Step by step——MacOs下源码编译Mysql5.7数据库以及进行主从部署
1. 前言
网络上关于在Linux系统下Mysql源码编译的文章有很多,但是在MacOs下编译的文档却很少。故而整理一份在MacOs(M2芯片)下Mysql5.7源码编译文档供大家借鉴参考。
2. Mysql相关依赖
相关依赖 | 版本 |
---|---|
openssl | 1.1 |
boost | 1.59 |
2.1 openssl安装
在mysql5.7中,openssl的依赖版本为1.1,执行以下命令进行安装
brew install openssl@1.1
重要: 安装成功后需要记住红框中的opensll的安装路径,后续在编译mysql时会用到,如下图中安装路径为: /opt/homebrew/opt/openssl@1.1/
2.2 下载boost1.59源码包
-
点击下载地址, 选择boost_1_59_0.tar.gz进行下载
-
拷贝到一个文件夹中进行解压,得到boost_1_59_0文件夹
cp boost_1_59_0.tar.gz ${指定的Boost文件解压目录}
tar -zxvf boost_1_59_0.tar.gz
注意: 无需进入解压后的文件夹中进行安装操作,Mysql在编译时会同步编译boost,我们只需要在CMake中添加WITH_BOOST的编译选项来指定解压后的boost文件夹即可
3 编译Mysql5.7
3.1 拉取源码
git clone https://github.com/mysql/mysql-server.git -b 5.7
如果拉取速度较慢,则可以在国内网站Gitee中进行拉取。
3.2 CMake编译
执行以下命令进行编译,其中Boost文件解压目录具体参考2.2小节,openssl安装的目录具体参考2.1小节
cd mysql-server
mkdir bld && cd bld
sudo cmake .. -DWITH_BOOST=${Boost文件解压目录} -DWITH_SSL=${openssl安装的目录}
CMake执行成功后,执行如下命令等待安装完成即可:
sudo make -j8
sudo make install
ps: 这里由于没有指定prefix安装路径,所以mysql将会安装在**/usr/local/**目录下
4 主备部署
我们先部署一个端口为3307的主库,同时部署一个端口为3308的从库,下列配置中4.1-4.5是主库和从库都需要进行的步骤。
4.1 创建配置目录
在表示主库的3307目录下创建了data, logs, mycnf, socket四个目录,这些目录的作用为:
- data目录:存放数据库文件,即我们常说的 MySQL data 文件。
- logs目录:存放数据库的日志文件,比如记录数据库异常信息的log_error日志等。
- mycnf目录:用于存放3307主库启动时以来的配置文件。
- socket目录:用于存放客户端和服务端通信的socket文件,mysql没有启动时该文件会为空。
4.2 填写配置文件
这里新建一个my.cnf的文件,并简单填写了相关配置项:
[mysqld]
# 端口号,若是从库则修改为3308
port=3307
# mysql服务的标识id
server-id=1
# mysql data文件存放目录
datadir=/Users/xxxx/multiserver/3307/data
# error日志存放目录
log_error=/Users/xxxx/multiserver/3307/logs/error.log
# mysql的安装路径
basedir=/usr/local/mysql
# 服务启动后,socket文件存放目录
socket=/Users/xxxx/multiserver/3307/socket/mysql.sock
# 表示开启binlog日志,并表明binlog日志的基本文件名
log-bin=/Users/xxxx/multiserver/3307/logs/mysql-bin
# 设置binlog日志三种格式:STATEMENT、ROW、MIXED. 详细区别可自行google
binlog_format=mixed
4.3 初始化mysql
mysql服务启动前需要进行初始化,其中–basedir参数表示mysql的安装路径, --datadir表示数据库data文件存放之处
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/Users/xxxx/mutilserver/3307/data
注意:命令执行完后将会生成root账户的密码(用于客户端连接mysql),会在命令行中以下列信息告知,注意保存密码 bkdashkj=da:
[Note] A temporary password is generated for root@localhost: bkdashkj=da
4.4 启动mysql服务端
./mysqld --defaults-file=/Users/xxxx/multiserver/3307/mycnf/my.cnf --user=mysql
可通过以下命令查看服务是否启动:
lsof -i:3307
4.5 连接mysql
连接到mysql并且输入初始密码验证
./mysql -uroot -P3307 -S /Users/xxxx/multiserver/3307/socket/mysql.sock -p
修改初始密码
alter user 'root'@'localhost' identified by 'yourpassword';
ps: 4.1-4.5是主库和从库都需要进行的步骤
4.6 主库配置
账号为slave,密码为1234
grant replication slave on *.* to 'slave'@'%' identified by '1234';
查看主库状态,并记录从库与主库建连时会用到的File和Position的值:
show master status
ps: 主库到此配置完成
4.7 从库配置
按照4.1-4.5的步骤执行后(配置需要对应修改,如port以及各个目录路径),执行命令登陆从库
./mysql -uroot -P3308 -S /Users/xxxx/multiserver/3308/socket/mysql.sock -p
创建从库与主库的联系,其中master_log_file和master_log_pos需要与主库对齐:
change master to master_host='127.0.0.1',master_user='slave',master_password='1234',master_port=3307,master_log_file='mysql-bin.000001',master_log_pos=154;
启动从库
start slave;
查看从库状态, Slave_IO_Running和Slave_SQL_Running为YES则表示成功
show slave status\G;
5. 验证主从功能
5.1 创建简单表
在主库中创建一个数据库,并在其中创建一个简单表
CREATE DATABASE test;
CREATE TABLE name_info(
id int not null,
name char(12)
);
5.2 查看从库是否同步更新
use test;
show tables;
从库中确实生成了名为name_info的库。
FAQ
Q1: 安装报错: You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=directory
如果按照文章步骤执行后报错,请检查一下执行如下命令时DWITH_BOOST的路径是否是boost解压后的路径
sudo cmake .. -DWITH_BOOST=${Boost文件解压目录} -DWITH_SSL=${openssl安装的目录}
Q2: 安装报错: Please install the appropriate openssl developer package.
如果按照文章步骤执行后报错,请检查一下执行如下命令时DWITH_SSL的路径下是否存在如下文件:
Q3: 启动主库失败,报错: Can’t open and lock privilege tables: Table ‘mysql.user’ doesn’t exist
这是没有初始化mysql导致的,需要执行4.3的命令来初始化mysql,再启动mysql服务端。
Q4: start slave后发现Slave_IO_Running状态为: Connecting
这可能是连接主库时slave账户密码填错导致,又或者没有在主库中创建用于备份的账号。从库中执行以下命令重新填写:
stop slave;
change master to master_host='127.0.0.1',master_user='slave',master_password='1234',master_port=3307,master_log_file='mysql-bin.000001',master_log_pos=154;
start slave;