mysql 主從錯誤以及監控

同步中的常見的錯誤和處理
1 、現象:在從庫上面show slave status\G;出現下列狀況,
          Slave_IO_Running: Yes
          Slave_SQL_Running: No
          Seconds_Behind_Master: NULL
緣由:
a. 程序可能在slave上進行了寫操做;
b. 也多是slave機器重起後,事務回滾形成的;
c .有多是在同步過程當中遇到某種錯誤,這個會在查看從庫中狀態時看到錯誤提示,最少見的就是主鍵重複1062的錯誤。
解決方法:
進入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql-bin.000040 | 324 |adb | mysql|
+----------------------+----------+--------------+------------------+
而後到slave服務器上執行手動同步
slave stop;
change master to
master_host='10.14.0.140',
master_user='repl',
master_password='1q2w3e4r',
master_port=3306,
master_log_file='mysql-bin.000040',
master_log_pos=324;
slave start;
show slave status\G;
2 、現象:從數據庫沒法同步,show slave status顯示:
          Slave_IO_Running: No
          Slave_SQL_Running: Yes
          Seconds_Behind_Master: NULL
    解決:首先查看數據庫的err日誌,查看是什麼錯誤提示,看從庫鏈接主庫的IP、用戶、密碼等相關信息是否有誤,若是有誤,從新執行同步;若是確認無誤,重啓主數據庫。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | adb| mysql|
+------------------+----------+--------------+------------------+
進入從庫mysql,執行:
slave stop;
change master to Master_Log_File='mysql-bin.000001',Master_Log_Pos=98;
slave start;
或是這樣:
stop slave;
set global sql_slave_skip_counter =1;
start slave;
這個現象主要是master數據庫存在問題,因爲鏈接主庫信息錯誤、主庫數據庫掛掉若是說常見錯等緣由引發的,我在實際的操做中先重啓master後重啓slave便可解決這問題,出現此問題,必需要要重啓master數據庫。
4、mysql主主和主主集羣
一、mysql主主的實現
     在實際的生產應用中,爲了在主庫出現崩潰或是主服務器出現嚴重故障時快速的恢復業務,會直接切換到從庫上,當主庫故障處理完成後讓他直接做爲叢庫來運行,此時主主就是一個不錯的選擇。
  
5、mysql主從的監控
在mysql主從的應用中,只要進行了合理設置,基本上不會出現問題,可是對他的監控是必不可少的,以避免因爲真的出現問題又不知道而形成沒必要要的數據損失。
1mysql主從監控的主要思路
Mysql 主從的監控,其主要是監控從庫上的一些重要參數:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master_Log_File: bin-log.003
Relay_Master_Log_File: bin-log.003
Read_Master_Log_Pos: 4
Exec_master_log_pos: 4
Seconds_Behind_Master: 0 (5.0以前版本沒有這個選項)
經過以上的參數能夠反映出主庫和從庫狀態是否正常,從庫是否落後於主庫等。值得一提的是在mysql5.0之前的版本,Slave_IO_Running這個狀態指標不可靠,會在主庫直接掛掉的狀況下不會變成NO,Seconds_Behind_Master參數也不存在。監控以上參數便可監控mysql主從。
2mysql主從監控的實現
無論mysql是那個版本,其中的從庫上的Exec_master_log_pos、Exec_master_log_pos;主庫上的 Master上的Log_File,  Position ,這四個參數能夠判斷出當前主從的狀態。如下是適用於mysql全部版本的主從監控shell腳本:
#/bin/sh
user=repl
passwd=123415
master_ip="192.168.1.2"
log="/data3/check_repl.log"
value()
{
 master=`/usr/local/mysql/bin/mysql -u$user -p$passwd -h$master_ip -e "show master status\G;"|egrep "File|Position"`
 #mysql 4.0
 slave=`/usr/local/mysql/bin/mysql -u$user -p$passwd -h127.0.0.1 -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_master_log_pos"`
 #mysql 5.0
 #slave=`mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos"`
 # 取主庫上的bin-log號及寫入的當前日誌位置   
 Master_Log=`echo $master |awk '{print $2}'|awk -F "." '{print $2}'`
 Master_Log_Pos=`echo $master |awk '{print $4}'`
 # 取從庫上當前同步主庫的位置
 Relay_Master_Log_File=`echo $slave |awk '{print $2}'|awk -F "." '{print $2}'`
 Exec_Master_Log_Pos=`echo $slave |awk '{print $4}'`
 echo "Master_Log:"$Master_Log>>$log
 echo "Master_Log_Pos:"$Master_Log_Pos>>$log
 echo "Relay_Master_Log_File:"$Relay_Master_Log_File>>$log
 echo "Exec_Master_Log_Pos:"$Exec_Master_Log_Pos>>$log
}
for((i=1;i<=10;i++));
do
 echo "#################################">>$log
 value
 time=`date +"%Y-%m-%d %H:%M:%S"`
 if [ $Master_Log -eq $Relay_Master_Log_File ];then
       A=`expr $Master_Log_Pos - $Exec_Master_Log_Pos`
       if [ $A -lt 0 ];then
             A=`expr 0 - $A`
       fi
       echo $A>>$log
       if [ $A -lt 10000 ];then
             echo "$time Master-Slave is OK.">>$log
             #echo "$i"
             break
       else
             if [ $i ge 3 ];then              
                  echo "$time Warning:Slave-Master lag $A " >>$log
                  echo "$i"
             fi
             sleep 30
             continue
       fi
 else
       sleep 60
       fi
       if [ $i -eq 10 ];then
             echo "$i"
             echo "$time Error:Slave-Master must be check !" >>$log
       fi
done
在mysql5.0之後的版本,mysql主從已經至關的成熟了,能夠只監控Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master狀態就能夠了,這裏再也不作說明。
相關文章
相關標籤/搜索