外观
MySQL 表级复制
什么是表级复制
只复制主库上特定表的数据到从库,是MySQL复制过滤功能的一种应用。可以减少从库的存储和计算资源消耗,适合只需要主库部分数据的场景。
表级复制的应用场景
- 从库只需要主库的部分核心表
- 不同从库需要主库的不同表集合
- 减轻从库的存储和计算压力
- 实现数据的选择性复制
表级复制的限制
- 复制过滤规则只在从库上生效
- 主库仍然会生成所有表的二进制日志
- 可能导致从库数据不一致
- 不支持跨数据库的表级复制过滤
表级复制的实现方式
1. 基于复制过滤规则
--replicate-do-table 选项
- 只复制指定的表
- 支持通配符
bash
# 在从库的my.cnf中配置
slave_skip_errors = 1062
replicate-do-table = db1.table1
replicate-do-table = db2.table2
replicate-do-table = db3.`table with spaces`--replicate-ignore-table 选项
- 忽略指定的表,复制其他所有表
bash
# 在从库的my.cnf中配置
replicate-ignore-table = db1.table_to_ignore
replicate-ignore-table = db2.ignore_*--replicate-wild-do-table 选项
- 支持通配符的表复制
- 格式:db_name.table_name
bash
# 在从库的my.cnf中配置
replicate-wild-do-table = db1.%-table
replicate-wild-do-table = %.audit_log--replicate-wild-ignore-table 选项
- 支持通配符的表忽略
bash
# 在从库的my.cnf中配置
replicate-wild-ignore-table = db1.%_temp
replicate-wild-ignore-table = %.log%2. 基于复制通道
MySQL 8.0引入了复制通道功能,可以为不同的从库配置不同的复制过滤规则:
sql
-- 创建复制通道
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = 'master_host',
SOURCE_USER = 'replication_user',
SOURCE_PASSWORD = 'password',
SOURCE_LOG_FILE = 'binlog.000001',
SOURCE_LOG_POS = 4,
FOR CHANNEL 'channel1';
-- 为通道配置表级复制规则
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (db1.table1, db2.table2) FOR CHANNEL 'channel1';
-- 启动特定通道的复制
START SLAVE FOR CHANNEL 'channel1';表级复制的配置步骤
1. 配置主库
确保主库启用了二进制日志和唯一服务器ID:
bash
# 在主库的my.cnf中配置
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW2. 创建复制用户
sql
-- 在主库上创建复制用户
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;3. 备份主库数据
bash
# 备份需要复制的表
mysqldump -u root -p --single-transaction --master-data=2 db1 table1 db2 table2 > partial_backup.sql4. 配置从库
bash
# 在从库的my.cnf中配置
server-id = 2
relay_log = /var/log/mysql/relay-bin.log
read_only = ON
# 配置表级复制过滤规则
replicate-do-table = db1.table1
replicate-do-table = db2.table25. 恢复备份到从库
bash
mysql -u root -p < partial_backup.sql6. 启动复制
sql
-- 在从库上配置主库信息
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'replication_user',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'binlog.000001',
MASTER_LOG_POS = 4;
-- 启动复制
START SLAVE;
-- 检查复制状态
SHOW SLAVE STATUS\G表级复制的最佳实践
1. 选择合适的复制过滤规则
- 根据业务需求选择合适的过滤规则类型
- 尽量使用精确的表名,避免过度使用通配符
- 定期审查和更新过滤规则
2. 监控复制状态
- 定期检查复制状态
- 监控复制延迟
- 关注复制错误日志
3. 确保数据一致性
- 定期验证从库数据与主库的一致性
- 避免在从库上执行写入操作
- 确保过滤规则不会导致数据依赖问题
4. 考虑性能影响
- 主库仍然会生成所有表的二进制日志
- 从库需要解析所有二进制日志事件
- 考虑使用多个从库分担不同表的复制压力
5. 备份策略
- 确保从库的备份策略与复制过滤规则匹配
- 定期测试从库的恢复能力
- 考虑主库和从库的备份一致性
表级复制的常见问题
1. 复制过滤规则不生效
症状
- 从库复制了所有表,而不仅仅是配置的表
解决方案
- 检查复制过滤规则的语法是否正确
- 确保过滤规则配置在从库上
- 检查复制是否已经重启以应用新的配置
2. 从库数据不一致
症状
- 从库某些表的数据与主库不一致
解决方案
- 检查复制过滤规则是否包含了所有相关的表
- 确保没有在从库上执行写入操作
- 定期使用pt-table-checksum验证数据一致性
3. 复制延迟
症状
- 表级复制的从库出现复制延迟
解决方案
- 检查主库的二进制日志生成速度
- 检查从库的硬件性能
- 考虑调整复制过滤规则,减少需要处理的事件数量
- 启用并行复制
4. 复制错误
症状
- 从库复制过程中出现错误
解决方案
- 检查错误日志,分析具体错误原因
- 考虑使用slave_skip_errors跳过特定错误
- 重新初始化从库复制
表级复制与其他复制方式的比较
| 复制方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 全库复制 | 配置简单,数据完整 | 消耗资源多 | 从库需要主库所有数据 |
| 表级复制 | 节省资源,灵活 | 配置复杂,可能数据不一致 | 从库只需要部分表 |
| 数据库级复制 | 配置简单,比全库复制节省资源 | 不够灵活 | 从库只需要特定数据库 |
| 过滤复制 | 最灵活 | 配置复杂,性能影响大 | 特殊复制需求 |
常见问题(FAQ)
Q1: 表级复制会影响主库性能吗?
A1: 表级复制主要影响从库性能,对主库影响较小。主库仍然会生成所有表的二进制日志,但不会因为表级复制而增加额外的负载。
Q2: 可以在运行时修改表级复制规则吗?
A2: 可以,MySQL 5.6+支持在线修改复制过滤规则。可以使用CHANGE REPLICATION FILTER语句动态修改复制规则,无需重启从库。
Q3: 表级复制支持跨数据库的表吗?
A3: 支持,可以在复制过滤规则中指定不同数据库的表。例如:
bash
replicate-do-table = db1.table1
replicate-do-table = db2.table2Q4: 如何验证表级复制是否正常工作?
A4: 可以通过以下方法验证:
- 检查SHOW SLAVE STATUS输出,确认复制正常运行
- 在主库上修改配置的表,检查从库是否同步更新
- 在主库上修改未配置的表,检查从库是否不会同步更新
Q5: 表级复制与二进制日志格式有关系吗?
A5: 有关系。表级复制在ROW格式的二进制日志下更高效可靠,因为ROW格式记录的是行级变更,更容易进行表级过滤。
Q6: 可以同时使用表级复制和数据库级复制吗?
A6: 可以,但需要注意规则的优先级。复制过滤规则的优先级是:
- replicate-ignore-table 和 replicate-wild-ignore-table
- replicate-do-table 和 replicate-wild-do-table
- replicate-ignore-db 和 replicate-wild-ignore-db
- replicate-do-db 和 replicate-wild-do-db
Q7: MySQL 8.0对表级复制有哪些改进?
A7: MySQL 8.0对表级复制的改进包括:
- 支持在线修改复制过滤规则
- 引入了复制通道,支持为不同通道配置不同的过滤规则
- 改进了复制过滤的性能
- 增强了复制过滤的错误处理
Q8: 如何迁移从表级复制到全库复制?
A8: 可以按照以下步骤迁移:
- 在从库上移除表级复制过滤规则
- 备份主库的所有数据
- 恢复全量备份到从库
- 重新配置复制
- 启动复制,验证数据同步
Q9: 表级复制会导致从库的binlog不完整吗?
A9: 不会。从库的binlog会记录从主库复制过来的所有事件,无论是否配置了表级过滤规则。如果从库需要作为其他从库的主库,需要注意这一点。
