MySQL主从复制的一些错误处理和日常维护
原文: http://www.blogjava.net/dongbule/archive/2010/08/23/329714.html
查看slave状态
检查从服务器一般使用show slave status命令来检查
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.100 Master_User: root Master_Port: 3306 Connect_Retry: 3 Master_Log_File: mysql-bin.003 Read_Master_Log_Pos: 79 Relay_Log_File: mysql -relay-bin. 003 Relay_Log_Pos: 548 Relay_Master_Log_File: mysql -bin. 003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Last_Errno: 0 …..
在上面这些信息中我们主要关注的是Slave_IO_Running和Slave_SQL_Running
- Slave_IO_Running:从服务器正从主服务器上读取BINLOG日志,并写入从服务器的中继日志
- Slave_SQL_Running:进程正在读取从服务器的BINLOG中继日志,并转化为SQL执行
如果有一个进程是no状态,表示复制的进程停止,在Last_Errno会看到是什么情况
主从同步
有时候因为主服务器的更新过于频繁,造成了从服务器更新速度较慢,当然问题是多种多样,有可能是网络搭建的结构不好或者硬件的性能较差,从而使得主从服务器之间的差距越来越大,最终对某些应用产生了影响,在这种情况下,我们需要定期进行主从服务器的数据同步,具体步骤如下:
-
在主服务器上查看日志文件和偏移量
mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.03 sec) mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000004 Position: 102 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
疑问:锁在什么时候释放?完成后是否需要执行UNLOCK TABLES释放锁?
记录出日志的名字和偏移量,这些是从服务器复制的目的目标
-
在从服务器上,使用MASTER_POS_WAIT()函数得到复制坐标值
mysql> select master_pos_wait('mysql-bin.000004','102'); +-------------------------------------------+ | master_pos_wait('mysql-bin.000004','102') | +-------------------------------------------+ | 0 | +-------------------------------------------+ 1 row in set (0.00 sec)
这个select语句会阻塞直到从服务器达到指定日志文件和偏移量后,返回0,如果是-1,则表示超时退出,查询是0时,表示从服务器与主服务器已经同步。
手工处理
在某些情况下,会出现从服务器更新失败,
首先需要确定是否从服务器的表与主服务器的不同造成的,如果是表结构造成的,则需要修改从服务器的表和主服务器一致,然后重新运行start slave
如果不是表结构不同造成的更新失败,则需要确认手动更新是否安全,然后忽视来自主服务器的更新失败语句,跳过来来自主服务器的语句,命令为SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n。
其中,n=1表示来自主服务器的更新语句不使用AUTO_INCREMENT或LAST_INSERT_ID(),n=2时则反之,原因是使用AUTO_INCREMENT或LAST_INSERT_ID的语句需要从二进制日志中取得两个事件.