Skip to content

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 = ROW

2. 创建复制用户

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.sql

4. 配置从库

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.table2

5. 恢复备份到从库

bash
mysql -u root -p < partial_backup.sql

6. 启动复制

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.table2

Q4: 如何验证表级复制是否正常工作?

A4: 可以通过以下方法验证:

  • 检查SHOW SLAVE STATUS输出,确认复制正常运行
  • 在主库上修改配置的表,检查从库是否同步更新
  • 在主库上修改未配置的表,检查从库是否不会同步更新

Q5: 表级复制与二进制日志格式有关系吗?

A5: 有关系。表级复制在ROW格式的二进制日志下更高效可靠,因为ROW格式记录的是行级变更,更容易进行表级过滤。

Q6: 可以同时使用表级复制和数据库级复制吗?

A6: 可以,但需要注意规则的优先级。复制过滤规则的优先级是:

  1. replicate-ignore-table 和 replicate-wild-ignore-table
  2. replicate-do-table 和 replicate-wild-do-table
  3. replicate-ignore-db 和 replicate-wild-ignore-db
  4. replicate-do-db 和 replicate-wild-do-db

Q7: MySQL 8.0对表级复制有哪些改进?

A7: MySQL 8.0对表级复制的改进包括:

  • 支持在线修改复制过滤规则
  • 引入了复制通道,支持为不同通道配置不同的过滤规则
  • 改进了复制过滤的性能
  • 增强了复制过滤的错误处理

Q8: 如何迁移从表级复制到全库复制?

A8: 可以按照以下步骤迁移:

  1. 在从库上移除表级复制过滤规则
  2. 备份主库的所有数据
  3. 恢复全量备份到从库
  4. 重新配置复制
  5. 启动复制,验证数据同步

Q9: 表级复制会导致从库的binlog不完整吗?

A9: 不会。从库的binlog会记录从主库复制过来的所有事件,无论是否配置了表级过滤规则。如果从库需要作为其他从库的主库,需要注意这一点。