注释:MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。在实际项目中,两台分布于异地的主机上安装有MySQL数据库,两台服务器互为主备,客户要求当其中一台机器出现故障时,另外一台能够接管服务器上的应用,这就需要两台数据库的数据要实时保持一致,在这里使用MySQL的同步功能实现双机的同步复制。
以下是操作实例:
一、环境配置
1、主数据服务端:CentOS release 5.6 mysql-5.0.77-4.el5_5.4 IP:192.168.4.200
2、从数据客户端:CentOS release 5.69 mysql-server-5.0.95-5.el5_9 IP:192.168.4.244
二、在主、从数据库增加同步账号
1、在主库增加一个从库可以登录的账号
MySQL> |
2、在从库增加一个主库可以登录的账号
MySQL> GRANT all privileges ON *.* TO tongbu@'192.168.4.200' IDENTIFIED BY '123456'; (注意:tongbu是用于同步的帐号,123456是tongbu的密码) |
三、配置数据库参数
1、以root用户登录主库,修改主库my.cnf文件;
[root@jw01 mysql]# vim /etc/my.cnf |
[mysqld]下面增加以下的参数;
default-character-set=utf8 log-bin=MySQL-bin relay-log=relay-bin relay-log-index=relay-bin-index server-id=1 master-host=192.168.4.244 #同步服务器的IP master-user=tongbu #用于同步的帐号 master-password=123456 #用于同步帐号的密码 master-port=3306 #同步服务器的端口 master-connect-retry=30 #同步的时间间隔,单位是秒 binlog-do-db=zhubao #需要同步的库,zhubao、HyDatabase、zentao、collect; binlog-do-db=HyDatabase binlog-do-db=zentao binlog-do-db=collect replicate-do-db=zhubao replicate-do-db=HyDatabase replicate-do-db=zentao replicate-do-db=collect |
2、以root用户登录从库,修改从库my.cnf文件;
[root@jw02 mysql]# vim /etc/my.cnf |
[mysqld]下面增加以下的参数;
default-character-set=utf8 |
3、手工执行数据库同步;
在从库重启mysql
[root@jw02 mysql]# service mysqld restart 停止 mysqld: [确定] 启动 mysqld: [确定] |
4、在从库上用root账户登录Mysql,执行;
MySQL> stop slave; MySQL> load data from master; MySQL> start slave; |
5、在主库重启Mysql;
[root@jw01 mysql]# service mysqld restart 停止 mysqld: [确定] 启动 mysqld: [确定] |
6、查看数据库同步的状态;将显示同步进程的状态,如下所示,红色字体为slave进程状态,如果都为YES表示正常;如果有问题会有错误提示,为NO:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.4.200 Master_User: tongbu Master_Port: 3306 Connect_Retry: 30 Master_Log_File: MySQL-bin.000014 Read_Master_Log_Pos: 98 Relay_Log_File: relay-bin.000052 Relay_Log_Pos: 235 Relay_Master_Log_File: MySQL-bin.000014 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: zhubao,HyDatabase,zentao,collect 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: 98 Relay_Log_Space: 235 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) |
7、测试数据库同步;
将主库现有的数据手工同步到从库,我利用Navicat工具同步的元数据;
在主库192.168.4.200下Collect库下增加了一个表名为:kk_test;
查看是否已同步;有kk_test证明已经同步成功~~
mysql> use collect; Database changed mysql> show tables; +-----------------------+ | Tables_in_collect | +-----------------------+ | fw_collect_item | | fw_collect_purpose | | fw_collect_site | | fw_collect_site_cate | | fw_collect_site_city | | kk_test | +----------------------+ 6 rows in set (0.00 sec) |
四、主、从库同步出现问题如下:
1、查看发现Slave_IO_Running的状态是No;当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据,在My.cnf配置文件中增加该参数,设置为60秒;
slave-net-timeout=60 |
重启Mysql数据库后在测试;
2、数据库同步失效的解决
当数据同步进程失效后,首先手工检查slave主机当前备份的数据库日志文件在master主机上是否存在,在slave主机上运行;
mysql> show slave status\G; |
在master上检查当前的数据库列表;
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | MySQL-bin.000001 | 117 | | MySQL-bin.000002 | 117 | | MySQL-bin.000003 | 117 | | MySQL-bin.000004 | 117 | | MySQL-bin.000005 | 117 | | MySQL-bin.000006 | 117 | | MySQL-bin.000007 | 117 | | MySQL-bin.000008 | 117 | | MySQL-bin.000009 | 117 | | MySQL-bin.000010 | 117 | | MySQL-bin.000011 | 117 | | MySQL-bin.000012 | 826 | | MySQL-bin.000013 | 7062 | | MySQL-bin.000014 | 13900 | +------------------+-----------+ 14 rows in set (0.00 sec) |
如果slave主机上使用的的Master_Log_File对应的文件在master的日志列表中存在,在slave主机上开启从属服务器线程后可以自动同步:
MySQL> start slave; |
如果master主机上的日志文件已经不存在,则需要首先从master主机上恢复全部数据,再开启同步机制。
在slave主机上运行:
MySQL> stop slave; |
在master主机上运行:
MySQL> stop slave; |
在slave主机上运行:
MySQL> load data from master; |
在master主机上运行:
MySQL> reset slave; |
注意:LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的数据库上有效。
3、Slave_SQL_Running: No
进入slave服务器,运行:
mysql> show slave status\G |
故障1:解决办法一
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的:
解决办法:
mysql> slave stop; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> slave start; |
解决办法二
首先停掉Slave服务:slave stop
到主服务器上查看主机状态:记录File和Position对应的值
进入master
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | MySQL-bin.000001 | 117 | | MySQL-bin.000002 | 117 | | MySQL-bin.000003 | 117 | | MySQL-bin.000004 | 117 | | MySQL-bin.000005 | 117 | | MySQL-bin.000006 | 117 | | MySQL-bin.000007 | 117 | | MySQL-bin.000008 | 117 | | MySQL-bin.000009 | 117 | | MySQL-bin.000010 | 117 | | MySQL-bin.000011 | 117 | | MySQL-bin.000012 | 826 | | MySQL-bin.000013 | 7062 | | MySQL-bin.000014 | 13900 | +------------------+-----------+ 14 rows in set (0.00 sec) |
然后到slave服务器上执行手动同步:
mysql> change master to master_host='192.168.4.200',master_user='tongbu', 1 row in set (0.00 sec) mysql> show slave status\G; |
手动同步需要停止master的写操作!
故障2:寻找参数设定忽略错误
mysql> show variables like "%slave%"; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | init_slave | | | log_slave_updates | OFF | | slave_compressed_protocol | OFF | | slave_load_tmpdir | /tmp/ | | slave_net_timeout | 60 | | slave_skip_errors | OFF | | slave_transaction_retries | 10 | +---------------------------+-------+ 7 rows in set (0.00 sec) |
在/etc/My.cnf 配置文件增加忽略错误的参数
slave-skip-errors=all |
重新启动Mysqld服务;
在查看一下:
mysql> show variables like "%slave%"; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | init_slave | | | log_slave_updates | OFF | | slave_compressed_protocol | OFF | | slave_load_tmpdir | /tmp/ | | slave_net_timeout | 60 | | slave_skip_errors | ALL | | slave_transaction_retries | 10 | +---------------------------+-------+ 7 rows in set (0.00 sec) |
4、 "Slave_IO_Running: No"MYSQL不同步;
show slave status\G;查看同步状态如下:
Slave_IO_Running: No
Slave_SQL_Running: Yes
先stop slave 再reset slave再start slave就正常了。
本文转自 kuangling 51CTO博客,原文链接:http://blog.51cto.com/kling/1132562