Linux之MySQL主从复制详细步骤
MySQL
的主从复制(Master-Slave Replication
)是一种数据复制解决方案,将主数据库的DDL
(数据定义语言)和DML
(数据操纵语言)操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而是的从库和主库的数据保存同步。
MySQL
支持将数据从一个MySQL
服务器(主服务器)复制到一个或多个其他MySQL
服务器(从服务器),从库同时也可以作为其他从服务器的主库,实现链状复制。
MySQL
主从复制的优点主要包含以下三个方面:
主库出现问题,可以快速切换到从库提供服务;实现读写分离,降低主库的访问压力;可以在从库中执行备份,以避免备份期间影响主库服务;
需要注意的是,MySQL
的主从复制是异步的,这意味着从服务器的数据可能会与主服务器的数据存在一定的延迟。因此,在使用主从复制时,需要根据具体的业务场景和需求来选择合适的配置和策略。
工作原理
从上图来看,主从复制分成三步:
Master
主库在事务提交时,会把数据变更记录在二进制日志文件Binlog
中;从库读取主库的二进制日志文件
Binlog
,写入到从库的中继日志Relay Log
;Slave
重做中继日志中的事件,将改变数据更新同步到从库中;
说白了就是Master
主库上执行的增删改的SQL
语句同步到对应的Slave
从库上,然后再在Slave
从库中同样再次执行一遍SQL
语句以作备份。
综合案例
前期准备
准备两台虚拟机,需要提前安装好MySQL
数据库(必须要开启二进制日志)。
如下所示:
主从库 | IP地址 |
---|---|
主库 | 192.168.111.135 |
从库 | 192.168.111.137 |
注意:以上只是示例说明,具体以自己的虚拟机情况为主。
例外如果克隆的两台虚拟机IP地址一致,可根据以下操作修改实现动态ip(基于mac地址发配IP)
切换目录到:/etc/netplan 并且编辑00-installer-config.yaml文件
如下图指定位置加入:dhcp-identifier: mac(严格缩进格式要求)
重启网络刷新修改:netplan apply
主库配置
修改主库服务器的MySQL
核心配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
,并添加如下配置信息(开启二进制日志):
注意:这里
binlog-ignore-db
和binlog-do-db
配置项没有指定,默认同步所有数据库信息。从 MySQL 5.7 开始,
binlog-ignore-db
的优先级高于binlog-do-db
。这意味着即使某个数据库被binlog-do-db
指定,如果它同时出现在binlog-ignore-db
的列表中,那么它的更改将不会被记录到二进制日志中
重启MySQL
服务器。
(追求安全,否则可跳过)登录MySQL
数据库,创建远程连接的账号,并授予主从复制权限。
通过指令,查看二进制日志坐标
从库配置
1)修改从库服务器的MySQL
核心配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
,并添加如下配置信息:
2)重启MySQL
服务器。
3)登录MySQL
数据库,设置主库配置。
MySQL8.0.23
之前的版本,执行如下SQL
语句:
MySQL8.0.23
之后的版本,执行如下SQL
语句:
参数说明:
参数名 | 含义 | 8.0.23之前 |
---|---|---|
source_host | 主库IP地址 | master_host |
source_user | 连接主库的用户名 | master_user |
source_password | 连接主库的密码 | master_password |
source_log_file | binlog日志文件名 | master_log_file |
source_log_pos | binlong日志文件位置 | master_log_pos |
4)开启同步操作
5)查看主从同步状态
格式化显示:show slave status\G;
上述图中显示Slave_IO_Running: No
,很明显主从复制开启失败。经过问题分析之后,发现是虚拟机是克隆的,导致主库和从库的MySQL
的server id
都是一样的。
解决方案:修改任意主库和从库的server id
即可解决问题。
修改/var/lib/mysql/auto.cnf
文件。将server-uuid
属性修改为唯一值即可。
方案二:
停止mysql服务
删除auto.cnf
启动mysql服务
修改完毕保存并退出,最后重启MySQL
服务后,并再次登录MySQL
查看主从复制是否成功。
数据测试
1)登录主库MySQL
,并执行以下SQL
语句:
2)登录从库MySQL
,查看主从复制结果:
存在数据即MySQL
主从复制同步成功(主库操作,从库也会有)。
异常处理
在创建用户时对 test
库授予 SELECT、INSERT、FILE 权限,因 FILE 权限不能授予某个数据库而导致语句执行失败。
但最终结果是:test@'%'
创建成功,授权部分失败。
从上面的测试可知,使用 GRANT 创建用户其实是分为两个步骤:创建用户和授权。
权限有问题并不影响用户的创建,上述语句会导致主库在 binlog 写 INCIDENT_EVENT,从而导致主从复制报错
故障解决