以下のエディターは、オンライン MYSQL 同期エラー報告のトラブルシューティング方法の概要 (必読) を提供します。非常に優れているので、共有して参考にしてみましょう。
前書き
フェールオーバー後に問題が発生することがよくあります。データベースが非常に小さい場合は、ダンプしてからインポートするのが簡単ですが、オンライン データベースはすべて 150G ~ 200G なので、この単純な方法を使用するとコストが高くなりすぎます。 , 結論としては、いくつかの処理方法が提案されています
本番環境アーキテクチャ図
現在のネットワークアーキテクチャは、データのコピーを 2 つ保存し、障害が発生すると 2 つのマシンがスレーブに切り替わります。故障したマシンは新しいマスターと逆に同期します。エラーに対処するときに最も一般的なエラー メッセージは、マスター/スレーブからのエラー メッセージです。
最も一般的な 3 つの状況これら 3 つの状況は、HA 切り替え中です。これは非同期レプリケーションであり、sync_binlog=0 であるため、ビンログの一部が完全に受信されず、同期エラーが発生します。 1 つ目: マスター上のレコードを削除しましたが、スレーブで見つかりません
2 つ目: レコードは既にスレーブ上に存在し、同じレコードがマスターに挿入されています
Last_SQL_Error: Could not execute Delete_rows event on table hcy.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000006, end_log_pos 254。 3 番目のタイプ: レコードはマスター上で更新されるが、スレーブ上では見つからず、データが失われます
Last_SQL_Error: Could not execute Write_rows event on table hcy.t1;
Duplicate entry '2' for key 'PRIMARY',
Error_code: 1062;
handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 924
簡単に言えば、スレーブが受信を完了したか、実行したかに関係なく、マスターはビンログをスレーブに送信します。準同期レプリケーション簡単に言うと、マスターはビンログを送信します。 binlog をスレーブに送信し、受信したことを確認しますが、実行されたかどうかに関係なく、マスターにシグナルを送信し、アクションは終了します (Google によって作成されたコードで、5.5 で正式に適用されました)
。非同期の欠点 書き込み操作がビジー状態の場合、現在の POS ポイントはたとえば 10 で、スレーブの IO_THREAD スレッドは 3 を受け取ります。このとき、マスターはダウンしており、 7 ポイントの差がスレーブに送信されず、データが失われます。
スレーブのリレーログリレービンが破損しています。この場合、SLAVE がダウンしています。または、停電、マザーボードの焼損などにより、リレー ログが破損し、同期が停止するなど、不正なシャットダウンが発生します。人的エラーに注意してください。この場合、複数のスレーブに重複したサーバー ID があります。同期は遅れ、同期は完了しません。上記の 2 行の情報が常にエラー ログに表示されます。解決策は、サーバー ID を変更して一貫性がなくなるようにすることです。
Last_SQL_Error: Could not execute Update_rows event on table hcy.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000010, end_log_pos 263
問題の処理
削除に失敗しました
マスター上のレコードを削除しましたが、スレーブ上で見つかりません。 Last_SQL_Error: Error initializing relay log position: I/O error reading the header from the binary log
Last_SQL_Error: Error initializing relay log position: Binlog has bad magic number;
It's not a binary log file that can be used by this version of MySQL
マスターはレコードを削除したいが、スレーブ上で見つからないため、エラーを報告します。この場合、マスターはレコードを削除しており、スレーブはそれをスキップできます。直接。利用可能なコマンド:
Slave: received end packet from server, apparent master shutdown: Slave I/O thread: Failed reading log event, reconnecting to retry, log 'mysql-bin.000012' at postion 106
このような状況が多い場合は、私が作成したスクリプト Skip_error_replcation.sh を使用できます。デフォルトでは、10 件のエラーがスキップされます (この状況に限り、他の状況ではエラー結果が出力され、処理を待ちます)。このスクリプトは、maakit ツールキットの mk-slave-restart 原則を参照してシェルで記述されており、エラーに関係なく、独自の内容の一部を定義しています。 )
主キーが重複していますレコードはスレーブ上にすでに存在しており、同じレコードがマスター上に挿入されています。
Last_SQL_Error: Could not execute Delete_rows event on table hcy.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000006, end_log_pos 254
解決策:
スレーブで desc hcy.t1 を使用します。まず、以下のテーブル構造を確認します:stop slave; set global sql_slave_skip_counter=1; start slave;
重複する主キーを削除しますLast_SQL_Error: Could not execute Write_rows event on table hcy.t1;
Duplicate entry '2' for key 'PRIMARY',
Error_code: 1062;
handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 924
マスターとスレーブでそれぞれ確認します。
マスター上でレコードが更新されましたが、スレーブ上では見つからず、データが失われます。
mysql> desc hcy.t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | name | char(4) | YES | | NULL | | +-------+---------+------+-----+---------+-------+解決策:
マスター上で、mysqlbinlog を使用して、間違った binlog ログが何を行っているかを分析します。
mysql> delete from t1 where id=2; Query OK, 1 row affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G; …… Slave_IO_Running: Yes Slave_SQL_Running: Yes …… mysql> select * from t1 where id=2;スレーブ上で、更新されたレコードが存在しないはずです。
Last_SQL_Error: Could not execute Update_rows event on table hcy.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000010, end_log_pos 794次に、マスターに移動して確認します
/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | grep -A '10' 794 #120302 12:08:36 server id 22 end_log_pos 794 Update_rows: table id 33 flags: STMT_END_F ### UPDATE hcy.t1 ### WHERE ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### @2='bbc' /* STRING(4) meta=65028 nullable=1 is_null=0 */ ### SET ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### @2='BTV' /* STRING(4) meta=65028 nullable=1 is_null=0 */ # at 794 #120302 12:08:36 server id 22 end_log_pos 821 Xid = 60 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;スレーブ上で失われたデータを入力し、エラー レポートをスキップします。
mysql> select * from t1 where id=2; Empty set (0.00 sec)リレーログが破損しています
スレーブのリレーログrelay-binが破損しています。 mysql> select * from t1 where id=2;
+----+------+
| id | name |
+----+------+
| 2 | BTV |
+----+------+
1 row in set (0.00 sec)
手作り修理
解决方法:找到同步的binlog和POS点,然后重新做同步,这样就可以有新的中继日值了。
例子:
mysql> show slave status\G; *************************** 1. row *************************** Master_Log_File: mysql-bin.000010 Read_Master_Log_Pos: 1191 Relay_Log_File: vm02-relay-bin.000005 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000010 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1593 Last_Error: Error initializing relay log position: I/O error reading the header from the binary log Skip_Counter: 1 Exec_Master_Log_Pos: 821
Slave_IO_Running :接收master的binlog信息
Master_Log_File
Read_Master_Log_Pos
Slave_SQL_Running:执行写操作
Relay_Master_Log_File
Exec_Master_Log_Pos
以执行写的binlog和POS点为准。
Relay_Master_Log_File: mysql-bin.000010 Exec_Master_Log_Pos: 821 mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=821; Query OK, 0 rows affected (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.8.22 Master_User: repl Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000010 Read_Master_Log_Pos: 1191 Relay_Log_File: vm02-relay-bin.000002 Relay_Log_Pos: 623 Relay_Master_Log_File: mysql-bin.000010 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1191 Relay_Log_Space: 778 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Ibbackup
各种大招都用上了,无奈slave数据丢失过多,ibbackup(需要银子)该你登场了。
Ibbackup热备份工具,是付费的。xtrabackup是免费的,功能上一样。
Ibbackup备份期间不锁表,备份时开启一个事务(相当于做一个快照),然后会记录一个点,之后数据的更改保存在ibbackup_logfile文件里,恢复时把ibbackup_logfile 变化的数据再写入到ibdata里。
Ibbackup 只备份数据( ibdata、.ibd ),表结构.frm不备份。
下面一个演示例子:
备份:ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf
恢复:ibbackup --apply-log /bak/etc/my_bak.cnf
[root@vm01 etc]# more my_local.cnf datadir =/usr/local/mysql/data innodb_data_home_dir = /usr/local/mysql/data innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /usr/local/mysql/data innodb_buffer_pool_size = 100M innodb_log_file_size = 5M innodb_log_files_in_group=2 [root@vm01 etc]# ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf InnoDB Hot Backup version 3.0.0; Copyright 2002-2005 Innobase Oy License A21488 is granted to vm01 (chunyang_he@126.com) (--apply-log works in any computer regardless of the hostname) Licensed for use in a computer whose hostname is 'vm01' Expires 2012-5-1 (year-month-day) at 00:00 See http://www.innodb.com for further information Type ibbackup --license for detailed license terms, --help for help Contents of /bak/etc/my_local.cnf: innodb_data_home_dir got value /usr/local/mysql/data innodb_data_file_path got value ibdata1:10M:autoextend datadir got value /usr/local/mysql/data innodb_log_group_home_dir got value /usr/local/mysql/data innodb_log_files_in_group got value 2 innodb_log_file_size got value 5242880 Contents of /bak/etc/my_bak.cnf: innodb_data_home_dir got value /bak/data innodb_data_file_path got value ibdata1:10M:autoextend datadir got value /bak/data innodb_log_group_home_dir got value /bak/data innodb_log_files_in_group got value 2 innodb_log_file_size got value 5242880 ibbackup: Found checkpoint at lsn 0 1636898 ibbackup: Starting log scan from lsn 0 1636864 120302 16:47:43 ibbackup: Copying log... 120302 16:47:43 ibbackup: Log copied, lsn 0 1636898 ibbackup: We wait 1 second before starting copying the data files... 120302 16:47:44 ibbackup: Copying /usr/local/mysql/data/ibdata1 ibbackup: A copied database page was modified at 0 1636898 ibbackup: Scanned log up to lsn 0 1636898 ibbackup: Was able to parse the log up to lsn 0 1636898 ibbackup: Maximum page number for a log record 0 120302 16:47:46 ibbackup: Full backup completed! [root@vm01 etc]# [root@vm01 etc]# cd /bak/data/ [root@vm01 data]# ls ibbackup_logfile ibdata1 [root@vm01 data]# ibbackup --apply-log /bak/etc/my_bak.cnf InnoDB Hot Backup version 3.0.0; Copyright 2002-2005 Innobase Oy License A21488 is granted to vm01 (chunyang_he@126.com) (--apply-log works in any computer regardless of the hostname) Licensed for use in a computer whose hostname is 'vm01' Expires 2012-5-1 (year-month-day) at 00:00 See http://www.innodb.com for further information Type ibbackup --license for detailed license terms, --help for help Contents of /bak/etc/my_bak.cnf: innodb_data_home_dir got value /bak/data innodb_data_file_path got value ibdata1:10M:autoextend datadir got value /bak/data innodb_log_group_home_dir got value /bak/data innodb_log_files_in_group got value 2 innodb_log_file_size got value 5242880 120302 16:48:38 ibbackup: ibbackup_logfile's creation parameters: ibbackup: start lsn 0 1636864, end lsn 0 1636898, ibbackup: start checkpoint 0 1636898 ibbackup: start checkpoint 0 1636898 InnoDB: Doing recovery: scanned up to log sequence number 0 1636898 InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .....99 Setting log file size to 0 5242880 ibbackup: We were able to parse ibbackup_logfile up to ibbackup: lsn 0 1636898 ibbackup: Last MySQL binlog file position 0 1191, file name ./mysql-bin.000010 ibbackup: The first data file is '/bak/data/ibdata1' ibbackup: and the new created log files are at '/bak/data/' 120302 16:48:38 ibbackup: Full backup prepared for recovery successfully! [root@vm01 data]# ls ibbackup_logfile ibdata1 ib_logfile0 ib_logfile1
把ibdata1 ib_logfile0 ib_logfile1拷贝到从,把.frm也拷贝过去,启动MySQL后,做同步,那个点就是上面输出的:
ibbackup: Last MySQL binlog file position 0 1191, file name ./mysql-bin.000010 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=1191;
Maatkit工具包
简介
maatkit是一个开源的工具包,为mysql日常管理提供了帮助。目前,已被Percona公司收购并维护。其中:
mk-table-checksum是用来检测master和slave上的表结构和数据是否一致。
mk-table-sync是发生主从数据不一致时,来修复的。
这两个工具包,没有在现网实际操作的经验,这里仅仅是新技术探讨和学术交流,下面展示下如何使用。
[root@vm02]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1 Cannot connect to MySQL because the Perl DBI module is not installed or not found. Run 'perl -MDBI' to see the directories that Perl searches for DBI. If DBI is not installed, try: Debian/Ubuntu apt-get install libdbi-perl RHEL/CentOS yum install perl-DBI OpenSolaris pgk install pkg:/SUNWpmdbi
提示缺少perl-DBI模块,那么直接 yum install perl-DBI。
[root@vm02 bin]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1 DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG hcy t1 0 vm02 InnoDB NULL 1957752020 0 0 NULL NULL hcy t1 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL
如果表数据不一致,CHECKSUM的值是不相等的。
解释下输出的意思:
DATABASE:数据库名
TABLE:表名
CHUNK:checksum时的近似数值
HOST:MYSQL的地址
ENGINE:表引擎
COUNT:表的行数
CHECKSUM:校验值
TIME:所用时间
WAIT:等待时间
STAT:MASTER_POS_WAIT()返回值
LAG:slave的延时时间
如果你想过滤出不相等的都有哪些表,可以用mk-checksum-filter这个工具,只要在后面加个管道符就行了。
[root@vm02 ~]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy | mk-checksum-filter hcy t2 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL hcy t2 0 vm02 InnoDB NULL 1068689114 0 0 NULL NULL
知道有哪些表不一致,可以用mk-table-sync这个工具来处理。
注:在执行mk-table-checksum时会锁表,表的大小取决于执行的快慢。
MASTER上的t2表数据:
SLAVE上的t2表数据:
mysql> select * from t2; mysql> select * from t2; +----+------+ +----+------+ | id | name | | id | name | +----+------+ +----+------+ | 1 | a | | 1 | a | | 2 | b | | 2 | b | | 3 | ss | | 3 | ss | | 4 | asd | | 4 | asd | | 5 | ss | +----+------+ +----+------+ 4 rows in set (0.00 sec) 5 rows in set (0.00 sec) mysql> \! hostname; mysql> \! hostname; vm02 vm01 [root@vm02 ~]# mk-table-sync --execute --print --no-check-slave --transaction --databases hcy h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 INSERT INTO `hcy`.`t2`(`id`, `name`) VALUES ('5', 'ss') /*maatkit src_db:hcy src_tbl:t2 src_dsn:h=vm01,p=...,u=admin dst_db:hcy dst_tbl:t2 dst_dsn:h=vm02,p=...,u=admin lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:3246 user:root host:vm02*/;
它的工作原理是:先一行一行检查主从库的表是否一样,如果哪里不一样,就执行删除,更新,插入等操作,使其达到一致。表的大小决定着执行的快慢。
If C<--transaction> is specified, C<LOCK TABLES> is not used. Instead, lock and unlock are implemented by beginning and committing transactions. The exception is if L<"--lock"> is 3. If C<--no-transaction> is specified, then C<LOCK TABLES> is used for any value of L<"--lock">. See L<"--[no]transaction">. When enabled, either explicitly or implicitly, the transaction isolation level is set C<REPEATABLE READ> and transactions are started C<WITH CONSISTENT SNAPSHOT>
MySQL复制监控
MySQL常见错误类型
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版本过低,不具有本功能
复制监控脚本
参考原文修改。
原脚本
#!/bin/bash # #check_mysql_slave_replication_status # # # parasum=2 help_msg(){ cat << help +---------------------+ +Error Cause: +you must input $parasum parameters! +1st : Host_IP +2st : Host_Port help exit } [ $# -ne ${parasum} ] && help_msg #若参数不够打印帮助信息并退出 export HOST_IP=$1 export HOST_PORt=$2 MYUSER="root" MYPASS="123456" MYSQL_CMD="mysql -u$MYUSER -p$MYPASS" MailTitle="" #邮件主题 Mail_Address_MysqlStatus="root@localhost.localdomain" #收件人邮箱 time1=$(date +"%Y%m%d%H%M%S") time2=$(date +"%Y-%m-%d %H:%M:%S") SlaveStatusFile=/tmp/salve_status_${HOST_PORT}.${time1} #邮件内容所在文件 echo "--------------------Begin at: "$time2 > $SlaveStatusFile echo "" >> $SlaveStatusFile #get slave status ${MYSQL_CMD} -e "show slave status\G" >> $SlaveStatusFile #取得salve进程的状态 #get io_thread_status,sql_thread_status,last_errno 取得以下状态值 IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print $2}') SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running |awk '{print $2}') Errno=$(cat $SlaveStatusFile|grep Last_Errno | awk '{print $2}') Behind=$(cat $SlaveStatusFile|grep Seconds_Behind_Master | awk '{print $2}') echo "" >> $SlaveStatusFile if [ "$IOStatus" == "No" ] || [ "$SQLStatus" == "No" ];then #判断错误类型 if [ "$Errno" -eq 0 ];then #可能是salve线程未启动 $MYSQL_CMD -e "start slave io_thread;start slave sql_thread;" echo "Cause slave threads doesnot's running,trying start slsave io_thread;start slave sql_thread;" >> $SlaveStatusFile MailTitle="[Warning] Slave threads stoped on $HOST_IP $HOST_PORT" elif [ "$Errno" -eq 1007 ] || [ "$Errno" -eq 1053 ] || [ "$Errno" -eq 1062 ] || [ "$Errno" -eq 1213 ] || [ "$Errno" -eq 1032 ]\ || [ "Errno" -eq 1158 ] || [ "$Errno" -eq 1159 ] || [ "$Errno" -eq 1008 ];then #忽略此些错误 $MYSQL_CMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;" echo "Cause slave replication catch errors,trying skip counter and restart slave;stop slave ;set global sql_slave_skip_counter=1;slave start;" >> $SlaveStatusFile MailTitle="[Warning] Slave error on $HOST_IP $HOST_PORT! ErrNum: $Errno" else echo "Slave $HOST_IP $HOST_PORT is down!" >> $SlaveStatusFile MailTitle="[ERROR]Slave replication is down on $HOST_IP $HOST_PORT ! ErrNum:$Errno" fi fi if [ -n "$Behind" ];then Behind=0 fi echo "$Behind" >> $SlaveStatusFile #delay behind master 判断延时时间 if [ $Behind -gt 300 ];then echo `date +"%Y-%m%d %H:%M:%S"` "slave is behind master $Bebind seconds!" >> $SlaveStatusFile MailTitle="[Warning]Slave delay $Behind seconds,from $HOST_IP $HOST_PORT" fi if [ -n "$MailTitle" ];then #若出错或者延时时间大于300s则发送邮件 cat ${SlaveStatusFile} | /bin/mail -s "$MailTitle" $Mail_Address_MysqlStatus fi #del tmpfile:SlaveStatusFile > $SlaveStatusFile
修改后脚本
只做了简单的整理,修正了Behind为NULL的判断,但均未测试;
应可考虑增加:
对修复执行结果的判断;多条错误的循环修复、检测、再修复?
取消SlaveStatusFile临时文件。
Errno、Behind两种告警分别发邮件,告警正文增加show slave结果原文。
增加PATH,以便加到crontab中。
考虑crontab中周期执行(加锁避免执行冲突、执行周期选择)
增加执行日志?
#!/bin/sh # check_mysql_slave_replication_status # 参考:http://www.tianfeiyu.com/?p=2062 Usage(){ echo Usage: echo "$0 HOST PORT USER PASS" } [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ] && Usage && exit 1 HOST=$1 PORT=$2 USER=$3 PASS=$4 MYSQL_CMD="mysql -h$HOST -P$PORT -u$USER -p$PASS" MailTitle="" #邮件主题 Mail_Address_MysqlStatus="root@localhost.localdomain" #收件人邮箱 time1=$(date +"%Y%m%d%H%M%S") time2=$(date +"%Y-%m-%d %H:%M:%S") SlaveStatusFile=/tmp/salve_status_${HOST_PORT}.${time1} #邮件内容所在文件 echo "--------------------Begin at: "$time2 > $SlaveStatusFile echo "" >> $SlaveStatusFile #get slave status ${MYSQL_CMD} -e "show slave status\G" >> $SlaveStatusFile #取得salve进程的状态 #get io_thread_status,sql_thread_status,last_errno 取得以下状态值 IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print $2}') SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running |awk '{print $2}') Errno=$(cat $SlaveStatusFile|grep Last_Errno | awk '{print $2}') Behind=$(cat $SlaveStatusFile|grep Seconds_Behind_Master | awk '{print $2}') echo "" >> $SlaveStatusFile if [ "$IOStatus" = "No" -o "$SQLStatus" = "No" ];then case "$Errno" in 0) # 可能是slave未启动 $MYSQL_CMD -e "start slave io_thread;start slave sql_thread;" echo "Cause slave threads doesnot's running,trying start slsave io_thread;start slave sql_thread;" >> $SlaveStatusFile ;; 1007|1053|1062|1213|1032|1158|1159|1008) # 忽略这些错误 $MYSQL_CMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;" echo "Cause slave replication catch errors,trying skip counter and restart slave;stop slave ;set global sql_slave_skip_counter=1;slave start;" >> $SlaveStatusFile MailTitle="[Warning] Slave error on $HOST:$PORT! ErrNum: $Errno" ;; *) echo "Slave $HOST:$PORT is down!" >> $SlaveStatusFile MailTitle="[ERROR]Slave replication is down on $HOST:$PORT! Errno:$Errno" ;; esac fi if [ "$Behind" = "NULL" -o -z "$Behind" ];then Behind=0 fi echo "Behind:$Behind" >> $SlaveStatusFile #delay behind master 判断延时时间 if [ $Behind -gt 300 ];then echo `date +"%Y-%m%d %H:%M:%S"` "slave is behind master $Bebind seconds!" >> $SlaveStatusFile MailTitle="[Warning]Slave delay $Behind seconds,from $HOST $PORT" fi if [ -n "$MailTitle" ];then #若出错或者延时时间大于300s则发送邮件 cat ${SlaveStatusFile} | /bin/mail -s "$MailTitle" $Mail_Address_MysqlStatus fi #del tmpfile:SlaveStatusFile > $SlaveStatusFile
以上がオンラインMYSQL同期エラー処理方法コードまとめの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

MySQLとSQLiteの主な違いは、設計コンセプトと使用法のシナリオです。1。MySQLは、大規模なアプリケーションとエンタープライズレベルのソリューションに適しており、高性能と高い並行性をサポートしています。 2。SQLiteは、モバイルアプリケーションとデスクトップソフトウェアに適しており、軽量で埋め込みやすいです。

MySQLのインデックスは、データの取得をスピードアップするために使用されるデータベーステーブル内の1つ以上の列の順序付けられた構造です。 1)インデックスは、スキャンされたデータの量を減らすことにより、クエリ速度を改善します。 2)B-Tree Indexは、バランスの取れたツリー構造を使用します。これは、範囲クエリとソートに適しています。 3)CreateIndexステートメントを使用して、createIndexidx_customer_idonorders(customer_id)などのインデックスを作成します。 4)Composite Indexesは、createIndexIDX_CUSTOMER_ORDERONORDERS(Customer_Id、Order_date)などのマルチコラムクエリを最適化できます。 5)説明を使用してクエリ計画を分析し、回避します

