关于GTID的同步监控()

select concat(
'select "',
TABLE_name,
'", count(*) from ',
TABLE_SCHEMA,
'.',
TABLE_name,
' union all'
) from information_schema.tables
where TABLE_SCHEMA='生产库名字';

  查出来的结果去掉最后的“union all”,然后分别在主库和从库运行,就能得出所有表数据量,再用diff去比较两者差异。

 1 #!/bin/bash
 2 
 3 #######################################################
 4 # $Version:     v1.0
 5 # $Description:判断GTID复制中从库有没有与主库同步 show slave stautus\G中: 
 6 #                当 Retrieved_Gtid_Set = Executed_Gtid_Set 表示从库已经和主库完成同步 
 7 #
 8 # Retrieved_Gtid_Set:从库已经接收到主库的事务编号
 9 # Executed_Gtid_Set: 已经执行的事务编号
10 
11 
12 #######################################################
13 
14 mysql -u 从库账号 -p'从库账号密码' -e "show slave status\G;" > slave_status
15 
16 # 1、找到Auto_Position的行号
17 AutoPosNum=`grep -n "Auto_Position" slave_status |awk '{print $1}' |tr -d ":"`
18 
19 # 2、Auto_Position的上一行即是 Executed_Gtid_Set 那行
20 Exec_numLine=$(($AutoPosNum-1))
21 
22 # 3、比对值是否相等:Retrieved_Gtid_Set ,Executed_Gtid_Set
23 Exec_num=`sed -n "$Exec_numLine"p slave_status |awk -F":" '{print $2}'|awk -F "-" '{ print $2}'` 
24 
25 Ret_num=`grep 'Retrieved_Gtid_Set' slave_status | awk -F":" '{print $3}'|awk -F "-" '{print $2}'`
26 
27 #判断这俩个数值是否相同,相等输出yes,否则报警
28 if [ $Exec_num -eq $Ret_num ]
29 then
30     echo "yes"
31 else
32     ## 10秒后再运行一次上面那堆命令,比较$Exec_num 和$Ret_num,因为可能会有某些瞬间是不相等的
33     sleep 10
34     。。。
35     如果还是不等就报警
36 fi
37      
进去从库运行:
show slave status\G;

