A、MySQL双机热备份概述
双机热备就是使用MySQL提供的一种主从备份机制实现。所谓双机热备其实是一个复制的过程,复制过程中一个服务器充当主服务器,一个或多个服务器充当从服务。这个复制的过程实质上是从服务器复制主服务器上MySQL的二进制日志(bin-log),并在从服务器上还原主服务器上的操作。
双机热备的实现需要MySQL的版本高于3.2。另外由于这种备份是基于MySQL二进制日志实现,所以主从服务器上的MySQL版本最好能够一样,至少从服务器的MySQL版本不可以低于主服务器的数据库版本。因为MySQL不同的版本之间二进制日志可能不一样。
B、 MySQL双机热备份配置步骤
假设主服务器A(master)、从服务器为B(slave)。两服务器Ip为:A——192.168.0.2,B——192.168.0.3。本文服务器A采用windows操作系统,服务器B采用centos 6.4,目的是为了一次说明windows和linux不同环境中的配置。
步骤一:主服务器授权
在主服务器A上创建一个username和password供从服务器B访问时使用。在MySQL命令行下输入mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO backup@192.168.0.3 IDENTIFIED BY'123456';
步骤二:数据复制
将A上已有的数据备份到B上,以便主从数据库建立的时候两个数据库的数据保持一致(这里复制的方法有很多,但必须保证两个数据库的数据完全相同)。
步骤三:配置主服务器
主服务器A是windows操作系统,其mysql配置文件在mysql安装目录下的my.ini文件。我们对主服务器的配置都在my.ini中。
停止A服务器上的mysql服务,打开my.ini配置文件。在my.ini中找到[mysqld],并在[mysqld]区域内做如下修改:
[mysqld]
server-id=1 #是1~2^23-1内的唯一值且不能与B或其它slave服务中的配置相同
log-bin = bin_log #日志文件以bin_log为前缀,如果不给log-bin赋值,日志文件将以#master-server-hostname为前缀
binlog-ignore-db= test #日志文件跳过的数据库(可选属性 ),如果有多个数据库,可以重复配置这个属性
binlog-do-db= qxpt_demo #日志文件操作的数据库(可选属性 ,默认所有数据库的相关操作都写入二进制日志文件) ,如果有多个数据库,可以重复配置这个属性
步骤四:重启A中的MySQL服务
配置完上面选项后,重启A上的MySQL服务,这时候A上所有对qxpt_demo数据库的更新操作都会被记录到二进制日志中。
步骤五:配置slave
本文中slave所在的B服务器是linux环境,其MySQL配置文件在/etc/my.cnf中。
在slave的my.cnf中 [mysqld],并在其中做如下配置:
[mysqld]
server-id=2 #唯一并与主服务器上的server-id不同。
replicate-do-db= qxpt_demo #复制操作要针对的数据库(可选,默认为全部),同样如果有多个数据库则可配置多次本属性。
步骤六:重启并对slave进行设置
重启B服务器上的MySQL服务,用mysql -uroot -p 登录MySQL,并执行如下命令:
mysql> change master to \
-> master_host='192.168.0.2',//主服务器的IP地址
-> master_user='backup', //同步数据库的用户
-> master_password=’123456’;//同步数据库的密码
注:MySQL 5.1.7之前上面命令中的参数都可以在my.cnf配置文件的[mysqld]区域中配置。
步骤七:重启并对slave进行设置
MySQL中执行show slavestatus;命令查看slave状态:
这时候slave还未启动,我们只要在MySQL中执行slave start; 即可启动slave。这时候slave_io_running和slave_sql_runing的值都应该变为yes。
如果slave_io_running和slave_sql_runing的值为NO的可以参考这篇文章:
经过以上六个步骤我们就可以实现从A到B的单向热备份。这时候我们对A中qxpt_demo数据库进行修改等影响数据库数据及结构的操作会被复制到B中。
C、 MySQL双机热备份原理
MySQL的双机热备份是一个异步的复制(replication),slave的备份数据实际上就是从master端获取其binlog日志后,在自己身上完全顺序的执行日志中记录的各种操作。实现整个复制操作主要由三个步骤:
(1) master将改变记录到二进制日志(bin-log)中;
(2)slave将master的bin-log拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
在网上找了一个个人感觉比较好的图,如下:
结合本图可以看出双机热备的具体步骤如下:
(1)在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,在事件写入二进制日志完成后,提交事物。
(2)slave开始一个工作线程——I/O线程。slave的io进程链接到master后,向master请求指定位置的日志内容。
(3) master接受到slave的请求后,通过master的io读取指定日志内容及bin-log文件的相关信息(slave status中Master_Log_File和Read_Master_Log_Pos属性),并返回给slave的io进程。
(4)slave接收到信息后,将接受到的日志内容依次添加到slave端的relay-log(在MySQLdata目录中)的最末端,并读取master传过来的bin-log文件信息,将bin-log的文件信息存到master.info文件中,以便下一次请求能够清楚的告诉master需要读取bin-log的哪个位置开始往后的日志内容。
(5)slave的sql进程检测到relay-log中新增内容后,会立刻解析relay-log的内容,将其解析成在master端真实执行的那些可执行内容,并在slave自身执行。