复制介绍 MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器
复制介绍
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 还原数据 。
登陆 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
在 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