-
2. MySQL 复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
tutorial2
-
-
Attachments
-
Changes
-
View Source
-
View
## 实验环境
此次实验的环境如下
- MySQL 5.7.25
- Redhat 6.10
- 操作系统账号:mysql
- 数据库复制账号:repl
- 复制格式:基于行的复制
| IP地址 |主从关系|复制账号 |复制格式 |
| --- | --- | --- | --- |
| 11.12.14.29 | 主库 | repl |Row-Based |
| 11.12.14.30| 从库(半同步)| repl |Row-Based|
这节我们的内容为MySQL的复制,MySQL复制有两种形式
- 基于二进制日志文件位置
- 基于GTID
这节为第一种基于二进制日志文件位置
## 1. 开启二进制日志功能
无论是使用哪种方式我们都需要启用二进制日志功能
如果未开启则需要在my.cnf文件中加入如下参数,需要重启数据库生效
**主库**
```
[mysqld]
server-id = 11121429
binlog_format = row
log_bin = /datalog/mysql/binlog/mysql-bin.log
expire_logs_days = 14
log-slave-updates=ON
```
**从库**
```
[mysqld]
server-id = 11121430
binlog_format = row
log_bin = /datalog/mysql/binlog/mysql-bin.log
expire_logs_days = 14
log-slave-updates=ON
read_only=1
```
我们需要保证server-id不一样,这里我们用IP地址命名
从库使用了read_only参数确保无其他写入
之后重启数据库
## 2. 查看UUID是否一致
需要注意的是如果从库是由主库克隆而来,这时的uuid是一样的,这样也会报错
该文件位于daadir的auto.cnf文件中
```
vim /data/mysql/data/auto.cnf
```
如果一样可删除该文件后重新启动数据库即可,这时会生成一个新的文件
## 3. 建立复制账号
接下来我们建立一个独立的用于复制的账号
**主库和从库**
```
mysql> CREATE USER 'repl'@'11.12.14.29' IDENTIFIED BY 'rpl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'11.12.14.29';
mysql> CREATE USER 'repl'@'11.12.14.30' IDENTIFIED BY 'rpl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'11.12.14.30';
mysql>flush privileges;
```
这里我们限制该账号只能从同步的两台服务器上连接
## 4. 备份主库
我们通过mysqldump备份主库的文件
**主库**
```
mysqldump -S /data/mysql/data/mysql.sock -usystem -p --all-databases --single-transaction --master-data=2 --set-gtid-purged=off --triggers --events --routines --hex-blob > /tmp/dumpmaster.sql
```
```
mysqldump -S /data/mysql/data/mysql.sock -usystem -p --databases test --single-transaction --master-data=2 --set-gtid-purged=off --triggers --events --routines --hex-blob > /tmp/dumpmaster.sql
```
## 5. 文件传输
接下来将主库的dump文件传到备份,之后更改备库的文件权限
**主库**
```
scp /tmp/dumpmaster.sql root@11.12.14.30:/tmp
```
**从库**
```
chown mysql:mysql /tmp/dumpmaster.sql
```
## 6. 备库导入数据
接下来我们将备份的数据导入到备份
```
mysql -S /data/mysql/data/mysql.sock -usystem -p </tmp/dumpmaster.sql
```
## 7.开始同步
接下来我们开启同步
首先我们查看dumpmaster.sql文件中master的信息
[image:635 size:orig]
之后使用如下命令开启同步
```
mysql> change master to master_host='11.12.14.29', master_user='repl', master_password='rpl',master_log_file='mysql-bin.000001',master_log_pos= 10843699;
mysql > start slave;
```
MySQL 8.0之后需要加额外的参数
```
mysql> change master to master_host='11.12.14.29', master_user='repl', master_password='rpl',master_log_file='mysql-bin.000001',master_log_pos= 10843699 ,get_master_public_key=1;
mysql > start slave;
```
## 8. 查看同步状态
使用如下命令查看同步是否正常
```
mysql>show slave status\G
```
[image:634 size:orig]
主要关注如下几点
- Slave_IO_Running需要为YES
- Slave_SQL_Running需要为YES
- Seconds_Behind_Master需要为0
## 9. 重启和重置复制
使用如下命令关闭重启
```
mysql>stop slave;
mysql>start slave;
```
我们可以独立的重启IO进程或者SQL进程
```
mysql>stop slave sql_thread;
mysql>stop slave io_thread;
mysql>start slave io_thread;
mysql>start slave sql_thread;
```
使用如下命令重置复制
```
mysql>reset slave all;
```
该命令更多内容后面介绍
## 10. 参考资料
本专题内容翻译自官方文档并结合自己的环境
[https://dev.mysql.com/doc/refman/5.7/en/replication.html](https://dev.mysql.com/doc/refman/5.7/en/replication.html)