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 <

相关推荐
s***5581几秒前
【MySQL】RedHat8安装mysql9.1
数据库·mysql·adb
笨笨没好名字5 分钟前
AI4CAD:用python+creo实现批量参数建模(creo二次开发示例)
数据库·python·microsoft
f***45326 分钟前
PostgreSQL常用时间函数与时间计算提取示例说明
数据库·postgresql
e***v3569 分钟前
redis分页查询
数据库·redis·缓存
9***446314 分钟前
MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序
数据库·microsoft
红石榴花生油14 分钟前
RBAC权限配置 核心笔记
数据库·windows·笔记
TracyCoder12315 分钟前
MySQL 实战宝典(九):Sharding-JDBC分库分表框架解析
数据库·mysql
W***533118 分钟前
MySQL 与 Redis 的数据一致性问题
数据库·redis·mysql
n***44324 分钟前
mysql查看binlog日志
数据库·mysql
k***082937 分钟前
mysql中general_log日志详解
android·数据库·mysql