mysql使用federated 实现类似oracle的dblink的功能

2019-01-27 14:55

使用场景: 原理不多做介绍 ,请自行百度之, oracle有dblink功能,当我们的业务系统需要调用其他的业务系统时候, 需要从数据库层面进行系统间的数据调用。Oracle中我们的客户端通过dblink调用已经成功实现。 姑且把我们的主业务数据库称作为A,被调用的其他业务数据库(也可以理解为其他公司的数据库)称作为B。

我们需要在A库中建立对B的映射, 需要通过federated引擎来实现(这个貌似没有事务处理的能力,未加验证(不支持)。)

只有innodb 引擎支持 事务

参考链接http://hi.http://www.wodefanwen.com//edeed/item/1e3f741eeb4fbef487ad4eb9

B库需要做什么?

B库需要做的很简单, 只需要告知我们需要的表结构,用户名密码,连接串,数据库串,当然一般情况下 B库是会建立一个view供A库使用 , 并建立新用户赋予相应的权限供A库使用,用户权限如果是只读的 那么A库就只有只读的权限, 总而言之,B库就是需要给我们可访问的权限。

A库需要做什么, 工作以及注意点 主要都在A库上了。 查看A库的引擎情况如图: Show engines;

此图是win7 32位 mysql 5.0.9 版本 默认情况 federated 是未开启的 也是 support字段为NO 。

如何开启?

找到mysql的安装位置

找到根目录下的my.ini文件

在 [mysqld]下边添加 rederated 即可

我的默认是 skip-rederated 你们的是什么就不知道了哦 然后重启mysql服务 在查询show engines;

Federated 的support就会变为 YES了, 此时我们的mysql已经支持该引擎了。

Linux怎么做?

测试系统为centos 6.x 64位 mysql版本 为 5.1.71 首次查询show engines; 的时候 没有federated的。 增加该引擎的支持有两种办法(我查到的) 第一种是安装时候tar包的时候 ./configure --prefix=/usr/local/mysql --without-debug --without-bench --enable-thread-safe-client --enable-assembler --enable-profiling --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-charset=latin1 --with-extra-charset=utf8,gbk --with-innodb --with-csv-storage-engine --with-federated-storage-engine --with-mysqld-user=mysql --without-embedded-server --with-server-suffix=-community --with-unix-socket-path=/usr/local/mysql/sock/mysql.sock 红色的代码表示编译的时候支持rederated 引擎

第二种是在mysql安装完成之后

Mysql >install plugin federated soname 'ha_federated.so'; 执行该语句就会动态将federated引擎加入到mysql中。(网上有的说执行这个语句会报错, 可能是版本太低的原因), 我执行该语句 未报任何错误,成功安装该引擎。

支持该引擎之后, 在linux下还需要做一步就是修改 my.conf文件 类似于windows下的my.ini文件。

Vim /etc/my.cnf

然后运行 show engines;

下边开始实践:

以我们的114库 为B库 建立test库 建立abc表 CREATE TABLE `abc` (

`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(11) DEFAULT NULL, `sex` varchar(22) DEFAULT NULL,

`birthday` varchar(22) DEFAULT NULL, PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

数据执行插入。

数据用户和用户权限略。做测试不限制了

现在处理A库 我本地的mysql数据库

创建表

CREATE TABLE `abc` (

`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(11) DEFAULT NULL, sex VARCHAR(11),

birthday VARCHAR(11), PRIMARY KEY (`id`)

) ENGINE=FEDERATED AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 CONNECTION = 'mysql://用户名:密码@114.*.*.*:3306【端口】/test【库名】/abc【表名】';

注意:

1、connection串的正确性。

2、A库创建的表名可以与B库不一样

3、A库的表字段应该是B库的表字段的子集,如果A中表字段有B种不存在的字段,在查询等操作时候会报错。

4、字段不一致的情况, (1)如果A中新建的字段类型由varchar –》int 则查询时候 如B库中是字符串, 在A中的查询结果会变成0, 是数字的则不便。 (2)如果B中字段长度为4, A中字段长度为2 , 此时B中如果存储了“1234”, 则在A中查询出来会是“12”

所以推断为:查询时候B库的数据类型 会向A中兼容!

为验证的:从A中进行新增,或者修改数据时候,B中会如何处理(设计类型不一致的情况)。

不过一般情况下 B库只会给A库只读的权限。

OK 到这里我们已经实现了我们想要的功能,怎么觉着比oracle的dblink 简单呢?

记录几个简单的sql命令: show engines; 显示引擎

[root@rzcx etc]# ps -ef|grep mysql

root 28180 1 0 15:08 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql

mysql 28285 28180 0 15:08 pts/0 00:00:10 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock root 30312 27726 0 16:50 pts/0 00:00:00 grep mysql

service mysqld restart (start, stop) 注意是mysqld 不是mysqlld 我总以为是mysqlld 多了个l 纠结很久….

[root@rzcx etc]# chkconfig --list mysqld

mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

[root@rzcx etc]# whereis mysql

mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz

查看MYSQL数据库中所有用户

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

查看数据库中具体某个用户的权限 show grants for 'cactiuser'@'%';

查看user表结构 需要具体的项可结合表结构来查询 mysql> desc mysql.user;

查询mysql版本

终端中执行 mysql –V (大写的V)

Mysql>status

检查服务状态:

service --status-all

service --status-all | grep ntpd

service --status-all | less

service httpd status

列出所有服务启动级别: chkconfig --list

列出服务和他们对应的端口: netstat -tulpn


mysql使用federated 实现类似oracle的dblink的功能.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2012年高三月考试题分类汇编之导数2

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: