Mysql主从同步搭建

第一次搭建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_filemaster_log_pos都是在主库中获取的(也就是上面提到的File字段和Position字段),需要和主库查询出来的保持一致。

  • 启动同步
start slave;

附上停止同步的命令:

stop slave;
  • 查看同步状态
show slave status\G;

这里会跳出一堆内容,其中Slave_IO_RunningSlave_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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值