故障现象
主从同步失败,报错如下
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