故障案例--通過create server創建federate引擎導致主從失敗

故障現象

主從同步失敗,報錯如下

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章