测试一:
从:
vi /etc/my.cnf
replicate_do_db=hadoop
测试步骤:
主:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
+------+
3 rows in set (0.00 sec)
mysql> use love;
mysql> insert into hadoop.test values(4);
Query OK, 1 row affected (0.00 sec)
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 4 |
+------+
4 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
+------+
3 rows in set (0.00 sec)
结果:数值4未同步过来
原因分析:
对于基于语句级的复制(或mixed级别),replicate_do_db这个参数指的是默认的数据库,即当前使用的数据库(use database),在默认数据库下更新replicate_do_db指定的数据库,从库不会随之更新。
测试二:
从:
vi /etc/my.cnf
replicate_do_db=hadoop
repalicate_wild_do_table=hadoop.%
主:
mysql> use love;
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 4 |
+------+
4 rows in set (0.00 sec)
mysql> insert into hadoop.test values(5);
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 5 |
| 4 |
+------+
5 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
+------+
3 rows in set (0.00 sec)
结果:5未插入,同步未成功
vi /etc/my.cnf
replicate_wild_do_table=hadoop.%
主:
mysql> use love;
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 5 |
| 4 |
+------+
5 rows in set (0.00 sec)
mysql> insert into hadoop.test values(6);
Query OK, 1 row affected (0.00 sec)
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 6 |
| 2 |
| 5 |
| 4 |
+------+
6 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
| 6 |
+------+
4 rows in set (0.00 sec)
结果:6同步成功
结论:对于binlog_format=statement或mixed,只在从库设置replicate_wild_do_table= hadoop.%或replicate_wild_ignore_table即可。此时可以避免跨库更新问题。
从:
vi /etc/my.cnf
replicate_do_db=hadoop
测试步骤:
主:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
+------+
3 rows in set (0.00 sec)
mysql> use love;
mysql> insert into hadoop.test values(4);
Query OK, 1 row affected (0.00 sec)
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 4 |
+------+
4 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
+------+
3 rows in set (0.00 sec)
结果:数值4未同步过来
原因分析:
对于基于语句级的复制(或mixed级别),replicate_do_db这个参数指的是默认的数据库,即当前使用的数据库(use database),在默认数据库下更新replicate_do_db指定的数据库,从库不会随之更新。
测试二:
从:
vi /etc/my.cnf
replicate_do_db=hadoop
repalicate_wild_do_table=hadoop.%
主:
mysql> use love;
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 4 |
+------+
4 rows in set (0.00 sec)
mysql> insert into hadoop.test values(5);
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 5 |
| 4 |
+------+
5 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
+------+
3 rows in set (0.00 sec)
结果:5未插入,同步未成功
结论:即使同时使用这两个参数,同步也会存在问题。
测试三:
从:vi /etc/my.cnf
replicate_wild_do_table=hadoop.%
主:
mysql> use love;
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 2 |
| 5 |
| 4 |
+------+
5 rows in set (0.00 sec)
mysql> insert into hadoop.test values(6);
Query OK, 1 row affected (0.00 sec)
mysql> select * from hadoop.test;
+------+
| id |
+------+
| 1 |
| 3 |
| 6 |
| 2 |
| 5 |
| 4 |
+------+
6 rows in set (0.00 sec)
从:
mysql> use hadoop;
mysql> select * from test;
+------+
| id |
+------+
| 3 |
| 1 |
| 2 |
| 6 |
+------+
4 rows in set (0.00 sec)
结果:6同步成功
结论:对于binlog_format=statement或mixed,只在从库设置replicate_wild_do_table= hadoop.%或replicate_wild_ignore_table即可。此时可以避免跨库更新问题。