亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何通過zabbix獲取數據庫連接的信息及部分擴展

發布時間:2021-07-01 08:55:38 來源:億速云 閱讀:187 作者:chen 欄目:開發技術

本篇內容介紹了“如何通過zabbix獲取數據庫連接的信息及部分擴展”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

背景

隨著應用系統的不斷增加,原本不告警的active threads,開始頻繁告警(一天2次左右)。雖然告警次數不多,而且該監控項舍得閾值不高(不超過50),但對于運維來說數據庫的threads-running是一個必須要重視的點。

一般告警出現在半夜,不可能靠人工去記錄threads-running過線后,到底哪些連接正在處理。市面上也沒好的工具能自動記錄這些數據,所以這時候就需要zabbix的action功能了。

zabbix配置

1. 定義監控項

這里偷個懶,直接使用了percona模板中Threads Running監控項:

如何通過zabbix獲取數據庫連接的信息及部分擴展

2. 定義觸發器

同樣適用percona的觸發器設置:

如何通過zabbix獲取數據庫連接的信息及部分擴展

3. 創建action

按照下圖的順序創建action:

如何通過zabbix獲取數據庫連接的信息及部分擴展

4. action條件

如何通過zabbix獲取數據庫連接的信息及部分擴展

A、B、C、D條件都滿足,才會觸發動作,這里盡量篩選的詳細點,免得出現zabbix錯誤調用的情況。

5. 完善操作內容

如何通過zabbix獲取數據庫連接的信息及部分擴展

這里適用ssh方式,當然你也可以在類型欄使用自定義腳本選項,就是要多給zabbix客戶端賦sudo權限。

命令欄填的是/bin/sh /opt/connect.sh命令,這個很好理解,直接調用connect.sh腳本,具體腳本附在后文中。

6. 修改zabbix-agent配置

進入被監控服務器

vim /etc/zabbix/zabbix_agentd.conf
    
    EnableRemoteCommands=1  #增加這項參數,意思是允許zabbix server遠程命令
    
service zabbix-agent restart

至此,zabbix相關的配置均已完成,接下來只需要將寫好的處理腳本放入/opt目錄即可。

功能腳本

這次要實現的是,在連接超過50個時,輸出到底是哪個賬號、哪個ip、在執行哪個sql等信息。腳本如下:

#!/bin/sh

    export PATH=$PATH:/usr/bin
    da=`date +%Y%m%d`
    dc=`date +%Y-%m-%d" "%H:%M:%S`
    
    echo $dc"-------------------------------我是分割線------------------------------------" >> /tmp/ok_$da.log
    
    /usr/local/mysql/bin/mysql -uroot -pXXX -e "select * from information_schema.PROCESSLIST where COMMAND != 'Sleep' order by TIME DESC;" >> /tmp/ok_$da.log

擴展

既然zabbix在報警時可以調用腳本,那是不是可以讓zabbix處理點更為復雜的工作?

數據庫連接、鎖、存儲引擎等信息

#!/bin/sh
export PATH=$PATH:/usr/bin
da=`date +%Y%m%d`
dc=`date +%Y-%m-%d" "%H:%M:%S`
echo $dc"-------------------------------我是分割線------------------------------------" >> /home/zabbix/engine_log/engine_log_$da.log
/usr/bin/mysql -hlocalhost -uroot -pXXX -e "show engine innodb status \G;" >> /home/zabbix/engine_log/engine_log_$da.log
echo -e "\n\n\n" >> /home/zabbix/engine_log/engine_log_$da.log
echo $dc"-------------------------------我是分割線------------------------------------" >> /home/zabbix/processlist/processlist_$da.log
/usr/bin/mysql -hlocalhost -uroot -pXXX -e "select * from information_schema.processlist where time>=0 and command !='sleep' order by time desc \G;" >> /home/zabbix/processlist/processlist_$da.log
echo -e "\n\n\n" >> /home/zabbix/processlist/processlist_$da.log
echo $dc"-------------------------------我是分割線------------------------------------" >> /home/zabbix/lock/lock_$da.log
/usr/bin/mysql -hlocalhost -uroot -pXXX -e "select 'Blocker' role, p.id, p.user, left(p.host, locate(':', p.host) - 1) host, tx.trx_id, tx.trx_state, tx.trx_started, timestampdiff(second, tx.trx_started, now()) duration, lo.lock_mode, lo.lock_type, lo.lock_table, lo.lock_index, tx.trx_query, tx.trx_tables_in_use, tx.trx_tables_locked, tx.trx_rows_locked from information_schema.innodb_trx tx, information_schema.innodb_lock_waits lw, information_schema.innodb_locks lo, information_schema.processlist p where lw.blocking_trx_id = tx.trx_id and p.id = tx.trx_mysql_thread_id and lo.lock_trx_id = tx.trx_id union all select 'Blockee' role, p.id, p.user, left(p.host, locate(':', p.host) - 1) host, tx.trx_id, tx.trx_state, tx.trx_started, timestampdiff(second, tx.trx_started, now()) duration, lo.lock_mode, lo.lock_type, lo.lock_table, lo.lock_index, tx.trx_query, tx.trx_tables_in_use, tx.trx_tables_locked, tx.trx_rows_locked from information_schema.innodb_trx tx, information_schema.innodb_lock_waits lw, information_schema.innodb_locks lo, information_schema.processlist p where lw.requesting_trx_id = tx.trx_id and p.id = tx.trx_mysql_thread_id and lo.lock_trx_id = tx.trx_id \G;" >> /home/zabbix/lock/lock_$da.log
echo -e "\n\n\n" >> /home/zabbix/lock/lock_$da.log
val=`/usr/bin/mysql -hlocalhost -uroot -pXXX -N -e "show variables like 'general_log'" |awk '{print $2}'`
if [ $val = 'OFF' ];
then
        /usr/bin/mysql -hlocalhost -uroot -pXXX -e "set global general_log=0;"
