• TiDB-Lightning 表库过滤
    • 过滤数据库
    • 过滤表
    • 例子

    TiDB-Lightning 表库过滤

    TiDB-Lightning 支持使用黑名单和白名单来过滤掉某些数据库和表。这可以用来跳过一些用作暂存、毋须迁移的表,或用来手动切分数据源,让多机同时导入。

    这些过滤规则与 MySQL 的 replication-rules-db/replication-rules-table 类似。

    过滤数据库

    1. [black-white-list]
    2. do-dbs = ["pattern1", "pattern2", "pattern3"]
    3. ignore-dbs = ["pattern4", "pattern5"]
    • 如果 [black-white-list] 下的 do-dbs 列表不为空,
      • 如数据库名称匹配 do-dbs 列表中任何一项,则数据库会被导入。
      • 否则,数据库会被略过。
    • 否则,如果数据库名称匹配 ignore-dbs 列表中任何一项,数据库会被略过。
    • 如果数据库名称同时匹配 do-dbsignore-dbs 列表,数据库会被导入。

    如果匹配项首字符为 ~,它会被解析为 Go 语言的正则表达式。否则会视为普通的字串来匹配数据库名称。

    过滤表

    1. [[black-white-list.do-tables]]
    2. db-name = "db-pattern-1"
    3. tbl-name = "table-pattern-1"
    4. [[black-white-list.do-tables]]
    5. db-name = "db-pattern-2"
    6. tbl-name = "table-pattern-2"
    7. [[black-white-list.do-tables]]
    8. db-name = "db-pattern-3"
    9. tbl-name = "table-pattern-3"
    10. [[black-white-list.ignore-tables]]
    11. db-name = "db-pattern-4"
    12. tbl-name = "table-pattern-4"
    13. [[black-white-list.ignore-tables]]
    14. db-name = "db-pattern-5"
    15. tbl-name = "table-pattern-5"
    • 如果 do-tables 列表不为空,
      • 如果表的限定名称匹配 do-tables 列表中任何一对,则表会被导入。
      • 否则,表会被略过。
    • 否则,如果表的限定名称匹配 ignore-tables 列表中任何一对,表会被略过。
    • 如果表的限定名称同时匹配 do-tablesignore-tables 列表,表会被导入。

    注意:

    Lightning 会先执行数据库过滤规则,之后才执行表的过滤规则。所以,如果一个数据库已被 ignore-dbs 略过,即使其下的表匹配 do-tables 也不会再被导入。

    例子

    以下例子演示过滤规则的操作原理。假设数据源包含这些表:

    1. `logs`.`messages_2016`
    2. `logs`.`messages_2017`
    3. `logs`.`messages_2018`
    4. `forum`.`users`
    5. `forum`.`messages`
    6. `forum_backup_2016`.`messages`
    7. `forum_backup_2017`.`messages`
    8. `forum_backup_2018`.`messages`
    9. `admin`.`secrets`

    我们使用以下设置:

    1. [black-white-list]
    2. do-dbs = [
    3. "forum_backup_2018", # 规则 A
    4. "~^(logs|forum)$", # 规则 B
    5. ]
    6. ignore-dbs = [
    7. "~^forum_backup_", # 规则 C
    8. ]
    9. [[black-white-list.do-tables]] # 规则 D
    10. db-name = "logs"
    11. tbl-name = "~_2018$"
    12. [[black-white-list.ignore-tables]] # 规则 E
    13. db-name = "~.*"
    14. tbl-name = "~^messages.*"
    15. [[black-white-list.do-tables]] # 规则 F
    16. db-name = "~^forum.*"
    17. tbl-name = "messages"

    首先进行数据库过滤:

    数据库 结果
    `logs` 导入(规则 B)
    `forum` 导入(规则 B)
    `forum_backup_2016` 略过(规则 C)
    `forum_backup_2017` 略过(规则 C)
    `forum_backup_2018` 导入(规则 A)(不会考虑规则 C)
    `admin` 略过(do-dbs 不为空,且没有匹配的项目)

    然后进行表过滤:

    结果
    `logs`.`messages_2016` 略过(规则 E)
    `logs`.`messages_2017` 略过(规则 E)
    `logs`.`messages_2018` 导入(规则 D)(不会考虑规则 E)
    `forum`.`users` 略过(do-tables 不为空,且没有匹配的项目)
    `forum`.`messages` 导入(规则 F)(不会考虑规则 E)
    `forum_backup_2016`.`messages` 略过(数据库已被剔除)
    `forum_backup_2017`.`messages` 略过(数据库已被剔除)
    `forum_backup_2018`.`messages` 导入(规则 F)(不会考虑规则 E)
    `admin`.`secrets` 略过(数据库已被剔除)