
mysql数据库复制维护说明.doc
9页mysqlmysql数据库复制维护方法数据库复制维护方法编写人:胡家惠日 期:2007-9-26数商的数据库服务器采用一主两从的结构,即一台主数据库服务器,两台 从数据库服务器,主服务器负责读写,从服务器只能读取以下例子中假设主 服务器的 IP 地址是:172.20.16.204从服务器的 IP 地址分别是: 172.20.16.205,172.20.16.214主服务器上更新的数据将通过 mysql 的复制功能 复制到其它两台从服务器上,复制是异步进行的,延迟时间正常在 3 秒左右, 如果是小数据量的更新操作,延迟时间将会更小,估计在 1 秒以下,完全能满 足应用的需求Web 服务器对数据库的访问负载将同时分布到这三台服务器上, 从测试的情况看,主服务器的负载明显比从服务器的负载大,一个主要的原因 是主服务器负责读写,而从服务器只分配一些查询的负载 Mysql 数据库复制维护主要包括:日常监控和维护,主从切换,从服务器 拷贝,根据一个最可靠的从服务器数据生成另外一个从服务器,并把这个最可 靠的从服务器升级为主服务器目标就是当数据库出现故障时,能尽快的修复, 最小化故障时间。
一、日常监控和维护 日常监控和维护的目的就是监控 mysql 复制进程的运行情况,解决发 生的故障问题,保证主从服务器数据的一致性 以下是用作日常监控的几条命令,说明如下:Show master status;显示主服务器当前复制进程所处的 bin 文件名和位置Show slave status\G;显示从服务器复制进程的状态Slave stop;在从服务器上停止复制进程Slave start;在从服务器上启动复制进程 Set global sql_slave_skip_counter=1;跳过一个错误的位置 Change master to master_log_file='mysql-bin.000001',master_log_pos=98;改变到指定的日志位置点:日志文件 mysql-bin.000001,位置 98示例: mysql> show slave status\G *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 172.20.16.204Master_User: repuserMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 98Relay_Log_File: relay-bin.000002Relay_Log_Pos: 235Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: mysql,information_schema,mysql,information_schemaReplicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 98Relay_Log_Space: 235Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0以下是一个复制的自动监控脚本,可以在从服务器上部署为作业计划,可以进 行一般故障的自动修复:/home/mysql/script/ Repmonitor.sh# 本脚本用于监控 MySQL 复制是否运行,并且根据具体的错误代码自动判断是否忽略#!/bin/sh now=`date +“%Y%m%d%H%M%S“`StatFile=“./slave_status.$now“ echo “show slave status\G“ | mysql -uroot -proot1234 > $StatFile IoStat=`cat $StatFile | grep Slave_IO_Running | awk '{print $2}'` SqlStat=`cat $StatFile | grep Slave_SQL_Running | awk '{ print $2}'` Errno=`cat $StatFile | grep Last_Errno | awk '{print $2}'` Behind=`cat $StatFile | grep Seconds_Behind_Master | awk '{print $2}'` #IoStat=`cat $StatFile | head -n 12 | tail -n 1 | awk '{print $2}'` #SqlStat=`cat $StatFile | head -n 13 | tail -n 1 | awk '{print $2}'` #Errno=`cat $StatFile | head -n 20 | tail -n 1 | awk '{print $2}'`if [ $IoStat = 'Yes' ] || [ $SqlStat = 'Yes' ] ; thenecho “That's all right!!“rm -f $StatFileexit fiif [ $IoStat = 'No' ] || [ $SqlStat = 'No' ] ; then echo “[chkslave]“ date #如果错误代码为 0,则可能是因为网络等原因导致复制中断,直接重新启动复制即可if [ “$Errno“ -eq 0 ] ; thenecho “start slave io_thread; start slave sql_thread;“ | mysql -uroot - proot1234echo “start slave io_thread; start slave sql_thread;“ #如果是一些不是很要紧的错误代码,也可以直接略过elif [ “$Errno“ -eq 1007 ] || [ “$Errno“ -eq 1053 ] || [ “$Errno“ -eq 1062 ] || [ “$Errno“ -eq 1213 ] \ || [ “$Errno“ -eq 1158 ] || [ “$Errno“ -eq 1159 ] || [ “$Errno“ -eq 1008 ] ; thenecho “stop slave; set global sql_slave_skip_counter=1; slave start;“ | mysql -uroot -proot1234echo “stop slave; set global sql_slave_skip_counter=1; slave start;“elseecho `date` “slave is down!!!“fi# 远远落后于 master#if [ “$Behind“ -gt 200 ] ; then# echo `date` “slave is behind master $Behind seconds!!!“#fi#删除临时状态文件rm -f $StatFile echo “[/chkslave]“fi在 linux 上部署作业计划: Chmod +x Repmonitor.sh设定没小时检查一次 Crontab -e 00 * * * * /home/mysql/script/ Repmonitor.sh说明:使用脚本前,请修改相应的本地 root 的密码,这里假设是 root1234。
主要可以看两个状态项 Slave_IO_Running,Slave_SQL_Running,如果两个 项目的状态都是 Yes,说明复制在正常运行如果有一个状态变成 No,说明复 制已经出现故障,可以先用命令 slave stop 停止复制进程,再用命令 slave start 尝试恢复,如果是一般的故障,这样就能解决如果发生了严重错误, 会在 Last_Error 这个状态项中显示出来,很可能是这个位置点的 sql 执行错误, 在不影响数据库数据一致性的前提下,可以用命令 set global sql_slave_skip_counter=1 跳过具体解决办法需要根据错误的具体情况来定, 前提是不影响主从数据库数据的一致性二、主从切换 主从切换是指当集群中主服务器发生故障,无法再继续服务时,需 要把另两台从服务器中的一台从从服务器升级成主服务器,使它同时具有 读写的功能,另一台从服务器改变为这台新升级的主服务器的从服务器 具体操作步骤如下: 1,如果原故障主服务器的 mysql 服务进程还没停止的话,停止它 例如: service mysql stop 2,察看两台从服务器所处的复制状态,在两台服务器上执行命令:show slave status\G,比较以下状态项的当前值Master_Log_FileRead_Master_Log_PosRelay_Log_FileRelay_Log_Pos如果两台从服务器的的以上状态项的值完全一致,说明两台从服务器 的数据是完全一致的。
这样可以选择其中的任一台服务器作为主服务器, 另一台服务器作为这台主服务器的从服务器,设置步骤如下: 2.1修改作为主服务器的服务器的配置文件 f,修改后重启 mysql,使新的配置文件生效原配置文件关于复制的设置可能是: server-id = 16205 master-host=172.20.16.204 master-user=repuser master-password=654321 relay-log=relay-bin relay-log-index=relay-bin replicate-ignore-db=mysql replicate-ignore-db=information_schema请修改为: server-id = 16205 log-bin=mysql-bin binlog-ignore-db=mysql binlog-ignore-db=information_schema主要目的就是把日志记录打开2.2在新主服务器上创建复制帐号和口令 进入 mysql,执行以下命令:GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'%' IDENTIFIED BY ‘111111’;这里创建的帐号是:repuesr,密码是:111111,只是作为例子, 请根据自己的情况作出修改2.3修改另一台从服务器的配置文件,让它指向新的主服务器,修改 后从新启动 mysql,使配置文件生效原配置文件关于复制的设置可能是:server-id = 16214 master-host=172.20.16.204 master-user=repuser master-password=111111 relay-log=relay-bin relay-lo。
