MySQL
NinGoo's blog

Redhat上安装Perl DBD::mysql驱动

打算熟悉下perl,自然主要用于数据库管理和监控方面的,所以需要连接数据库。Perl连接数据库可以通过DBI模块和相应数据库的DBD驱动,上一篇记录了DBI模块的安装,这里记录下DBD::mysql驱动的安装。可以从CPAN下载相应DBD驱动

安装过程很简单,下载解压:

gzip -d DBD-mysql-4.006.tar.gz
tar xvf DBD-mysql-4.006.tar

然后进入DBD-mysql-4.006目录,执行:

perl Makefile.PL
make
make test
make install

检查已经安装的Perl模块:

# ./perl-module.pl
DBD::mysql
DBI
Perl

安装DBD::mysql需要mysql_config,包含在Headers and libraries安装包中(MySQL-devel-community-5.1.23-0.rhel4.i386.rpm),并且PATH环境变量中必须包含mysql_config所在的路径。否则在执行perl Makefile.PL生成makefile的时候会报错:

Can’t exec “mysql_config”: No such file or directory at Makefile.PL line 76.

Cannot find the file ‘mysql_config’! Your execution PATH doesn’t seem
not contain the path to mysql_config. Resorting to guessed values!
Can’t exec “mysql_config”: No such file or directory at Makefile.PL line 466.

通过调用DBI->available_drivers()函数可以查看当前系统中已经安装好的所有驱动。安装好DBI和DBD::mysql后,就可以访问MySQL数据库啦,首先在test库中创建一个table:

create table test(id int,name varchar(30))

然后执行下面的Perl脚本插入一条数据并且查询得到结果:

#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect(“DBI:mysql:database=test;host=localhost”,”NinGoo”,”password”, {‘RaiseError’ => 1});
my $rows = $dbh->do(“INSERT INTO test (id, name) VALUES (1, ‘NinGoo’)”);
my $query = $dbh->prepare(“SELECT name FROM test”);
$query->execute();
while(my $rs = $query->fetchrow_hashref()) {
print “$rs->{‘name’}\n”;
}

给MySQL DBA推荐一本书

Understanding MySQL Internals一直以来,对于MySQL都是一知半解,而从Google的Blogsearch的结果来看,国内大部分关于MySQL的文章也都是限于会用的水平。照理来说,MySQL是开源软件,应该有更多的深入讨论MySQL原理、架构和实现机制的文章才对,当然,也可能我孤陋寡闻,MySQL关注得不多。四年前刚开始接触Oracle的时候,Oracle的文档以及论坛的讨论已经非常的丰富和深入,这也是我选择Oracle DBA做为这几年职业发展方向的原因之一吧。

这两年Web2.0大潮,很多创业公司都选择了MySQL数据库做为系统的数据平台,从而对于MySQL的开发人员和DBA的需求也多了起来,这是MySQL的机遇,也是MySQL DBA的机遇。MySQL有很多的优点,了解其架构和实现机制,不仅仅可以更加有效的管理和使用MySQL数据库,也可以借鉴其思想为我所用,或者触类旁通更好的理解其他的系统设计,毕竟开源的东西,只要有研究的精神,不怕没有研究的材料。不像Oracle等,很多东西只能需要靠蛛丝马迹去猜测,靠试验去验证。

大致翻了一下,这本《Understanding MySQL Internals》对于MySQL的概念、架构和实现机制的剖析还是比较到位的。目前市面上大部分的MySQL书基本上都是操作手册,能这么深入的讲解MySQL的书还真的是难得一见,得抽时间好好看看。这本书是2007年4月出版的,但至今似乎还没有中文版,看来中文MySQL图书市场还是一块待开垦的处女地^_^

Google一下能找到这本书的电子版,下载链接这里就不给了,不知道是否有版权问题呢,呵呵。

[继续阅读全文]

MySQL Proxy工作机制浅析

MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的。代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,MySQL Protocol包括认证和查询两个基本过程:

认证过程包括:

  1. 客户端向服务器发起连接请求
  2. 服务器向客户端发送握手信息
  3. 客户端向服务器发送认证请求
  4. 服务器向客户端发送认证结果

如果认证通过,则进入查询过程:

  1. 客户端向服务器发起查询请求
  2. 服务器向客户端返回查询结果

当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解MySQL Protocol的同学,可以去这里看看。MySQL Proxy要做的,就是介入协议的各个过程。首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。所以MySQL Proxy需要同时实现客户端和服务器的协议。由于要对客户端发送过来的SQL语句进行分析,还需要包含一个SQL解析器。可以说MySQL Proxy相当于一个轻量级的MySQL了,实际上,MySQL Proxy的admin server是可以接受SQL来查询状态信息的。

MySQL Proxy通过lua脚本来控制连接转发的机制。主要的函数都是配合MySQL Protocol各个过程的,这一点从函数名上就能看出来:

  • connect_server()
  • read_handshake()
  • read_auth()
  • read_auth_result()
  • read_query()
  • read_query_result()

至于为什么采用lua脚本语言,我想这是因为MySQL Proxy中采用了wormhole存储引擎的关系吧,这个虫洞存储引擎很有意思,数据的存储格式就是一段lua脚本,真是创意无限啊。

使用MySQL Proxy和MySQL Replication实现读写分离

MySQL Replication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力。那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave上。如果每个应用都需要来实现读写分离的算法,一则成本太高,二来如果slave增加更多的机器,应用就要随之修改。明显的,如果在应用和数据库间加一个专门用于实现读写分离的中间层,则整个系统的架构拥有更好的扩展性。MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

MySQL read write splitting

[继续阅读全文]