MySQL 主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台 MySQL 数据库(Slave 库)从另一台 MySQL 数据库(master 库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL 主从复制是MySQL数据库自带功能,无需借助第三方工具。
binlog(二进制日志)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL 的主从复制, 就是通过 binlog 实现的。默认MySQL 是未开启该日志的。
MySQL的主从复制原理如下:
复制过程分为三步:
1). MySQL master 将数据变更写入二进制日志( binary log)
2). slave 将 master 的 binary log 拷贝到它的中继日志(relay log)
3). slave 重做中继日志中的事件,将数据变更反映它自己的数据
一、搭建前的准备工作
提前在两台 CentOS7 服务器上安装好 mysql ,本博客服务器信息如下:
Mysql角色 | IP | 数据库版本 |
---|---|---|
Master | 192.168.216.218 | 5.7.41 |
Slave | 192.168.216.219 | 5.7.41 |
两台 CentOS7 服务器上的防火墙,都开通 3306 端口即可。
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
二、Master 数据库操作
修改 Mysql 的配置文件 /etc/my.cnf ,在 [mysqld] 下增加以下内容:
log-bin=mysql-bin
server-id=218
然后重启 mysql 服务:
systemctl restart mysqld
登录到 mysql 中,创建一个专门用于数据同步的用户,并给予数据同步的权限:
# 此处创建了一个名称为 datasync 的用户,密码为 Sync@123456 ,并授予数据同步权限
GRANT REPLICATION SLAVE ON *.* to 'datasync'@'%' identified by 'Sync@123456';
查看 master 的状态,记录 File 和 Position 的值:
show master status \G;
三、Slave 数据库操作
修改 Mysql 的配置文件 /etc/my.cnf ,在 [mysqld] 下增加以下内容:
server-id=129
然后重启 mysql 服务:
systemctl restart mysqld
登录 mysql 数据库,然后设置 master 数据库的连接信息和同步位置:
change master to master_host='192.168.216.128',master_user='datasync',master_password='Sync@123456',master_log_file='mysql-bin.000002',master_log_pos=1641;
查看从库的状态,如果 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes 的话,表示主从复制已经配置成功。
show slave status \G;
此时在 Master 库上,对数据库进行增删改,以及对表进行增删改,都会同步到 Slave 库中。
四、Slave_IO_Running 为 No 的解决方案
主要原因是 Slave 库所在服务器的 /var/lib/mysql/auto.cnf 文件中 server-uuid 的值,跟 Master 库所在服务器的相应文件中的 server-uuid 中的值相同导致的问题。之所以会相同,很可能是是因为虚拟机复制导致的问题。此时只需要将 Slave 服务器中的 /var/lib/mysql/auto.cnf 删除掉,然后重启 Slave 的 mysql 即可生成新的 auto.cnf 文件。
cat /var/lib/mysql/auto.cnf
systemctl restart mysqld
把上面的 Slave 库的操作再做一遍即可,查看主库状态,登录 Slave 的 mysql 数据库,设置 master 数据库的连接信息和同步位置,查看从库状态,直到看到 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes 为止。