故障現象
主從同步失敗,報錯如下
Error 'Unknown storage engine 'FEDERATED'' on query. Default database: 'test'. Query: 'create table test_federated(`id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', `other` int(20) NOT NULL DEFAULT '0', PRIMARY KEY (`id`),
KEY `name` (`name`), KEY `other_key` (`other`)) ENGINE=FEDERATED CONNECTION='test_server/test_table''
故障原因
主庫採用先創建server的方式創建federate引擎的表,結果create server時mysql默認不會記錄binlog,也就是從庫的mysql.servers記錄傳不到slave,那麼當從庫使用這個server創建federate引擎時,由於找不到對應的server記錄而報錯。
Error 'server name: 'test_server' doesn't exist!' on query. Default database: 'test'. Query: 'create table test_federated(`id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', `other` int(20) NOT NULL DEFAULT '0', PRIMARY KEY
(`id`), KEY `name` (`name`), KEY `other_key` (`other`)) ENGINE=FEDERATED CONNECTION='test_server/test_table''
復現方法
1 主庫上創建server
create server test_server FOREIGN DATA WRAPPER mysql OPTIONS (USER 'ucloudbackup', HOST '10.9.160.116', PORT 3306, DATABASE 'federated',password 'idL060E88F');
2 這時查看主庫的mysql.servers表會有記錄,而從庫的mysql.servers 表無記錄
mysql> select * from mysql.servers;
+-------------+--------------+-----------+--------------+------------+------+--------+---------+-------+
| Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner |
+-------------+--------------+-----------+--------------+------------+------+--------+---------+-------+
| test_server | 10.9.160.116 | federated | ucloudbackup | idL060E88F | 3306 | | mysql | |
+-------------+--------------+-----------+--------------+------------+------+--------+---------+-------+
1 row in set (0.00 sec)
3 主庫上創建federated引擎的表,創建成功並查詢有效
create table test_federated(`id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', `other` int(20) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `name` (`name`), KEY `other_key` (`other`)) ENGINE=FEDERATED CONNECTION='test_server/test_table';
mysql> select * from test_federated;
+----+-------+-------+
| id | name | other |
+----+-------+-------+
| 1 | jiang | 0 |
+----+-------+-------+
1 row in set (2.59 sec)
4 在從庫上show slave status\G發現上述報錯
解決方法
解決方法有兩個
1 出現問題在從庫上先手工創建出該server
2 摒棄這種創建federate的方式,ddl時指定完整的字符串,比如
mysql> create table test_federated1(`id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL DEFAULT '', `other` int(20) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `name` (`name`), KEY `other_key` (`other`)) ENGINE=FEDERATED CONNECTION='mysql://ucloudbackup:[email protected]:3306/federated/test_table';
Query OK, 0 rows affected (0.00 sec)
兩種創建方法官網鏈接如下
https://dev.mysql.com/doc/refman/5.7/en/federated-create-connection.html
https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html