链接数据库
MySQL可以向Oracle、SQLServer一样链接到远程数据库,使用 federated
数据库引擎实现远程链接
开启FEDERATED引擎
检验是否开启 federated 数据库引擎。
#查看 federated 引擎的 support 属性值,如果是 "YES" 表示已开启,如果是 "NO" 表示未开启
show engines;
如果 federated 数据库引擎未开启,通过调整配置启动 federated。
#修改 my.cnf (如果是windows系统,修改 C:\ProgramData\MySQL\MySQL Server 5.6\my.ini)
#在 mysqld 下直接添加 federated ,修改保存后重启MySQL,再通过 show engines 查看状态
[mysqld]
federated
mysql-> show engines;
创建远程数据库链接表
首先在源数据库(source,需要被链接的库)建立一个表demo:
CREATE TABLE `demo` (
`code` varchar(16) NOT NULL,
`name` varchar(16) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在目标数据库(target,需要链接源数据库的库)建立链接表demo_remote:
CREATE TABLE `demo_remote` (
`code` varchar(16) NOT NULL,
`name` varchar(16) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8
CONNECTION='mysql://root:mysql@localhost:3307/source/demo'; #source= demo表所属的schema
# CONNECTION='mysql://username:password@hostname:port/database/tablename'
# CONNECTION='mysql://username@hostname/database/tablename'
# CONNECTION='mysql://username:password@hostname/database/tablename'
在目标库查询和操作数据:
insert into demo_remote values ('code 01','name 01');
select * from demo_remote;
权限分配
grant all PRIVILEGES on source.* to user@'123.123.123.123' identified by 'password';
上面的语句表示将 source
数据库的所有权限授权给 user
用户,允许 user
用户在 123.123.123.123
这个 IP 进行远程登录,并设置 user
用户的密码为 password
。
下面逐一分析所有的参数:
all PRIVILEGES
表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如:
select,insert,update,delete,create,drop 等。具体权限间用【,】半角逗号分隔。
source.*
表示上面的权限是针对于哪个表的,source 指的是数据库,后面的 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”
FEDERATED的使用
本地的表结构必须与远程的完全一致;
没有对事务的支持;
远程服务器必须是一个MySQL服务器,FEDERATED对其它数据库引擎的支持可能会在将来被添加;
FEDERATED表指向的远程表在通过FEDERATED表访问它之前必须存在;
一个FEDERATED表指向另一个FEDERATED表是可能的, 但是必须小心不要创建一个循环;
如果远程表已经改变,对FEDERATED引擎而言是没有办法知道的。原因是因为这个表必须象数据文件一样工作,除了数据其它任何都不会被写入。如果有任何对远程数据库的改变,本地表中数据的完整性可能会被破坏;
FEDERATED存储引擎支持SELECT、INSERT、UPDATE、DELETE和索引, 它不支持ALTER TABLE、DROP TABLE或任何其它的数据定义语言语句;
执行使用SELECT、INSERT、UPDATE和DELETE, 但不用HANDLER.;
FEDERATED表对查询缓存不起作用.;