1. 程式人生 > >【MySQL】主從複製問題與監控

【MySQL】主從複製問題與監控

 

引言

在主從複製初期,出現了各種問題,因為主從資料庫不是同時搭建的,所以需要動態同步,與此同時,主資料庫的表結構還這個過程中還在做修改,導致了一系列問題

 

主從複製

資料不一致同步

1.把Master上該資料庫備備份出來:

 mysqldump -uroot -p discuz > /data/20150611.sql 

2.在Slave的mysql中執行:

 mysql> stop slave;
 mysql> set global sql_slave_skip_counter=1;
 mysql> start slave;

3.在Master上建立資料庫並把北風的資料庫檔案匯入到該資料庫中:

   mysql> create database discuz charset=utf8;
   mysql -uroot -p discuz < /data/20150611.sql

參考:http://blog.51cto.com/liupengfang1015/1660980


常見問題

1005:建立表失敗
1006:建立資料庫失敗
1007:資料庫已存在,建立資料庫失敗
1008:資料庫不存在,刪除資料庫失敗
1009:不能刪除資料庫檔案導致刪除資料庫失敗
1010:不能刪除資料目錄導致刪除資料庫失敗
1011:刪除資料庫檔案失敗
1012:不能讀取系統表中的記錄
1020:記錄已被其他使用者修改
1021:硬碟剩餘空間不足,請加大硬碟可用空間
1022:關鍵字重複,更改記錄失敗
1023:關閉時發生錯誤
1024:讀檔案錯誤
1025:更改名字時發生錯誤
1026:寫檔案錯誤
1032:記錄不存在
1036:資料表是隻讀的,不能對它進行修改
1037:系統記憶體不足,請重啟資料庫或重啟伺服器
1038:用於排序的記憶體不足,請增大排序緩衝區
1040:已到達資料庫的最大連線數,請加大資料庫可用連線數
1041:系統記憶體不足
1042:無效的主機名
1043:無效連線
1044:當前使用者沒有訪問資料庫的許可權
1045:不能連線資料庫,使用者名稱或密碼錯誤
1048:欄位不能為空
1049:資料庫不存在
1050:資料表已存在
1051:資料表不存在
1054:欄位不存在
1065:無效的SQL語句,SQL語句為空
1081:不能建立Socket連線
1114:資料表已滿,不能容納任何記錄
1116:開啟的資料表太多
1129:資料庫出現異常,請重啟資料庫
1130:連線資料庫失敗,沒有連線資料庫的許可權
1133:資料庫使用者不存在
1141:當前使用者無權訪問資料庫
1142:當前使用者無權訪問資料表
1143:當前使用者無權訪問資料表中的欄位
1146:資料表不存在
1147:未定義使用者對資料表的訪問許可權
1149:SQL語句語法錯誤
1158:網路錯誤,出現讀錯誤,請檢查網路連線狀況
1159:網路錯誤,讀超時,請檢查網路連線狀況
1160:網路錯誤,出現寫錯誤,請檢查網路連線狀況
1161:網路錯誤,寫超時,請檢查網路連線狀況
1062:欄位值重複,入庫失敗
1169:欄位值重複,更新記錄失敗
1177:開啟資料表失敗
1180:提交事務失敗
1181:回滾事務失敗
1203:當前使用者和資料庫建立的連線已到達資料庫的最大連線數,請增大可用的資料庫連線數或重啟資料庫
1205:加鎖超時
1211:當前使用者沒有建立使用者的許可權
1216:外來鍵約束檢查失敗,更新子表記錄失敗
1217:外來鍵約束檢查失敗,刪除或修改主表記錄失敗
1226:當前使用者使用的資源已超過所允許的資源,請重啟資料庫或重啟伺服器
1227:許可權不足,您無權進行此操作
1235:MySQL版本過低,不具有本功能

解決辦法:

1.跳過該錯誤

mysql> stop slave;
mysql> set global sql_slave_skip_counter=1
mysql> start slave;

2.修改配置檔案

vim  /etc/my.cnf
slave-skip-errors=1007,1008,1032,1062

參考:
https://blog.csdn.net/testder/article/details/81218630
https://blog.csdn.net/zhangbiaobiaobiao/article/details/17072199

 

同步監控

監控mysql-slave是否正常同步

#!/bin/sh

USER=root
PASSWORD=root
PORT=3306
error=(1158 1159 1008 1007 1062)
MYSQLCMD="mysql -u$USER -p$PASSWORD -S /var/run/mysqld/mysqld.sock"

is_run(){
  [ `lsof -i:$PORT|wc -l` -lt 2 ]&&{
    echo "mysql server is stopped"
    exit 1
  }
}

status_array(){
 status=($($MYSQLCMD -e "show slave status\G"|egrep "_Running|Last_Errno|Behind_Master"|awk '{print $NF}'))
}

status_error(){
for((i=0;i<${#error[*]};i++))
do
  if [ "$1" == "${error[$i]}" ]
    then
      $MYSQLCMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
  else 
      echo "MySQL slave is failed, errorno is $1"
  fi
done
}

judge_slave(){
  status_array
  if [ "${status[0]}" == "Yes" -a "${status[1]}" == "Yes" -a "${status[3]}" = "0" ]
  then
    echo "MySQL slave is ok"
  else
    status_error ${status[2]}
  fi
}

main(){
while true
do
  is_run
  judge_slave
  sleep 60
done
}
main

參考:
http://blog.51cto.com/oldboy/1652086


發現異常郵件提醒

傳送郵件:

    echo "正文"|mail -s "主題" [email protected]
    echo "MySQL Slave is OK"|mail -s "MySQL Slave Status" [email protected]

修改郵件配置:

    sudo vi /etc/s-nail.rc

郵件配置:

    set from=[email protected]
    set smtp=smtps://smtp.163.com:465
    set smtp-auth=login
    set smtp-auth-user=[email protected]
    set smtp-auth-password=授權碼

參考:
https://blog.csdn.net/caijiapeng0102/article/details/81239920?utm_source=blogxgwz0
https://blog.csdn.net/ithomer/article/details/6776067
https://blog.csdn.net/heng4719/article/details/78885811

擴充套件:
https://www.jianshu.com/p/78e2e1914ec1
https://blog.csdn.net/SeanChina/article/details/79652753?utm_source=blogxgwz0

 

小結

主從複製在前期表結構變動的情況下會有一系列問題,監控可以及時發現問題,另外,在後期可以做很好的保證。同時,也要做好資料的定時備份,防止不必要的損失。

 
 

更多同步問題參考: