2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

導讀:數據庫是導致應用系統運行緩慢的常見原因。面對數據庫引性能問題,很多開發者或者DBA卻束手無策。本文作者經過多年的實際經驗,整理了一些材料,將Linux環境下MySQL性能突發事件問題排查技巧分享給大家。

作者介紹:崔虎龍,雲和恩墨-開源架構部-MySQL技術顧問,長期服務於數據中心(金融,遊戲,物流)行業,熟悉數據中心運營管理的流程及規範,自動化運維 等方面。擅長MySQL,Redis,MongoDB 數據庫高可用設計 和 運維故障處理,備份恢復,升級遷移,性能優化 。

經過多年的實際經驗,整理了一些材料,將Linux環境下MySQL性能突發事件問題排查技巧分享給大家。

作為DBA在面對性能上突發問題的時候,是否出現過束手無策,無從下手的經歷。 其實性能無非問題點在於存儲、操作系統, 應用程序,數據庫 等方面。

性能分析問題 並沒有想象的那麼難,當了解到一些常用的Linux 系統命令和MySQL的基礎排查命令的時候,所有問題點都可以定位到。

先上一個Linux性能工具圖譜圖,Brendan D. Gregg動態追蹤工具 DTrace 的作者。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

有點複雜,不用太care,只要你理解了下面的常用命令和分析點,那就可以確定絕大數性能上問題。

Linux 平臺基礎常用的性能收集工具:

1. top — Linux 系統進程監控

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。並且它也是 Linux 系統管理員經常使用的監控系統性能的工具。Top命令可以定期顯示所有正在運行和實際運行並且更新到列表中,它顯示出 CPU 的使用、內存的使用、交換內存、緩存大小、緩衝區大小、過程控制、用戶和更多命令。它也會顯示內存和 CPU 使用率過高的正在運行的進程。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

2. vmstat — 虛擬內存統計

vmstat 命令是用於顯示虛擬內存、內核線程、磁盤、系統進程、I/O 模塊、中斷、CPU 活躍狀態等更多信息。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

3. lsof — 打開文件列表

lsof 命令對於很多 Linux/Unix 系統都可以使用,主要以列表的形式顯示打開的文件和進程。打開的文件主要包括磁盤文件、網絡套接字、管道、設備和進程。這個命令很容易看出哪些文件正在使用。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

4. tcpdump — 網絡數據包分析器

tcpdump 是一種使用最廣泛的命令行網絡數據包分析,將網絡中傳送的數據包完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾 並提供and、or、not等邏輯語句來幫助你去掉無用的信息。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

包可通過tcpdump命令解析,也可以保存成後綴為pcap的文件,使用wireshark等軟件進行查看。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

3. netstat — 網絡統計

netstat 命令是一個監控網絡數據包傳入和傳出的統計界面的命令行工具。它對於許多系統管理員去監控網絡性能和解決網絡相關問題是一個非常有用的工具。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

4. iostat — 輸入/輸出統計

iostat 是收集和展示系統輸入和輸出存儲設備統計的簡單工具。這個工具通常用於查找存儲設備性能問題,包括設備、本地磁盤、例如 NFS 遠程磁盤。

除了上述 還有 其他一些Linux 常用的工具sar,htop, IPTraf , iotop ,iftop ,iptraf 等。

MySQL常用性能突發事件分析命令:

1. SHOW PROCESSLIST; —當前MySQL數據庫的運行的所有線程

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

2. INNODB_TRX; — 當前運行的所有事務

## 當前運行的所有事務 ,還有具體的語句

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

3. INNODB_LOCKS; — 當前出現的鎖

## 當前事務出現的鎖的語句信息

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

4. INNODB_LOCK_WAITS; — 鎖等待的對應關係計

## 鎖等待的對應關係

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

5. SHOW OPEN TABLES where In_use >0; — 當前打開表

查看哪些表在使用中,In_use列表示有多少線程正在使用某張表,Name_locked表示表名是否被鎖,這一般發生在Drop或Rename命令操作這張表時。所以這條命令不能幫助解答我們常見的問題:當前某張表是否有死鎖,誰擁有表上的這個鎖等。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

下面比較重點部分,請注意!

6. SHOW ENGINE INNODB STATUS \\G; —Innodb狀態

顯示除了大量的內部信息,輸出內容比較複雜難懂,輸出內容中包含了一些平均值的統計信息,這些平均值是自上次輸出結果生成以來的統計數。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

具體分析如下:

①.Header

這部分簡單的打印,輸出的時間,以及自從上次輸出的間隔時間。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

②.BACKGROUND THREAD

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

參數

說明

Srv_master_thread loops

Master線程的循環次數,master線程在每次loop過程中都會sleep,sleep的時間為1秒。而在每次loop的過程中會選擇active、shutdown、idle中一種狀態執行。Master線程在不停循環,所以其值是隨時間遞增的。

Srv_active

Master線程選擇的active狀態執行。Active數量增加與數據表、數據庫更新操作有關,與查詢無關,例如:插入數據、更新數據、修改表等。

Srv_shutdown

