做了篇关于Mysql replication的文档,欢迎大家纠错....
时间:2007-02-17 来源:PHP爱好者
因为本来是用word写的,我是直接复制过来,所以可能会比较难看... 过一段时间找到服务器,再给大家下载....
贴上来的目的:share,顺便请高人纠错,万分感谢,或者不完善的地方,请大家多多提出...
因为我觉得也不是太熟悉,所以大家多看看,帮我指指错误就最好啦:)
实现MySQL的Replication
在MySQL 3.23.15版本之后,MySQL提供了数据库复制的功能,可以实现两个数据库实时同步,增强了MySQL数据库的稳定性,而且可以在企业级应用的数据库层实现Cluster…
条件:
1 Redhat 9
2 Mysql 4.0.20
3 两台机器ip为192.168.37.188 192.168.37.189,分别安装mysql
目标:
1.数据库的双向复制
2.在master与slave网络不通但过后再次恢复正常,master上的数据在slave上也可以得到更新,反之亦然.
本文主要分为以下几个部分:
第一部分 安装MySQL
第二部分 配置/etc/my.cnf(要查看/etc/init.d/mysql脚本判断是/etc/my.cnf)
第三部分 给权限
第四部分 查看工作状态,测试并验证是否可以真正同步
第五部分 Troubleshooting
第一部分 安装MySQL
1.得到MySQL的RPM安装包,列表如下:
MySQL-server-4.0.20-0
MySQL-client-4.0.20-0
MySQL-shared-4.0.20-0
2.使用root身份安装
#rpm –ivh MySQL-*-4.0.20-0
会有进度条提示安装进度;
安装完毕后,MySQL的数据库配置文件在/var/lib/mysql/中,而默认的几个配置文件在/usr/share/mysql/中,有以下几个文件:
My-hug.cnf
My-large.cnf
My-medium.cnf
My-small.cnf
顾名思义,是为了针对不同的应用来设计的,主要是对数据库的一些参数作了优化,具体优化请见my.cnf内的[mysqld]中语句.
第二部分 配置/etc/my.cnf
通过RPM包安装的mysql在/etc/init.d下会生成一个mysql的shell脚本文件,而在Redhat下我们一般用service mysql start的时候,其实就是传给该脚本start参数并执行,那么需要查看该文件,究竟是调用的哪个配置文件,在其中我们找到这么一行…
conf=/etc/my.cnf
那么可以判断配置文件是/etc/my.cnf
假设我们的是中型应用:
#copy /usr/share/mysql/my-medium.cnf /etc/my.cnf
拷贝到/etc/my.cnf之后,就可以对其进行配置,MySQL在每次启动的时候读取该配置文件并按其配置方式启动,因为数据库需要双向复制,则每台机器都需要同时是master和slave,
1、首先在192.168.37.188的/etc/my.cnf下在[mysqld]中修改,以下配置该机为master:
server-id=1
log-bin
binlog-do-db=backup
解释:
1)server-id=1表示是本机的序号为1,一般来讲就是master的意思.
2)log-bin表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提;
3)binlog-do-db=backup 表示需要备份的数据库是backup这个数据库,
4)如果需要备份多个数据库,那么应该写多行,如下所示:
binlog-do-db=backup1
binlog-do-db=backup2
binlog-do-db=backup3
2、其次仍然在该区域修改,以下配置为该机为slave
master-host=192.168.37.189
master-user=backup
master-password=1234
master-port=3306
3、然后配置192.168.37.189上的my.cnf
在/etc/my.cnf下在[mysqld]中修改:
server-id=2
master-host=192.168.37.188
master-user=username
master-password=password
master-port=3306 #主服务器端口
master-connect-retry=60 #同步时间间隔为60秒
replicate-do-db=backup
log-bin
binlog-do-db=backup
解释:
1)server-id=2表示本机器的序号;
2)master-host=192.168.37.188 表示本机做slave时的master为192.168.37.188;
3)master-user=username 这里表示master上开放的一个有权限的用户,使其可以从slave连接到master并进行复制;
4)master-password=password 表示授权用户的密码;
5)master-port=3306 master上MySQL服务Listen3306端口;
6)master-connect-retry=60 同步间隔时间;
7)replicate-do-db=backup 表示同步backup数据库;
8)log-bin 打开logbin选项以能写到slave的 I/O线程;
9)binlog-do-db=backup 表示别的机器可以同步本机的backup数据库.
最后重新启动192.168.37.188和192.168.37.189两台机器的mysql.
第三部分 分配权限
在192.168.37.188上使用mysql登陆,操作如下:
(1)Mysql>grant all privileges on backup.* to ‘backup’@’192.168.37.189’ identified by ‘1234’;
给使用192.168.37.189连接的backup用户以replication的权限…
(2)Mysql>flush privileges;
刷新权限设置;
在slave上使用mysql登陆
(1)Mysql> grant all privileges on backup.* to ‘backup’@’192.168.37.188’ identified by ‘1234’;
(2)Mysql>flush privileges;
刷新权限设置;
说明:上面的all privileges在4.0版上应该为replication slave,也就是grant replication slave on ........在3.23上是file,也就是grant file on ........但是我怕有别的麻烦,干脆权限全给好啦.
在进行如上设置之后,可以看出在192.168.37.189设定好并重启mysql以后,mysql会在数据目录(/var/lib/mysql)下生成一个master.info文件和relay-log.info,relay-log.index文件.如果要更改master服务器,则要删除掉这个文件,(即在更改了/etc/my.cnf中master相关信息)在my.cnf文件中重新配置,重新启动mysql,更改才会生效.
第四部分 查看工作状态
1)在master上新建一个backup数据库
Mysql>create database backup;
2)新建一个表:
Mysql>create table jintao (id int(10),name varchar(20));
3)查看192.168.37.189上的mysql;
Mysql>use backup;
Mysql>show tables;
Mysql>desc jintao;
Mysql>select * from jintao;
如果看到与master相同的信息,则可以证明是成功的.
同时可以改动已有的数据库来判断是否已经达到同步,都差不多的…只要证明数据库同步就可以啦…这时不分master/slave,在master上改动slave上会更新,而在slave上改动,master上也可以得到更新.
第五部分 troubleshooting
在master上,其实不需要做什么设置,只需要打开log-bin,写上server-id=1,写上要备份的数据库,则自动是master模式,于是问题主要集中在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的东西,于是同步就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var/lib/mysql/relay-log.info.
请注意,因为上边提到了binlog里的内容是改了什么东东,而不是改了以后是什么东东,所以在进行同步之前必须保证两个数据库是完全相同的,不然可能出错.打个比方来说.A机上有一个表里的元组为2,而操作是减一,则binlog只会记录减一这个操作,如果B机上没有,那么则无法得到同步,因为B机没有这个字段,就不知道减一是什么操作.
对于故障诊断,我的方法是都在slave(master/slave是相对的)的mysql(指客户端)里完成.
方法一:show slave status;
正确情况下应该同如下类似:
mysql> show slave status;
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
| Master_Host | Master_User | Master_Port | Connect_retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_do_db | Replicate_ignore_db | Last_errno | Last_error | Skip_counter | Exec_master_log_pos | Relay_log_space |
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
| 192.168.37.188 | backup | 3306 | 5 | Server-bin.020 | 79 | Jintao-relay-bin.001 | 45 | Server-bin.020 | Yes | Yes | backup | | 0 | | 0 | 79 | 45 |
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
1 row in set (0.00 sec)
上边的Jintao和Server是两台机器的主机名,所以真实情况应该有所分别,注意其中的YES|YES,这个是本地I/O线程及SQL线程的工作状态,要确保都为YES,如果不是YES,请检查mysql是否正常运行.
方法二:show processlist;
如果正确,则应该如下所示:
Mysql>show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| 4 | system user | | NULL | Connect | 398 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 398 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 6 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
注意同标记过的字符类似,则是正确的,错误情况下应该是这个样子:
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| 4 | system user | | NULL | Connect | 454 | Reconnecting after a failed master event read | NULL |
| 5 | system user | | NULL | Connect | 454 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 7 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
当然如果这里的Reconnecting只是错误的一种,有可能是connecting,则表示正在连接,那么请检查:
1 master上的mysql daemon是否正常运行
2 master与slave的网络连接是否正常
3 my.cnf是否配置正确
4 在修改配置后是否删除过master.info?(删掉以后会自动再生成一个,别担心删掉),因为如果不删掉的话,那么则还是使用原来的配置
5 修改配置后有没有重新启动mysql daemon,重新启动过程后必须证实mysql已经正常启动
6 master上给slave及slave给master上分配的replication用户权限是否正确,master的主机名和dns设置
7 当前状况两台数据库是否完全相同.
方法三:show master status;
mysql> show master status;
+----------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+----------------+----------+--------------+------------------+
| Server-bin.021 | 79 | backup | |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注意上边的这条,position不能为0,如果为0则表示有问题,请检查/etc/my.cnf中的server-id及是否打开log-bin
mysql> show processlist;
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
| 1 | backup | 192.168.37.189:1067 | NULL | Binlog Dump | 284 | Has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
如果master上不是这样,那么就应该是master的配置有问题啦.
方法四 查看错误日志
在/var/lib/mysql下有个hostname.err文件,所有的错误都在其中被记录,如下所示:
041210 12:54:51 mysqld started
041210 12:54:51 Warning: Asked for 196608 thread stack, but got 126976
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
041210 12:54:51 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
041210 12:54:54 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
041210 12:54:55 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
041210 12:54:58 InnoDB: Started
/usr/sbin/mysqld: ready for connections.
Version: '4.0.20-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306
041210 12:54:58 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './Jintao-relay-bin.001' position: 4
041210 12:54:58 Slave I/O thread: connected to master '[email protected]:3306', replication started in log 'FIRST' at position 4
以上日志没有错误,只是一个例子,但是假如数据库同步失败出现错误时,两个数据库不同,binlog中的记录将不能被slave所理解,所以会出错./var/lib/mysql/下会不停的生成hostname-bin.001及hostname-relay-bin.001之类的文件,这样每次在重新启动master/slave的时候都会用一个新的relay-log来取代原来的.所以该目录会不停的生成类似文件,而hostname-relay-bin.index来控制哪个是当前所使用的relay-log.整体的同步过程上面第五部分开头已经说清楚了,这里不再详述.
Btw:假如不知道本机的hostname,可以在终端下输入
#hostname
wing-qiang 回复于:2004-12-19 00:39:46不错!
odin_free 回复于:2004-12-20 12:36:56内容很好
整理整理就加精华
njblue2004 回复于:2005-01-17 11:23:00我试了一下,不行,
高手指教!!
wangyih 回复于:2005-01-17 13:11:58[quote:391400b805="双眼皮的猪"]行薷?
server-id=2
master-host=192.168.37.188
master-user=username
master-password=password
master-port=3306 #主服务器端口
master-connect-retry=60 #同步时间间隔为60秒
replicate-do-db=back..........[/quote:391400b805]
没看到在那里实现的双向复制
双眼皮的猪 回复于:2005-01-17 14:55:39to njblue2004:
哪里不行?把log贴上来看看行不?
to wangyih:
看不出来就没办法了...如果单向复制的话,没必要把37.188配置为slave的?
wangyih 回复于:2005-01-17 15:34:41[quote:553d9716d5="双眼皮的猪"]to njblue2004:
哪里不行?把log贴上来看看行不?
to wangyih:
看不出来就没办法了...如果单向复制的话,没必要把37.188配置为slave的?[/quote:553d9716d5]
那你告诉我你的37。189做主机的配置在那里.
既然互备两边干吗配置不一样
aspbiz 回复于:2005-01-17 22:45:20精神可嘉。!!!
应当加精。
双眼皮的猪 回复于:2005-01-18 09:31:47[quote:b3cff6326a="wangyih"]
那你告诉我你的37。189做主机的配置在那里.
既然互备两边干吗配置不一样[/quote:b3cff6326a]
配置一下就知道了...我不想说太多...
做主机的配置就是log-bin,以及要备份的数据库...
个人对你没什么好感,就请不要老是用这种语气来说话...
如果说自己没做过,我说什么都没用,自己去试一下就知道了...
wangyih 回复于:2005-01-18 11:51:43[quote:d31942f639="双眼皮的猪"]
配置一下就知道了...我不想说太多...
做主机的配置就是log-bin,以及要备份的数据库...
个人对你没什么好感,就请不要老是用这种语气来说话...
如果说自己没做过,我说什么都没用,自己去试一下就知道了...[/quote:d31942f639]
我对你这样只有讨厌的感觉。
你这东西就是一个垃圾,根本就是不能用的,自我感觉良好。
这破玩意只要正式环境一使用就完蛋,想实现mysql互备,只有痴人做梦
aspbiz 回复于:2005-01-18 14:29:22互备,效果不太好。
不过,一般场合还是可以用的。
双眼皮的猪 回复于:2005-01-18 16:11:07[quote:632bb972f4="wangyih"]
我对你这样只有讨厌的感觉。
你这东西就是一个垃圾,根本就是不能用的,自我感觉良好。
这破玩意只要正式环境一使用就完蛋,想实现mysql互备,只有痴人做梦[/quote:632bb972f4]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是试一下mysql提供的这个功能...
3 请你实质上做一次
4 我不想把Mysql replication的原理说好多好多次...我原来的帖子里说过好几次...
5 这破玩意有一个很大的公司在用,多大,应该比你的大的多...
6 不要因为自己不了解的东西,来跟别人理论...
其实,你还是做一次吧,其实我很想说点什么的,上面这些算了吧...
btw:我觉得vim比ue方便...应该是ue用的没你好吧...
titan3 回复于:2005-01-18 20:40:53楼上涵养好,现在有些人确实不可理喻
wangyih 回复于:2005-01-18 20:56:34[quote:94ace9ab7f="双眼皮的猪"]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是?.........[/quote:94ace9ab7f]
你更加没有礼貌,我问你问题是你先发表,没好感的话题。
我也很想知道同一个表双向复制和互备的区别
双眼皮的猪 回复于:2005-01-19 08:46:02好的,我先错的...
互备我不知道..
而双向复制,则只需要说单向复制即可..依次类推...
[quote:c88c0741d7]
在master上,其实不需要做什么设置,只需要打开log-bin,写上server-id=1,写上要备份的数据库,则自动是master模式,于是问题主要集中在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的数据,进而转换成本地数据,也就一步步实现了复制...[/quote:c88c0741d7]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...
wangyih 回复于:2005-01-19 11:14:57[quote:6cd02af33a="双眼皮的猪"]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...[/quote:6cd02af33a]
老实说还是没太看懂有什么区别,我再找找资料,谢谢
wangyih 回复于:2005-01-19 11:15:39[quote:7c16e0cb28="双眼皮的猪"]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...[/quote:7c16e0cb28]
老实说还是没太看懂有什么区别,
我第一次做Replication还是3年多前.但从未做出来过互备.
我不是问代码实现,既然你说不是一回事情,就是不知道这两个功能上的区别
谢谢
toplee 回复于:2005-02-22 16:21:09mysql互备在实际应用中是很少使用的,对于并发很大的应用来讲,更是没法使用,到时Master/Slave单向的复制倒是有些实际应用场景,既可以做到实时备份,还能从程序逻辑上来分担一些纯粹的select操作到slave上,对于统计分析、查询等应用是比较有利的。比如很多论坛就是这么实现的,我观察sohu的论坛就是这么搞的,帖子发出是更新到master,然后稍有延迟从slave中取到显示出来。
至于楼主的内容,不加以评判好坏,不过至少精神可嘉。对于mysql的repliction我曾经研究不少,大家最好还是去mysql的官方网站看看(http://dev.mysql.com/doc/mysql/en/replication.html),上面有关于mysql的repliction最权威的说法,中间重点提到了一些需要注意的地方,比如某些字段类型的使用,楼主说到互备或者双向复制,对于auto_increment类型的字段来说,肯定存在问题。
个人见解,不带攻击成分!支持言论自由!
双眼皮的猪 回复于:2005-02-23 09:28:20来逛一下~发现了,呵呵~
我可没说过是互备~只是说了下双向复制~
我很同意Toplee的看法...双向复制我也认为没有什么意思...假如出现问题导致db不同了,就不好了,所以我觉得单向做复制比较有用..
您给的这个链接我看过,mysql的manual还是很全的:)
我还找到mysql.org里做replication自己写的一个文档,里边谈到其中的实现,一些很少的代码。可惜没时间,所以也没去深究。
bon 回复于:2005-04-02 00:01:29兄弟有没有试过对某个表的同步?
lixcos2 回复于:2005-04-02 07:13:22一个错误, 不支持双向复制,在英文文档中写的很明白。
最好不要在slave更新,写到master中会冲突的。所以要在master端设置reprication 权限。
---下面摘mysql的说明书
MySQL 3.23.15 and up features support for one-way replication.
---
Note that when you are using replication, all updates to the tables that are replicated should be performed on the master server. Otherwise, you must always be careful to avoid conflicts between updates that users make to tables on the master and updates that they make to tables on the slave.
如有问题,不妨msn联系:[email protected]
welcome to www.sayatoo.com
I am lix.
dgvri 回复于:2005-04-14 13:31:45好,顶.我也刚搞出这个,不过没写文档.
ywang_h 回复于:2005-05-16 12:50:27唉,mysql5.0.4的replication不支持procedure。
调用procedure时replication会报错!
myfisher 回复于:2005-06-09 13:40:43我刚刚在我的机器上进行了试验.
我的mysql的版本是4.0.16, 试验的结果是这样的.
1. 在两台机器上进行了update , insert, create table, delete 等操作, 另外一台机器马上会做同样的操作.
2. 在两台机器上创建用户时, 用grant all on 好像还是会提示access denied , 到mysql.user表中一看, replication slave 权限还是为N. mysql的手册上说只要给replication slave权限就行了(http://dev.mysql.com/doc/mysql/en/replication-howto.html). 所以我手动的改的user表
update mysql.user set Repl_slave_priv = 'Y' where User = 'backup';
3. 对复制的理解我觉得需要澄清一下. 在my.cnf里面设置
binlog-do-db = backup, 意思是说在你用use bakcup后的所有的操作都会在另一台机器上进行同样的一次操作.
比如;
mysql > use backup;
mysql > create database backup2;
此时在另一台机器上也会建一个backup2. 虽然不是backup
mysql > create table backup2.jintao (id int(10), name varchare(32));
虽然是操作backup2数据库, 但是在另一台机器上也会建同样的table.
4. 有了上面的理解, 可以得出复制的是sql操作. 如果, 用删除文件的办法, 把一个表删掉, 那么这个表是不会从另一台机器恢复的.
还有一些测试我还没做, 比如, 一个中断后恢复是什么结果, 等等, 我做完了后再发贴子.
兰花仙子 回复于:2005-08-26 08:18:27[quote:5e5e91416c="双眼皮的猪"]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是?.........[/quote:5e5e91416c]
这个我可以证明下,我们公司某系统的用户有数千万,就是用的mysql replication来备份。
peng1000cn 回复于:2005-08-26 08:25:19双眼皮的猪
好东西大家看。。我转了。
北京野狼 回复于:2005-08-26 09:13:25[quote:2c34a122a6="兰花仙子"]
这个我可以证明下,我们公司某系统的用户有数千万,就是用的mysql replication来备份。[/quote:2c34a122a6]
你看清楚mysql replication,并不是双向的
kingnetwork 回复于:2005-08-26 09:19:44双机互备是比较实用,但有个问题,如果主机在出现故障的时候,最后修改的几条记录备机是无法记录的,所以会造成数据库的不一致,如果真的需要高可靠性,还是做集群比较好!
兰花仙子 回复于:2005-08-26 09:38:44[quote:ab2bc67ac8="北京野狼"]
你看清楚mysql replication,并不是双向的[/quote:ab2bc67ac8]
我只是说使用了replication,又没说是否双向。
北京野狼 回复于:2005-08-26 09:45:18[quote:530af39628="兰花仙子"]
我只是说使用了replication,又没说是否双向。[/quote:530af39628]
那有什么好证实的,人家吵架说的也不是replication。
replication我都搞4,5年了
hardiwang 回复于:2005-08-26 12:10:15为什么不选择用存储呢?
一个MASTER ,一个SLAVE
读数据和验证从SLAVE, 修改用MASTER
php爱好者站 http://www.phpfans.net 网页制作|网站建设|数据采集.
贴上来的目的:share,顺便请高人纠错,万分感谢,或者不完善的地方,请大家多多提出...
因为我觉得也不是太熟悉,所以大家多看看,帮我指指错误就最好啦:)
实现MySQL的Replication
在MySQL 3.23.15版本之后,MySQL提供了数据库复制的功能,可以实现两个数据库实时同步,增强了MySQL数据库的稳定性,而且可以在企业级应用的数据库层实现Cluster…
条件:
1 Redhat 9
2 Mysql 4.0.20
3 两台机器ip为192.168.37.188 192.168.37.189,分别安装mysql
目标:
1.数据库的双向复制
2.在master与slave网络不通但过后再次恢复正常,master上的数据在slave上也可以得到更新,反之亦然.
本文主要分为以下几个部分:
第一部分 安装MySQL
第二部分 配置/etc/my.cnf(要查看/etc/init.d/mysql脚本判断是/etc/my.cnf)
第三部分 给权限
第四部分 查看工作状态,测试并验证是否可以真正同步
第五部分 Troubleshooting
第一部分 安装MySQL
1.得到MySQL的RPM安装包,列表如下:
MySQL-server-4.0.20-0
MySQL-client-4.0.20-0
MySQL-shared-4.0.20-0
2.使用root身份安装
#rpm –ivh MySQL-*-4.0.20-0
会有进度条提示安装进度;
安装完毕后,MySQL的数据库配置文件在/var/lib/mysql/中,而默认的几个配置文件在/usr/share/mysql/中,有以下几个文件:
My-hug.cnf
My-large.cnf
My-medium.cnf
My-small.cnf
顾名思义,是为了针对不同的应用来设计的,主要是对数据库的一些参数作了优化,具体优化请见my.cnf内的[mysqld]中语句.
第二部分 配置/etc/my.cnf
通过RPM包安装的mysql在/etc/init.d下会生成一个mysql的shell脚本文件,而在Redhat下我们一般用service mysql start的时候,其实就是传给该脚本start参数并执行,那么需要查看该文件,究竟是调用的哪个配置文件,在其中我们找到这么一行…
conf=/etc/my.cnf
那么可以判断配置文件是/etc/my.cnf
假设我们的是中型应用:
#copy /usr/share/mysql/my-medium.cnf /etc/my.cnf
拷贝到/etc/my.cnf之后,就可以对其进行配置,MySQL在每次启动的时候读取该配置文件并按其配置方式启动,因为数据库需要双向复制,则每台机器都需要同时是master和slave,
1、首先在192.168.37.188的/etc/my.cnf下在[mysqld]中修改,以下配置该机为master:
server-id=1
log-bin
binlog-do-db=backup
解释:
1)server-id=1表示是本机的序号为1,一般来讲就是master的意思.
2)log-bin表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提;
3)binlog-do-db=backup 表示需要备份的数据库是backup这个数据库,
4)如果需要备份多个数据库,那么应该写多行,如下所示:
binlog-do-db=backup1
binlog-do-db=backup2
binlog-do-db=backup3
2、其次仍然在该区域修改,以下配置为该机为slave
master-host=192.168.37.189
master-user=backup
master-password=1234
master-port=3306
3、然后配置192.168.37.189上的my.cnf
在/etc/my.cnf下在[mysqld]中修改:
server-id=2
master-host=192.168.37.188
master-user=username
master-password=password
master-port=3306 #主服务器端口
master-connect-retry=60 #同步时间间隔为60秒
replicate-do-db=backup
log-bin
binlog-do-db=backup
解释:
1)server-id=2表示本机器的序号;
2)master-host=192.168.37.188 表示本机做slave时的master为192.168.37.188;
3)master-user=username 这里表示master上开放的一个有权限的用户,使其可以从slave连接到master并进行复制;
4)master-password=password 表示授权用户的密码;
5)master-port=3306 master上MySQL服务Listen3306端口;
6)master-connect-retry=60 同步间隔时间;
7)replicate-do-db=backup 表示同步backup数据库;
8)log-bin 打开logbin选项以能写到slave的 I/O线程;
9)binlog-do-db=backup 表示别的机器可以同步本机的backup数据库.
最后重新启动192.168.37.188和192.168.37.189两台机器的mysql.
第三部分 分配权限
在192.168.37.188上使用mysql登陆,操作如下:
(1)Mysql>grant all privileges on backup.* to ‘backup’@’192.168.37.189’ identified by ‘1234’;
给使用192.168.37.189连接的backup用户以replication的权限…
(2)Mysql>flush privileges;
刷新权限设置;
在slave上使用mysql登陆
(1)Mysql> grant all privileges on backup.* to ‘backup’@’192.168.37.188’ identified by ‘1234’;
(2)Mysql>flush privileges;
刷新权限设置;
说明:上面的all privileges在4.0版上应该为replication slave,也就是grant replication slave on ........在3.23上是file,也就是grant file on ........但是我怕有别的麻烦,干脆权限全给好啦.
在进行如上设置之后,可以看出在192.168.37.189设定好并重启mysql以后,mysql会在数据目录(/var/lib/mysql)下生成一个master.info文件和relay-log.info,relay-log.index文件.如果要更改master服务器,则要删除掉这个文件,(即在更改了/etc/my.cnf中master相关信息)在my.cnf文件中重新配置,重新启动mysql,更改才会生效.
第四部分 查看工作状态
1)在master上新建一个backup数据库
Mysql>create database backup;
2)新建一个表:
Mysql>create table jintao (id int(10),name varchar(20));
3)查看192.168.37.189上的mysql;
Mysql>use backup;
Mysql>show tables;
Mysql>desc jintao;
Mysql>select * from jintao;
如果看到与master相同的信息,则可以证明是成功的.
同时可以改动已有的数据库来判断是否已经达到同步,都差不多的…只要证明数据库同步就可以啦…这时不分master/slave,在master上改动slave上会更新,而在slave上改动,master上也可以得到更新.
第五部分 troubleshooting
在master上,其实不需要做什么设置,只需要打开log-bin,写上server-id=1,写上要备份的数据库,则自动是master模式,于是问题主要集中在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的东西,于是同步就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var/lib/mysql/relay-log.info.
请注意,因为上边提到了binlog里的内容是改了什么东东,而不是改了以后是什么东东,所以在进行同步之前必须保证两个数据库是完全相同的,不然可能出错.打个比方来说.A机上有一个表里的元组为2,而操作是减一,则binlog只会记录减一这个操作,如果B机上没有,那么则无法得到同步,因为B机没有这个字段,就不知道减一是什么操作.
对于故障诊断,我的方法是都在slave(master/slave是相对的)的mysql(指客户端)里完成.
方法一:show slave status;
正确情况下应该同如下类似:
mysql> show slave status;
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
| Master_Host | Master_User | Master_Port | Connect_retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_do_db | Replicate_ignore_db | Last_errno | Last_error | Skip_counter | Exec_master_log_pos | Relay_log_space |
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
| 192.168.37.188 | backup | 3306 | 5 | Server-bin.020 | 79 | Jintao-relay-bin.001 | 45 | Server-bin.020 | Yes | Yes | backup | | 0 | | 0 | 79 | 45 |
+----------------+-------------+-------------+---------------+-----------------+---------------------+----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+------------+------------+--------------+---------------------+-----------------+
1 row in set (0.00 sec)
上边的Jintao和Server是两台机器的主机名,所以真实情况应该有所分别,注意其中的YES|YES,这个是本地I/O线程及SQL线程的工作状态,要确保都为YES,如果不是YES,请检查mysql是否正常运行.
方法二:show processlist;
如果正确,则应该如下所示:
Mysql>show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| 4 | system user | | NULL | Connect | 398 | Waiting for master to send event | NULL |
| 5 | system user | | NULL | Connect | 398 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 6 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
注意同标记过的字符类似,则是正确的,错误情况下应该是这个样子:
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
| 4 | system user | | NULL | Connect | 454 | Reconnecting after a failed master event read | NULL |
| 5 | system user | | NULL | Connect | 454 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 7 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
当然如果这里的Reconnecting只是错误的一种,有可能是connecting,则表示正在连接,那么请检查:
1 master上的mysql daemon是否正常运行
2 master与slave的网络连接是否正常
3 my.cnf是否配置正确
4 在修改配置后是否删除过master.info?(删掉以后会自动再生成一个,别担心删掉),因为如果不删掉的话,那么则还是使用原来的配置
5 修改配置后有没有重新启动mysql daemon,重新启动过程后必须证实mysql已经正常启动
6 master上给slave及slave给master上分配的replication用户权限是否正确,master的主机名和dns设置
7 当前状况两台数据库是否完全相同.
方法三:show master status;
mysql> show master status;
+----------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+----------------+----------+--------------+------------------+
| Server-bin.021 | 79 | backup | |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注意上边的这条,position不能为0,如果为0则表示有问题,请检查/etc/my.cnf中的server-id及是否打开log-bin
mysql> show processlist;
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
| 1 | backup | 192.168.37.189:1067 | NULL | Binlog Dump | 284 | Has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+--------+---------------------+------+-------------+------+----------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
如果master上不是这样,那么就应该是master的配置有问题啦.
方法四 查看错误日志
在/var/lib/mysql下有个hostname.err文件,所有的错误都在其中被记录,如下所示:
041210 12:54:51 mysqld started
041210 12:54:51 Warning: Asked for 196608 thread stack, but got 126976
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
041210 12:54:51 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
041210 12:54:54 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
041210 12:54:55 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
041210 12:54:58 InnoDB: Started
/usr/sbin/mysqld: ready for connections.
Version: '4.0.20-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306
041210 12:54:58 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './Jintao-relay-bin.001' position: 4
041210 12:54:58 Slave I/O thread: connected to master '[email protected]:3306', replication started in log 'FIRST' at position 4
以上日志没有错误,只是一个例子,但是假如数据库同步失败出现错误时,两个数据库不同,binlog中的记录将不能被slave所理解,所以会出错./var/lib/mysql/下会不停的生成hostname-bin.001及hostname-relay-bin.001之类的文件,这样每次在重新启动master/slave的时候都会用一个新的relay-log来取代原来的.所以该目录会不停的生成类似文件,而hostname-relay-bin.index来控制哪个是当前所使用的relay-log.整体的同步过程上面第五部分开头已经说清楚了,这里不再详述.
Btw:假如不知道本机的hostname,可以在终端下输入
#hostname
wing-qiang 回复于:2004-12-19 00:39:46不错!
odin_free 回复于:2004-12-20 12:36:56内容很好
整理整理就加精华
njblue2004 回复于:2005-01-17 11:23:00我试了一下,不行,
高手指教!!
wangyih 回复于:2005-01-17 13:11:58[quote:391400b805="双眼皮的猪"]行薷?
server-id=2
master-host=192.168.37.188
master-user=username
master-password=password
master-port=3306 #主服务器端口
master-connect-retry=60 #同步时间间隔为60秒
replicate-do-db=back..........[/quote:391400b805]
没看到在那里实现的双向复制
双眼皮的猪 回复于:2005-01-17 14:55:39to njblue2004:
哪里不行?把log贴上来看看行不?
to wangyih:
看不出来就没办法了...如果单向复制的话,没必要把37.188配置为slave的?
wangyih 回复于:2005-01-17 15:34:41[quote:553d9716d5="双眼皮的猪"]to njblue2004:
哪里不行?把log贴上来看看行不?
to wangyih:
看不出来就没办法了...如果单向复制的话,没必要把37.188配置为slave的?[/quote:553d9716d5]
那你告诉我你的37。189做主机的配置在那里.
既然互备两边干吗配置不一样
aspbiz 回复于:2005-01-17 22:45:20精神可嘉。!!!
应当加精。
双眼皮的猪 回复于:2005-01-18 09:31:47[quote:b3cff6326a="wangyih"]
那你告诉我你的37。189做主机的配置在那里.
既然互备两边干吗配置不一样[/quote:b3cff6326a]
配置一下就知道了...我不想说太多...
做主机的配置就是log-bin,以及要备份的数据库...
个人对你没什么好感,就请不要老是用这种语气来说话...
如果说自己没做过,我说什么都没用,自己去试一下就知道了...
wangyih 回复于:2005-01-18 11:51:43[quote:d31942f639="双眼皮的猪"]
配置一下就知道了...我不想说太多...
做主机的配置就是log-bin,以及要备份的数据库...
个人对你没什么好感,就请不要老是用这种语气来说话...
如果说自己没做过,我说什么都没用,自己去试一下就知道了...[/quote:d31942f639]
我对你这样只有讨厌的感觉。
你这东西就是一个垃圾,根本就是不能用的,自我感觉良好。
这破玩意只要正式环境一使用就完蛋,想实现mysql互备,只有痴人做梦
aspbiz 回复于:2005-01-18 14:29:22互备,效果不太好。
不过,一般场合还是可以用的。
双眼皮的猪 回复于:2005-01-18 16:11:07[quote:632bb972f4="wangyih"]
我对你这样只有讨厌的感觉。
你这东西就是一个垃圾,根本就是不能用的,自我感觉良好。
这破玩意只要正式环境一使用就完蛋,想实现mysql互备,只有痴人做梦[/quote:632bb972f4]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是试一下mysql提供的这个功能...
3 请你实质上做一次
4 我不想把Mysql replication的原理说好多好多次...我原来的帖子里说过好几次...
5 这破玩意有一个很大的公司在用,多大,应该比你的大的多...
6 不要因为自己不了解的东西,来跟别人理论...
其实,你还是做一次吧,其实我很想说点什么的,上面这些算了吧...
btw:我觉得vim比ue方便...应该是ue用的没你好吧...
titan3 回复于:2005-01-18 20:40:53楼上涵养好,现在有些人确实不可理喻
wangyih 回复于:2005-01-18 20:56:34[quote:94ace9ab7f="双眼皮的猪"]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是?.........[/quote:94ace9ab7f]
你更加没有礼貌,我问你问题是你先发表,没好感的话题。
我也很想知道同一个表双向复制和互备的区别
双眼皮的猪 回复于:2005-01-19 08:46:02好的,我先错的...
互备我不知道..
而双向复制,则只需要说单向复制即可..依次类推...
[quote:c88c0741d7]
在master上,其实不需要做什么设置,只需要打开log-bin,写上server-id=1,写上要备份的数据库,则自动是master模式,于是问题主要集中在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的数据,进而转换成本地数据,也就一步步实现了复制...[/quote:c88c0741d7]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...
wangyih 回复于:2005-01-19 11:14:57[quote:6cd02af33a="双眼皮的猪"]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...[/quote:6cd02af33a]
老实说还是没太看懂有什么区别,我再找找资料,谢谢
wangyih 回复于:2005-01-19 11:15:39[quote:7c16e0cb28="双眼皮的猪"]
这是上面文章里有的...至于说代码实现,那我就没研究过了...我只是应用,实验一下它的功能...
其实说那么多,只需要你亲自做一下,那么问题就清楚了...[/quote:7c16e0cb28]
老实说还是没太看懂有什么区别,
我第一次做Replication还是3年多前.但从未做出来过互备.
我不是问代码实现,既然你说不是一回事情,就是不知道这两个功能上的区别
谢谢
toplee 回复于:2005-02-22 16:21:09mysql互备在实际应用中是很少使用的,对于并发很大的应用来讲,更是没法使用,到时Master/Slave单向的复制倒是有些实际应用场景,既可以做到实时备份,还能从程序逻辑上来分担一些纯粹的select操作到slave上,对于统计分析、查询等应用是比较有利的。比如很多论坛就是这么实现的,我观察sohu的论坛就是这么搞的,帖子发出是更新到master,然后稍有延迟从slave中取到显示出来。
至于楼主的内容,不加以评判好坏,不过至少精神可嘉。对于mysql的repliction我曾经研究不少,大家最好还是去mysql的官方网站看看(http://dev.mysql.com/doc/mysql/en/replication.html),上面有关于mysql的repliction最权威的说法,中间重点提到了一些需要注意的地方,比如某些字段类型的使用,楼主说到互备或者双向复制,对于auto_increment类型的字段来说,肯定存在问题。
个人见解,不带攻击成分!支持言论自由!
双眼皮的猪 回复于:2005-02-23 09:28:20来逛一下~发现了,呵呵~
我可没说过是互备~只是说了下双向复制~
我很同意Toplee的看法...双向复制我也认为没有什么意思...假如出现问题导致db不同了,就不好了,所以我觉得单向做复制比较有用..
您给的这个链接我看过,mysql的manual还是很全的:)
我还找到mysql.org里做replication自己写的一个文档,里边谈到其中的实现,一些很少的代码。可惜没时间,所以也没去深究。
bon 回复于:2005-04-02 00:01:29兄弟有没有试过对某个表的同步?
lixcos2 回复于:2005-04-02 07:13:22一个错误, 不支持双向复制,在英文文档中写的很明白。
最好不要在slave更新,写到master中会冲突的。所以要在master端设置reprication 权限。
---下面摘mysql的说明书
MySQL 3.23.15 and up features support for one-way replication.
---
Note that when you are using replication, all updates to the tables that are replicated should be performed on the master server. Otherwise, you must always be careful to avoid conflicts between updates that users make to tables on the master and updates that they make to tables on the slave.
如有问题,不妨msn联系:[email protected]
welcome to www.sayatoo.com
I am lix.
dgvri 回复于:2005-04-14 13:31:45好,顶.我也刚搞出这个,不过没写文档.
ywang_h 回复于:2005-05-16 12:50:27唉,mysql5.0.4的replication不支持procedure。
调用procedure时replication会报错!
myfisher 回复于:2005-06-09 13:40:43我刚刚在我的机器上进行了试验.
我的mysql的版本是4.0.16, 试验的结果是这样的.
1. 在两台机器上进行了update , insert, create table, delete 等操作, 另外一台机器马上会做同样的操作.
2. 在两台机器上创建用户时, 用grant all on 好像还是会提示access denied , 到mysql.user表中一看, replication slave 权限还是为N. mysql的手册上说只要给replication slave权限就行了(http://dev.mysql.com/doc/mysql/en/replication-howto.html). 所以我手动的改的user表
update mysql.user set Repl_slave_priv = 'Y' where User = 'backup';
3. 对复制的理解我觉得需要澄清一下. 在my.cnf里面设置
binlog-do-db = backup, 意思是说在你用use bakcup后的所有的操作都会在另一台机器上进行同样的一次操作.
比如;
mysql > use backup;
mysql > create database backup2;
此时在另一台机器上也会建一个backup2. 虽然不是backup
mysql > create table backup2.jintao (id int(10), name varchare(32));
虽然是操作backup2数据库, 但是在另一台机器上也会建同样的table.
4. 有了上面的理解, 可以得出复制的是sql操作. 如果, 用删除文件的办法, 把一个表删掉, 那么这个表是不会从另一台机器恢复的.
还有一些测试我还没做, 比如, 一个中断后恢复是什么结果, 等等, 我做完了后再发贴子.
兰花仙子 回复于:2005-08-26 08:18:27[quote:5e5e91416c="双眼皮的猪"]
算了,本来想吵一吵的,想来还是算了,wangyih做一做就知道了...
我没说过互备的...我说双向复制...
至于“你这东西就是一个垃圾”,“自我感觉良好”
我可以告诉你
1 你很不礼貌
2 我没有感觉良好,我只是?.........[/quote:5e5e91416c]
这个我可以证明下,我们公司某系统的用户有数千万,就是用的mysql replication来备份。
peng1000cn 回复于:2005-08-26 08:25:19双眼皮的猪
好东西大家看。。我转了。
北京野狼 回复于:2005-08-26 09:13:25[quote:2c34a122a6="兰花仙子"]
这个我可以证明下,我们公司某系统的用户有数千万,就是用的mysql replication来备份。[/quote:2c34a122a6]
你看清楚mysql replication,并不是双向的
kingnetwork 回复于:2005-08-26 09:19:44双机互备是比较实用,但有个问题,如果主机在出现故障的时候,最后修改的几条记录备机是无法记录的,所以会造成数据库的不一致,如果真的需要高可靠性,还是做集群比较好!
兰花仙子 回复于:2005-08-26 09:38:44[quote:ab2bc67ac8="北京野狼"]
你看清楚mysql replication,并不是双向的[/quote:ab2bc67ac8]
我只是说使用了replication,又没说是否双向。
北京野狼 回复于:2005-08-26 09:45:18[quote:530af39628="兰花仙子"]
我只是说使用了replication,又没说是否双向。[/quote:530af39628]
那有什么好证实的,人家吵架说的也不是replication。
replication我都搞4,5年了
hardiwang 回复于:2005-08-26 12:10:15为什么不选择用存储呢?
一个MASTER ,一个SLAVE
读数据和验证从SLAVE, 修改用MASTER
php爱好者站 http://www.phpfans.net 网页制作|网站建设|数据采集.
相关阅读 更多 +