使用场景: 原理不多做介绍 ,请自行百度之,oracle有dblink功能,当我们的业务系统需要调用其他的业务系统时候,需要从数据库层面进行系统间的数据调用。Oracle中我们的客户端通过dblink调用已经成功实现。
姑且把我们的主业务数据库称作为A,被调用的其他业务数据库(也可以理解为其他公司的数据库)称作为B。
我们需要在A库中建立对B的映射, 需要通过federated引擎来实现(这个貌似没有事务处理的能力,未加验证(不支持)。)
只有innodb 引擎支持事务
参考链接http://hi.baidu.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数据库
创建表
CREATETABLE `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=14DEFAULT 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命令:
showengines; 显示引擎
[root@rzcxetc]# 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
servicemysqld restart (start, stop) 注意是mysqld 不是mysqlld 我总以为是mysqlld 多了个l 纠结很久….
[root@rzcxetc]# chkconfig --list mysqld
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@rzcxetc]# whereis mysql
mysql:/usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
查看MYSQL数据库中所有用户
mysql> SELECTDISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
查看数据库中具体某个用户的权限
showgrants 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