MySQL 五 日誌

ellen艾琳發表於2020-11-02

五、MySQL日誌
1、 錯誤日誌:
    重新命名原來的錯誤日誌檔案,手動沖洗日誌建立一個新的,命令為:mv hostname.err  hostname.err.old mysqladmin flush-logs
2、 查詢日誌模式是關閉的,可以通過以下命令開啟查詢日誌:set global generallog=1 set global logoutput='table';    
    general_log=1 為開啟查詢日誌,0 為關閉查詢日誌,這個設定命令即時生效,不用重啟 MySQL 伺服器
3、 預設情況下,慢查詢日誌是不開啟的,只有手動開啟了,慢查詢才會被記錄到慢查詢日誌中。開啟慢查詢日誌:set global slowquerylog='ON';
    只是對當前資料庫有效,如果 MySQL 資料庫重啟後就會失效。所以如果要永久生效,就要修改配置檔案 my.cnf,設定 slowquerylog=1 並重啟 MySQL 伺服器
4、 慢查詢是 MySQL 中提供的一種慢查詢日誌,記錄在 MySQL 中響應時間超過閥值的語句,具體指執行時間超過 longquerytime 值的 SQL,則會被記錄到慢查詢日誌中
    longquerytime 的預設值為 10。MySQL 資料庫並不啟動慢查詢日誌,需要我們手動來設定這個引數,如果不是調優需要的話,一般不建議啟動該引數
    慢查詢日誌支援將日誌記錄寫入檔案,也支援將日誌記錄寫入資料庫表。
    使用 mysql> show variables like '%slow_query_log%'; 來查詢慢查詢日誌是否開啟
    開啟慢查詢日誌,MySQL 命令:mysql> set global slowquerylog=1    這種設定方式,只對當前資料庫生效,如果 MySQL 重啟也會失效
    開啟慢查詢日誌,在 MySQL 的安裝目錄下找到 my.cnf 檔案設定 slow-query-log=On 開啟慢查詢,慢查詢預設時長為 10s,預設儲存檔名為 host_name-slow.log
    永久生效,修改 MySQL 的配置檔案 my.cnf    slowquerylog =1 slowquerylogfile=/tmp/mysqlslow.log
5、 Undo log(回滾日誌):用於儲存日誌被修改前的值,從而保證如果修改出現異常,可以使用 Undo log 日誌來實現回滾操作
6、 Undo log 預設存放在共享表空間中,在 ySQL 5.6 中,Undo log 的存放位置還可以通過變數 innodbundodirectory 來自定義存放目錄,預設值為“.”表示 datadir 目錄
7、 Undo Log實現事務原子性:事務處理過程中如果出現了錯誤或者使用者執行了 ROLLBACK語句,Mysql可以利用Undo Log中的備份將資料恢復到事務開始之前的狀態
8、 Undo log實現多版本併發控制:事務未提交之前,Undo儲存了未提交之前的版本資料,Undo log中的資料可作為資料舊版本快照供其他併發事務進行快照讀
9、 快照讀:SQL讀取的資料是快照版本,也就是歷史版本,普通的SELECT就是快照讀innodb快照讀,資料的讀取將由 cache(原本資料) + undo(事務修改過的資料) 兩部分組成
10、當前讀:SQL讀取的資料是最新版本。通過鎖機制來保證讀取的資料無法通過其他事務進行修改UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、
    SELECT … FOR UPDATE都是當前讀
11、Redo log指事務中操作的任何資料,將最新的資料備份到一個地方 (Redo Log)
12、redo log(重做日誌):為了最大程度的避免資料寫入時,因為 IO 瓶頸造成的效能問題,MySQL 採用了這樣一種快取機制,先將資料寫入記憶體中,再批量把內
    存中的資料統一刷回磁碟。為了避免將資料刷回磁碟過程中,因為掉電或系統故障帶來的資料丟失問題,InnoDB 採用 redo log 來解決此問題
