快速实现 MySQL 主从复制

MySQL 主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台 MySQL 数据库(Slave 库)从另一台 MySQL 数据库(master 库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL 主从复制是MySQL数据库自带功能,无需借助第三方工具。

binlog(二进制日志)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL 的主从复制, 就是通过 binlog 实现的。默认MySQL 是未开启该日志的。

MySQL的主从复制原理如下:

image

复制过程分为三步:

1). MySQL master 将数据变更写入二进制日志( binary log)

2). slave 将 master 的 binary log 拷贝到它的中继日志(relay log)

3). slave 重做中继日志中的事件,将数据变更反映它自己的数据


一、搭建前的准备工作

提前在两台 CentOS7 服务器上安装好 mysql ,本博客服务器信息如下:

Mysql角色 IP 数据库版本
Master 192.168.216.128 5.7.41
Slave 192.168.216.129 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

image

然后重启 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;

image


三、Slave 数据库操作

修改 Mysql 的配置文件 /etc/my.cnf ,在 [mysqld] 下增加以下内容:

server-id=129

image

然后重启 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;

image

此时在 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

image

systemctl restart mysqld

把上面的 Slave 库的操作再做一遍即可,查看主库状态,登录 Slave 的 mysql 数据库,设置 master 数据库的连接信息和同步位置,查看从库状态,直到看到 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes 为止。

posted @ 2023-05-01 12:45  乔京飞  阅读(10742)  评论(0编辑  收藏  举报