通用设置
- 源上,开启二进制日志,并配置 server_id
-
每个副本上,配置 server_id
-
(可选) 为副本创建单独用户,与源进行身份验证期间使用
-
需要记录源的二进制日志位置
-
如果源上已有数据,需要先将数据复制到副本
-
源和副本的连接设置要一致
前提
确保网络通畅
- 不要使用 skip_networking 选项
源和副本上配置不同的 server_id
-
默认1,范围是1到2^32-1
8.0 版本之前,默认0,表示拒绝主/从节点的连接。
-
动态设置
SET GLOBAL server_id = 2;
开启二进制日志
- 副本可以不开启二进制日志
规划
架构
- 源
- 172.16.0.20:3306
- 副本
- 172.16.0.21:3306
系统变量
- 二进制日志
- log_bin
- 控制开启/禁用二进制日志。默认已开启
- log_bin_index
- 二进制日志的索引文件
- binlog_format
- 二进制日志的格式
- log_bin
- 中继日志
- relay_log
- 控制开启/禁用中继日志
- relay_log_index
- 中继日志的索引文件
- relay_log_purge
- 控制自动删除中继日志
- relay_log_recovery
- 控制中继日志的崩溃恢复
- relay_log_info_repository
- 副本服务器的信息存储库位置。默认 TABLE
- relay_log
- 源
master_info_repository这个系统变量已过时,将来会删除,而且源服务器信息都会存储在表中,不再使用文件存储。
- 源服务器信息的存储库位置。默认 TABLE
- 有效值
FILE:数据目录中两个文件master.inforelay-log.info
- TABLE:信息保存在 mysql 表中
- slave_master_info
- slave_relay_log_info
- 副本
- log_slave_updates
- 控制是否将复制的内容记录到二进制日志。默认已开启
- slave_load_tmpdir
- LOAD DATA 的目录
- slave_net_timeout
- 通信超时时间
- slave_parallel_workers
- 应用线程是否启用并行
- slave_preserve_commit_order
- 控制副本事务有序提交 (串行)
- sql_slave_skip_counter
- 跳过的事件数
- log_slave_updates
- 安全
- innodb_flush_log_at_trx_commit=1
- sync_binlog=1
配置过程
源上创建一个复制账户
mysql> create user repl@'172.16.0.%' identified by 'repl';
mysql> grant replication slave on *.* to repl@'172.16.0.%';
- 每个副本使用 MySQL 用户名和密码连接到源,因此源上必须有一个用户帐户,副本可用于连接
- 8.0 版本,使用 caching_sha2_password 作为身份验证插件,这个插件要求必须使用加密连接
- 复制账户所需权限
- REPLICATION SLAVE
获取源服务器的数据快照 (备份)
- 使用 mysqldump 创建数据快照
shell> mysqldump -uroot -p -S /tmp/mysql.sock -A --master-data=2 --single-transaction > /tmp/full.sql shell> scp /tmp/full.sql root@172.16.0.21:/tmp/full.sql
- –master-data
- 使输出中包含二进制日志的位置和文件名。便于执行 change master to 语句以启用复制
- –ignore-table
- 指定要排除的表
- –databases
- 指定要备份的库
- –master-data
- 使用原始数据文件创建数据快照
- 源和副本的以下变量要相同
“`sql
mysql> show variables like 'ft%';
+————————–+—————-+
| Variable_name | Value |
+————————–+—————-+
| ft_boolean_syntax | + -> tar -Jcf /tmp/db.tar.xz /mdata/ # -J:使用 xz 压缩格式
or
shell> rsync -a mdata 172.16.0.21:/tmp
“`- 重启服务
- 使用克隆插件把数据克隆过去
- 源和副本的以下变量要相同
在副本服务器上还原备份
- 还原 mysqldump 备份
shell> mysql -uroot -p -S /tmp/mysql.sock set sql_log_bin=0; mysql> source /tmp/full.sql; mysql> set sql_log_bin=1;
- 还原原始数据文件
shell> tar -xvf db.tar.xz
获取源的二进制日志坐标
- 获取当前二进制日志坐标
mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000009 | 760 | | | | +---------------+----------+--------------+------------------+-------------------+
- 查询 mysqldump 备份文件
shell> more /tmp/full.sql ... -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=760;
在副本上设置源服务器信息
- CHANGE REPLICATION SOURCE TO
CHANGE REPLICATION SOURCE TO SOURCE_HOST='172.16.0.20', SOURCE_USER='repl', SOURCE_PASSWORD='repl', SOURCE_PORT=3306, SOURCE_LOG_FILE='binlog.000009', SOURCE_LOG_POS=760 SOURCE_PUBLIC_KEY_PATH='public_key.pem', GET_SOURCE_PUBLIC_KEY=1;
- 选项
如果不使用安全连接,并且使用 SOURCE_USER 选项通过 caching_sha2_password 插件进行身份验证,则必须启用基于 RSA 密钥对的密码交换。
- SOURCE_PUBLIC_KEY_PATH
- GET_SOURCE_PUBLIC_KEY
- 通过帮助查看所有选项
mysql> ? change master to
- 选项
CHANGE MASTER TOCHANGE MASTER TO MASTER_HOST='172.16.0.20', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_PORT=3306, MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=760, MASTER_PUBLIC_KEY_PATH='public_key.pem', GET_MASTER_PUBLIC_KEY=1;
选项如果不使用安全连接,并且使用 SOURCE_USER | MASTER_USER 选项通过 caching_sha2_password 插件进行身份验证,则必须启用基于 RSA 密钥对的密码交换。
MASTER_PUBLIC_KEY_PATHGET_MASTER_PUBLIC_KEY
- 注意事项
- 8.0 版本必须开启自动提交 autocommit,否则副本会话上的中继日志应用时不会自动提交,这是与 5.7 版本的差异
开启副本
mysql> start slave | replica;
查看复制状态
mysql> show slave | replica status\G
...
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
如果副本配置错误,还可以重置
mysql> stop slave; reset slave;
or
mysql> stop replica; reset replica;
- reset replica
- 主要是清除中继日志
- reset replica all
- 会清除 change replication source to 的选项
将新副本添加到复制环境
可以复制现有副本的目录,修改 server_id 来实现,或者通过克隆插件克隆数据。
停止现有副本,并记录状态
记录二进制日志文件和中继日志的位置。
mysql> stop slave | replica;
mysql> show slave | replica status\G
复制现有副本的目录
- 关闭副本服务
shell> mysqladmin shutdown
-
将数据目录从现有副本复制到新副本,包括日志文件和中继日志文件 (tar、cp、rsync、scp)
-
修改新副本的 server_id
-
复制后,在新副本上的数据目录副本中删除 auto.cnf 文件,以便使用其他生成的服务器 UUID 启动新副本
重启现有副本
mysql> start slave | replica;
启动新的副本服务器
开启新副本
mysql> start slave | replica;
查看复制状态
mysql> show slave | replica status\G