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
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
2
如果已经安装会提示already exists!所以开启支持就可以了!
# 五、开启Federated
# 5.1、修改my.ini(如果你不知道你的配置文件在哪,请不要继续看了!)
# 在配置文件中添加下面内容,实现远程访问其他数据库,相当于Oracle的dblink
federated
# 放该配置的位置为[mysqld]标签下,否则配置不起作用
1
2
3
4
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
2
3
4
5
6
- Linux系统
# 停止mysql服务
systemctl stop mysqld.service
# 启动mysql服务
systemctl start mysqld.service
1
2
3
4
5
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
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
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
2
3
4
5
6
7
8
9
10
11
12