复制介绍
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
如果你想要设置链式复制服务器,从服务器本身也可以充当主服务器。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
l 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
l 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
l 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
要实现热备MYSQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本,如果要实现双机热备就一定要两个数据库的版本一样,如果不知道两个数据库的版本可以用如下命令查看
1、登陆前查看
$MYSQLHOME/bin/mysql –V//$MYSQLHOME指MYSQL的安装目录
2、登陆后查看
A、 mysql>status
B、 mysql>select version();
Mysql版本:5.1.69 for Win32
操作系统:Windows Server 2003 32位
服务器名称 | IP |
MYSQL_A | 192.168.100.100 |
MYSQL_B | 192.168.100.200 |
1、主-从双机热备
MYSQL_A作为主机,MYSQL_B作为从机。在MYSQL_A和MYSQL_B上分别创建好需要同步的数据库。
编辑MYSQL_A的my.cnf配置文件,在[mysqld]下加入如下参数:
server-id=1
log-bin=log_name
binlog-do-db=etim
binlog-ignore-db=mysql
编辑MYSQL_B的my.cnf配置文件,在[mysqld]下加入如下参数:
server-id=2
log-bin=log_name
binlog-do-db=etim
binlog-ignore-db=mysql
参数配置说明:
参数 |
说明 |
Server-id |
服务id,每个数据库都不一样,n代表ID号,在MYSQL_A上设为1,在MYSQL_B上设为2。 |
log-bin |
日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称。 |
binlog-do-db |
需要热备的数据库。 |
binlog-ignore-db |
不需要热备的数据库,这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。 |
重启MYSQL_A、MYSQL_B上的MYSQL数据库。
设置同步数据库的用户帐号
登陆MYSQL_A上的mysql,运行如下命令:
GRANT REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.200' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.200' IDENTIFIED BY '123456';
在MYSQL_A上锁定现有的数据库,使用如下命令:
FLUSH TABLES WITH READ LOCK;
另外打开一个窗口,使用命令备份MYSQL_A上的数据库。
mysqldump -uroot -proot etim > c:\etim.sql
在MYSQL_A的mysql查看主服务器状态,使用命令:
show master status;
记录File 和 Position 项目的值,以后要用的。
然后用“unlock tables;”语句来释放MYSQL_A上mysql锁。
将MYSQL_A上的etim.sql文件拷贝到MYSQL_B上,在MYSQL_B上使用命令mysql -uroot -p etim < c:\etim.sql 还原数据。
登陆MYSQL_B的MYSQL并设置主服务器的各种参数:
MYSQL_B:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.100.100',
MASTER_USER='syn',
MASTER_PASSWORD='123456',
MASTER_CONNECT_RETRY=60,
MASTER_LOG_FILE='log_name.000002',
MASTER_LOG_POS=1443;
参数配置说明:
MASTER_HOST |
同步数据库的IP,从该主机上同步数据到本机。 |
MASTER_USER |
同步数据的用户 |
MASTER_PASSWORD |
同步数据的密码 |
MASTER_CONNECT_RETRY |
断开之后,再次尝试连接的时间间隔 |
MASTER_LOG_FILE |
主服务器二进制日志的文件名(前面要求记住的参数) |
MASTER_LOG_POS |
日志文件的开始位置(前面要求记住的参数) |
然后在MYSQL_B的mysql里运行“slave start;”来启动同步数据库的线程。主-从双机热备配置完成。
2、主-主双机热备
先编辑MYSQL_A和MYSQL_B上的my.cnf配置文件,在[mysqld]下加入如下参数:
server-id=n
log-bin=log_name
binlog-do-db=etim
binlog-ignore-db=mysql
服务器MYSQL_A中server-id的值为1,服务器MYSQL_B中server-id的值为2。
分别重启MYSQL_A和MYSQL_B上的MYSQL数据库,然后登陆mysql,运行如下命令:
MYSQL_A:
GRANT REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.200' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.200' IDENTIFIED BY '123456';
MYSQL_B:
GRANT REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.100' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'syn'@'192.168.100.100' IDENTIFIED BY '123456';
重启MYSQL_A、MYSQL_B上的mysql。
在MYSQL_A上锁定现有的数据库、备份现在的数据,并在MYSQL_B上恢复数据。
锁定数据库
FLUSH TABLES WITH READ LOCK;
使用命令备份数据库,etim事先已经创建好
mysqldump -uroot -proot etim > c:\etim.sql
在MYSQL_A上查看主服务器状态
MYSQL_A:
mysql> show master status;
记录File 和 Position 项目的值,以后要用的。
然后用“unlock tables;”语句来释放锁,
在MYSQL_B上创建etim数据库,还原数据使用命令:
mysql -uroot -p etim < c:\etim.sql
在MYSQL_B上查看主服务器状态,在查看状态之前,MYSQL_B服务器上更新的数据将不会同步到MYSQL_A服务器上,为了保持数据一致,不能在查看状态之前更新MYSQL_B上的数据。
MYSQL_B:
mysql> show master status;
分别登陆上MYSQL_A和MYSQL_B的MYSQL并设置主服务器的各种参数:
MYSQL_A:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.100.200',
MASTER_USER='syn',
MASTER_PASSWORD='123456',
MASTER_CONNECT_RETRY=60,
MASTER_LOG_FILE='log_name.000002',
MASTER_LOG_POS=1443;
MYSQL_B:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.100.100',
MASTER_USER='syn',
MASTER_PASSWORD='123456',
MASTER_CONNECT_RETRY=60,
MASTER_LOG_FILE='log_name.000001',
MASTER_LOG_POS=59668786;
然后分别在MYSQL_A和MYSQL_B的mysql里运行“slave start;”来启动同步数据库的线程。
至此,版本5.1的双机热备配置完成
最后分别在MYSQL_A和MYSQL_B的数据库里面插入大量数据查看效果,
参考
http://dev.mysql.com/doc/refman/5.1/zh/replication.html
http://www.asymt.com/servers/database/460.html