mysql dblink

 

使用场景:   原理不多做介绍 ,请自行百度之,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【表名】';

 

注意:

1connection串的正确性。

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

  3A库的表字段应该是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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值