MySQL 面試系列:MySQL 中日志的面試題總結

其它MySQL 面試系列:

MySQL 面試系列:MySQL查詢如何進行優(yōu)化?

MySQL 面試系列:一條select語句在MySQL是這樣執(zhí)行的?
MySQL 面試系列:MySQL 常見的開放性問題
MySQL 面試系列:MySQL 性能優(yōu)化 & 分布式

MySQL 面試系列:MySQL 命令和內置函數
MySQL 面試系列:MySQL 中日志的面試題總結
MySQL 面試系列:MySQL 中鎖的面試題總結

MySQL 面試系列:MySQL 事務的面試題總結
MySQL 面試系列:MySQL 索引的面試題總結
MySQL 面試系列:MySQL 基礎模塊的面試題總結


MySQL 有哪些重要的日志文件?

MySQL 中的重要日志分為以下幾個: ① 錯誤日志:用來記錄 MySQL 服務器運行過程中的錯誤信息,比如,無法加載 MySQL 數據庫的數據文件,或權限不正確等都會被記錄在此,還有復制環(huán)境下,從服務器進程的信息也會被記錄進錯誤日志。默認情況下,錯誤日志是開啟的,且無法被禁止。默認情況下,錯誤日志是存儲在數據庫的數據文件目錄中,名稱為 hostname.err,其中 hostname 為服務器主機名。在 MySQL 5.5.7 之前,數據庫管理員可以刪除很長時間之前的錯誤日志,以節(jié)省服務器上的硬盤空間, MySQL 5.5.7 之后,服務器將關閉此項功能,只能使用重命名原來的錯誤日志文件,手動沖洗日志創(chuàng)建一個新的,命令為:

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

② 查詢日志:查詢日志在 MySQL 中被稱為 general log(通用日志),查詢日志里的內容不要被“查詢日志”誤導,認為里面只存儲 select 語句,其實不然,查詢日志里面記錄了數據庫執(zhí)行的所有命令,不管語句是否正確,都會被記錄,具體原因如下:

  • insert 查詢?yōu)榱吮苊鈹祿_突,如果此前插入過數據,當前插入的數據如果跟主鍵或唯一鍵的數據重復那肯定會報錯;
  • update 時也會查詢因為更新的時候很可能會更新某一塊數據;
  • delete 查詢,只刪除符合條件的數據;

因此都會產生日志,在并發(fā)操作非常多的場景下,查詢信息會非常多,那么如果都記錄下來會導致 IO 非常大,影響 MySQL 性能,因此如果不是在調試環(huán)境下,是不建議開啟查詢日志功能的。

查詢日志的開啟有助于幫助我們分析哪些語句執(zhí)行密集,執(zhí)行密集的 select 語句對應的數據是否能夠被緩存,同時也可以幫助我們分析問題,所以,我們可以根據自己的實際情況來決定是否開啟查詢日志。

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

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

general_log=1 為開啟查詢日志,0 為關閉查詢日志,這個設置命令即時生效,不用重啟 MySQL 服務器。

③ 慢日志:慢查詢會導致 CPU、IOPS、內存消耗過高,當數據庫遇到性能瓶頸時,大部分時間都是由于慢查詢導致的。開啟慢查詢日志,可以讓 MySQL 記錄下查詢超過指定時間的語句,之后運維人員通過定位分析,能夠很好的優(yōu)化數據庫性能。默認情況下,慢查詢日志是不開啟的,只有手動開啟了,慢查詢才會被記錄到慢查詢日志中。使用如下命令記錄當前數據庫的慢查詢語句:

set global slowquerylog='ON';

使用 set global slowquerylog='ON' 開啟慢查詢日志,只是對當前數據庫有效,如果 MySQL 數據庫重啟后就會失效。所以如果要永久生效,就要修改配置文件 my.cnf,設置 slowquerylog=1 并重啟 MySQL 服務器。

④ redo log(重做日志):為了最大程度的避免數據寫入時,因為 IO 瓶頸造成的性能問題,MySQL 采用了這樣一種緩存機制,先將數據寫入內存中,再批量把內存中的數據統(tǒng)一刷回磁盤。為了避免將數據刷回磁盤過程中,因為掉電或系統(tǒng)故障帶來的數據丟失問題,InnoDB 采用 redo log 來解決此問題。

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

