Mysql实现DBLink方案

2021/9/27 mysqlDBLinkFederated

# 一、需求问题

  • 现有服务器A,上有数据库A
  • 现有服务器B,上有数据库B
  • 现有业务系统要同时使用A、B数据库,且用到了关联查询,即A.tabela left join B.tabelb这样的处理

# 二、预想解决方案

  • 在A数据库(目标库)中创建DBLink远程访问数据库B
  • 在A数据库中可以使用dblinkB@tableb这样的方式直接访问数据库B的tableb

# 三、实际存在问题

Mysql没有DBLink,DBLink是Oracle中的存在,最终替代方案:使用Federated引擎解决

# 四、Federated引擎安装

登录到mysql,查看已经安装的各种engine

 






 








mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| FEDERATED          | NO     | Federated MySQL storage engine                                 | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

可以看到FEDERATED不支持,需要安装

mysql> install plugin federated soname 'ha_federated.so';
ERROR 1125 (HY000): Function 'federated' already exists
1
2

如果已经安装会提示already exists!所以开启支持就可以了!

# 五、开启Federated

# 5.1、修改my.ini(如果你不知道你的配置文件在哪,请不要继续看了!)

# 在配置文件中添加下面内容,实现远程访问其他数据库,相当于Oracle的dblink
federated

# 放该配置的位置为[mysqld]标签下,否则配置不起作用
1
2
3
4

ps: 配置文件linux一般都在/etc下

# 5.2、重启mysql服务

  • Windows系统
# 停止mysql服务
# MySQL8是我安装时候注册的服务名字,自己根据自己情况执行
net stop MySQL8

# 启动mysql服务
net start MySQL8
1
2
3
4
5
6
  • Linux系统
# 停止mysql服务
systemctl stop mysqld.service

# 启动mysql服务
systemctl start mysqld.service
1
2
3
4
5

如果上面的命令提示提示错误,可以进入到MySQL的安装目录下(是安装目录不是安装目录下的bin目录)

sudo ./support-files/mysql.server restart
1
  • Max系统
# 重启mysql服务
sudo /usr/local/mysql/support-files/mysql.server restart
1
2

# 六、建立连接

  • 最终实现目标
    • 有B数据库,其中有表tableb
    • 在A库中创建B.tableb映射A.tableb_fed
    • 在A库中可以使用tableb_fed访问B库中的tableb
  • 获得B.tableb的建表语句
 








 

CREATE TABLE `tableb` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `create_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '添加人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加时间,默认当前时间',
  `update_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '修改人',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `delete_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '删除人,不为空就为删除',
  `delete_time` datetime DEFAULT NULL COMMENT '删除时间'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs COMMENT='XXXXX表';
1
2
3
4
5
6
7
8
9
10
  • 改造建表语句并在A库中建立映射表
 









 
 

CREATE TABLE `tableb_fed` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `create_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '添加人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加时间,默认当前时间',
  `update_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '修改人',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `delete_by` varchar(64) COLLATE utf8mb4_0900_as_cs DEFAULT NULL COMMENT '删除人,不为空就为删除',
  `delete_time` datetime DEFAULT NULL COMMENT '删除时间'
  PRIMARY KEY (`id`)
)
ENGINE=FEDERATED
CONNECTION='mysql://root:passward@B服务器IP:3306/B/tableb'  COMMENT='XXXXX表'
1
2
3
4
5
6
7
8
9
10
11
12
更新日期: 2021/11/8 上午11:11:08