MySQL主从复制部署以及遇到的问题
MySQL主从复制,就是利用MySQL本身的复制特性实现
达到互联网常用的数据库配置,如:1主+1从;1主+N从等架构
一、复制解决的根本问题
让一台服务器的数据与其他服务器保持同步。
二、支持两种复制方式
基于行的复制(5.1版本引入)
基于语句的复制(也称为逻辑复制)
两种方式都是通过主库上记录二进制日志,在备库重放日志的方式来实现异步的数据复制。
三、复制解决的问题
1、数据分布
2、负载均衡
3、备份
4、高可用和故障切换
5、MySQL升级测试
四、复制如何工作
复制通常有三个步骤:
1、在主库上把数据更改记录记录到二进制日志中(这些记录被称为二进制日志事件)
2、备库将主库上的日志复制到自己的中继日志(relay log)中
3、备库读取中继日志中的事件,将其重放到备库数据之上
五、配置复制
下面列出针对新安装的主库和备库,可以从以下几步进行配置:
1、在每台服务器创建复制账号
2、配置主库和备库
3、通知备库连接到主库并从主库复制数据
1、创建复制账号
注:主库和备库都执行该操作。
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO username@'192.168.0.%' IDENTIFIED BY 'password'; |
2、配置主库和备库
在主库的 my.cnf
的 [mysqld]
增加或修改以下配置:
log-bin=mysql-bin |
执行 SHOW VARIABLES LIKE 'log_bin';
, 可以查看二进制日志是否打开。
执行 SHOW MASTER STATUS;
, 可以看到二进制日志的文件名和位置(这2个值,在备库启动复制时有用到)
在备库的 my.cnf
的 [mysqld]
增加或修改以下配置:
log-bin=mysql-bin |
注: 主库和备库的server_id是唯一标识。
3、启动复制
在备库执行以下语句,告诉备库如何连接到主库并重放其二进制日志。
CHANGE MASTER TO MASTER_HOST = 'server_ip or address', |
语句中的 MASTER_LOG_FILE
和 MASTER_LOG_POS
和第二步中,设置好的主库状态一致。(当然也可以设置MASTER_LOG_POS=0
, 从头开始)
执行SHOW SLAVE STATUS;
, 查看复制是否正确执行,这里的 Last_Errno
和 Last_Error
会显示发生的错误。
执行START SLAVE;
, 开始复制。如果没有显示错误,我们再用SHOW SLAVE STATUS;
进行检查
此时,Slave_IO_Running
和 Slave_SQL_Running
都已经启动。
以上,就是实现MySQL复制的一些简单操作。
六、期间可能会遇到问题
1、主库添加log-bin-index 参数后,从库报以下错误:
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' |
解决方式:在备库执行以下语句。
stop slave; |
2、错误提示主从使用了相同的server UUID
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. |
导致原因:
auto.cnf 中的 server-uuid 相同
该场景发生是因为我使用的是虚拟机直接克隆整机,所以会导致整个问题。
解决方式:
停止mysql服务,删除 auto.cnf 文件后,重启mysql服务
服务器执行
systemctl stop mysqld.service |
其他参考解决