Mysql日誌相關

2021-09-27 13:51:15 字數 2914 閱讀 7100

在 mysql 中也稱為通用日誌(general log),查詢日誌裡面記錄了資料庫執行的所有命令,不管語句是否正確,都會被記錄,原因如下:

查詢日誌的開啟有助於幫助我們分析哪些語句執行密集,執行密集的 select 語句對應的資料是否能夠被快取,同時也可以幫助我們分析問題,但是在併發操作非常多的場景下,查詢資訊會非常多,若都記錄下來會導致 io 非常大,影響了mysql 效能,因此如果不是在除錯環境下,是不建議開啟查詢日誌功能的。

查詢日誌模式預設是關閉的,可以通過以下命令開啟查詢日誌:

set global generallog=1 set global logoutput='table';

general_log=1 為開啟查詢日誌,0 為關閉查詢日誌,這個設定命令即時生效,不用重啟 mysql 伺服器。

慢查詢會導致 cpu、iops、記憶體消耗過高,當資料庫遇到效能瓶頸時,大部分時間都是由於慢查詢導致的。

開啟慢查詢日誌,可以讓 mysql 記錄下查詢超過指定時間的語句,之後運維人員通過定位分析,能夠很好的優化資料庫效能。

預設情況下,慢查詢日誌是不開啟的,只有手動開啟了,慢查詢才會被記錄到慢查詢日誌中。使用如下命令記錄當前資料庫的慢查詢語句:

set global slowquerylog='on';

上面的這個命令只是對當前資料庫有效,若 mysql 資料庫重啟後就會失效。因此如果要永久生效,就要修改配置檔案 my.cnf,設定 slowquerylog=1 並重啟 mysql 伺服器。

為了最大程度的避免資料寫入時,因為 io 瓶頸造成的效能問題,mysql 採用了這樣一種快取機制,先將資料寫入記憶體中,再批量把記憶體中的資料統一刷回磁碟。為了避免將資料刷回磁碟過程中,因為掉電或系統故障帶來的資料丟失問題,innodb 採用 redo log 來解決此問題。

用於儲存日誌被修改前的值,從而保證如果修改出現異常,可以使用 undo log 日誌來實現回滾操作。 undo log 和 redo log 記錄物理日誌不一樣,它是邏輯日誌,可以認為當 delete 一條記錄時,undo log 中會記錄一條對應的 insert 記錄,反之亦然,當 update 一條記錄時,它記錄一條對應相反的 update 記錄,當執行 rollback 時,就可以從 undo log 中的邏輯記錄讀取到相應的內容並進行回滾。undo log 預設存放在共享表空間中,在 ysql 5.6 中,undo log 的存放位置還可以通過變數 innodbundodirectory 來自定義存放目錄,預設值為「.」表示 datadir 目錄。

用來記錄 mysql 伺服器執行過程中的錯誤資訊,比如,無法載入 mysql 資料庫的資料檔案,或許可權不正確等都會被記錄在此,還有複製環境下,從伺服器程序的資訊也會被記錄進錯誤日誌。預設情況下,錯誤日誌是開啟的,且無法被禁止。預設情況下,錯誤日誌是儲存在資料庫的資料檔案目錄中,名稱為 hostname.err,其中 hostname 為伺服器主機名。在 mysql 5.5.7 之前,資料庫管理員可以刪除很長時間之前的錯誤日誌,以節省伺服器上的硬碟空間, mysql 5.5.7 之後,伺服器將關閉此項功能,只能使用重新命名原來的錯誤日誌檔案,手動沖洗日誌建立乙個新的,命令為:

mv hostname.err hostname.err.old mysqladmin flush-logs

它是乙個二進位制檔案,主要記錄所有資料庫表結構變更,比如,create、alter table 等,以及表資料修改,比如,insert、update、delete 的所有操作,bin log 中記錄了對 mysql 資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、運算元據等其它額外資訊,但是它不記錄 select、show 等那些不修改資料的 sql 語句。

binlog 的作用如下:

除了上面幾個作用外,binlog 對於事務儲存引擎的崩潰恢復也有非常重要的作用,在開啟 binlog 的情況下,為了保證 binlog 與 redo 的一致性,mysql 將採用事務的兩階段提交協議。當 mysql 系統發生崩潰時,事務在儲存引擎內部的狀態可能為 prepared(準備狀態)和 commit(提交狀態)兩種,對於 prepared 狀態的事務,是進行提交操作還是進行回滾操作,這時需要參考 binlog,如果事務在 binlog 中存在,那麼將其提交;如果不在 binlog 中存在,那麼將其回滾,這樣就保證了資料在主庫和從庫之間的一致性。

binlog 預設是關閉狀態,可以在 mysql 配置檔案(my.cnf)中通過配置引數 log-bin = [base-name] 開啟記錄 binlog 日誌,如果不指定 base-name,則預設二進位制日誌檔名為主機名,並以自增的數字作為字尾,比如:mysql-bin.000001,所在目錄為資料庫所在目錄(datadir)。

通過以下命令來查詢 binlog 是否開啟:

binlog 格式分為: statement、row 和 mixed 三種:

redo log(重做日誌)和 binlog(歸檔日誌)都是 mysql 的重要的日誌,它們的區別如下:

剛開始 mysql 裡並沒有 innodb 引擎,mysql 自帶的引擎是 myisam,但是 myisam 沒有crash-safe的能力,binlog 日誌只能用於歸檔。而 innodb 是另乙個公司以外掛程式形式引入 mysql 的,既然只依靠 binlog 是沒有 crash-safe 能力的,所以 innodb 使用另外一套日誌系統,也就是 redo log 來實現 crash-safe 能力。

注:crash-safe是指發生宕機等意外情況下,伺服器重啟後資料依然不會丟失的情況。

MySQL日誌相關

對於mysql的日誌還沒有仔細研究過,目前只是使用了乙個通用日誌,所以在這裡先列舉mysql的主要日誌檔案,接下來有時間會去研究一下,畢竟很多時候,日誌可以更精確的定位問題,所以了解一下mysql的日誌系統還是很有必要的。檢視日誌是否啟用 show variables like log 1 mysq...

MySQL 日誌相關

2.redo log 和 binlog 有什麼區別?3.什麼是 crash safe?4.什麼是髒頁和乾淨頁?5.什麼情況下會引發 mysql 刷髒頁 flush 的操作?6.mysql 刷髒頁的速度很慢可能是什麼原因?7.如何控制 mysql 只重新整理當前髒頁?8.mysql 的 wal 技術是...

MySQL相關日誌介紹

錯誤日誌 log error 查詢日誌 query log 二進位制日誌 binary log 2.相關日誌的作用 1 錯誤日誌 error log 記錄mysql服務程序mysql在啟動 關閉或者執行過程中遇到的錯誤訊息.是工作中排查錯誤的重要工具.2 查詢日誌 query log 1 普通查詢日...