故障案例--通过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


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