13、Redo log持久化不是隨著事務的提交才寫入的,而是在事務的執行過程中,便開始寫入redo 中。具體的落盤策略可以進行配置
14、InnoDB 使用 redo log 來實現 crash-safe 能力    。crash-safe 是指發生當機等意外情況下,伺服器重啟後資料依然不會丟失的情況    
15、Redo Log實現事務永續性:防止在發生故障的時間點,尚有髒頁未寫入磁碟,在重啟mysql服務的時候,根據redolog進行重做,從而達到事務的未入磁碟資料進行持久化這一特性
16、在 InnoDB 中設定 innodbflushneighbors 這個引數的值為 0,來規定 MySQL 只刷當前髒頁,MySQL 8 這個值預設是 0
17、指定Redo log 記錄在{datadir}/ib_logfile1&ib_logfile2 可通過innodb_log_group_home_dir 配置指定目錄儲存
18、一旦事務成功提交且資料持久化落盤之後,Redo log中的對應事務資料記錄就失去了意義,所以Redo log的日誌檔案是迴圈寫入的
19、Redo log引數
    指定Redo log日誌檔案組中的數量 innodb_log_files_in_group 預設為2
    指定Redo log每一個日誌檔案最大儲存量innodb_log_file_size 預設48M
    指定Redo log在cache/buffer中的buffer池大小innodb_log_buffer_size 預設16M
20、Redo buffer 持久化Redo log的策略, Innodb_flush_log_at_trx_commit:
    1)取值 0 每秒提交 Redo buffer --> Redo log OS cache -->flush cache to disk[可能丟失一秒內的事務資料]
    2)取值 1 ,預設值,每次事務提交執行Redo buffer --> Redo log OS cache -->flush cache to disk[最安全,效能最差的方式]
    2)取值 2 每次事務提交執行Redo buffer --> Redo log OS cache 再每一秒執行 ->flush cache todisk操作
21、bin log(二進位制日誌):是一個二進位制檔案,主要記錄所有資料庫表結構變更,比如,CREATE、ALTER TABLE 等,以及表資料修改,比如,INSERT、UPDATE、DELETE    
22、binlog 預設是關閉狀態,可以在 MySQL 配置檔案(my.cnf)中通過配置引數 log-bin = [base-name] 開啟記錄 binlog 日誌,如果不指定 base-name,
    則預設二進位制日誌檔名為主機名,並以自增的數字作為字尾,比如:mysql-bin.000001,所在目錄為資料庫所在目錄(datadir)    
23、查詢 binlog 是否開啟:show variables like 'log_%';    
24、binlog 的作用如下:
    1)恢復(recovery):某些資料的恢復需要二進位制日誌。比如,在一個資料庫全備檔案恢復後,使用者可以通過二進位制日誌進行 point-in-time 的恢復;
    2)複製(replication):其原理與恢復類似,通過複製和執行二進位制日誌使一臺遠端的 MySQL 資料庫(一般稱為 slave 或者 standby)與一臺 MySQL 資料庫
        (一般稱為 master 或者 primary)進行實時同步;
    3)審計(audit):使用者可以通過二進位制日誌中的資訊來進行審計,判斷是否有對資料庫進行注入攻擊。
25、binlog 對於事務儲存引擎的崩潰恢復也有非常重要的作用,在開啟 binlog 的情況下,為了保證 binlog 與 redo 的一致性,MySQL 將採用事務的兩階段提交協議。
    當 MySQL 系統發生崩潰時,事務在儲存引擎內部的狀態可能為 prepared(準備狀態)和 commit(提交狀態)兩種,對於 prepared 狀態的事務,是進行提交操作還
    是進行回滾操作,這時需要參考 binlog,如果事務在 binlog 中存在,那麼將其提交;如果不在 binlog 中存在,那麼將其回滾,這樣就保證了資料在主庫和從庫之間的一致性。
26、binlog 格式分為 STATEMENT、ROW 和 MIXED 三種
    STATEMENT    基於語句的複製
    ROW            基於行的複製
    MIXED        是 MySQL 預設使用的二進位制日誌記錄方式,但 MIXED 格式預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
27、redo log 和 binlog 的區別:
    1)redo log 是物理日誌,記錄的是“在某個資料頁上做了什麼修改”。binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 欄位加 1 ”。
    2)redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用。
    3)redo log 是迴圈寫的,空間固定會用完;binlog 是可以追加寫入的。“追加寫”是指 binlog 檔案寫到一定大小後會切換到下一個,並不會覆蓋以前的日誌。
28、redo log 和 binlog 是怎麼關聯的?
    它們有一個共同的資料欄位,叫 XID。崩潰恢復的時候,會按順序掃描 redo log:如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;
    如果碰到只有 parepare、而沒有 commit 的 redo log,就拿著 XID 去 binlog 找對應的事務。
29、MySQL 怎麼知道 binlog 是完整的?
    statement 格式的 binlog,完整的標識是最後有 COMMIT 關鍵字。
    row 格式的 binlog,完整的標識是最後會有一個 XID event 關鍵字。
30、MySQL 中可不可以只要 binlog,不要 redo log?不可以,binlog 沒有崩潰恢復的能力。

相關文章