unknown storage engine ‘FEDERATED‘

FEDERATED存储引擎允许您访问远程 MySQL 数据库中的数据,而无需使用复制或集群技术 。查询本地FEDERATED表会自动从远程(联合)表中提取数据。本地表上不存储任何数据。
FEDERATED如果您从源代码构建 MySQL, 要包含存储引擎,请使用该 选项 调用CMake 。-DWITH_FEDERATED_STORAGE_ENGINE
FEDERATED运行服务器默认不开启存储引擎 ;要启用您必须使用该选项 FEDERATED启动 MySQL 服务器二进制文件。--federated
要检查FEDERATED引擎的源代码,请查看storage/federatedMySQL 源代码分发的目录。

联邦存储引擎概述

当您使用标准存储引擎之一(例如MyISAM、CSV或 InnoDB)创建表时,该表由表定义和相关数据组成。创建 FEDERATED表时,表定义相同,但数据的物理存储在远程服务器上处理。
一个FEDERATED表由两个元素组成:
☑ 带有数据库表的远程服务器,数据库表由表定义(存储在MySQL数据字典中)和关联的表组成。远程表的表类型可以是远程mysqld服务器支持的任何类型,包括MyISAM或InnoDB。
☑ 具有数据库表的本地服务器,其中表定义与远程服务器上相应表的定义相匹配。表定义存储在数据字典中。本地服务器上没有数据文件。相反,表定义包含一个指向远程表的连接字符串。
当在本地服务器上对FEDERATED表执行查询和语句时,通常会从本地数据文件中插入、更新或删除信息的操作会被发送到远程服务器执行,它们会更新远程服务器上的数据文件或从远程服务器返回匹配的行。

FEDERATED 表结构

在这里插入图片描述
当客户端发出一条引用 FEDERATED 的SQL语句时,本地服务器(执行SQL语句的地方)和远程服务器(数据物理存储的地方)之间的信息流如下:
1.存储引擎将遍历FEDERATED表中的每一列,并构造一条引用远程表的适当SQL语句。
2.该语句使用MySQL客户端API发送到远程服务器。
3.远程服务器处理该语句,本地服务器检索该语句产生的任何结果(受影响的行数或结果集)。
4.如果语句生成结果集,则每一列都被转换为FEDERATED引擎所期望的内部存储引擎格式,并可用于向发出原始语句的客户机显示结果。
本地服务器使用MySQL客户端C API函数与远程服务器通信。它调用mysql_real_query()来发送语句。为了读取结果集,它使用mysql_store_result(),并使用mysql_fetch_row()一次读取一行。

如何创建 FEDERATED 表

更多内容请参考MySQL文档
要创建FEDERATED表,您应该按照以下步骤操作:
1、在远程服务器上创建表。或者,记下现有表的表定义,可能使用SHOW CREATE TABLE 语句。
2、在本地服务器上创建具有相同表定义的表,但添加将本地表链接到远程表的连接信息。

CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=MyISAM
DEFAULT CHARSET=utf8mb4;

要创建与远程表联合的本地表,有两个选项可用。您可以创建本地表并指定连接字符串(包含使用connection连接到远程表的服务器名称、登录名、密码),也可以使用之前使用create server语句创建的现有连接。

Important
创建本端表时,它必须具有与远程表相同的字段定义。
Note
可以通过向主机上的表添加索引来提高FEDERATED表的性能。之所以会发生优化是因为发送到远程服务器的查询包含WHERE子句的内容,并被发送到远程服务器,随后在本地执行。这减少了网络流量,否则将从服务器请求整个表进行本地处理。

使用 CONNECTION 创建一个 FEDERATED 表

要使用第一种方法,您必须 在语句中指定CONNECTION引擎类型之后的字符串 。CREATE TABLE例如:

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=utf8mb4
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
# CONNECTION取代了以前MySQL版本中使用的COMMENT。

CONNECTION字符串包含连接到远程服务器所需的信息,远程服务器包含数据物理驻留的表。连接字符串指定服务器名称、登录凭据、端口号和数据库/表信息。在本例中,远程表位于服务器remote_host上,使用端口9306。名称和端口号应该与希望用作远程表的远程MySQL服务器实例的主机名(或IP地址)和端口号匹配。
连接字符串格式如下:

scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name

Where:
♥ scheme:可识别的连接协议。目前只支持mysql作为方案值。
♥ user_name:连接的用户名。这个用户必须是在远程服务器上创建的,并且必须有适当的权限在远程表上执行所需的操作(SELECT、INSERT、UPDATE等等)。
♥ password:(可选)user_name对应的密码。
♥ host_name:远程服务器的主机名或IP地址。
♥ port_num:(可选)远端服务器端口号。默认值为3306。
♥ db_name:保存远程表的数据库的名称。
♥ tbl_name:远程表的名称。本地表和远程表的名称不必匹配。
示例连接字符串:

CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'

问题

一、问题现象

运行下面脚本,结果报出“[Err] 1286 - Unknown storage engine ‘FEDERATED’”问题

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
   ***
    `del_flag` tinyint(3) unsigned DEFAULT '0' COMMENT '是否删除[0:未删除 1:已删除]',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 CONNECTION='mysql://****@mysql:3306/*****/sys_user';

在命令行键入:

show ENGINES;			//查看当前支持的存储引擎

结果显示NO,具体如下FEDERATED NO Federated MySQL storage engine NO NO NO

二、解决方法

MYSQL配置文件my.ini里,[mysqld] 下面加上federated,重启MYSQL服务
1.打开mysql根目录下my.cnf文件,新增一行,插入federated
2.重启mysql服务
3.再重新键入“show ENGINES;”命令,结果显示YESFEDERATED YES Federated MySQL storage engine NO NO NO

# Support 的值有以下几个:
YES 	 支持并开启
DEFAULT  支持并开启, 并且为默认引擎
NO 		 不支持
DISABLED 支持,但未开启

4.结果再重新执行创建问题现象脚本,运行Ok
5.查看当前支持的存储引擎 Federated 是否suport 为yes
在这里插入图片描述
需要注意的几点:
1.本地的表结构必须与远程的完全一样。
2.远程数据库目前仅限MySQL
3.不支持事务
4.不支持表结构修改

特殊情况

我这边采用Docker-compose的方式

volumes:
      #设置时区使用宿主机时区,防止时间少8小时
      - ./localtime:/etc/localtime:ro
      - ./data:/var/lib/mysql
      - ./config:/etc/mysql/conf.d
      - ./mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf

发现即使添加了FEDERATED存储引擎也没有生效

[root@master mysql]# docker exec -it mysql bash
root@mysql:/# mysql -uroot -p
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored.
Enter password: 

退出查看

[root@master mysql]#  ll
-rwxrwxrwx  1 root    root 1599 Jul 11 19:06 mysqld.cnf

解决:

[root@master mysql]# chmod 644 mysqld.cnf
[root@master mysql]#  ll
-rw-r--r--  1 root    root 1599 Jul 11 19:06 mysqld.cnf
[root@master mysql]# docker-compose restart
[root@master mysql]#  docker exec -it mysql bash
root@mysql:/# mysql -uroot -p
Enter password: 
再次执行脚本即可插入成功!
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)

Guys, we can’t throw in the towel. Come on!

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/125728259