1 系统需求
目标安装MySql5.7版本。
系统环境:
oracle云主机,arm架构
确认主机架构如下图:
查看是否有5.7版本的源
apt-cache search mysql | grep mysql-server
执行后发现只有8.0版本的,5.7版本只能通过源码安装了。
2 下载MySql源码
下载源码要选择合适的版本,官网下载地址:
MySQL :: Download MySQL Community Server (Archived Versions)
上面图片两种不同类型的压缩包选项:“Compressed TAR Archive, Includes Boost Headers” 和 “Compressed TAR Archive”。
- Compressed TAR Archive, Includes Boost Headers:这个版本的源码包包含了构建MySQL所需的所有文件,包括Boost库的头文件。Boost是一个非常流行的C++库集合,提供了一系列高质量的软件库,用于处理如容器、算法、线程等任务。MySQL的某些部分依赖于Boost库来实现特定的功能。如果你从零开始编译MySQL,并且不想单独安装或配置Boost库,那么选择这个版本会更方便。
- Compressed TAR Archive:这个版本只包含MySQL本身的源代码,没有额外的依赖库文件(比如Boost)。如果你已经有一个现成的开发环境,其中包含了所有必要的依赖项,或者你有特殊的需求想要自己管理这些依赖关系,那么可以选择这个较小的包。
对于大多数开发者来说,特别是那些刚开始编译MySQL或不确定自己环境中是否已正确设置所有必要依赖的人来说,推荐下载“Compressed TAR Archive, Includes Boost Headers”。这样可以避免因为缺少Boost库而导致编译失败的问题。
根据以下选择最终下载链接:https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.44.tar.gz
直接在linux下载
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.44.tar.gz
包不是很大,很快就下载完成,如下图:
3 编译MySQl源码
在源码编译前需要安装一些依赖:
sudo apt update
sudo apt install cmake build-essential libncurses5-dev libaio-dev libssl-dev libedit-dev libreadline-dev zlib1g-dev libcurl4-openssl-dev libevent-dev libgoogle-perftools-dev libjemalloc-dev
解压
tar -xzf mysql-boost-5.7.44.tar.gz
进入解压后的目录,创建编译目录
mkdir build
cd build
配置编译参数
cmake .. \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DWITH_BOOST=boost \-DWITH_SSL=yes \-DWITH_ZLIB=bundled \-DWITH_EDITLINE=bundled \-DWITH_CURL=yes \-DWITH_JEMALLOC=bundled \-DWITH_SYSTEMD=1 \-DCMAKE_C_FLAGS="-march=armv8-a" \-DCMAKE_CXX_FLAGS="-march=armv8-a"
解释:
- -DCMAKE_INSTALL_PREFIX=/usr/local/mysql:指定 MySQL 安装目录。
- -DWITH_BOOST=boost:指定 Boost 库的位置,如果源码包中包含 Boost 头文件,使用 boost。
- -DCMAKE_C_FLAGS="-march=armv8-a" 和 -DCMAKE_CXX_FLAGS="-march=armv8-a":指定编译器优化选项,确保针对 ARM64 架构进行优化。
编译源码:
使用 make 命令编译源码。这一步可能需要一些时间,具体取决于你的系统性能:
make
编译过程,漫长的等待……,如下图:
编译完成如下图:
oracle的云主机 4核 (cpu 3.0 GHz Ampere® Altra™)+24g内存 编译花了2个小时。
4 安装mysql
编译完成开始,安装mysql
sudo make install
安装完成如下图:
5 初始化数据库
创建 MySQL 用户和组,创建一个专用的 MySQL 用户和组:
sudo groupadd mysql
sudo useradd -r -g mysql mysql
初始化数据目录,初始化 MySQL 数据目录:
cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql
设置权限,设置 MySQL 目录的权限:
sudo chown -R mysql:mysql /usr/local/mysql
sudo chown -R mysql:mysql /usr/local/mysql/data
创建Mysql配置文件,在/etc/目录下创建my.cnf并保存,配置文件内容如下:
[mysqld]
# 基本配置
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /usr/local/mysql/data/mysqld.pid# 日志配置
log-error = /usr/local/mysql/data/error.log
slow-query-log = 1
slow-query-log-file = /usr/local/mysql/data/slow-query.log# InnoDB 配置
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_buffer_pool_size = 8024M
innodb_log_file_size = 100M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1# 其他配置
max_connections = 151
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
key_buffer_size = 16M#bind-address = 0.0.0.0
6 启动 MySQL 服务
创建 systemd 服务文件:
如果你使用的是 systemd 系统,可以创建一个 systemd 服务文件来管理 MySQL 服务。创建文件 /etc/systemd/system/mysqld.service,内容如下:
[Unit]
Description=MySQL Server
After=network.target[Service]
User=mysql
Group=mysql
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysqld.pid[Install]
WantedBy=multi-user.target
服务配置文件的解释:
[Unit] 部分
Description
- 这行
Description = MySQL Server
是对该服务单元的一个简单描述,说明此服务是 MySQL 服务器。它主要用于在系统日志、管理工具等地方显示一个人类可读的服务名称。
After
After = network.target
表示该服务应该在network.target
之后启动。这是因为 MySQL 服务器需要网络服务就绪后才能正常运行。network.target
代表网络初始化完成的一个系统目标,确保 MySQL 在网络环境准备好之后启动,避免因网络未就绪而出现启动失败等问题。
[Service] 部分
User 和 Group
User = mysql
和Group = mysql
指定了运行 MySQL 服务的用户和用户组。使用专门的mysql
用户和组来运行服务,可以提高系统安全性,避免 MySQL 以特权用户(如root
)运行可能带来的安全风险。
ExecReload
ExecReload = /bin/kill -HUP $MAINPID
定义了如何重新加载服务配置。这里通过向主进程($MAINPID
)发送HUP
(挂起信号)来实现重新加载配置的操作。当系统管理员执行systemctl reload mysql
命令时,会执行此操作,让 MySQL 重新读取配置文件而无需完全重启服务。
ExecStop
ExecStop = /bin/kill -SIGINT $MAINPID
指定了如何停止服务。当执行systemctl stop mysql
命令时,会向主进程发送SIGINT
(中断信号)来正常停止 MySQL 服务,确保服务能够有序地关闭,避免数据丢失或损坏等问题。
ExecStart
ExecStart = /usr/local/mysql/bin/mysqld --defaults - file = /etc/my.cnf --basedir = /usr/local/mysql --datadir = /usr/local/mysql/data --pid - file = /usr/local/mysql/data/mysqld.pid
定义了如何启动 MySQL 服务。--defaults - file = /etc/my.cnf
指定了 MySQL 的配置文件路径,MySQL 在启动时会读取此文件中的配置参数。--basedir = /usr/local/mysql
指定了 MySQL 的安装基础目录。--datadir = /usr/local/mysql/data
指定了 MySQL 的数据存储目录,数据库文件、表数据等都存储在此目录中。--pid - file = /usr/local/mysql/data/mysqld.pid
指定了 MySQL 服务主进程的 PID 文件存储位置,通过此 PID 文件可以方便地对服务进程进行管理。
[Install] 部分
WantedBy = multi - user.target
表示该服务希望在multi - user.target
被激活时自动启动。multi - user.target
是系统启动到多用户模式时的一个目标,意味着当系统进入多用户模式时,MySQL 服务将自动启动,确保在正常的多用户使用环境下 MySQL 能够正常运行。
如下图:
启动 MySQL 服务,加载新的服务文件并启动 MySQL 服务:
sudo systemctl daemon-reload
sudo systemctl start mysqld
sudo systemctl enable mysqld
查看mysql服务状态启动成功运行正常,如下图:
7 mysql账号管理
登录 MySQL,使用初始密码(初始化时生成的密码)登录 MySQL:
/usr/local/mysql/bin/mysql -u root -p
登陆后操作,首次登陆要求修改密码如下图:
修改初始密码:
登录后,建议立即修改初始密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';
增加远程访问用户
CREATE USER 'root'@'%' IDENTIFIED BY 'xxxxxxxx';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
远程验证登陆成功,如下图: