搜档网
当前位置:搜档网 › MySQL 双向实时同步方法

MySQL 双向实时同步方法

MySQL 双向实时同步方法
MySQL 双向实时同步方法

我今天做了一下,初步测试是可以的。无论在A机器还是在B机器上增加数据,另一台机器都能即时地反应出来。

以下是我在另一个帖子上回复的,请参考:

刚开始时也是一直不成功,经过查看错误日志后,修正了一些错误。值得注意的有两点:

1、备份用户只赋file权限时,我发现该连接被拒绝。后来,我直接用了root用户就可以了,这点我还要再研究一下。

2、当我们在测试时,不停地修改my.ini文件(我这个版本是修改安装目录\my.ini),但要注意,修改完此文件,即使是重启mysql服务,也并未生效,应该这样做:停止mysql服务--修改my.ini文件--删除data 目录下的:机器名-bin.*及https://www.sodocs.net/doc/db18505433.html,文件,注意别把机器名-relay-bin.*删了--启动mysql服务。

我试了一下分别在两台机器上修改数据,基本上即时地在另外一台服务器上得到更新。

以下是我的my.ini文件。

机器A:

log-bin

server-id=1

sql-bin-update-same

binlog-do-db=test

master-host=10.143.52.11

master-user=root

master-password=yg0616

master-connect-retry=60

replicate-do-db=test

log-slave-updates

机器B

log-bin

server-id=2

sql-bin-update-same

binlog-do-db=test

master-host=10.143.52.21

master-user=root

master-password=yg0616

master-connect-retry=60

replicate-do-db=test

log-slave-updates

祝好运,解决了说一声啊。

source:

https://www.sodocs.net/doc/db18505433.html,/nuanchun666/archive/2008/01/28/2069301.aspx

一、概述MySQL从3.23.15版本以后提供数据库复制(replication)功能,利用该功能可以实现两个数据库同步、主从模式、互相备份模式的功能。本文档主要阐述了如何在linux系统中利用mysql的replication 进行双机热备的配置。

二、环境操作系统:Linux 2.6.23.1-42.fc8 # SMP(不安装XEN)Mysql版本:5.0.45-4.fc8设备环境:PC(或者虚拟机)两台

