本文已参与「新人创作礼」活动,一起开启掘金创作之路。MySQL跨服务器查询

435 阅读2分钟

跨库查询

同服务器下跨数据库进行查询在表前加上数据库名就可以查询到数据。

跨服务查询

mysql跨服务器进行查询提供了FEDERATED引擎进行映射表,然后进行查询。mysql数据库federated引擎是默认关闭的,需要先启用该引擎。

检查federated引擎是否开启

mysql执行show engines命令查看引擎状态。

show engines

在这里插入图片描述 FEDERATE的Support为NO,我们需要把这个引擎启用 修改mysql的my.ini文件,windows系统的在Mysql安装路径下的data文件夹里,可以使用Everything工具检索这个文件

修改mysql的my.ini文件

在这里插入图片描述[mysqld]下加上federated

重启MySQL服务

打开服务表,重启MySQL服务 在这里插入图片描述 federated引擎是否开启 在这里插入图片描述

建立目标库的映射表

跨服务器查询,我们可以把其中一个服务器的库最为源,以另外一个库为目标库,在源库上建立目标库的表。

例如:我要在本地库查询线上服务器的库表my_config在这里插入图片描述 在本地库开启SQL连接,执行SQL:

CREATE TABLE `my_config_ref` (
  `id` BIGINT(20) NOT NULL,
  `config_key` varchar(150) DEFAULT NULL,
  `config_value` varchar(255) DEFAULT NULL,
  `role_id` varchar(40) DEFAULT NULL,
  `remark` bigint(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=FEDERATED CONNECTION='mysql://账号:密码@另外一个服务器的ip地址:端口号/数据库名/表名';

执行完该SQL后,就在本地库建立了一张名为my_config_ref的映射表,对该表的CRUD操作都会直接影响到另外一台服务器的my_config

PS

当远程服务器的数据库的密码包含符号或者其他特殊符号时,可能会报下面的错误:

CREATE TABLE my_config_ref ( id BIGINT(20) NOT NULL, config_key varchar(150) DEFAULT NULL, config_value varchar(255) DEFAULT NULL, role_id varchar(40) DEFAULT NULL, remark bigint(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=FEDERATED CONNECTION='mysql://123:"123rrr@."@10.22.32.33:3306/gdcwpt/my_config' 1432 - Can't create federated table. The data source connection string 'mysql://123:"123rrr@."@10.22.32.33:3306/gdcwpt/my_config' is not in the correct format 时间: 0.008s 在这里插入图片描述

解决方式有两种:

  1. 改密码(简单、快捷、高效)
  2. 通过使用CREATE SERVER创建FEDERATED表(一般来说,服务器的数据库密码是不能随便改的)
CREATE SERVER fedlink
FOREIGN DATA WRAPPER mysql
OPTIONS (USER '123', PASSWORD '123rrr@.',HOST '10.22.32.33', PORT 3306, DATABASE 'gdcwpt');

CREATE TABLE `my_config_ref` (
  `id` BIGINT(20) NOT NULL,
  `config_key` varchar(150) DEFAULT NULL,
  `config_value` varchar(255) DEFAULT NULL,
  `role_id` varchar(40) DEFAULT NULL,
  `remark` bigint(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=FEDERATED CONNECTION='fedlink/my_config';

通过 SERVER fedlink做一个中转

注意

在mysql中创建远程服务器数据库中的需要映射的表,映射表名称可以随意命名,但是数据结构必要一样

这种方式效率低下,只能临时用来应急,不能长久

通过这种方式对远程服务器的库表执行DML语句都是不走事务的

如果需要使用多张远程服务器数据库的表,就需要建立对应数量的映射表