TiDB Lightning Table Filter

TiDB Lightning supports setting up black and white lists to ignore certain databases and tables. This can be used to skip cache tables, or manually partition the data source on a shared storage to allow multiple Lightning instances work together without interfering each other.

The filtering rule is similar to MySQL replication-rules-db/replication-rules-table.

Filtering databases

[black-white-list] do-dbs = ["pattern1", "pattern2", "pattern3"] ignore-dbs = ["pattern4", "pattern5"]
  • If the do-dbs array in the [black-white-list] section is not empty,
    • If the name of a database matches any pattern in the do-dbs array, the database is included.
    • Otherwise, the database is skipped.
  • Otherwise, if the name matches any pattern in the ignore-dbs array, the database is skipped.
  • If a database’s name matches both the do-dbs and ignore-dbs arrays, the database is included.

The pattern can either be a simple name, or a regular expression in Go dialect if it starts with a ~ character.

Filtering tables

[[black-white-list.do-tables]] db-name = "db-pattern-1" tbl-name = "table-pattern-1" [[black-white-list.do-tables]] db-name = "db-pattern-2" tbl-name = "table-pattern-2" [[black-white-list.do-tables]] db-name = "db-pattern-3" tbl-name = "table-pattern-3" [[black-white-list.ignore-tables]] db-name = "db-pattern-4" tbl-name = "table-pattern-4" [[black-white-list.ignore-tables]] db-name = "db-pattern-5" tbl-name = "table-pattern-5"
  • If the do-tables array is not empty,
    • If the qualified name of a table matched any pair of patterns in the do-tables array, the table is included.
    • Otherwise, the table is skipped
  • Otherwise, if the qualified name matched any pair of patterns in the ignore-tables array, the table is skipped.
  • If a table’s qualified name matched both the do-tables and ignore-tables arrays, the table is included.

Note that the database filtering rules are applied before Lightning considers the table filtering rules. This means if a database is ignored by ignore-dbs, all tables inside this database are not considered even if they matches any do-tables array.

Example

To illustrate how these rules work, suppose the data source contains the following tables:

`logs`.`messages_2016` `logs`.`messages_2017` `logs`.`messages_2018` `forum`.`users` `forum`.`messages` `forum_backup_2016`.`messages` `forum_backup_2017`.`messages` `forum_backup_2018`.`messages` `admin`.`secrets`

Using this configuration:

[black-white-list] do-dbs = [ "forum_backup_2018", # rule A "~^(logs|forum)$", # rule B ] ignore-dbs = [ "~^forum_backup_", # rule C ] [[black-white-list.do-tables]] # rule D db-name = "logs" tbl-name = "~_2018$" [[black-white-list.ignore-tables]] # rule E db-name = "~.*" tbl-name = "~^messages.*" [[black-white-list.do-tables]] # rule F db-name = "~^forum.*" tbl-name = "messages"

First apply the database rules:

DatabaseOutcome
`logs`Included by rule B
`forum`Included by rule B
`forum_backup_2016`Skipped by rule C
`forum_backup_2017`Skipped by rule C
`forum_backup_2018`Included by rule A (rule C will not apply)
`admin`Skipped since do-dbs is not empty and this does not match any pattern

Then apply the table rules:

TableOutcome
`logs`.`messages_2016`Skipped by rule E
`logs`.`messages_2017`Skipped by rule E
`logs`.`messages_2018`Included by rule D (rule E will not apply)
`forum`.`users`Skipped, since do-tables is not empty and this does not match any pattern
`forum`.`messages`Included by rule F (rule E will not apply)
`forum_backup_2016`.`messages`Skipped, since database is already skipped
`forum_backup_2017`.`messages`Skipped, since database is already skipped
`forum_backup_2018`.`messages`Included by rule F (rule E will not apply)
`admin`.`secrets`Skipped, since database is already skipped