MySQL에서는 데이터를 복제할 때 필터 할 수 있는 기능을 제공한다.
MySQL 5.7부터는 서버 재기동 없이 온라인으로 설정할 수 있게 되었다.
Replication filter options
1. replicate-do-db=dbname # 복제할 데이터베이스 지정
2. replicate-ignore-db=dbname # 복제 대상에서 제외할 데이터베이스 지정
3. replicate-do-table=dbname.table # 복제할 테이블 지정
4. replicate-ignore-table=dbname.table # 복제 대상에서 제외할 테이블 지정
5. replicate-rewrite-db=from_name->to_name # from_name 데이터베이스를 to_name 데이터베이스로 바꿔서 복제하도록 지정
6. replicate-wild-do-table=dbname.% # 복제할 테이블을 '%' 또는 '_' 와일드카드 문자로 설정
7. replicate-wild-ignore-table=dbname.% #
제외할 테이블을 '%' 또는 '_' 와일드카드 문자로 설정
주의점
SBR(statement-based replication)에서 replicate-do-db를 이용할 경우 cross-database statements는 복제되지 않는다.
SQL thread가 default database를 기준으로 제한하고 있기 때문이다.
# On slave
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.0.2
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 6025
Relay_Log_File: mysql-relay-bin.000015
Relay_Log_Pos: 395
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test_db_01 # Slave에서 test_db_01만을 복제하도록 설정
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
# On master
mysql> USE mysql;
Database changed
mysql> INSERT INTO test_db_01.test_table (id) VALUES (1111);
Query OK, 1 row affected (0.02 sec)
# On Slave
mysql> SELECT * FROM test_db_01.test_table;
Empty set (0.00 sec)
cross-database갱신도 복제를 하기 위해서는 replicate-wild-do-table를 이용해야한다.
# On slave
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.0.2
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 6408
Relay_Log_File: mysql-relay-bin.000017
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: test_db_01.%
# On master
mysql> USE mysql;
Database changed
mysql> INSERT INTO test_db_01.test_table (id) VALUES (2222);
Query OK, 1 row affected (0.02 sec)
# On slave
mysql> SELECT * FROM test_db_01.test_table;
+------+
| id |
+------+
| 2222 |
+------+
1 row in set (0.00 sec)
# Refer
https://dev.mysql.com/doc/refman/5.6/en/replication-options-replica.html