iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

MYSQL-相關實務操作學習紀錄系列 第 5

Day.5 留個紀錄好辦事 - Mysql Log (日誌紀錄)-上

遇到系統出問題時,第一個動作會是去查看系統上的Log紀錄,各種日誌都紀錄著不同用途,透過日誌紀錄的內容能幫助管理者快速判斷問題點,分析Mysql操作狀況與錯誤資訊等,提供在MySQL管理和優化上的重要資訊。

前面有提到MYSQL設定檔my.cnf用來設置Mysql全域參數初始化(EX:開啟功能or調整參數限制&作用),沒有設置會依照預設值運行,所以只要異動到設定檔,需重啟服務配置才會生效喔!

溫馨提醒! 以下參數設定更動皆需重啟Mysql服務來生效作用喔/images/emoticon/emoticon31.gif

systemctl restart mysql

首先從預設開啟的錯誤日誌開始,分別了解各日誌紀錄用途與設定 ~

1.錯誤日誌- error log

  • 內容: mysqld服務器(啟動/關閉/運行)期間發生的錯誤,警告與註釋。

    EX:擷取error log 一小段關閉mysqld時紀錄的log內容

https://ithelp.ithome.com.tw/upload/images/20210802/20130880ikbv4GJuVu.png

  • 用途: 查詢mysql服務異常問題&診斷警告。

  • 相關配置: my.cnf設定檔(/etc/mysql/my.cnf)

[mysqld]

#錯誤日誌路徑&檔名
log-error=/var/log/mysql/error.log 

2.查詢日誌- general log

  • 內容: 紀錄所有mysql相關SQL操作指令

    EX:擷取general log部分內容可以看到從使用者連線登入到對資料做異動的指令通通都會被紀錄到log
    https://ithelp.ithome.com.tw/upload/images/20210802/20130880BbTa7saNlW.png

  • 用途: 排查錯誤時可能用到(還沒遇過...XD) 或debug期間內有哪些執行語法。

    • 注意點: 因為執行的所有行為操作都會紀錄到日誌中,log累積量會佔用很大的disk空間,請求量一多會產生不小的系統開銷影響效能! 所以在環境上通常不會啟用此日誌。如果只是要針對效能語法的部分,不如透過slow log設定秒數去過濾。
  • 相關配置: my.cnf設定檔(/etc/mysql/my.cnf)

[mysqld]

#general log是否開啟(default:0禁用 / 1啟用)
general_log = 1
#查詢日誌路徑&檔名
general_log_file = /mnt/mysql_data/mysql/general.log
#指定日誌輸出目的地(default:FILE=記錄到general.log / TABLE=紀錄到mysql.general_log表)
log-output=TABLE
  1. 慢查詢日誌- slow log
  • 內容: 紀錄超過設定秒數執行的SQL語法。

    • 用途: 不適當的SQL指令會影響到資料庫效能(EX:卡住變慢的狀況)。
    • 注意點: 在開發的時候寫的SQL指令就算有測過執行時間,但如果遇到資料量不足的問題,雖然看起來沒問題但上線後資料量一大所造成的影響,執行秒數差異會越來越明顯。可能是表結構索引關係設計上又或者是SQL語法本身問題,透過slowlog能找出這些語法發現問題並做優化。
      << 在資料庫日常管理上非常重要!! >>/images/emoticon/emoticon23.gif

    EX: 把long_query_time設定秒數改成0,等於執行語法都會被紀錄到log
    https://ithelp.ithome.com.tw/upload/images/20210802/20130880t0KIukv6P5.png

  • 相關配置: my.cnf設定檔(/etc/mysql/my.cnf)

[mysqld]

#slow log是否開啟(1啟用/0禁用)
slow-query-log = 1
#慢查詢日誌路徑&檔名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#執行超過x秒就紀錄 (EX: 1s)
long_query_time = 1