⑥ bin log(二進制日志):是一個二進制文件,主要記錄所有數據庫表結構變更,比如,CREATE、ALTER TABLE 等,以及表數據修改,比如,INSERT、UPDATE、DELETE 的所有操作,bin log 中記錄了對 MySQL 數據庫執(zhí)行更改的所有操作,并且記錄了語句發(fā)生時間、執(zhí)行時長、操作數據等其它額外信息,但是它不記錄 SELECT、SHOW 等那些不修改數據的 SQL 語句。

binlog 的作用如下:

  • 恢復(recovery):某些數據的恢復需要二進制日志。比如,在一個數據庫全備文件恢復后,用戶可以通過二進制日志進行 point-in-time 的恢復;
  • 復制(replication):其原理與恢復類似,通過復制和執(zhí)行二進制日志使一臺遠程的MySQL數據庫(一般稱為 slave 或者 standby)與一臺 MySQL 數據庫(一般稱為 master 或者 primary)進行實時同步;
  • 審計(audit):用戶可以通過二進制日志中的信息來進行審計,判斷是否有對數據庫進行注入攻擊。

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

binlog 默認是關閉狀態(tài),可以在 MySQL 配置文件(my.cnf)中通過配置參數 log-bin = [base-name] 開啟記錄 binlog 日志,如果不指定 base-name,則默認二進制日志文件名為主機名,并以自增的數字作為后綴,比如:mysql-bin.000001,所在目錄為數據庫所在目錄(datadir)。

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

show variables like 'log_%';

[圖片上傳中...(image-c8174c-1605073940677-0)]

binlog 格式分為: STATEMENT、ROW 和 MIXED 三種:

  • STATEMENT 格式的 binlog 記錄的是數據庫上執(zhí)行的原生 SQL 語句。這種格式的優(yōu)點是簡單,簡單地記錄和執(zhí)行這些語句,能夠讓主備保持同步,在主服務器上執(zhí)行的 SQL 語句,在從服務器上執(zhí)行同樣的語句。另一個好處是二進制日志里的時間更加緊湊,所以相對而言,基于語句的復制模式不會使用太多帶寬,同時也節(jié)約磁盤空間。并且通過 mysqlbinlog 工具容易讀懂其中的內容。缺點就是同一條 SQL 在主庫和從庫上執(zhí)行的時間可能稍微或很大不相同,因此在傳輸的二進制日志中,除了查詢語句,還包括了一些元數據信息,如當前的時間戳。即便如此,還存在著一些無法被正確復制的 SQL。比如,使用 INSERT INTO TB1 VALUE(CUURENT_DATE()) 這一條使用函數的語句插入的數據復制到當前從服務器上來就會發(fā)生變化,存儲過程和觸發(fā)器在使用基于語句的復制模式時也可能存在問題;另外一個問題就是基于語句的復制必須是串行化的,比如:InnoDB 的 next-key 鎖等,并不是所有的存儲引擎都支持基于語句的復制;

  • ROW 格式是從 MySQL 5.1 開始支持基于行的復制,也就是基于數據的復制,基于行的更改。這種方式會將實際數據記錄在二進制日志中,它有其自身的一些優(yōu)點和缺點,最大的好處是可以正確地復制每一行數據,一些語句可以被更加有效地復制,另外就是幾乎沒有基于行的復制模式無法處理的場景,對于所有的 SQL 構造、觸發(fā)器、存儲過程等都能正確執(zhí)行;它的缺點就是二進制日志可能會很大,而且不直觀,所以,你不能使用 mysqlbinlog 來查看二進制日志,也無法通過看二進制日志判斷當前執(zhí)行到那一條 SQL 語句?,F在對于 ROW 格式的二進制日志基本是標配了,主要是因為它的優(yōu)勢遠遠大于缺點,并且由于 ROW 格式記錄行數據,所以可以基于這種模式做一些 DBA 工具,比如數據恢復,不同數據庫之間數據同步等;

  • MIXED 也是 MySQL 默認使用的二進制日志記錄方式,但 MIXED 格式默認采用基于語句的復制,一旦發(fā)現基于語句的無法精確的復制時,就會采用基于行的復制。比如用到 UUID()、USER()、CURRENTUSER()、ROWCOUNT() 等無法確定的函數。

redo log 和 binlog 有什么區(qū)別?

還有 40% 的精彩內容
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
支付 ¥3.99 繼續(xù)閱讀

相關閱讀更多精彩內容

友情鏈接更多精彩內容