MySQLでトランザクションを使用すると、データの一貫性が保証されます。 1)StartTransactionを介してトランザクションを開始し、SQL操作を実行して、コミットまたはロールバックで送信します。 2)SavePointを使用してSave Pointを設定して、部分的なロールバックを許可します。 3)パフォーマンスの最適化の提案には、トランザクション時間の短縮、大規模なクエリの回避、分離レベルの使用が合理的に含まれます。

MySQLの代わりにPostgreSQLが選択されるシナリオには、1)複雑なクエリと高度なSQL関数、2)厳格なデータの整合性と酸コンプライアンス、3)高度な空間関数が必要、4)大規模なデータセットを処理するときに高いパフォーマンスが必要です。 PostgreSQLは、これらの側面でうまく機能し、複雑なデータ処理と高いデータの整合性を必要とするプロジェクトに適しています。

MySQLデータベースのセキュリティは、以下の測定を通じて達成できます。1。ユーザー許可管理:CreateUSERおよびGrantコマンドを通じてアクセス権を厳密に制御します。 2。暗号化された送信:SSL/TLSを構成して、データ送信セキュリティを確保します。 3.データベースのバックアップとリカバリ:MySQLDUMPまたはMySQLPumpを使用して、定期的にデータをバックアップします。 4.高度なセキュリティポリシー:ファイアウォールを使用してアクセスを制限し、監査ロギング操作を有効にします。 5。パフォーマンスの最適化とベストプラクティス:インデックス作成とクエリの最適化と定期的なメンテナンスを通じて、安全性とパフォーマンスの両方を考慮に入れます。

