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 <

相关推荐
ptc学习者1 分钟前
OGG 安装注意事项
java·开发语言·数据库
鸽鸽程序猿40 分钟前
【MySQL】索引
数据库·mysql
zym大哥大1 小时前
Redis-Zest
数据库·redis·缓存
zl9798991 小时前
Redis-stream、bitfield类型
数据库·redis·缓存
数据库那些事儿2 小时前
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
数据库·后端
IvorySQL2 小时前
PostgreSQL 18 异步 I/O(AIO)调优指南
数据库·postgresql
kakacc:2 小时前
记录一次巧妙的SQL:一对多关联导致的 sum () 、count()等group函数重复计算问题
数据库·sql
心随雨下2 小时前
Redis中Geospatial 实际应用指南
数据库·redis·分布式·缓存
黑夜管理员2 小时前
Sql Server安装报错“服务没有及时响应启动或控制请求”
数据库·sql server
NineData2 小时前
NineData云原生智能数据管理平台新功能发布|2025年9月版
数据库·云原生·devops·ninedata·数据库迁移·数据复制·风险sql管控