這個參數的值一直為0,因為srv_shutdown只有在mysql服務關閉的時候才會增加。

Srv_idle

這個參數是在master線程空閒的時候增加,即沒有任何數據庫改動操作時。

Log_flush_and_write

Master線程在後臺會定期刷新日誌,日誌刷新是由參數innodb_flush_log_at_timeout參數控制前後刷新時間差。

注:Background thread部分信息為統計信息,即mysql服務啟動之後該部分值會一直遞增,因為它顯示的是自mysqld服務啟動之後master線程所有的loop和log刷新操作。通過對比active和idle的值,可以獲知系統整體負載情況。Active的值越大,證明服務越繁忙。

③. SEMAPHORES 信號量

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

OS WAIT ARRAY INFO 操作系統等待數組的信息,它是一個插槽數組,innodb使用了多少次操作系統的等待

保留統計(reservation count)顯示了innodb分配插槽的頻度

信號計數(signal count) 衡量的是線程通過數組得到信號的頻度

RW-shared spins:#這行顯示讀寫的共享鎖的計數器

RW-excl spins:#這行顯示讀寫的排他鎖的計數器

RW-sx spins:#這行顯示共享排它鎖計數器

*備註:5.7.2增加了一種新的讀寫鎖類型稱為SX共享排他鎖

鎖的擁有則可以讀表中的任何數據,如果在相應的行上能夠獲得X鎖,則可以修改該行。


S

SX

X

S

o

o

x

SX

o

x

x

X

x

x

x

④. TRANSACTIONS

包含Innodb 事務(transactions)的統計信息,還有當前活動的事務列表。

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

transaction id: 這個ID是一個系統變量隨時每次新的transaction產生而增加。

Purge done:正在進行清空(purge)操作的transaction ID。你可以通過查看第transaction id和第Purge done ID的區別,明白沒有被purge的事務落後的情況。

History listlength:記錄了undo spaces內unpurged的事務的個數。

⑤. FILE I/O

顯示了I/O Helper thread的狀態,包括一些統計信息

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

pending operations, pending的log和buffer pool thread的fsync調用

399 OS file:行顯示了reads, writes, and fsync調用次數。

0.00 reads/s…… : 顯示了每秒的統計信息

備註:“aio”表示“ 異步I/O(asynchronous I/O).”

⑥. INSERT BUFFER AND ADAPTIVE HASH INDEX

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

Ibuf:insertbuffer的一些信息,包括free list, segment size

Hash table:顯示了hash table的一些信息最後一行顯示了每秒進行了多少次hash搜索,以及非hash搜索

⑦. LOG

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

Log sequence number表示的是redo log buffer中的lsn

Log flushed up to表示的是redo log file中的lsn

Pages flushed up to表示的緩衝池最舊髒頁的lsn

Last checkpoint at 指的就是最近一個物理頁刷新到磁盤時,它的fil_page_lsn的變量值。

⑧. BUFFER POOL AND MEMORY

當前內存使用狀態

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

Pages read ahead:顯示了每秒線性預讀跟隨機預讀的次數

備註:InnoDB 提供了兩種預讀的方式,一種是 Linear read ahead,由參數innodb_read_ahead_threshold控制,當你連續讀取一個 extent 的 threshold 個 page 的時候,會觸發下一個 extent 64個page的預讀。另外一種是Random read-ahead,由參數innodb_random_read_ahead控制,當你連續讀取設定的數量的page後,會觸發讀取這個extent的剩餘page。InnoDB 的預讀功能是使用後臺線程異步完成。

⑨. ROW OPERATIONS

0 queries inside InnoDB, 0 queries in queue:顯示了有多少線程在Innodb內核

read views open inside InnoDB:顯示了有多少read view被打開了,一個read view是一致性保證的MVCC “snapshot”

備註:innodb多版本併發(MVCC)通過read view來確定一致性讀時的數據庫snapshot, innodb的read view確定一條記錄能否看到,

在RC隔離級別下,是每個SELECT都會獲取最新的read view;

在RR隔離級別下,則是當事務中的第一個SELECT請求才創建read view

7. SHOW STATUS LIKE 'innodb_row_lock_%'; — 鎖性能狀態

查看當前鎖性能狀態

2020想進大廠你不得不瞭解的MySQL意外事件的查詢技巧

解釋如下:

Innodb_row_lock_current_waits:當前等待鎖的數量

Innodb_row_lock_time:系統啟動到現在、鎖定的總時間長度

Innodb_row_lock_time_avg:每次平均鎖定的時間

Innodb_row_lock_time_max:最長一次鎖定時間

Innodb_row_lock_waits:系統啟動到現在、總共鎖定次數

8. SQL語句EXPLAIN; — 查詢優化器

EXPLAIN執行計劃部分,略過(後續專題分享)

作為一個DBA,問題排查技巧是每個工程師都需要掌握的核心技能。

相關閱讀:

  • Cookie或將被替換!Chrome工程師提議新型HTTP狀態管理協議
  • MySQL 5.7 新特性大全和未來展望
  • 單表60億記錄等大數據場景的MySQL優化和運維之道


分享到:


相關文章: