第一次搭建Mysql的主从同步,记录一下。
环境
- 服务器: 服务器为CentOS7,准备好两台IP互通的服务器,其中主库
192.168.0.102
,从库192.168.0.104
。 - Mysql: 版本为5.7.34,用yum的方式安装,管理员账号均为root,密码123456,这里以test库的test表做测试(需要提前在主从两个库中建立该数据库,表结构需要保持一致)。
注:一开始以为搭建完主从同步后,从库会自动复制主库的旧数据,但实际上发现并不会,只有在主从搭建完成后才会保持同步更新,所以建议主从库的数据和结构保持一致再开始配置。
主库配置
修改主库服务器的Mysql配置文件
- 打开配置文件
vim /etc/my.cnf
- 打开后在文件尾部追加以下配置:
# 指定一个server的id,随便起只要不重复即可,因为这台是主,所以直接给1
server-id=1
# 开启binlog日志并且指定日志的位置,从库就是根据这个日志做数据同步的
log_bin=/var/log/mysql-bin.log
# 日志的缓存时间,设置5天
expire_logs_days=5
#日志的最大大小,设置5G
max_binlog_size=5G
#同步的数据库名称
binlog_do_db=test
#忽略同步的数据库
#binlog_ignore_db = mysql
- 修改完成后需要重启Mysql:
systemctl restart mysqld
注: 重启的时候发现启动失败,查看日志后发现是缺少/var/log/
目录的权限,赋予权限:
chmod 777 /var/log/
赋予完权限后再次启动Mysql应该就正常了。
创建同步账号
- 登进主库
mysql -u root -p 123456
- 创建同步账号
CREATE USER 'syncuser'@'%' IDENTIFIED BY '123456789';
- 赋予权限
GRANT REPLICATION SLAVE ON *.* TO 'syncuser'@'%' IDENTIFIED BY '123456789';
- 刷新用户权限
flush privileges;
- 查看主的状态
show master status;
这句执行完,能看到以下内容
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 3746 | test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
这里的File
字段和Position
字段在后面的从库上需要使用到。Binlog_Do_DB
就是我们需要同步的库。
至此主库的配置完成,接下来配置从库。
从库配置
修改从库服务器的Mysql配置文件
- 打开配置文件
vim /etc/my.cnf
- 打开后在文件尾部追加以下配置:
#设置一个serviceid,不允许与其他服务器的重复
server-id=2
##日志的缓存时间,5天
expire_logs_days=5
##日志的最大大小,5G
max_binlog_size=5G
##同步的数据库名称
replicate_do_db=test
##忽略同步的数据库
##replicate_ignore_db = mysql
- 修改完成后需要重启Mysql:
systemctl restart mysqld
配置同步信息
- 登进从库
mysql -u root -p 123456
- 配置主库信息
change master to master_host='192.168.0.102', master_user='syncuser', master_password='123456789', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=3746;
注:这里的master_log_file
和master_log_pos
都是在主库中获取的(也就是上面提到的File
字段和Position
字段),需要和主库查询出来的保持一致。
- 启动同步
start slave;
附上停止同步的命令:
stop slave;
- 查看同步状态
show slave status\G;
这里会跳出一堆内容,其中Slave_IO_Running
和Slave_SQL_Running
两个字段为Yes就代表目前正常同步,可以尝试在主库的test表中添加一条数据,看看从库对应的test表是否同步。
过程可能出现的问题
问题1
在从库上查看同步状态,发现报错了下面的错:
Last_Error: Error executing row event: 'Table 'test.test' doesn't exist'
是因为从库没有对应的表结构。
问题2
在从库上查看同步状态,发现报错了下面的错:
Last_SQL_Error: Could not execute Update_rows event on table test.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 3205
这是因为我在配置从库前修改了表数据,导致从库的master_log_pos
字段和主库的Position
字段不一致。查询下主库的Position
字段,从库重新执行下change master to...
语句即可。
问题3
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.
创建虚拟机的时候为了方便,在装完mysql之后直接复制了一份虚拟机,导致两个MySQL的auto.cnf
文件中UUID是一样的,所以需要修改其中一个的UUID。
该文件在/var/lib/mysql/auto.cnf
,可以直接删掉,重启MySQL服务会自动生成:
mv auto.cnf auto.cnf.bk
systemctl restart mysqld
本文由 visionki 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 12, 2021 at 03:07 pm