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 <<EOF

binlog_do_db= db1

binlog_do_db= db2

EOF

#只同步db1和db2

[root@master ~]# systemctl restart mysqld.service

1.4.2 测试

1、保证数据一致

[root@master ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+

[root@slave1 ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+

[root@slave1 ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+

[root@slave2 ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
2、创建一堆数据库包括db1和db2

[root@master ~]# mysql -e 'create database db1'

[root@master ~]# mysql -e 'create database db2'

[root@master ~]# mysql -e 'create database ppt'

[root@master ~]# mysql -e 'create database word'

[root@master ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
| ppt                |
| school             |
| sys                |
| word               |
+--------------------+
3、从库查看

[root@slave1 ~]# mysql -e 'show databases' #只有db1和db2被同步

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+

[root@slave2 ~]# mysql -e 'show databases'

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
相关推荐
一行玩python22 分钟前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
MXsoft61842 分钟前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
TheITSea1 小时前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
王ASC2 小时前
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】
数据库·sql·oracle
Dlwyz2 小时前
问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
数据库·redis·缓存
如意机反光镜裸3 小时前
如何快速将Excel数据导入到SQL Server数据库
数据库
Stara05113 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
不爱学习的啊Biao3 小时前
初识mysql数据库
数据库·mysql·oracle
宛唐羁客4 小时前
ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
网络·数据库
吴半杯4 小时前
Redis-monitor安装与配置
数据库·redis·缓存