主从的工作流程
- 1、主库把数据更改记录到二进制日志(Binary Log)中
- 2、备库将主库上的日志复制到自己的中继日志 (Relay Log) 中
- 3、备库读取中继日志中的事件,将其重放到备库数据之上
第一步是主库记录binlog日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到binlog日志中,MySQL 会按照事务提交的顺序而不是语句执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。然后从库复制二进制日志到其本地中继日志
中,首先从库会启动一个工作线程,称为 I/O 线程 (Slave_IO_Running)
,I/O 和主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程,该线程会读取主库上二进制日志的事件,如果该线程追赶上主库将睡眠状态,直到主库发送信号量通知其有新事件产生才会被唤醒,从库 I/O 线程会将收到的事件记录到中继日记。从库的另外一个 SQL 线程 (Slave_SQL_Running)
则会分析中继日志,落地到自身数据库中。
主从配置步骤:
- 1.配置主库参数
my.cnf
,建议将 sync_binlog 设置为1,保证数据不丢失。 - 2.添加从库访问主库的账号。
- 3.使用mysqldump导出主库数据。
- 4.配置从库参数
my.cnf
,主要配置 relay-log。 - 5.将导出主库的数据 导入到从库中。
- 6.进入从库mysql终端,设置master相关参数,主要是设置主库的连接信息,binlog文件和pos位置。
- 7.启动从库复制
START SLAVE;
,启动完毕查看状态SHOW SLAVE STATUS;
。
1.配置主库参数
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
expire_logs_days = 10
sync_binlog = 1
在主库里添加从库访问主库的账号
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY 'repl';
mysql> flush privileges;
导出主库数据
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases > all-databases.sql
配置从库参数
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
expire_logs_days = 10
early-plugin-load = ""
relay-log=mysql-relay-bin
read_only=1
log-slave-updates=0
skip-slave-start
relay-log
中继日志存放read_only
用户只读模式,不允许修改log-slave-updates
从库也要给其他库充当主库身份时,需要设置 logs-slave-updates 选项,这个选项告诉从库将其 SQL 线程执行的更新记录到自己的binlog日志上skip-slave-start
不随数据库启动而启动从库复制
将导出主库的数据 导入到从库中
mysql> source /opt/all-databases.sql;
从库启动复制配置
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.40.10',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl',
-> MASTER_LOG_FILE='mysql-bin.000043',
-> MASTER_LOG_POS=154,
-> MASTER_CONNECT_RETRY=10;
启动从库复制
START SLAVE;
SHOW SLAVE STATUS;
如果发现 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,则表示启动成功,如果有为no的,则存在失败,此时我们就需要翻看mysql报错日志文件排查问题
常见错误1:
The slave I/O thread stops because master and slave have equal MySQL server ids;
出现此报错是因为主从采用的 server_id 一样导致的,修改从库 server_id 重启即可
常见错误2:
The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
出现以上报错是因为主从数据库使用相同的uiid,查看 auto.cnf
,原因是拷贝了虚拟机的环境导致的,解决方法是将从库的 auto.cnf 备份删除,然后重启mysql