mysql的双向备份可以实现一个简单的数据库cluster,从而提高数据的可靠性和访问性能。 以下是用mysql5.0.51b实现双向备份的一些记录。
(1)从网上下载了一个非安装的版本mysql-5.0.51b,然后在192.168.1.10机器上解压在E:\mysql目录下。
(2)在E:\mysql下创建一个my.ini文件,内容是从该目录下面的其他ini复制而来,然后修改里面的内容,主要是设置路径。因为mysql安装在E:/mysql下,所以修改如下:
[mysqld]
basedir="E:/mysql/"
datadir="E:/mysql/Data/"
(3)修改端口
为了让mysql以服务的形式在windows中运行,同时不和其他已安装的mysql发生冲突,所以要修改msyql服务运行的端口,主要修改如下:
[mysqld]
port=5306
(4)安装服务
windows键+R,输入“cmd”,回车,进入window中控制台窗口,然后切换到E:\mysql\bin目录下,运行mysqld-nt --install replDb,这样服务安装完成。
(5)设置master
设置master的目的主要让msyql数据库程序运行起来的时候在本地产生bin-log,以备slave可以从该log中读取sql操作,从而保持和master的数据同步。主要设置如下:
[mysqld]
log-bin=mysql-bin
server-id=1
log-bin设置的是本地产生的bin-log文件的名字,mysql还会自动产生扩展名。server-id用来标识本数据库服务器。只所以需要配置server-id是为了区分bin-log中那些数据的来源。这样就可以防止在一个loop的备份环境中,数据被循环复制。比如:AàB, BàC, CàA。假如没有这个server-id,A在从C复制数据的时候,就不知道这些数据是C产生的,还是B产生的,还是A自己产生的。如果是B和C产生的,A当然需要复制,如果是A自己产生的,当然就不需要再复制了,不然就无限循环下去了。
保存my.ini文件,这个时候运行 net start replDb。就会发现mysql数据库程序运行之后,会在E:/mysql/Data/目录下产生mysql-bin.xxxxxx的日志文件,以备slave访问。
(6)创建slave帐户和权限
net start replDb 就会启动replDb。
在slave复制bin-log内容的时候,需要相应的帐号和访问权限,因此如下命令:
Mysql –uroot –port=5306
由于初始没有密码,因此该命令直接可以访问数据库,如果为了安全起见,应该设置root密码,如下:
Grant all on *.* to ‘root’@’localhost’ identified by ‘root’;
这样root用户只能在本机以’root’密码访问。然后创建slave可以访问的帐户,运行如下语句:
Grant replication slave on *.* to ‘repl’@’192.168.1.11’ identified by ‘slavepass’;
这样192.168.1.11这台机器上的mysql slave就可以以repl用户名和’slavepass’密码来复制本机(192.168.1.10)的bin-log中的内容了。
(7)安装slave
在192.168.1.11机器上重复上面的(1),(2),(3),(4),(5),(6)步骤。
但是在第(5)步中server-id应该设置成和192.168.1.10机器不同的值,如下:
[mysqld]
log-bin=mysql-bin
server-id=2
同时在第(6)步创建slave帐户的时候,ip有所改变,如下:
Grant replication slave on *.* to ‘repl’@’192.168.1.10’ identified by ‘slavepass’;
(8)设置slave选项
在192.168.1.10的my.ini文件中,加入如下内容:
[mysqld]
master-host=192.168.1.11
master-port=5306
master-user=repl
master-password=slavepass
这个设置是告诉192.168.1.10上的mysql服务器把192.168.1.11:5306作为master,以用户名repl和密码slavepass去访问。同样的在192.168.1.11上如下设置:
[mysqld]
master-host=192.168.1.10
master-port=5306
master-user=repl
master-password=slavepass
然后在192.168.1.10和192.168.1.11机器上都运行如下命令
Net stop replDb
Net start replDb
如果不出问题,两台机器上的mysql数据应该就已经处于相互备份的状态下了。
那么如何检验是否连接成功呢,主要通过以下命令:
在192.168.1.10机器上运行 mysql –u root –p –port=5306,输入密码’root’之后,进入mysql操作界面。
然后输入show slave status\G 语句
会输出如下:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 931
Relay_Log_File: slave1-relay-bin.000056
Relay_Log_Pos: 950
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 931
Relay_Log_Space: 1365
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.01 sec)
注意其中的 Slave_IO_Running 和 Slave_SQL_Running,这两个指标如果是yes表示slave已经在工作了,然后再看Last_Error,如果是空的表示一切正常,还有最后一个Seconds_Behind_Master,这个指标表示slave读的速度落后原始数据多少,正常当然是越小越好,太大就表示slave来不及复制master的数据了。
到此,设置运行完毕,在测试的过程中,我发现还可以这样安装,比如在上面第(6)步结束之后,可以不用把slave的配置写到文件中,而是可以在不重新启动mysql数据库的情况下直接通过运行语句来完成:
mysql>
CHANGE MASTER TO
->
MASTER_HOST='192.168.1.10',
->
MASTER_USER='repl'
,
->
MASTER_PASSWORD='slavepass'
,
-> MASTER_PORT=5306;
即先change master,然后运行start slave。
然后再运行show slave status\G,应该也是OK。
有一点需要说明的是,这里安装的时候是直接用两个完全新的数据库,如果在已经有数据在数据库中,并且该数据库是master,这个时候想不关闭master的情况下,加入一个slave进来的话,就需要参考mysql的replication一章中的内容,其基本过程是这样:
(1) 先锁定master中的数据库,并把数据写到硬盘。
mysql> FLUSH TABLES WITH READ LOCK;
(2) 然后再数据锁定的情况下,用show master status查看bin-log的位置,并记下参数,并备份master中的内容。
(3) 解锁master数据库。
(4) 把备份好的数据倒到slave中。
(5) 在slave数据库中运行用change master语句,该语句需要加上master_log_file和master_log_pos参数。这两个参数就是在(2)中记下的bin-log参数。
(6) 在slave 中运行 start slave。然后就ok了。
通过上面的阐述可以发现,有两种方式配置备份,一个是通过my.ini,还有一个是通过change master语句。其实当数据库运行的时候,如果发现my.ini中有master_host等参数,数据库就把这些信息写到data目录下的master.info文件中,然后slave启动的时候就直接从这个master.info文件中读取master的信息。而在slave数据库中运行change master语句的时候,数据库程序是把那些参数直接写入master.info文件中。
在mysql数据库中,处理逻辑是这样的,当mysql数据库程序启动的时候,如果它发现有master.info数据文件存在,那么它不会去读my.ini中的相关配置,而是直接用master.info中的内容。如果没有master.info存在,它才去读my.ini中的相关配置,并且产生一个master.info文件。所以如果想通过my.ini来更改已有的master信息,必须先关掉mysql数据库,然后删除master.info文件,然后重新启动。