MySQL主从同步

master 192.168.110.31 数据库主服务器
slave1 192.168.110.32 数据库从服务器
slave2 192.168.110.33 数据库从服务器

1.1 基于binlog的主从同步

1.1.1 master配置

1、配置server_id

root@master \~\]# `echo 'server_id=1' >> /etc/my.cnf.d/mysql-server.cnf` #添加server_id \[root@master \~\]# `systemctl restart mysqld.service` #### 2、完全备份发送给slave保证数据一致性 \[root@master \~\]# `mysql -e 'show databases;'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@master \~\]# `mysql -e 'flush tables with read lock;'` #锁表只读 \[root@master \~\]# `mysqldump -B school > /tmp/school.sql` \[root@master \~\]# `scp /tmp/school.sql 192.168.110.32:/tmp` \[root@master \~\]# `scp /tmp/school.sql 192.168.110.33:/tmp` \[root@master \~\]# `mysql -e 'unlock tables;'` #解锁 #### 3、授权用户 mysql\> `create user 'rep'@'%' identified with mysql_native_password by 'MySQL@1234';` Query OK, 0 rows affected (0.03 sec) mysql\> `grant all on *.* to 'rep'@'%';` Query OK, 0 rows affected (0.00 sec) #### 4、查看当前binlog状态 mysql\> `show master status;` ```bash +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000008 | 2245 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) ``` ### 1.1.2 slave1配置 #### 1、设置server_id \[root@slave1 \~\]# `echo 'server_id=2' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave1 \~\]# `systemctl restart mysqld.service` #### 2、同步master数据 \[root@slave1 \~\]# `mysql < /tmp/school.sql` \[root@slave1 \~\]# `mysql -e 'show databases;'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 3、配置change msater mysql\> `change master to` -\> `master_host='192.168.110.31',` -\> `master_user='rep',` -\> `master_password='MySQL@1234',` -\> `master_log_file='binlog.000008',` -\> `master_log_pos=2245,` -\> `get_master_public_key=1;` Query OK, 0 rows affected, 9 warnings (0.01 sec) mysql\> `show slave status\G` ##IO和SQL线程YES就OK Slave_IO_Running: Yes Slave_SQL_Running: Yes ### 1.1.3 slave2配置 #### 1、设置server_id \[root@slave2 \~\]# `echo 'server_id=3' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave2 \~\]# `systemctl restart mysqld.service` #### 2、同步master数据 \[root@slave2 \~\]# `mysql < /tmp/school.sql` \[root@slave2 \~\]# `mysql -e 'show databases;'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 3、配置change msater mysql\> `change master to` -\> `master_host='192.168.110.31',` -\> `master_user='rep',` -\> `master_password='MySQL@1234',` -\> `master_log_file='binlog.000008',` -\> `master_log_pos=2245` -\> `get_master_public_key=1;` Query OK, 0 rows affected, 9 warnings (0.01 sec) mysql\> `show slave status\G` #IO和SQL线程YES就OK Slave_IO_Running: Yes Slave_SQL_Running: Yes ### 1.1.4 测试 \[root@master \~\]# `mysql -e 'show databases'` #主库创建一个数据库 ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@slave1 \~\]# `mysql -e 'show databases;'` #两个从库也就有了 ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@slave2 \~\]# `mysql -e 'show databases;'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` ## 1.2 基于GTID的主从同步 ### 1.2.1 master配置 #### 1、完全备份发送给slave保证数据一致性 \[root@master \~\]# `mysql -e 'show databases;'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@master \~\]# `mysql -e 'flush tables with read lock;'` #锁表只读 \[root@master \~\]# `mysqldump -B school > /tmp/school.sql` \[root@master \~\]# `scp /tmp/school.sql 192.168.110.32:/tmp` \[root@master \~\]# `scp /tmp/school.sql 192.168.110.33:/tmp` \[root@master \~\]# `mysql -e 'unlock tables;'` #解锁 #### 2、授权用户 mysql\> `create user 'rep'@'%' identified with mysql_native_password by 'MySQL@1234';` Query OK, 0 rows affected (0.03 sec) mysql\> `grant all on *.* to 'rep'@'%';` Query OK, 0 rows affected (0.00 sec) #### 3、配置server_id,开启GTID特性 \[root@master \~\]# `echo 'server_id=1' >> /etc/my.cnf.d/mysql-server.cnf` #添加server_id \[root@master \~\]# `echo 'gtid_mode=ON' >> /etc/my.cnf.d/mysql-server.cnf` \[root@master \~\]# `echo 'enforce-gtid-consistency=true' >> /etc/my.cnf.d/mysql-server.cnf` \[root@master \~\]# \`systemctl restart mysqld.service ### 1.2.2 slave1配置 #### 1、同步master数据,保证数据一致性 \[root@slave1 \~\]# `mysql < /tmp/school.sql` \[root@slave1 \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 2、配置server_id并开启GTID特性 \[root@slave1 \~\]# `echo 'server_id=2' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave1 \~\]# `echo 'gtid_mode=ON' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave1 \~\]# `echo 'enforce-gtid-consistency=true' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave1 \~\]# `systemctl restart mysqld.service` #### 3、配置change msater mysql\> `change master to` -\> `master_host='192.168.110.31',` -\> `master_user='rep',` -\> `master_password='MySQL@1234',` -\> `master_auto_position = 1;` Query OK, 0 rows affected, 7 warnings (0.05 sec) \[root@slave1 \~\]# `mysql -e 'start slave'` \[root@slave1 \~\]# `mysql -e 'show slave status\G'` Slave_IO_Running: Yes Slave_SQL_Running: Yes ### 1.2.3 slave2配置 #### 1、同步master数据,保证数据一致性 \[root@slave2 \~\]# `mysql < /tmp/school.sql` \[root@slave2 \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 2、配置server_id并开启GTID特性 \[root@slave2 \~\]# `echo 'server_id=3' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave2 \~\]# `echo 'gtid_mode=ON' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave2 \~\]# `echo 'enforce-gtid-consistency=true' >> /etc/my.cnf.d/mysql-server.cnf` \[root@slave2 \~\]# `systemctl restart mysqld.service` #### 3、配置change msater mysql\> `change master to` -\> `master_host='192.168.110.31',` -\> `master_user='rep',` -\> `master_password='MySQL@1234',` -\> `master_auto_position = 1;` Query OK, 0 rows affected, 7 warnings (0.05 sec) \[root@slave2 \~\]# `mysql -e 'start slave'` \[root@slave2 \~\]# `mysql -e 'show slave status\G'` Slave_IO_Running: Yes Slave_SQL_Running: Yes ### 1.2.4 测试 \[root@master \~\]# `mysql -e 'create database db1'` \[root@master \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@slave1 \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@slave2 \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 1.3 延时同步 > SQL线程延时:数据已经写入relaylog中了,SQL线程"慢点"运行 > > 一般企业建议3-6小时,具体看公司运维人员对于故障的反应时间 > > 在主从同步的基础上配置,这里就拿一个slave做测试了,另一个配置一样 #### 1.3.1 slave1配置 mysql\> `stop slave;` Query OK, 0 rows affected (0.01 sec) mysql\> `change master to MASTER_DELAY = 300;` #将从服务器的复制延迟设置为300秒(5分钟)。 Query OK, 0 rows affected (0.01 sec) mysql\> `start slave;` Query OK, 0 rows affected (0.00 sec) mysql\> `show slave status\G` SQL_Delay: 300 #### 1.3.2 测试 **master** \[root@master \~\]# `mysql -e 'create database db2'` #主库创建一个库 \[root@master \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | db2 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` **slave1** \[root@slave1 \~\]# `mysql -e 'show databases'` #从库不会立刻同步 ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` \[root@slave1 \~\]# `sleep 300` #等待三百秒 \[root@slave1 \~\]# `mysql -e 'show databases'` #同步 ```bash +--------------------+ | Database | +--------------------+ | db1 | | db2 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` #### 1.3.3 故障恢复 **master** \[root@master \~\]# `mysql -e 'drop database db2'` #主库模拟删除文件 \[root@master \~\]# `mysql -e 'show databases'` ```bash +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | school | | sys | +--------------------+ ``` **slave1** \[root@slave1 \~\]# `mysql -e 'stop slave sql_thread;'` #停止sql线程,不能再开启,开启后还是会删 \[root@slave1 \~\]# `mysql -e 'show master status\G'` #查看当前使用的binlog ```bash *************************** 1. row *************************** File: binlog.000009 Position: 909 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:1-4 [root@slave1 ~]# mysql -e "show binlog events in 'binlog.000009'\G" #查询中继日志 *************************** 1. row *************************** Log_name: binlog.000009 Pos: 4 Event_type: Format_desc Server_id: 2 End_log_pos: 126 Info: Server ver: 8.0.35, Binlog ver: 4 *************************** 2. row *************************** Log_name: binlog.000009 Pos: 126 Event_type: Previous_gtids Server_id: 2 End_log_pos: 157 Info: *************************** 3. row *************************** Log_name: binlog.000009 Pos: 157 Event_type: Gtid Server_id: 1 End_log_pos: 241 Info: SET @@SESSION.GTID_NEXT= '3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:1' *************************** 4. row *************************** Log_name: binlog.000009 Pos: 241 Event_type: Query Server_id: 1 End_log_pos: 346 Info: create database db1 /* xid=14 */ *************************** 5. row *************************** Log_name: binlog.000009 Pos: 346 Event_type: Gtid Server_id: 1 End_log_pos: 430 Info: SET @@SESSION.GTID_NEXT= '3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:2' *************************** 6. row *************************** Log_name: binlog.000009 Pos: 430 Event_type: Query Server_id: 1 End_log_pos: 535 Info: create database db2 /* xid=30 */ *************************** 7. row *************************** Log_name: binlog.000009 Pos: 535 Event_type: Gtid Server_id: 1 End_log_pos: 619 Info: SET @@SESSION.GTID_NEXT= '3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:3' *************************** 8. row *************************** Log_name: binlog.000009 Pos: 619 Event_type: Query Server_id: 1 End_log_pos: 720 Info: drop database db2 /* xid=31 */ *************************** 9. row *************************** Log_name: binlog.000009 Pos: 720 Event_type: Gtid Server_id: 1 End_log_pos: 804 Info: SET @@SESSION.GTID_NEXT= '3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:4' *************************** 10. row *************************** Log_name: binlog.000009 Pos: 804 Event_type: Query Server_id: 1 End_log_pos: 909 Info: create database db2 /* xid=32 */ ``` #找到drop命令的GTID,恢复时不要它这里为 '3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:4' \[root@slave1 \~\]# `mysqlbinlog --skip-gtids --include-gtids='3f8e4de8-d2c1-11ee-abc3-000c29ae0c7f:1-3' /var/lib/mysql/binlog.000009 > /tmp/gtid1.sql` #导处binlog文件 \[root@slave1 \~\]# `mysql < /tmp/gtid1.sql` #恢复,从库当主库,slave1为master 下来就是停止原来的主库 ### 1.4 过滤同步 #### 1.4.1 master配置 \[root@master \~\]# `cat >> /etc/my.cnf.d/mysql-server.cnf <

相关推荐
傻啦嘿哟1 小时前
Python正则表达式:用“模式密码“解锁复杂字符串
linux·数据库·mysql
言之。2 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
辰哥单片机设计3 小时前
JW01三合一传感器详解(STM32)
数据库·mongodb
小刘同学++3 小时前
Qt使用 SQLite 数据库的基本方法
数据库·qt·sqlite
jack_xu5 小时前
高频面试题:如何保证数据库和es数据一致性
后端·mysql·elasticsearch
施嘉伟5 小时前
Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程
数据库·oracle
橘猫云计算机设计6 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
卓怡学长7 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
冰^7 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
电商数据girl7 小时前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理