在Java相關崗位的面試中,mysql類的問題經常會被cue到,無論大家是想要進入開發崗位還是運維崗位,總會有那么相關的幾道題,所以,熟知mysql語句面試題,對于日后的面試有很大的幫助,大家可以跟著小編一起在來熟悉一下:

1.MySQL 怎么知道 binlog 是完整的?
一個事務的 binlog 是有完整格式的:
statement 格式的 binlog,最后會有 COMMIT;
row 格式的 binlog,最后會有一個 XID event。
2.什么是 WAL 技術,有什么優點?
WAL,中文全稱是 Write-Ahead Logging,它的關鍵點就是日志先寫內存,再寫磁盤。MySQL 執行更新操作后,在真正把數據寫入到磁盤前,先記錄日志。
好處是不用每一次操作都實時把數據寫盤,就算 crash 后也可以通過redo log 恢復,所以能夠實現快速響應 SQL 語句。
3.binlog 日志的三種格式
binlog 日志有三種格式
- Statement:基于SQL語句的復制((statement-based replication,SBR))
- Row:基于行的復制。(row-based replication,RBR)
- Mixed:混合模式復制。(mixed-based replication,MBR)
Statement格式
- 每一條會修改數據的 SQL 都會記錄在 binlog 中
- 優點:不需要記錄每一行的變化,減少了binlog日志量,節約了IO,提高性能。
- 缺點:由于記錄的只是執行語句,為了這些語句能在備庫上正確運行,還必須記錄每條語句在執行的時候的一些相關信息,以保證所有語句能在備庫得到和在主庫端執行時候相同的結果。
Row格式
- 不記錄 SQL 語句上下文相關信息,僅保存哪條記錄被修改。
- 優點:binlog 中可以不記錄執行的 SQL 語句的上下文相關的信息,僅需要記錄那一條記錄被修改成什么了。所以rowlevel的日志內容會非常清楚的記錄下每一行數據修改的細節。不會出現某些特定情況下的存儲過程、或 function、或trigger的調用和觸發無法被正確復制的問題。
- 缺點:可能會產生大量的日志內容。
Mixed格式
- 實際上就是 Statement 與 Row 的結合。一般的語句修改使用 statment 格式保存 binlog,如一些函數,statement 無法完成主從復制的操作,則采用 row 格式保存 binlog,MySQL 會根據執行的每一條具體的 SQL 語句來區分對待記錄的日志形式。
4.redo log日志格式
redo log buffer (內存中)是由首尾相連的四個文件組成的,它們分別是:ib_logfile_1、ib_logfile_2、ib_logfile_3、ib_logfile_4。
- write pos 是當前記錄的位置,一邊寫一邊后移,寫到第 3 號文件末尾后就回到 0 號文件開頭。
- checkpoint 是當前要擦除的位置,也是往后推移并且循環的,擦除記錄前要把記錄更新到數據文件。
- write pos 和 checkpoint 之間的是“粉板”上還空著的部分,可以用來記錄新的操作。
- 如果 write pos 追上 checkpoint,表示“粉板”滿了,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把 checkpoint 推進一下。
- 有了 redo log,當數據庫發生宕機重啟后,可通過 redo log將未落盤的數據(check point之后的數據)恢復,保證已經提交的事務記錄不會丟失,這種能力稱為crash-safe。
5.原本可以執行得很快的 SQL 語句,執行速度卻比預期的慢很多,原因是什么?如何解決?
原因:從大到小可分為四種情況
- MySQL 數據庫本身被堵住了,比如:系統或網絡資源不夠。
- SQL 語句被堵住了,比如:表鎖,行鎖等,導致存儲引擎不執行對應的 SQL 語句。
- 確實是索引使用不當,沒有走索引。
- 表中數據的特點導致的,走了索引,但回表次數龐大。
解決:
- 考慮采用 force index 強行選擇一個索引
- 考慮修改語句,引導 MySQL 使用我們期望的索引。比如把“order by b limit 1” 改成 “order by b,a limit 1” ,語義的邏輯是相同的。
- 第三種方法是,在有些場景下,可以新建一個更合適的索引,來提供給優化器做選擇,或刪掉誤用的索引。
- 如果確定是索引根本沒必要,可以考慮刪除索引。
6.InnoDB 數據頁結構
一個數據頁大致劃分七個部分
- File Header:表示頁的一些通用信息,占固定的38字節。
- page Header:表示數據頁專有信息,占固定的56字節。
- inimum+Supermum:兩個虛擬的偽記錄,分別表示頁中的最小記錄和最大記錄,占固定的26字節。
- User Records:真正存儲我們插入的數據,大小不固定。
- Free Space:頁中尚未使用的部分,大小不固定。
- Page Directory:頁中某些記錄的相對位置,也就是各個槽對應的記錄在頁面中的地址偏移量。
- File Trailer:用于檢驗頁是否完整,占固定大小 8 字節。
數據相關
7.MySQL 是如何保證數據不丟失的?
只要redolog 和 binlog 保證持久化磁盤就能確保MySQL異常重啟后回復數據
在恢復數據時,redolog 狀態為 commit 則說明 binlog 也成功,直接恢復數據;如果 redolog 是 prepare,則需要查詢對應的 binlog事務是否成功,決定是回滾還是執行。
8.誤刪數據怎么辦?
DBA 的最核心的工作就是保證數據的完整性,先要做好預防,預防的話大概是通過這幾個點:
- 權限控制與分配(數據庫和服務器權限)
- 制作操作規范
- 定期給開發進行培訓
- 搭建延遲備庫
- 做好 SQL 審計,只要是對線上數據有更改操作的語句(DML和DDL)都需要進行審核
- 做好備份。備份的話又分為兩個點 (1)如果數據量比較大,用物理備份 xtrabackup。定期對數據庫進行全量備份,也可以做增量備份。(2)如果數據量較少,用 mysqldump 或者 mysqldumper。再利用 binlog 來恢復或者搭建主從的方式來恢復數據。定期備份binlog 文件也是很有必要的
- 如果發生了數據刪除的操作,又可以從以下幾個點來恢復:
- DML 誤操作語句造成數據不完整或者丟失。可以通過 flashback,美團的 myflash,也是一個不錯的工具,本質都差不多
- 都是先解析 binlog event,然后在進行反轉。把 delete 反轉為insert,insert 反轉為 delete,update前后 image 對調。
- 所以必須設置binlog_format=row 和 binlog_row_image=full,切記恢復數據的時候,應該先恢復到臨時的實例,然后在恢復回主庫上。
- DDL語句誤操作(truncate和drop),由于DDL語句不管 binlog_format 是 row 還是 statement ,在 binlog 里都只記錄語句,不記錄 image 所以恢復起來相對要麻煩得多。
- 只能通過全量備份+應用 binlog 的方式來恢復數據。一旦數據量比較大,那么恢復時間就特別長
- rm 刪除:使用備份跨機房,或者最好是跨城市保存。
以上就是“mysql語句面試題,提高面試幾率”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。