paperen对mysql的接触是从玩php开始的,paperen并没有学过SQL,但是自学了一些,对于mysql其实也不是专研得太深,而最近又重新看一遍《PHP和MySql Web开发 第4版》才有发现mysql中有些东西paperen到现在还没有玩过~~所以现在paperen再亲自测试一下并拿出来跟大家分享一下,其实大家有这本书的话不妨自己翻开,再看看12,13章的内容,当然如果你是已经了解并玩得很熟了那么可以忽略了。

大概总结了下,这两章介绍了一些玩法有:mysql prepared,pear mdb2,权限分配,sql优化分析,备份与恢复数据库,主从同步数据库,innodb事务与外键,存储过程。都是一些很实用的技巧,而这里paperen只具体说说主从同步数据库与存储过程,其他技巧自己去查查资料吧。

主从同步数据库,这个概念应该很好理解,其实就是集群数据库的概念,在客户端看上去数据库只有一个,但是实质上不止一个,可能是多个数据库在维持,实质上说这个技巧是为了保证web平台的稳定而使用的,paperen觉得这个技巧并不是用来防止数据出错(数据出错站在mysql的层面来看是根本没法避免的,只能靠备份来预防)是为了提高可靠性。

在《PHP和MySql Web开发 第4版》中这个技巧放在实现复制小节中,下面为引用书中的一段:

“复制是一个允许提供相同数据库的多个数据库服务器的技术。这样,可以载入共享并提高系统可靠性;如果有一个服务器停止运行,其他服务器还能继续工作。复制一旦设置成功,它也可以用作备份。”

paperen我也承认看书确实有点让人犯困……好吧,let's do it~

你需要确定哪个机器上的数据库是主,而哪些机器是从。

#猪数据库192.168.1.17

#从数据库192.168.1.16

#同步192.168.1.17上的test数据库

#请保证同步之前主从服务器上的test数据库结构与数值都一致了

步骤一:修改mysql配置文件,将主从服务器上的mysql配置文件my.ini或my.cnf在[mysqld]下加入

log-bin = ** #定义二进制日志前缀,等你玩过一遍你就明白了

server-id = ** #定义服务器唯一ID,注意是唯一

#[主服务器/master上才有的配置]

binlog-do-db = **  需要备份的数据库

binlog-ignore-db = ** #[主/master上才配置这个] 不需要备份的数据库

slave-skip-errors #跳过错误

log-slave-updates #会将更新记录放到二进制文件里

#[从服务器/slave上才有的配置]

replicate-do-db = ** #需要备份的数据库

replicate-ignore-db = ** #不需要备份的数据库

master-connect-retry = ** #当主服务器连接失败时重连时间差(秒)

slave-skip-errors #跳过错误

log-slave-updates #同主选项说明一致

步骤二:为从服务器开一个用户(当然也可以不开使用最大权限的root,但是不是太好咯~)

使用sql命令或用phpmyadmin也可以

GRANT REPLICATION SLAVE ON * . * TO 'paperen'@'%' IDENTIFIED BY 'useful';

步骤三:重启主从服务器的mysql服务,如果重启服务失败可能是修改my.ini或者my.cnf错误了,需要排错一下

步骤四:获得主服务器数据库快照

在192.168.1.17中需要输入sql命令

flush tables with read lock;#该数据库的所有表的写操作将被阻塞,而读操作顺利进行(当然你需要进入到test数据库或者使用use dbname;后才执行该sql操作)

然后

show master status;

将会获得有关数据库快照的信息

20110211152424

记下,FILE与Position的值,之后再执行

unlock tables;#解除读锁定

在从服务器中运行

change master to

master_host = '192.168.1.17',

master_user = 'paperen',

master_password = 'useful',

master_log-file = 'mysqlbin.00002',

master_log_pos = 281;

之后再送入

start slave;

到这里就可以进行同步了,到主数据库去更新插入一些数据你会发现从数据库也会跟着更新与插入。

Tips:

1.如果最后从数据库的数据不能同步可以试试以下信息解决问题

show slave status;(phpmyadmin中)

show slave statusG(命令行下)

查看一下Slave_IO_Running与Slave_SQL_Running是否全为yes,大多数不成功都是因为其中一个状态不是yes导致的,故针对这两个状态进行排错。google一下就很多。下面放出两个。

Slave_SQL_Running:No http://jianzi0307.blog.163.com/blog/static/208120020091212532947/

Slave_IO_Running: No http://www.9enjoy.com/slave-io-running-no/

其实最好还是在mysql配置中加入一个选项 log-error = mysqlerr.txt 当出现某些问题时查看一下错误日志就明白了,还有提示,真系very good的~~

2.关于主从同步原理

http://machael.blog.51cto.com/829462/239112

3.更多参考信息

http://www.intgoo.com/10022.html

至于存储过程呢,其实也是相当简单,相对于主从同步来说是没那么复杂了。说明了就是在mysql层上建立了一个自定义1查询过程(函数),为了不用在服务器程序中写比较复杂的查询语句而已。看个例子你就明白了。

#有一个简单需求:查询商品表中价格超过某个价位商品的数量,这里就是定义了一个存储过程放在mysql那边,而不用自己写一条sql来查询。

delimiter //
create procedure count_mycost (in scost float, out total int)
BEGIN
SELECT count(distinct name) into total
FROM `goods`
where cost >scost;
END
//
delimiter;

当送入数据库后就可以使用

call count_mycost(6,@num);
select @num;

获得数据了

20110211172749

使用php代码就先送入call count_mycost(6,@num);后送入select @num;来获取数据。

mysql_query("call count_mycost(6,@num)");
$res = mysql_query( "select @num" );
echo mysql_result($res, 0 );

貌似也不是很方便~~不过可能在实际中有些地方可以用到,统计什么的或者能派上用场,省了在服务端写太多的sql与代码。除了声明过程外你还可以声明一个函数,方法类似但是也有不同的地方,还可以配合使用declare,if等等。