【環境介紹】
系統環境:Linux + mysql 5.7.18 + 主從復制架構
【背景描述】
需求:MySQL數據庫都有每年的集團安全整改,常常要求弱口令掃描,基線掃描,漏洞掃描等等。對於MySQL的基線配置檢查中的日志方面也是有好幾個要求,建議開啟MySQL的各種日志配置,記錄數據庫的各種類型活動,便於處理數據庫故障和性能優化都有很大的幫助。開啟這配置提供了幫助的同時也同時產生一定的性能消耗和存儲方面的消耗。
【MySQL日志配置大致介紹】
類型 |
介紹 |
作用 |
參數 |
錯誤日志 |
記錄對數據庫的啟動、運行、關閉過程進行記錄信息 |
記錄告警或正確信息 |
log_error |
二進制日志 |
記錄對數據庫執行更改的所有操作,不包含select和show類型操作信息 |
用於恢復,復制,審計 |
log_bin |
慢查詢日志 |
記錄對數據庫執行長的SQL操作信息 |
定位存在問題的SQL,從SQL語句層面上進行優化 |
slow_query_log
|
通用查詢日志 |
記錄對數據庫請求的所有操作信息 |
用於恢復,審計 |
general_log |
更新日志 |
記錄從主服務器接收的從服務器的更新是否應該記錄到從設備自己的二進制日志 |
用於復制 |
log_slave_updates |
【MySQL日志配置配置】
錯誤日志:默認開啟,初始化時指定錯誤日志路徑。/etc/my.cnf 參數文件設置:log_error = /home/mysql/logs/mysql.err
二進制日志:可關閉,可開啟,全局靜態參數。log_bin = /home/mysql/logs/binlog
慢查詢日志:可開啟可關閉,全局動態參數。
set GLOBAL slow_query_log_file = '/home/mysql/logs/slow.log'; set GLOBAL slow_query_log = ON;
通用查詢日志:可開啟可關閉,全局動態參數。
set GLOBAL general_log_file = '/home/mysql/data/oracle.log'; set GLOBAL general_log =ON;
更新日志:可關閉,可開啟,全局靜態參數。/etc/my.cnf 參數文件設置:log_slave_updates = ON
安全檢查建議開啟全部的日志配置。在整改的過程中,開啟這些日志消耗性能是一定的,其中,通用查詢日志的消耗最明顯,產生的日志量的問題也是很常見。咨詢業務側,該數據庫的業務比較繁忙,那么通用查詢日志的問題就比較顯著,進行對通用日志處理。
【通用日志處理】
於是對通用日志產生的日志量的問題進行處理。
需求:開啟通用日志,每周日定時清理日志,保存3份有效日志記錄備份,記錄清理日志。
測試最終效果如下:
主要實現功能的腳本如下:
cat > mysql_generlog_clean.sh
######################################################################
# mysql_generlog_clean.sh
# This script is clean mysql generlog
# Author CZT
######################################################################
#!/bin/sh
mysqladmin=`which mysqladmin` ---定義mysql命令環境變量
mysql=`which mysql`
user="root" ---注意進行操作的用戶權限
passwd="xxx"
time=`date +%Y%m%d%H%M`
general_log=`mysql -u${user} -p${passwd} -Ne "show variables like 'general_log_file';" 2>/dev/null |grep general_log_file|awk '{print $2}'` ---取當前設置通用日志的日志路徑
mv ${general_log} ${general_log}_bak.${time}
mysqladmin -u$user -p$passwd flush-logs general 2>/dev/null
gzip ${general_log}_bak.${time} ---對歷史通用日志進行壓縮
var_count=`ls -lrt ${general_log}_bak*|wc -l`
if [ $var_count -gt 3 ]
then
echo "gt 3"
var_del_count=`expr $var_count - 3` ---判斷保留3份歷史日志
ls -lrt ${general_log}_bak* |awk '{print $9}'|head -$var_del_count> del_bakfile_list.txt
while read LINE
do
echo $LINE
rm -f $LINE ---刪除舊日志備份文件
done<del_bakfile_list.txt ---記錄刪除歷史日志記錄
else
echo "lt 3"
fi
【問題思考】
1, 對於產生的空間大小一定要經過測試,不同的業務產生的影響也有所不同,系統空間問題由於權限限制,不能限制空間,只能手動制定策略;
2, 因為備份中有切換日志操作,對日志備份清理的時間點避免業務高峰期間,防止期間造成告警報錯,時間點的選擇也是非常重要的環節;
3, 對於參數調整,必須了解該參數屬性,是否可以實時開啟關閉,對應急處理有非常大的幫助。
【總結】:
1, 對於安全整改配置時,一定要評估好風險,防止產生問題;
2, 對於日志量的問題,腳本可以舉一反三處理;
3, 對於安全整改配置時,必須全面了解參數屬性,便於應急的處理。