補充: 在生產環境上不是隨時都能重啟服務的,總不可能為了不是必要到需立即修改的功能而重啟服務 (馬上被抬走.../images/emoticon/emoticon50.gif

所以在運行中狀態時部分變數可以透過修改環境變數的方式達到不停機生效的作用。不過要注意使用set修改的變數值重啟後是會失效的。<< 想要永久生效,還是得寫入my.cnf檔 >>

#無需修改my.cnf 依舊能開啟log功能
mysql> SET GLOBAL slow_query_log = 1

簡單介紹一下設定上差異:

區分: 1.全域(GLOBAL)級變數 2.會話(SESSION)級變數

MYSQL官方文件:變數範圍Var Scope & 可否動態變更參數Dynamic

  • 使用( show variables like '變數名稱' )指令查看變數值時會優先顯示SESSION級變數值,如果不存在,則為全域級變數值。
  • 部分參數會提示read only 是無法動態更改的。
  • 修改時使用錯誤級別會無法修改。

EX:圖中可以看到我們以SESSION級的方式更改。但因為slow_query_log屬於GLOBAL變數級別所以會噴ERROR!以 global方式修改就能將日誌功能關閉~
https://ithelp.ithome.com.tw/upload/images/20210802/20130880YiXJk2cTpu.png
https://ithelp.ithome.com.tw/upload/images/20210802/20130880vdnng7kdUi.png

作用範圍: 以long_query_time來看Both等於2種方式都支援,Yes等於可動態更改。
https://ithelp.ithome.com.tw/upload/images/20210803/20130880JfOObnQkrD.png

  1. GLOBAL: 修改global變數,對所有新會話的global和session變數都會產生影響。

Example 圖1-0中先開啟2個SESSION連線資料庫 SESSION-1 & SESSION-2,透過左邊SESSION-1使用GLOBAL方式修改long_query_time變數,修改完成後再開啟新連線SESSION-3。

  • SESSION-1 (左)
    起始設定值: 0
    參數修改後: SESSION = 0 , GLOBAL = 5

  • SESSION-2 (中)
    起始設定值: 0
    參數修改後: SESSION = 0 , GLOBAL = 5

  • SESSION-3 (右) 新建立的連線
    參數修改後: SESSION = 5 , GLOBAL = 5

當變數同時擁有兩個級別,在建立連線時用全域級變數初始化會話級變數,但一旦連線建立之後,全域級不會影響到會話級變數!! 看圖自己做一次馬上就能知道差異囉~

圖.1-0
https://ithelp.ithome.com.tw/upload/images/20210803/20130880KwlvUnpMuk.png

  1. SESSION: 修改session變數,只會對當前連線的會話產生影響。

Example 圖1-1中開啟2個SESSION連線資料庫使用,透過左邊SESSION-1用session方式修改long_query_time變數。

  • SESSION-1 (左)
    起始設定值: 0
    參數修改後: SESSION = 5 , GLOBAL = 0

  • SESSION-2 (右)
    起始設定值: 0
    參數修改後: SESSION = 0 , GLOBAL = 0

圖.1-1
https://ithelp.ithome.com.tw/upload/images/20210803/20130880UO4JQbdOgE.png


以上內容目前配置參考:

[client]
#mysql 客戶端連線服務端預設port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock

[mysqld]
#mysql使用socket方式登陸的sock檔案路徑
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 資料庫檔案所在目錄
datadir=/mnt/mysql_data/mysql
#錯誤日誌路徑&檔名
log-error=/var/log/mysql/error.log
#mysql服務端預設監聽port
port=3306

# 設定字符集utf8
character_set_server=utf8

#general log是否開啟(1啟用/0禁用)
general_log = 1
#查詢日誌路徑&檔名
general_log_file = /mnt/mysql_data/mysql/general.log
#指定日誌輸出目的地(default: FILE) FILE=寫入general.log , TABLE=寫入mysql.general_log表
log-output=FILE

#slow log是否開啟(1啟用/0禁用)
slow-query-log = 1
#慢查詢日誌路徑&檔名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#執行超過x秒就紀錄 (EX: 1s)
long_query_time = 1

今天介紹了幾個MYSQL日誌的不同特點~

下集預告: 一樣分享MYSQL相關日誌但不同的是這些日誌跟資料庫的資料處理與數據恢復有關 !
還有( binlog / redo-log / undo-log / relay-log )後面都會提到....好多/images/emoticon/emoticon20.gif


上一篇
Day.4 針對使用者做管理 - 權限管理&資安 (Power)
下一篇
Day.6 留個紀錄好辦事 - Mysql Log (日誌紀錄)-下
系列文
MYSQL-相關實務操作學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言