else
        exit 0;
fi

在數據庫壓力大的時候,可以記錄哥哥鎖信息、連接信息還有存儲引擎信息。所謂壓力大,我們可以將觸發項定以下幾個:

  • threads-running:running的連接過多

  • Innodb Row Lock Waits:鎖等待時間過長

  • Com Select\Update\Insert\Delete:增產查改過多

  • Incoming\Outgoing network traffic:進出流量不正常時

這些都可以作為觸發條件。

殺死長sql

#!/bin/sh
export PATH=$PATH:/usr/bin
da=`date +%Y%m%d`
dc=`date +%Y-%m-%d" "%H:%M:%S`
user="root"
password="XXX"
val=`mysql -u$user -p$password -N -e "select count(*) from information_schema.processlist where time>=180 and command ='Query' and user in ('job_name','report')" | awk '{print $1}'`
if [ $val -gt 0 ];
then
        echo $dc"-------------------------------我是分割線------------------------------------" >> /home/zabbix/kill_log/long_query_$da.log
        mysql -u$user -p$password -e "select * from information_schema.processlist where time>=180 and command ='Query' and user in ('job_name','report') order by time desc \G;" >> /home/zabbix/kill_log/long_query_$da.log
        echo -e "\n\n\n" >> /home/zabbix/kill_log/long_query_$da.log
        count=`mysql -u$user -p$password -N -e "select id from information_schema.processlist where time>=180 and command ='Query' and user in ('job_name','report')"`
        for id in $count;
        do
           mysql -u$user -p$password -e "kill $id"
        done
else
        exit 0;
fi

有時候一些job或者報表sql會長時間在那里執行,導致影響到其他業務,我們可以簡單做下判斷,當數據庫連接激增,多數是由于有大sql夯在那里,這時候可以讓zabbix調用這個腳本去殺死特殊賬號發起的超過180秒的sql。至于kill sql的條件可以在腳本中自定義。

當然了,像這種明知需要很長時間才能處理完的sql,應該放在從庫中去執行。

刪除無用日志

#!/bin/sh
logdir='/mysql/logs'
binlog='/mysql/binlog'
var_percent=`df -h |grep var|grep dev/sda|awk '{print $5}'|awk -F% '{print $1}'`
if [ -z $var_percent ] || [ $var_percent -lt 90 ];then
        echo "never mind"
        exit 0
fi
date >>$binlog/del_list.txt
list=`ls -l --time-style='+%Y-%m-%d %H:%M:%S' $binlog/mysql-bin.0?????|awk '{print $6","$7","$8}'`
for i in $list
do
        filetime=`echo $i|awk -F "," '{print $1,$2}'`
        filetimestamp=`date -d "$filetime" +%s`
        cur_time=`date +%s`
        if [ $(($cur_time - $filetimestamp)) -gt $((3*24*3600)) ];then
                filename=`echo $i|awk -F, '{print $3}'`
                echo "$filename will delete">>$binlog/del_list.txt
                /bin/rm $filename
        fi
done
if [ -f $logdir/mysql-slow.log ];then
        slow_log_size=`stat $logdir/mysql-slow.log|grep 'Size:'|awk -F ':' '{print $2}'|awk '{print $1}'`
        if [ $slow_log_size -gt $((2*1024*1024*1024)) ];then
                echo "$logdir/mysql-slow.log">>$logdir/del_list.txt
                /bin/rm $logdir/mysql-slow.log
        fi
fi

有些時候binlog和slowlog沒設置自動刪除,時間長了會把磁盤空間占滿。這時候我們可以關聯Free disk space on /mysql監控項,查過閾值后,調用上面的腳本去清理無用的binlog和slowlog。

在有些依賴binlog的情況下,比如主從中斷,之后還需要恢復的情況下,需要謹慎使用。

參考鏈接 :

通過zabbix獲取數據庫連接的信息及部分擴展 :http://www.mlszssj.com/article/207412.htm

“如何通過zabbix獲取數據庫連接的信息及部分擴展”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临城县| 博爱县| 万宁市| 周宁县| 固原市| 盈江县| 汉源县| 红河县| 泸溪县| 武强县| 汶川县| 鹿邑县| 班玛县| 当阳市| 伽师县| 西平县| 会宁县| 化州市| 蛟河市| 宁德市| 雷波县| 肥乡县| 万荣县| 舒城县| 九江县| 蓬莱市| 江源县| 仪征市| 上高县| 崇明县| 营口市| 温宿县| 廉江市| 济南市| 密云县| 镇安县| 神农架林区| 泰宁县| 永德县| 巴林右旗| 固安县|