为了实现MYSQL数据库的冗灾、备份、恢复、负载均衡等功能,喻名堂这两天一直在学习和研究mysql的双机热备,其实MYSQL的双机热备就是使用MYSQL同步功能两种方式里面的“主-主”同步方式实现的。在一开始搜索资料进行配置时没有注意版本的问题,所以试了很多次都没有成功,后来才知道搜索的方法不对,结果搜索出来的资料都是老版本的,最后通过搜索对应的版本号再根据资料终于配置成功,现将不同版本的双机热备的配置方法进行整理并分享出来方便其他想配置MYSQL双机热备的朋友能一次成功。
要实现热备MYSQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本,如果要实现双机热备就一定要两个数据库的版本一样,如果不知道两个数据库的版本可以用如下命令查看
1、登陆前查看
$MYSQLHOME/bin/mysql –V //$MYSQLHOME指MYSQL的安装目录
2、登陆后查看
A、 mysql>status
B、 mysql>select version();
现在MYSQL的最新版为5.5.27,从版本5.1.7开始双机热备的方法就出现了变化,在版本5.1.7前的配置文件里面的一些可以用的参数在版本5.1.7以后已经不可以用了。现在喻名堂就根据版本5.1.7以前和版本5.1.7以后两种情况的双机热备的配置进行描述。
在对配置过程进行描述前先对实验环境做一些定义,方便后面的描述
第一台MYSQL数据库服务器的名称为:MYSQL_A,IP地址为:192.168.100.100;第二台MYSQL数据库服务器的名称为:MYSQL_B,IP地址为:192.168.100.200,两台服务器都是使用的centos5.6的操作系统,两个MYSQL的安装目录都是:/mysql,数据目录都是:/mysql/data,配置文件目录都是:/etc/my.cnf,要同步的数据库为asymt
一、版本5.1.7以前
1、设置MYSQL_A
编辑my.cnf,在[mysqld]下添加如下配置:(my.cnf里面已经存在的配置不必重复配置)
Server-id=1 //服务id,这个应该默认是1就不用改动
log-bin=log_name //日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称
master-host=192.168.100.200 //主服务器的IP地址或者域名
master-port=3306 //主数据库的端口号
master-user=asymt //同步数据库的用户
master-password=123456 //同步数据库的密码
master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差
binlog-do-db=asymt //记录日志的数据库
binlog-ignore-db=mysql //不记录日志的数据库 , 这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。
以上的如果有多个数据库只要在下面添加就行,有多少个数据库就添加几行
然后设置同步数据库的用户帐号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.200' IDENTIFIED BY '123456';
4.0.2以前的版本, 因为不支持REPLICATION 要使用下面的语句来实现这个功能
mysql> GRANT FILE ON *.* TO 'asymt'@'192.168.100.200' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.200' IDENTIFIED BY '123456';
锁定现有的数据库、备份现在的数据并在MYSQL_B上恢复数据
锁定数据库
mysql> FLUSH TABLES WITH READ LOCK;
不要退出这个终端,否则这个锁就不生效了;备份数据库有两种办法一种是直接进入到mysql的data目录然后打包你需要备份数据库的文件夹,第二种是使用mysqldump的方式来备份数据库但是要加上"--master-data " 这个参数,建议使用第一种方法来备份数据库,然后在MYSQL_B上将MYSQL_A上的备份数据解压到数据库data目录并设置好权限以及属主,然后用“unlock tables”语句来释放锁,最后重启数据库。
2、设置MYSQL_B
同MYSQL_A一样,编辑my.cnf,在[mysqld]下添加如下配置:(my.cnf里面已经存在的配置不必重复配置)
Server-id=2 //服务id,每个数据库应该不一样
log-bin=log_name //日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称
master-host=192.168.100.100 //主服务器的IP地址或者域名
master-port=3306 //主数据库的端口号
master-user=asymt //同步数据库的用户
master-password=123456 //同步数据库的密码
master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差
binlog-do-db=asymt //记录日志的数据库
binlog-ignore-db=mysql //不记录日志的数据库 , 这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。
以上的如果有多个数据库只要在下面添加就行,有多少个数据库就添加几行
然后设置同步数据库的用户帐号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.100' IDENTIFIED BY '123456';
4.0.2以前的版本, 因为不支持REPLICATION 要使用下面的语句来实现这个功能
mysql> GRANT FILE ON *.* TO 'asymt'@'192.168.100.100' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.100' IDENTIFIED BY '123456';
最后重启数据库
3、分别登陆MYSQL_A和MYSQL_B上的数据库,查看同步状态:
mysql –h localhost –u root -p
mysql>SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.100
Master_User: asymt
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000002
Read_Master_Log_Pos: 1556
Relay_Log_File: localhost-relay-bin.000004
Relay_Log_Pos: 51
Relay_Master_Log_File: localhost-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: cicro,cicro
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: 1556
Relay_Log_Space: 51
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: 0
1 row in set (0.00 sec)
可以看到,Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",这表明 Slave 的 I/O 和 SQL 线程都在正常运行
到此,MYSQL版本5.1.7以前的双机热备已经配置成功
二、版本5.1.7以后(以版本5.5.17为例)
同版本5.1.7以前一样,先编辑MYSQL_A和MYSQL_B上的my.cnf配置文件,加入如下参数:
Server-id=n //服务id,每个数据库都不一样,“n”代表ID号,在MYSQL_A上设为1,在MYSQL_B上设为2。
log-bin=log_name //日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称
binlog-do-db=asymt //记录日志的数据库
binlog-ignore-db=mysql //不记录日志的数据库 , 这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。
设置同步数据库的用户帐号
分别重启MYSQL_A和MYSQL_B上的MYSQL数据库,然后登陆mysql,运行如下命令
MYSQL_A:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.200' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.200' IDENTIFIED BY '123456';
MYSQL_B:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.100' IDENTIFIED BY '123456';
如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'asymt'@'192.168.100.100' IDENTIFIED BY '123456';
用上文的方法先锁定数据库并备份MYSQL_A上的数据然后还原到MYSQL_B上最后把数据库的锁定释放。
分别根本法MYSQL_A和MYSQL_B上的mysql查看主服务器状态
MYSQL_A:
mysql> show master status\G;
+---------------+----------+--------------+------------------+ |
|