找到两个线程,比较是否都是 Yes
IO_env=`echo $STATUS | grep IO | awk '{print $2}'`
SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`

3、监控主从binlog同步情况

 1 #!/bin/bash
 2 
 3 ######################################
 4 # 监控当前主从同步的情况
 5 ######################################
 6 
 7 ### 1、从库: 
 8 SLAVE_BINLOG1=`mysql -u '从库账号' -p'从库账号密码' -h '从库连接ip' -e "show slave status\G;" | awk '$1=="Master_Log_File:" {print $2}'`
 9 
10 SLAVE_BINLOG2=`mysql -u '从库账号' -p'从库账号密码' -e "show slave status\G;" | awk '$1=="Relay_Master_Log_File:" {print $2}'
11 
12 
13 ### 2、主库:
14 ## 获得Master端,当前的binlog文件以及binlog路径
15 MASTER_BINLOG=`mysql -u '主库账号' -p'主库账号密码' -h '主库连接ip'  -e "show master status;"
16  | grep -v '^+' | tail -1 | awk '{print $1}'`
17 
18 ### 3、同步情况
19 ##### 3.1 主从端已经同步到相同的binlog
20 if [[ "${SLAVE_BINLOG1}" = "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]];then
21     CURR_BINLOG="${MASTER_BINLOG}"
22     echo "主从端已经同步到相同的binlog。。。"
23 
24 ##### 3.2 主从端已经同步,但从端的binlog还没有追赶到主端最新的binlog
25 elif [[ "${SLAVE_BINLOG1}" != "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then
26     CURR_BINLOG="${SLAVE_BINLOG2}"
27     echo "主从端已经同步,但从端的binlog还没有追赶到主端最新的 binlog。。。"
28 
29 ##### 3.3 主从端已经同步,主从端的binlog一致,但relaylog还不一致
30 elif [[ "${SLAVE_BINLOG1}" != "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then
31     CURR_BINLOG="${SLAVE_BINLOG2}"
32     echo "主从端已经同步,主从端的binlog一致,但 relaylog 还不一致"
33 else
34     echo "未知错误 Has noknown error at:`date +%F" "%H-%M-%S`,需要人工检查" 
35     发钉钉告警。。。
36     exit 1
37 fi
————————
select concat(
'select "',
TABLE_name,
'", count(*) from ',
TABLE_SCHEMA,
'.',
TABLE_name,
' union all'
) from information_schema.tables
where TABLE_SCHEMA='生产库名字';

  查出来的结果去掉最后的“union all”,然后分别在主库和从库运行,就能得出所有表数据量,再用diff去比较两者差异。

 1 #!/bin/bash
 2 
 3 #######################################################
 4 # $Version:     v1.0
 5 # $Description:判断GTID复制中从库有没有与主库同步 show slave stautus\G中: 
 6 #                当 Retrieved_Gtid_Set = Executed_Gtid_Set 表示从库已经和主库完成同步 
 7 #
 8 # Retrieved_Gtid_Set:从库已经接收到主库的事务编号
 9 # Executed_Gtid_Set: 已经执行的事务编号
10 
11 
12 #######################################################
13 
14 mysql -u 从库账号 -p'从库账号密码' -e "show slave status\G;" > slave_status
15 
16 # 1、找到Auto_Position的行号
17 AutoPosNum=`grep -n "Auto_Position" slave_status |awk '{print $1}' |tr -d ":"`
18 
19 # 2、Auto_Position的上一行即是 Executed_Gtid_Set 那行
20 Exec_numLine=$(($AutoPosNum-1))
21 
22 # 3、比对值是否相等:Retrieved_Gtid_Set ,Executed_Gtid_Set
23 Exec_num=`sed -n "$Exec_numLine"p slave_status |awk -F":" '{print $2}'|awk -F "-" '{ print $2}'` 
24 
25 Ret_num=`grep 'Retrieved_Gtid_Set' slave_status | awk -F":" '{print $3}'|awk -F "-" '{print $2}'`
26 
27 #判断这俩个数值是否相同,相等输出yes,否则报警
28 if [ $Exec_num -eq $Ret_num ]
29 then
30     echo "yes"
31 else
32     ## 10秒后再运行一次上面那堆命令,比较$Exec_num 和$Ret_num,因为可能会有某些瞬间是不相等的
33     sleep 10
34     。。。
35     如果还是不等就报警
36 fi
37      
进去从库运行:
show slave status\G;

找到两个线程,比较是否都是 Yes
IO_env=`echo $STATUS | grep IO | awk '{print $2}'`
SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'`

3、监控主从binlog同步情况

 1 #!/bin/bash
 2 
 3 ######################################
 4 # 监控当前主从同步的情况
 5 ######################################
 6 
 7 ### 1、从库: 
 8 SLAVE_BINLOG1=`mysql -u '从库账号' -p'从库账号密码' -h '从库连接ip' -e "show slave status\G;" | awk '$1=="Master_Log_File:" {print $2}'`
 9 
10 SLAVE_BINLOG2=`mysql -u '从库账号' -p'从库账号密码' -e "show slave status\G;" | awk '$1=="Relay_Master_Log_File:" {print $2}'
11 
12 
13 ### 2、主库:
14 ## 获得Master端,当前的binlog文件以及binlog路径
15 MASTER_BINLOG=`mysql -u '主库账号' -p'主库账号密码' -h '主库连接ip'  -e "show master status;"
16  | grep -v '^+' | tail -1 | awk '{print $1}'`
17 
18 ### 3、同步情况
19 ##### 3.1 主从端已经同步到相同的binlog
20 if [[ "${SLAVE_BINLOG1}" = "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]];then
21     CURR_BINLOG="${MASTER_BINLOG}"
22     echo "主从端已经同步到相同的binlog。。。"
23 
24 ##### 3.2 主从端已经同步,但从端的binlog还没有追赶到主端最新的binlog
25 elif [[ "${SLAVE_BINLOG1}" != "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then
26     CURR_BINLOG="${SLAVE_BINLOG2}"
27     echo "主从端已经同步,但从端的binlog还没有追赶到主端最新的 binlog。。。"
28 
29 ##### 3.3 主从端已经同步,主从端的binlog一致,但relaylog还不一致
30 elif [[ "${SLAVE_BINLOG1}" != "${SLAVE_BINLOG2}" && "${SLAVE_BINLOG1}" = "${MASTER_BINLOG}" ]]; then
31     CURR_BINLOG="${SLAVE_BINLOG2}"
32     echo "主从端已经同步,主从端的binlog一致,但 relaylog 还不一致"
33 else
34     echo "未知错误 Has noknown error at:`date +%F" "%H-%M-%S`,需要人工检查" 
35     发钉钉告警。。。
36     exit 1
37 fi