MySQLのパフォーマンスを効果的に監視する方法は? MySqladmin、ShowGlobalStatus、PerconAmonitoring and Management(PMM)、MySQL EnterpriseMonitorなどのツールを使用します。 1. mysqladminを使用して、接続の数を表示します。 2。showglobalstatusを使用して、クエリ番号を表示します。 3.PMMは、詳細なパフォーマンスデータとグラフィカルインターフェイスを提供します。 4.mysqlenterprisemonitorは、豊富な監視機能とアラームメカニズムを提供します。

MySQLとSQLServerの違いは次のとおりです。1)MySQLはオープンソースであり、Webおよび埋め込みシステムに適しています。2)SQLServerはMicrosoftの商用製品であり、エンタープライズレベルのアプリケーションに適しています。ストレージエンジン、パフォーマンスの最適化、アプリケーションシナリオの2つには大きな違いがあります。選択するときは、プロジェクトのサイズと将来のスケーラビリティを考慮する必要があります。

高可用性、高度なセキュリティ、優れた統合を必要とするエンタープライズレベルのアプリケーションシナリオでは、MySQLの代わりにSQLServerを選択する必要があります。 1)SQLServerは、高可用性や高度なセキュリティなどのエンタープライズレベルの機能を提供します。 2)VisualStudioやPowerbiなどのMicrosoftエコシステムと密接に統合されています。 3)SQLSERVERは、パフォーマンスの最適化に優れた機能を果たし、メモリが最適化されたテーブルと列ストレージインデックスをサポートします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 中国語版
中国語版、とても使いやすい
