posts - 4, comments - 6, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

mysql 双向备份

Posted on 2008-06-03 17:08 hongsion 阅读(665) 评论(0)  编辑 收藏 引用
      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-idA在从C复制数据的时候,就不知道这些数据是C产生的,还是B产生的,还是A自己产生的。如果是BC产生的,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.10my.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.10192.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进来的话,就需要参考mysqlreplication一章中的内容,其基本过程是这样:

(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_filemaster_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文件,然后重新启动。





 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理