三、配置数据库同步复制功能的设置都在MySQL的配置文件中体现,MySQL的配置文件(一般是https://www.sodocs.net/doc/db18505433.html,f):在本环境下为/etc/https://www.sodocs.net/doc/db18505433.html,f 。

3.1 设置环境:IP 的设置:A主机IP:10.10.0.119 Mask:255.255.0.0B主机IP:

10.10.8.112 Mask:255.255.0.0在IP设置完成以后,需要确定两主机的防火墙确实已经关闭。可以使用命令service iptables status 查看防火墙状态。如果防火墙状态为仍在运行。使用service iptables stop 来停用防火墙。如果想启动关闭防火墙,可以使用setup命令来禁用或定制。最终以两台主机可以相互ping通为佳。

3.2 配置A主(master) B从(slave)模式3.2.1 配置A 为master

1、增加一个用户同步使用的帐号:GRANT FILE ON *.* TO ‘backup’@'10.10.8.112' I DENTIFIED BY ‘1234’;GRANT REPLICATION SLAVE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;赋予10.10.8.112也就是Slave 机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以。

2、增加一个数据库作为同步数据库:create database test;

3、创建一个表结构:create table mytest (username varchar(20),password varchar(20));

4、修改配置文件:修改A的/etc/https://www.sodocs.net/doc/db18505433.html,f 文件,在https://www.sodocs.net/doc/db18505433.html,f 配置项中加入下面配置:server-id = 1 #Server 标识log-binbinlog-do-db=test #指定需要日志的数据库

5、重起数据库服务:service mysqld restart查看server-id:show variable like ‘server_id’;实例:mysql> show variables like 'server_id'; --------------- ------- | Variable_name | Value | ---------------

------- | server_id | 1 | --------------- ------- 1 row in set (0.00 sec)6、用show master status\G 命令看日志情况。正常为:mysql> show master

status\G*************************** 1. row ***************************File: mysqld-bin.000002Position: 198Binlog_Do_DB: test,testBinlog_Ignore_DB: 1 row in set (0.08 sec)3.2.2 配置B 为slave1、增加一个数据库作为同步数据库:create database test;

2、创建一个表结构:create table mytest (username varchar(20),password varchar(20));

3、修改配置文件:修改B的/etc/https://www.sodocs.net/doc/db18505433.html,f 文件,在https://www.sodocs.net/doc/db18505433.html,f 配置项中加入下面配置:

server-id=2master-host=10.10. 0.119master-user=backup #同步用户帐号

master-password=1234master-port=3306master-connect-retry=60 #预设重试间隔60秒replicate-do-db=test #告诉slave只做backup数据库的更新

5、重起数据库服务:service mysqld restart查看server-id:show variables like ‘server_id’;实例:mysql> show variables like 'server_id'; --------------- ------- | Variable_name | Value |

--------------- ------- | server_id | 2 | --------------- ------- 1 row in set (0.00 sec)6、用show slave status\G 命令看日志情况。正常为:mysql> show slave

status\G*************************** 1. row

*************************** Slave_IO_State: Waiting for master to send

event Master_Host: 10.10.0.119 Master_User:

backup Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysqld-bin.000001 Read_Master_Log_Pos: 98 Relay_Log_File:

mysqld-relay-bin.000003 Relay_Log_Pos: 236 Relay_Master_Log_File:

mysqld-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running:

Yes Replicate_Do_DB:

test,test Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno:

0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos:

98 Relay_Log_Space: 236 Until_Condition:

None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed:

No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 01 row in set (0.01 sec)

3.2.3 验证配置分别使用insert, delete , update 在A 主机进行增删改查数据库;查看B主机的数据库是否与A主机一致;若一致,则配置成功。

3.3双机互备模式如果在A主机加入slave设置,在B主机加入master设置,则可以做B->A的同步。1、在A主机的配置文件中mysqld 配置项加入以下设置:

master-host=10.10.8.112master-user=backupmaster-password=1234replicate-do-db=testmast er-connect-retry=102、在B的配置文件中mysqld 配置项加入以下设置:log-binbinlog-do-db=test

注意:当有错误产生时,*.err日志文件同步的线程退出,当纠正错误后,要让同步机制进行工作,运行slave start。重起A、B机器,则可以实现双向的热备份。

四、常见问题及解决

1、Slave机器的权限问题,不但要给slave机器File权限,还要给它REPLICATION SLAVE的权限。

2、在修改完Slave机器/etc/https://www.sodocs.net/doc/db18505433.html,f之后,slave机器的mysql服务启动之前,记得要删除掉https://www.sodocs.net/doc/db18505433.html,

3、在show master status 或着show slave status 不正常时,看看.err是怎样说的。

4、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/https://www.sodocs.net/doc/db18505433.html,,而决定SQL thread的是/var/lib/mysql/https://www.sodocs.net/doc/db18505433.html,.

5、启动slave,命令用start slave;重新启动用restart slave

6、把master上的数据拷贝过来的方法之一实在slave上执行LOAD DATA FROM MASTER 语句。不过要注意,LOAD DATA FROM MASTER 是从MySQL 4.0.0之后才开始可以用的,而且只支持master上的MyISAM 类型表

我的配制A机:

server-id = 1

#zxw add

binlog-do-db=reader

##

master-host=172.16.168.216

master-user=backup

master-password=1234

replicate-do-db=reader

master-connect-retry=10

B机:

server-id = 2

#zxw add

master-host=172.16.168.215

master-user=backup

master-password=1234

master-port=3306

master-connect-retry=60

replicate-do-db=reader

#

binlog-do-db=reader

如果权限有问题,就给所有权限!!

参考:

https://www.sodocs.net/doc/db18505433.html,/2006_03_05_mysql_optimize_1

第一步:设置同步帐号

GRANT FILE,Select,SUPPER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO rep@192.168.1.15 IDENTIFIED BY '123456';

第二步:设置主机(master)的https://www.sodocs.net/doc/db18505433.html,f

master的唯一ID号:

server-id = 1

master的日志文件:

log-bin

master的不生成日志的数据库:

set-variable = binlog-ignore-db=mysql

set-variable = binlog-ignore-db=test

第三步:设置从机(slave)的https://www.sodocs.net/doc/db18505433.html,f

slave的唯一ID号:

setver-id = 2

slave的日志文件

log-bin

slave的不想生成日志的数据库:

set-variable = binlog-ignore-db = mysql

set-variable = binlog-ignore-db = test

连接主机(master)的地址:

master-host = 192.168.1.13

连接主机(master)的帐号:

master-user = rep

连接主机(master)的密码:

master-password = 123456

连接主机的(master)的端口:

master-port = 3306

设置想要同步的数据库:

set-variable=replicate-do-db=webdata

设置不想同步的数据库:

set-variable=replicate-ignore-db=mysql

set-variable=replicate-ignore-db=test

第四步:拷贝主机(master)的数据库到从机(slave)

1,首先把主机(master)的数据库的日志文件全部删除,重启数据库

2,用root帐号过入主机(master)的mysql,并把mysql的表都处于只读状态.

FLUSH TABLES WITH READ LOCK;

3,在不退出当前登陆口的情况下,另开一个登陆,把主机(master)数据库的文件

全部打包,并把文件拷贝到从机(slave)上面。

4,把从机(slave)的数据库停止,把从机原数据库文件先备份(防止出错),再把由主机拷贝过来的数据库文件解压并使主机(master)的数据库代替从机(slave)的数据库,设置好属主关系5,现在可以把主机的数据库的表解锁啦,执行UNLOCK TABLES;

6,重新启动从机(slave)的数据库,并进入mysql执行SHOW SLAVE STATUS\G,

如果你看到

Slave_IO_Running: Yes Slave_SQL_Running: Yes 那么,恭喜你,成功同步了。最后,提示,如果不成功,可以再做一次,检查从机(slave)的错误日志,看看日志里写了什么再在网上查查相应资料,不过我按这个方法设置了几台机子都是成功的。呵呵。如果你想主从互相同步,那么你只要把主机也加入从机同步的内容也就行了。具体没试过。理论上应该是行的。呵呵。

相关主题