## 实验环境 此次实验的环境如下 - MySQL 5.7.25 - Redhat 6.10 - 操作系统账号:mysql - 数据库复制账号:repl - 复制格式:基于行的复制 | IP地址 |主从关系|复制账号 |复制格式 | | --- | --- | --- | --- | | 11.12.14.29 | 主库 | repl |Row-Based | | 11.12.14.30| 从库(半同步)| repl |Row-Based| | 11.12.14.31| 从库(异步)| repl |Row-Based| 这节我们的内容为MySQL的复制,MySQL复制有两种形式 - 基于二进制日志文件位置 - 基于GTID 上节我们讲了如何通过备份主库来进行复制的搭建,如果主库不允许我们进行备份,这时可以通过备库来进行 通过备库进行搭建和通过主库搭建步骤是一样的,只是在备份备库时使用--dump-slave参数而不是--master-data参数 该参数的目的为获取该备库对应的主库的二进制的位置 这里我假设大家已经搭建好了一套主从的复制 ## 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 ``` **从库(异步)** ``` [mysqld] server-id = 11121431 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参数确保无其他写入 之后重启数据库 这里需要注意的是如果从库是由主库克隆而来,这时的uuid是一样的,这样也会报错 ## 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> CREATE USER 'repl'@'11.12.14.31' IDENTIFIED BY 'rpl'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'11.12.14.31'; mysql>flush privileges; ``` 这里我们限制该账号只能从同步的三台服务器上连接 ## 4. 备份主库 我们通过mysqldump备份主库的文件,这里使用--dump-slave来获取主库的位置点 **从库(异步)** ``` mysqldump -S /data/mysql/data/mysql.sock -usystem -p --all-databases --dump-slave --set-gtid-purged=off > /tmp/dumpslave.sql ``` ## 5. 文件传输 接下来将主库的dump文件传到备份,之后更改备库的文件权限 **从库(半同步)** ``` scp /tmp/dumpslave.sql root@11.12.14.30:/tmp ``` **从库(异步)** ``` chown mysql:mysql /tmp/dumpslave.sql ``` ## 6. 备库导入数据 接下来我们将备份的数据导入到备份 **从库(异步)** ``` mysql -S /data/mysql/data/mysql.sock -usystem -p </tmp/dumpslave.sql ``` ## 7.开始同步 接下来我们开启同步 首先我们查看dumpslave.sql文件中master的信息 [image:642 size:orig] 之后使用如下命令开启同步 **从库(异步)** ``` mysql> change master to master_host='11.12.14.29', master_user='repl', master_password='rpl',master_log_file='mysql-bin.000003',master_log_pos= 9615332; mysql > start slave; ``` ## 8. 查看同步状态 使用如下命令查看同步是否正常 **从库(异步)** ``` mysql>show slave status\G ``` [image:643 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; ``` 该命令更多内容后面介绍 ## 10. 参考资料 本专题内容翻译自官方文档并结合自己的环境 [https://dev.mysql.com/doc/refman/5.7/en/replication.html](https://dev.mysql.com/doc/refman/5.7/en/replication.html)