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 <