MySQL的复制原理大致如下:
(1)首先,MySQL主库在事务提交时会把数据变更作为事件Events记录在二进制日志文件Binlog中;MySQL主库上的sync_binlog参数控制Binlog日志刷新到磁盘。
(2)主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay Log,之后从库根据中继日志Relay Log重做数据变更操作,通过逻辑复制以此来达到主库和从库的数据一致。
MySQL通过3个线程来完成主从库间的数据复制:其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑在从库上。当在从库上启动复制(start slave)时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志Relay Log中去,之后从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用。如下图所示。
以数据库单主单从来说,目前我测试过的数据库的版本是5.7.17,在数据库binlog都已开启且无错误的情况下,下面的SQL中的ip可以根据自己的情况来做相应的修改
主库执行下面的SQL
grant replication slave on *.* to 'rep1'@'%' identified by 'rep1';
grant replication slave on *.* to 'rep1'@'192.168.1.6' identified by 'rep1';这条SQL我在执行后从库频繁报账户拒绝登录的问题。使用上面的SQL就不会出现问题。
flush privileges;
show grants for 'rep1'@'%';
查看主库上当前的二进制日志名和偏移量值
show master status;
从库执行下面的语句
CHANGE MASTER TO
MASTER_HOST='192.168.1.6',
MASTER_PORT=3306,
MASTER_USER='rep1',
MASTER_PASSWORD='rep1',
MASTER_LOG_FILE='mysql-bin-log.000003',
MASTER_LOG_POS=154;
MASTER_LOG_FILE和MASTER_LOG_POS显示show master status显示的值。
启动slave线程
start slave;
查看从库状态
show slave status \G
Slave_IO_Running和Slave_SQL_Running如果都为Yes且Last_IO_Errno后无错误说明,说明主从异步复制搭建成功。
接下来自己可以在主库上执行几条SQL建库、建表、CRUD相关操作,看看从库上是否有相关数据。