欢迎光临范阳布衣的运维博客
分享工作和学习中的知识、技术

MySQL主从复制-基于binlog

MySQL主从复制原理

MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(Master)复制到另一个MySQL数据库(Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的,其中有两个线程(SQL线程和IO线程)在Slave端。另外一个线程(I/O线程)在Master端。
要实现MySQL的主从复制,首先必须打开Master端的binlog日志记录功能,否则就无法实现,因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作

开启主库binlog,从库不用开,配置server-id(不能相同)

检查master server-id及配置

[root@mysql ~]# grep -Ei "server-id|log_bin" /etc/my.cnf
log_bin=/data/mysql/logs/mysql-bin
server-id=1   #不能和从库相同

检查slave server-id及配置

[root@mysql02 ~]# grep -Ei "server-id" /etc/my.cnf
server-id=2

主库创建同步的用户

[root@mysql ~]# mysql    #配置文件中配置了免密码登录
mysql> grant replication slave on *.* to 'rep'@'192.9.%.%' identified by '123123';
Query OK, 0 rows affected (0.09 sec)

进行检查

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| rep  | 192.9.%.% |
| root | 192.9.%.% |
| zhry | 192.9.%.% |
| root | localhost |
| root | mysql     |
+------+-----------+
6 rows in set (0.00 sec)

从master导出数据

[root@mysql ~]# mysqldump -B --master-data=2 --single-transaction -A | gzip >/root/tools/all_$(date +%F).sql.gz
#--master-data=2表示在dump过程中记录当前库的binlog和pos点,并在dump文件中注释掉这一行;
#--single-transaction在导出开始时设置事务隔离状态并使用一致性快照开始事务,而后马上unlock tables

slave导入全备的数据

[root@mysql02 ~]# gzip -d all_2019-06-17.sql.gz
[root@mysql02 ~]# ll
total 321920
-rw-r--r-- 1 root root    660123 Jun 17 14:13 all_2019-06-17.sql
-rw-r--r-- 1 root root 328979165 Jun 17 13:24 mysql-5.6.42-linux-glibc2.12-x86_64.tar.gz
[root@mysql02 ~]# mysql < all_2019-06-17.sql

找位置点,然后change master从库

[root@mysql02 tools]# sed -n '22p' all_2019-06-17.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=325;

登录slave

mysql> change master to master_host='192.9.201.201',master_port=3306,master_user='rep',master_password='123123',master_log_file='mysql-bin.000007',master_log_pos=325;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
#不是所有参数都加单引号:例如端口和pos。否则会报错。
#如果写错了  stop slave 执行reset slave all 重新change master to  然后再start slave 
#如果写错了  stop slave 执行reset slave all 重新change master to  然后再start slave 

查看同步状态

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.9.201.201
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 325
               Relay_Log_File: mysql02-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

主从复制设置完毕

总结:

  • 主从复制是异步的逻辑的SQL语句集的复制
  • 复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程。
  • 实现主从复制的必要条件时主库要开启记录binlog功能。
  • 作为复制的所有MySQL节点的server-id都不能相同。
  • binlog文件只记录对数据库有更改的SQL语句(来自主数据库内容的变更),不记录任何查询(select、show)语句。
未经允许不得转载:范阳布衣 » MySQL主从复制-基于binlog