环境要求: Windows + MySQL 3.23.15以上。
前置条件
假设数据库A为主机,数据库B为从机(A向B提供同步服务,即B中的数据来自A)
- A机器:IP=10.10.151.166
- B机器:IP=10.10.151.156
单向同步
下面看单向同步的配置步骤:
- 在机器A中建立一个新的数据库,sql语句:
CREATE DATABASE backup_db;
USE test;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
- 打开A机器的mysql安装目录下的my.ini文件,在文件最后添加:
server-id=1
log-bin=c:\mysqlback #启动同步事件的日志记录文件
binlog-do-db=test #提供数据同步服务的数据库
- 在机器B中建立一个和机器A结构相同的数据库,sql语句:
CREATE DATABASE backup_db;
USE test;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注:机器A和B的数据库结构必须一致,否则无法构成同步
- 打开B机器的mysql安装目录下的my.ini文件,在文件最后添加:
server-id=2
master-host=10.10.151.166 #主机A的地址
master-user=ym #主机A提供给B的用户,该用户中需要包括数据库test的权限
master-password=ym #访问密码
master-port=3306 #端口,主机的MYSQL端口
master-connect-retry=60 #重试间隔60秒,当主从服务器连接意外断开时数据库每隔60秒进行一个重新连接
replicate-do-db=test #同步的数据库
- 完成以上配置之后,在机器A的mysql控制台中输入:
GRANT REPLICATION SLAVE,RELOAD,SUPER
ON *.* TO ym@10.10.151.156 IDENTIFIED BY 'ym';
这句负责给服务器配权限,从主服务器接收二进制日志文件
重启机器A和B的mysql数据库.
在机器B的mysql控制台(开启主从同步):
Mysql>slave start;
如果想查看同步配置的情况,可以按如下输入:
机器A的mysql控制台:
Mysql>show master status;
机器B的mysql控制台:
Mysql>show slave status;
在机器A中test数据库中的
backup_table
表中插入一些数据,查看机器B中test数据库中的backup_table
表应该同步实现了数据的改动。
双向同步
- 还是使用机器A和机器B,但B是主机,A是从机,保持上面的配置不要改,在机器A的mysql安装目录下的my.ini文件最后添加:
master-host=10.10.151.156 #主机B的地址
master-user=ym #主机B提供给A的用户,该用户中需要包括数据库test的权限
master-password=ym #访问密码
master-port=3306 #端口,主机的MYSQL端口
master-connect-retry=60 #重试间隔60秒当主从服务器连接意外断开时数据库每隔60秒进行一个重新连接
replicate-do-db=test #同步的数据库
在机器B的mysql安装目录下的my.ini文件最后添加
log-bin=c:\mysqlback #启动同步事件的日志记录文件
binlog-do-db=test #提供数据同步服务的数据库
- 机器B的mysql控制台输入:
GRANT REPLICATION SLAVE,RELOAD,SUPER
ON *.* TO ym@10.10.151.166 IDENTIFIED BY 'ym' ;
重启机器A和机器B的mysql数据库
在机器B中test数据库中的
backup_table
表中插入一些数据,查看机器A中test数据库中的backup_table
表应该同步实现了数据的改动。但不会导致循环
注:实现mysql数据库的数据同步,须将参与数据同步服务器的防火墙关闭。
数据同步的原理
简介
在Mysql官方网站文档上,数据同步叫replication
,字面意思是重复、主从复制,很准确的表明了Mysql数据库操作的实质,是重复同样的操作,以保持主数据库服务器(master)与从属数据库服务器(slave)之间的数据一致。
在MySQL 3.23.15以后,Mysql支持单向的异步复制。也就是说,1台Mysql服务器充当Master(主库),1台或多台Mysql服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于Mysql的同步复制实现1。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志2,并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。
异步复制 机制
在从库启动异步复制时,从库会开启两个I/O线程:
1. 其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。
2. 另一个线程则负责读取本地写入的二进制日志,并在本地执行,以保证主从数据库之间的数据同步。
旧版本在复制时,只启用一个I/O线程,实现这两部分的功能。
这种方法是利用了Mysql数据库主(master)和从(slave)异步复制功能,来实现数据库之间的同步。
Windows系统中,Mysql安装目录下my.ini文件中:
log-bin=c:\mysqlback;
这一句表示数据库的二进制日志文件都存放在C盘根目录下,并且以mysqlback
为文件名,以.000001
这样的序号为为文件的扩展名,每一个binlog
文件默认是1GB,超过了会自动换到以.000002
为文件扩展名的的文件,索引文件mysqlback.index
记录了所有mysqlback
的文件名。当然也可以删除这些二进制日志文件:
//使用下面的两个命令:xxx不会被清除,删除这个序号以前的所有二进制日志文件,并重新生成新的二进制日志文件,后缀从.000001开始。
PURGE {MASTER | BINARY} LOGS TO 'log_name' //log_name不会被清除……
PURGE {MASTER | BINARY} LOGS BEFORE 'date' //date不会被清除……
但,若存在一个正在运行的从属服务器,该服务器当前正在读取正在试图删除的日志文件时,则该删除语句不会起作用,而是会失败,并提示一个错误。
如果从属服务器是停止的,并且碰巧清理了其想要读取的日志文件,则从属服务器启动后便不能复制。当从属服务器正在复制时,删除语句可以安全运行,无需停止它们。
在完成了主服务器A的my.ini
文件的配置之后,重启主服务器A,从现在起对主服务器A数据库的增删改操作都会记录在二进制日志文件中(查询操作不做记录)。
也可以指定从服务器从哪里开始和主服务器进行同步,在从服务器上执行下面sql操作:
首先输入命令:slave stop;
然后输入:
Mysql > change master to
—>master_host=’master_host_name’,#主机IP地址
—>master_user=’replication_user_name’,
—>master_password=’replication_password’,
—>master_log_file=’recorded_log_file_name’,
—>master_log_pos=’recorded_log_position’;
最后输入命令:slave start
;
想从哪个二进制日志文件开始同步,就把上面的recorded_log_file_name
改为对应的文件名,而recorded_log_position
改为从该文件的第几条记录开始同步。
当数据同步产生错误时,会在mysql安装目录下生成*.err日志文件,同时同步线程会退出。
PURGE binary logs TO ‘mysql-bin.000003′;
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
例如:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
清除3天前的 binlog:
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
BEFORE变量的date自变量可以为’YYYY-MM-DD hh:mm:ss’格式。MASTER和BINARY是同义词。