mysql状态查询
mysql狀態查詢
Mysql 可以通過指令去了解數據庫的情況。記一下常用的查看狀態的指令。
mysql狀態
?通過 SHOW STATUS 可以提供服務器狀態信息,也可以使用 mysqladmin extende d-status 命令獲得。 SHOW STATUS 可以根據需要顯示 session 級別的統計結果和 global級別的統計結果。
show status; Aborted_clients 由于客戶沒有正確關閉連接已經死掉,已經放棄的連接數量。 Aborted_connects 嘗試已經失敗的MySQL服務器的連接的次數。 Connections 試圖連接MySQL服務器的次數。 Created_tmp_tables 當執行語句時,已經被創造了的隱含臨時表的數量。 Delayed_insert_threads 正在使用的延遲插入處理器線程的數量。 Delayed_writes 用INSERT DELAYED寫入的行數。 Delayed_errors 用INSERT DELAYED寫入的發生某些錯誤(可能重復鍵值)的行數。 Flush_commands 執行FLUSH命令的次數。 Handler_delete 請求從一張表中刪除行的次數。 Handler_read_first 請求讀入表中第一行的次數。 Handler_read_key 請求數字基于鍵讀行。 Handler_read_next 請求讀入基于一個鍵的一行的次數。 Handler_read_rnd 請求讀入基于一個固定位置的一行的次數。 Handler_update 請求更新表中一行的次數。 Handler_write 請求向表中插入一行的次數。 Key_blocks_used 用于關鍵字緩存的塊的數量。 Key_read_requests 請求從緩存讀入一個鍵值的次數。 Key_reads 從磁盤物理讀入一個鍵值的次數。 Key_write_requests 請求將一個關鍵字塊寫入緩存次數。 Key_writes 將一個鍵值塊物理寫入磁盤的次數。 Max_used_connections 同時使用的連接的最大數目。 Not_flushed_key_blocks 在鍵緩存中已經改變但是還沒被清空到磁盤上的鍵塊。 Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數量。 Open_tables 打開表的數量。 Open_files 打開文件的數量。 Open_streams 打開流的數量(主要用于日志記載) Opened_tables 已經打開的表的數量。 Questions 發往服務器的查詢的數量。 Slow_queries 要花超過long_query_time時間的查詢數量。 Threads_connected 當前打開的連接的數量。 Threads_running 不在睡眠的線程數量。 Uptime 服務器工作了多少秒。如果opened_tables太大,應該把my.cnf中的table_cache變大
如果Key_reads太大,則應該把my.cnf中key_buffer_size變大.可以用Key_reads/Key_read_requests計算出cache失敗率
如果Handler_read_rnd太大,則你寫的SQL語句里很多查詢都是要掃描整個表,而沒有發揮索引的鍵的作用
如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections計算cache命中率?
如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于內存的臨時表代替基于磁盤的
SHOW PROCESSLIST
查看當前正在進行的進程,對于有鎖表等情況的排查很有用處 。默認顯示100條,SHOW FULL PROCESSLIST; 顯示所有。
SHOW PROCESSLIST; id列:一個標識,你要kill 一個語句的時候很有用。 user列: 顯示當前用戶,如果不是root,這個命令就只顯示你權限范圍內的sql語句。 host列:顯示這個語句是從哪個ip 的哪個端口上發出的。可用來追蹤出問題語句的用戶。 db列:顯示這個進程目前連接的是哪個數據庫。 command列:顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。 time列:此這個狀態持續的時間,單位是秒。 state列:顯示使用當前連接的sql語句的狀態,很重要的列,后續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個sql語句,已查詢為例,可能需要經過copying to tmp table,Sorting result,Sending data等狀態才可以完成。 info列:顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。State 列詳解:(當前sql跑在什么狀態下)
Checking table 正在檢查數據表(這是自動的)。 Closing tables 正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經滿了或者磁盤是否正處于重負中。 Connect Out 復制從服務器正在連接主服務器。 Copying to tmp table on disk 由于臨時結果集大于 tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。 Creating tmp table 正在創建臨時表以存放部分查詢結果。 deleting from main table 服務器正在執行多表刪除中的第一部分,剛刪除第一個表。 deleting from reference tables 服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。 Flushing tables 正在執行 FLUSH TABLES,等待其他線程關閉數據表。 Killed 發送了一個kill請求給某線程,那么這個線程將會檢查kill標志位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那么kill請求會在鎖釋放時馬上生效。 Locked 被其他查詢鎖住了。 Sending data 正在處理 SELECT 查詢的記錄,同時正在把結果發送給客戶端。 Sorting for group 正在為 GROUP BY 做排序。 Sorting for order 正在為 ORDER BY 做排序。 Opening tables 這個過程應該會很快,除非受到其他因素的干擾。例如,在執 ALTER TABLE 或 LOCK TABLE 語句行完以前,數據表無法被其他線程打開。 正嘗試打開一個表。 Removing duplicates 正在執行一個 SELECT DISTINCT 方式的查詢,但是MySQL無法在前一個階段優化掉那些重復的記錄。因此,MySQL需要再次去掉重復的記錄,然后再把結果發送給客戶端。 Reopen table 獲得了對一個表的鎖,但是必須在表結構修改之后才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。 Repair by sorting 修復指令正在排序以創建索引。 Repair with keycache 修復指令正在利用索引緩存一個一個地創建新索引。它會比 Repair by sorting 慢些。 Searching rows for update 正在講符合條件的記錄找出來以備更新。它必須在 UPDATE 要修改相關的記錄之前就完成了。 Sleeping 正在等待客戶端發送新請求. System lock 正在等待取得一個外部的系統鎖。如果當前沒有運行多個 mysqld 服務器同時請求同一個表,那么可以通過增加 –skip-external-locking參數來禁止外部系統鎖。 Upgrading lock INSERT DELAYED 正在嘗試取得一個鎖表以插入新記錄。 Updating 正在搜索匹配的記錄,并且修改它們。 User Lock 正在等待 GET_LOCK()。 Waiting for tables 該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然后,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。show com
SHOW STATUS like "Com_%"; #全局級別: show global status like "Com_%"; #全局級別:?Com_select 執行 select 操作的次數,一次查詢只累加 1 ;
?Com_insert 執行 insert 操作的次數,對于批量插入的 insert 操作,只累加一次 ;
Com_update 執行 update 操作的次數;
Com_delete 執行 delete 操作的次數;
通過以上幾個參數,可以很容易的了解當前數據庫的應用是以插入更新為主還 是以查詢操作為主,以及各種類型的 SQL大致的執行比例是多少。對于更新操作的計 數,是對執行次數的計數,不論提交還是回滾都會累加。 對于事務型的應用,通過 Com_commit 和 Com_rollback 可以了解事務提交和回 滾的情況,對于回滾操作非常頻繁的數據庫,可能意味著應用編寫存在問題。此外,以下幾個參數便于我們了解數據庫的基本情況:
Connections 試圖連接 Mysql 服務器的次數
Uptime 服務器工作時間
慢查詢
通過設置慢查詢時間以及對應的文件能夠把慢查詢記錄,以便以后做分析。
show variables like '%slow%';
slow_launch_time 表明2s 為慢查詢的界限
以上表示慢查詢為2s,一共618條慢查詢。
開啟慢查詢
通過配置my.cnf。
安裝完成后可能還沒有配置文件,需要自己創建。
MySQL啟動時會讀取配置文件my.cnf,讀取次序依次為 /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf。安裝完MySQL后可能上述位置上都沒有my.cnf文件,要想指定配置文件,可以將MySQL安裝目錄下的示例配置文件拷貝到對應位置。
Linux下找到mysql的配置文件my.ini, 在mysqld下方加入慢查詢的配置語句(注意:一定要在[mysqld]下的下方加入)
查看慢查詢 可以使用mysql自帶的慢查詢日志工具 mysqldumpslow
慢日志格式
# Time: 2016-12-22T09:41:17.777439Z # User@Host: homestead[homestead] @ [192.168.10.1] Id: 1543 # Query_time: 2.001423 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 use homestead; SET timestamp=1482399677; select sleep(2);主要功能是, 統計不同慢 sql 下面這些屬性:
出現次數(Count),
執行最長時間(Time),
累計總耗費時間(Time),
等待鎖的時間(Lock),
發送給客戶端的行總數(Rows),
掃描的行總數(Rows),
用戶以及sql語句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).
講一下有用的參數:
-s 排序選項:
c 查詢次數
r 返回記錄行數 t 查詢時間 -t num 只顯示 top n 條查詢 其他參數可以使用 -h 命令進行查看
參考: https://blog.csdn.net/zhangliangzi/article/details/51884863總結
- 上一篇: element表单校验
- 下一篇: linux cmake编译源码,linu