本文问题
- 如何只复制部分数据到从库上?过滤机制是在主库上还是在从库上实现的?
- 要只复制主库中的一部分内容到从库,可以在哪几个级别进行数据的过滤,涉及的相关选项有哪些?
- 如何设置只记录部分更新语句到二进制日志中,评估的规则是怎样的?
- 在从库上,通过哪几个选项可以在数据库级别控制哪些语句在从库上执行?评估规则是怎样的?
- 在从库上,通过哪几个选项可以在表级别控制哪些语句在从库上执行?评估规则是怎样的?
过滤规则
ignore
表示忽略,do
表示记录或执行
主库上的过滤
未记录在主库二进制日志中的更改不会复制到从库上
通过--binlog-do-db
和--binlog-ignore-db
来控制写入主库的二进制记录
- 如果不存在
--binlog-do-db
和--binlog-ignore-db
,记录到日志中 - 存在选项但是没有使用
USE
选择默认数据库,忽略这个语句(但是实际测试不使用USE
的DDL语句也会进行记录) - 检查
--binlog-do-db
。如果不存在--binlog-do-db
选项,进行下一步 - 检查
--binlog-ignore-db
从库上的过滤
在从库上,通过一系列的--replicate-*
选项来确定执行或忽略哪些语句。也可以通过GHANGE REPLICATEION FILTER
语句来动态设置过滤器。
首先检查数据库级别的过滤选项--replicate-do-db
,--replicate-ignore-db
如果没有数据库级别的过滤选项,MySQL检查表级别的过滤选项
如果存在一个或多个数据库级别的过滤选项,不在这些选项中的库的语句不会执行。
数据库级复制的过滤
通过--replicate-do-db
和--replicate-ignore-db
控制哪些数据库的更改在从库上执行
- 首先根据
binlog_format
确定默认数据库,对于STATEMENT
格式的记录,默认数据库是使用USE
指定的,对于ROW
格式的记录,默认数据库是更新的数据所在的库 - 查看是否存在
--replicate-do-db
选项,如果存在,则默认数据库在--replicate-do-db
中的更新会进行下一步表级别的过滤,不在其中的库不会在从库上更新。 - 查看是否存在
--replicate-ignore-db
选项,如果存在,在默认数据库包括在--replicate-ignore-db
中的更新不会在从库上执行,其他库的更新进行下一步表级别的过滤
- 当
--replicate-do-db
和--replicate-ignore-db
同时存在时,--replicate-do-db
的优先级更高,不在--replicate-do-db
中的库不会在从库上复制。 - 当
binlog_format=ROW
时,DML
语句的默认数据库根据更新的内容自动获取,但是DDL语句的默认数据库需要通过USE
指定
表级复制的过滤
通过--replicate-do-table
,--replicate-wild-do-table
和--replicate-ignore-table
,--replicate-wild-ignore-table
选项控制表级别的过滤
区别:
--replicate-do-table
和 --replicate-ignore-table
每次只能指定一个表,指定多个表需要多次设置,示例:--replicate-do-table:channel_1:db_name.tbl_name
--replicate-wild-do-table
和--replicate-wild-ignore-table
支持通配符,示例:--replicate-wild-do-table=foo%.bar%
- 是否存在表级别的过滤选项,如果没有,执行语句
- 如果存在表级别的过滤选项,按照以下顺序进行检查
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
问题答案
- 如何只复制部分数据到从库上?过滤机制是在主库上还是在从库上实现的?
使用replication*
选项来控制数据的过滤,过滤是在从库上实现的,主库上的所有二进制日志都会传输到从库上,从库根据过滤规则来决定执行其中的哪些事务 - 要只复制主库中的一部分内容到从库,可以在哪几个级别进行数据的过滤,涉及的相关选项有哪些?
- 主库binlog级别:
--binlog-do-db
和--binlog-ignore-db
- 从库数据库级别:
--replicate-do-db,--replicate-ignore-db
- 从库表级别:
--replicate-do-table, --replicate-ignore-table
和--replicate-wild-do-table,--replicate-wild-ignore-table
- 如何设置只记录部分更新语句到二进制日志中,评估的规则是怎样的?
--binlog-do-db,--binlog-ignore-db
- 如果不存在--binlog-do-db和--binlog-ignore-db,记录到日志中
- 存在选项但是没有使用USE选择默认数据库,忽略这个语句(但是实际测试不使用USE的DDL语句也会进行记录)
- 检查--binlog-do-db
- 检查--binlog-ignore-db
- 在从库上,通过哪几个选项可以在数据库级别控制哪些语句在从库上执行?评估规则是怎样的?
--replicate-do-db
和--replicate-ignore-db
- 首先根据
binlog_format
确定默认数据库,对于STATEMENT
格式的记录,默认数据库是使用USE
指定的,对于ROW
格式的记录,默认数据库是更新的数据所在的库 - 检查
--replicate-do-db
- 检查
--replicate-ignore-db
- 在从库上,通过哪几个选项可以在表级别控制哪些语句在从库上执行?评估规则是怎样的?
--replicate-do-table,--replicate-wild-do-table
和--replicate-ignore-table,--replicate-wild-ignore-table
如果存在表级别的过滤选项,按照以下顺序进行检查
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
网友评论