【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
小結
主從複製在前期表結構變動的情況下會有一系列問題,監控可以及時發現問題,另外,在後期可以做很好的保證。同時,也要做好資料的定時備份,防止不必要的損失。
更多同步問題參考: