精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL死鎖與日志二三事

數據庫 MySQL
最近線上 MySQL 接連發生了幾起數據異常,都是在凌晨爆發,由于業務場景屬于典型的數據倉庫型應用,白天壓力較小無法復現。甚至有些異常還比較詭異,最后 root cause 分析頗費周折。那實際業務當中咱們如何能快速的定位線上 MySQL 問題,修復異常呢?下文我會根據兩個實際 case,分享下相關的經驗與方法。

MySQL死鎖與日志二三事

最近線上 MySQL 接連發生了幾起數據異常,都是在凌晨爆發,由于業務場景屬于典型的數據倉庫型應用,白天壓力較小無法復現。甚至有些異常還比較詭異,*** root cause 分析頗費周折。那實際業務當中咱們如何能快速的定位線上 MySQL 問題,修復異常呢?下文我會根據兩個實際 case,分享下相關的經驗與方法。

1、Case1:部分數據更新失敗

某天渠道同學反饋某報表極個別渠道數據為 0,大部分渠道數據正常。這個數據是由一個統計程序每天凌晨例行更新的,按理來說,要么全部正常,要么全部失敗,那會是什么原因導***個別數據異常呢?

首先我們能想到的自然是根據統計任務日志來看了,但是看了統計程序打印的日志沒有發現諸如 SQL update 失敗的異常描述,那當時的數據庫究竟發生了什么呢?在查看 MySQL-server 日志之前,習慣性的看了下數據庫狀態:

  1. SHOW ENGINE INNODB STATUS\G 

恰好看到了凌晨這個 update 發生了死鎖:

  1. ------------------------ 
  2. LATEST DETECTED DEADLOCK 
  3. ------------------------ 
  4. 2017-07-17 04:09:01 0x7f6de03c8700 
  5. *** (1) TRANSACTION
  6. TRANSACTION 215208479, ACTIVE 0 sec fetching rows 
  7. mysql tables in use 3, locked 3 
  8. LOCK WAIT 5 lock struct(s), heap size 1136, 3 row lock(s) 
  9. MySQL thread id 27844824, OS thread handle 140092183037696, query id 412503674 10.126.95.84 zeye Searching rows for update 
  10. update t_channel_final_datas set nr_register=133,nr_add_goods=29,nr_order_normal=11,nr_pay_normal=8,nr_order_special=0,nr_pay_special=0,n_add_user_num=16 where count_date='2017-07-16' and channel_id='16' and channel_type='10' and terminal='26' 
  11. *** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
  12. RECORD LOCKS space id 464 page no 5459 n bits 392 index index_countdate_type_terminal of table `db_zz_flow`.`t_channel_final_datas` trx id 215208479 lock_mode X locks rec but not gap waiting 
  13. Record lock, heap no 304 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 
  14.  0: len 10; hex 323031372d30372d3136; asc 2017-07-16;; 
  15.  1: len 1; hex 30; asc 0;; 
  16.  2: len 4; hex 80000010; asc     ;; 
  17.  3: len 4; hex 8009055e; asc    ^;; 
  18.  
  19. *** (2) TRANSACTION
  20. TRANSACTION 215208474, ACTIVE 0 sec fetching rows 
  21. mysql tables in use 3, locked 3 
  22. 6 lock struct(s), heap size 1136, 7 row lock(s) 
  23. MySQL thread id 27844825, OS thread handle 140109890225920, query id 412503669 10.135.6.41 zeye Searching rows for update 
  24. update t_channel_final_datas set nr_register=24,nr_add_goods=32,nr_order_normal=0,nr_pay_normal=0,nr_order_special=0,nr_pay_special=0,n_add_user_num=11 where count_date='2017-07-16' and channel_id='114' and channel_type='10' and terminal='116' 
  25. *** (2) HOLDS THE LOCK(S): 
  26. RECORD LOCKS space id 464 page no 5459 n bits 392 index index_countdate_type_terminal of table `db_zz_flow`.`t_channel_final_datas` trx id 215208474 lock_mode X locks rec but not gap 
  27. Record lock, heap no 304 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 
  28.  0: len 10; hex 323031372d30372d3136; asc 2017-07-16;; 
  29.  1: len 1; hex 30; asc 0;; 
  30.  2: len 4; hex 80000010; asc     ;; 
  31.  3: len 4; hex 8009055e; asc    ^;; 
  32.  
  33. ... 
  34.  
  35. *** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
  36. RECORD LOCKS space id 464 page no 4743 n bits 264 index PRIMARY of table `db_zz_flow`.`t_channel_final_datas` trx id 215208474 lock_mode X locks rec but not gap waiting 
  37. Record lock, heap no 168 PHYSICAL RECORD: n_fields 32; compact format; info bits 0 
  38.  0: len 4; hex 80090569; asc    i;; 
  39.  1: len 6; hex 00000cd3b9d0; asc       ;; 
  40. ... 
  41.  
  42. *** WE ROLL BACK TRANSACTION (1)  

篇幅所限,上下文我這里省略了很多,從這段日志里可以看到,TRANSACTION 1 和 TRANSACTION 2 分別持有一定數量的行鎖,然后又等待對方的鎖,*** MySQL 檢測到 deadlock ,然后選擇回滾了 TRANSACTION 1:Innodb目前處理死鎖的方法是將持有最少行級排他鎖的事務進行回滾。

那這里就有 3 個問題了:

(1)innodb 行鎖不是只鎖一行?

因為這張表是 innodb 引擎的,InnoDB 支持行鎖和表鎖。而InnoDB行鎖是通過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不同,后者是通過在數據塊中對相應數據行加鎖來實現的。InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖,會把所有掃描過的行都鎖定!在實際應用中,要特別注意InnoDB行鎖的這一特性,不然的話,可能導致大量的鎖沖突,從而影響并發性能。由于MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現鎖沖突的。當我們用范圍條件而不是相等條件檢索數據,并請求共享或排他鎖時,InnoDB會給符合條件的已有數據記錄的索引項加鎖;另外間隙鎖也會鎖多行,InnoDB除了通過范圍條件加鎖時使用間隙鎖外,如果使用相等條件請求給一個不存在的記錄加鎖,InnoDB也會使用間隙鎖!

話都說到這了,那就看下咱們業務表的索引情況:

  1. show INDEX from `db_zz_flow`.`t_channel_final_datas`; 
  2. +-----------------------+--------------+-------------------------------+----------------+-------------+----------+--------+--------------+-----------+-----------------+ 
  3. Table                 |   Non_unique | Key_name                      |   Seq_in_index | Column_namt |   Packed | Null   | Index_type   | Comment   | Index_comment   | 
  4. |-----------------------+--------------+-------------------------------+----------------+-------------+----------+--------+--------------+-----------+-----------------| 
  5. | t_channel_final_datas |            0 | PRIMARY                       |              1 | id        > |   <null> |        | BTREE        |           |                 | 
  6. | t_channel_final_datas |            1 | index_countdate_type_terminal |              1 | count_date> |   <null> | YES    | BTREE        |           |                 | 
  7. | t_channel_final_datas |            1 | index_countdate_type_terminal |              2 | channel_ty> |   <null> | YES    | BTREE        |           |                 | 
  8. | t_channel_final_datas |            1 | index_countdate_type_terminal |              3 | terminal  > |   <null> | YES    | BTREE        |           |                 | 
  9. | t_channel_final_datas |            1 | index_countdate_channelid     |              1 | count_date> |   <null> | YES    | BTREE        |           |                 | 
  10. | t_channel_final_datas |            1 | index_countdate_channelid     |              2 | channel_id> |   <null> | YES    | BTREE        |           |                 | 
  11. +-----------------------+--------------+-------------------------------+----------------+-------------+----------+--------+--------------+-----------+-----------------+ 

可以看到這張表的索引極不合理:有3個索引,但是 update 卻沒有完全的用上索引,導致 update 沒有精確的用上索引,需要鎖定多行范圍數據,從而引發死鎖。

知道原理后,咱們再精心構建一個四字段的組合索引即可讓 update 精準的走 innodb 索引,實際上,我們更新索引后,這個死鎖問題即得到了解決。

注:innodb不僅會打印出事務和事務持有和等待的鎖,而且還有記錄本身,不幸的是,它可能超過innodb為輸出結果預留的長度(只能打印1M的內容且只能保留最近一次的死鎖信息),如果你無法看到完整的輸出,此時可以在任意庫下創建innodb_monitor或innodb_lock_monitor表,這樣innodb status信息會完整且每15s一次被記錄到錯誤日志中。如:create table innodb_monitor(a int)engine=innodb;,不需要記錄到錯誤日志中時就刪掉這個表即可。

(2)回滾的話,為什么只有部分 update 語句失敗,而不是整個事務里的所有 update 都失敗?

這是因為咱們的 innodb 默認是自動提交的:

  1. show variables like 'autocommit'
  2. +-----------------+---------+ 
  3. | Variable_name   | Value   | 
  4. |-----------------+---------| 
  5. | autocommit      | ON      | 
  6. +-----------------+---------+  

在多個 update 或 insert 語句情況下,每執行完一條 SQL,innodb 就立即 commit 一次以持久化變更,同時釋放鎖,這也正是本例中死鎖回滾事務后只有極個別語句失敗的原因。

需要注意的是,通常還有另外一種情況也可能導致部分語句回滾,需要格外留意。在 innodb 里有個參數叫:innodb_rollback_on_timeout

  1. show VARIABLES LIKE 'innodb_rollback_on_timeout' 
  2. +----------------------------+---------+ 
  3. | Variable_name              | Value   | 
  4. |----------------------------+---------| 
  5. | innodb_rollback_on_timeout | OFF     | 
  6. +----------------------------+---------+  

官方手冊里這樣描述:

In MySQL 5.1, InnoDB rolls back only the last statement on a transaction timeout by default. If –innodb_rollback_on_timeout is specified, a transaction timeout causes InnoDB to abort and roll back the entire transaction (the same behavior as in MySQL 4.1). This variable was added in MySQL 5.1.15.

解釋:這個參數關閉或不存在的話遇到超時只回滾事務***一個Query,打開的話事務遇到超時就回滾整個事務。

(3)怎樣降低 innodb 死鎖幾率?

死鎖在行鎖及事務場景下很難完全消除,但可以通過表設計和SQL調整等措施減少鎖沖突和死鎖,包括:

  • 盡量使用較低的隔離級別,比如如果發生了間隙鎖,你可以把會話或者事務的事務隔離級別更改為 RC(read committed)級別來避免,但此時需要把 binlog_format 設置成 row 或者 mixed 格式
  • 精心設計索引,并盡量使用索引訪問數據,使加鎖更精確,從而減少鎖沖突的機會;
  • 選擇合理的事務大小,小事務發生鎖沖突的幾率也更小;
  • 給記錄集顯示加鎖時,***一次性請求足夠級別的鎖。比如要修改數據的話,***直接申請排他鎖,而不是先申請共享鎖,修改時再請求排他鎖,這樣容易產生死鎖;
  • 不同的程序訪問一組表時,應盡量約定以相同的順序訪問各表,對一個表而言,盡可能以固定的順序存取表中的行。這樣可以大大減少死鎖的機會;
  • 盡量用相等條件訪問數據,這樣可以避免間隙鎖對并發插入的影響;
  • 不要申請超過實際需要的鎖級別;除非必須,查詢時不要顯示加鎖;
  • 對于一些特定的事務,可以使用表鎖來提高處理速度或減少死鎖的可能。

2、Case2:詭異的 Lock wait timeout

連續幾天凌晨6點和早上8點 都分別有一個任務失敗,load data local infile 的時候報 Lock wait timeout exceeded try restarting transaction innodb 的 Java SQL 異常,和平臺的同學溝通得知,這是我們自己的業務數據庫的 Lock 時間太短或者鎖沖突的問題。但是回頭一想不應該啊?這不一直好好的嗎?而且基本都是單表單任務,不存在多人沖突。

甭管誰的問題,那咱們還是先看自己的數據庫有沒有問題:

  1. show variables like 'innodb_lock_wait_timeout'
  2. +--------------------------+---------+ 
  3. | Variable_name            |   Value | 
  4. |--------------------------+---------| 
  5. | innodb_lock_wait_timeout |      50 | 
  6. +--------------------------+---------+  

默認 lock 超時時間 50s,這個時間真心不短了,估計調了也沒用,事實上確實死馬當活馬醫的試了下沒用。。。

而且這次 SHOW ENGINE INNODB STATUS\G 也沒出現任何死鎖信息,然后又將目光轉向 MySQL-server 日志,希望能從日志里看一看那個時刻前后數據究竟在做什么操作。這里先簡單的介紹下MySQL日志文件系統的組成:

(a) error 日志:記錄啟動、運行或停止 mysqld 時出現的問題,默認開啟。

(b) general 日志:通用查詢日志,記錄所有語句和指令,開啟數據庫會有 5% 左右性能損失。

(c) binlog 日志:二進制格式,記錄所有更改數據的語句,主要用于 slave 復制和數據恢復。

(d) slow 日志:記錄所有執行時間超過 long_query_time 秒的查詢或不使用索引的查詢,默認關閉。

(e) Innodb日志:innodb redo log、undo log,用于恢復數據和撤銷操作。

從上面的介紹可以看到,目前這個問題的日志可能在 d 和 b 中,看了下 d 中沒有,那就只能開啟 b 了,但 b 對數據庫的性能有一定損耗,由于是全量日志,量非常巨大,所以開啟一定要謹慎:

  1. -- general_log 日志默認關閉,開啟會影響數據庫 5% 左右性能: 
  2. show variables like 'general%'
  3. +------------------+---------------------------------+ 
  4. | Variable_name    | Value                           | 
  5. |------------------+---------------------------------| 
  6. | general_log      | OFF                             | 
  7. | general_log_file | /opt/data/mysql/tjtx-103-26.log | 
  8. +------------------+---------------------------------+ 
  9.  
  10. -- 全局 session 級別開啟: 
  11. set global general_log=1 
  12.  
  13. -- 如果需要對當前 session 生效需要: 
  14. set general_log=1 
  15.  
  16. -- set 指令設置的動態參數在 MySQL 重啟后失效,如果需要***生效需要在 /etc/my.cnf 中配置靜態變量/參數。 
  17. -- 如果不知道 my.cnf 位置,可以根據 mysql -? | grep ".cnf" 查詢 
  18.                       order of preference, my.cnf, $MYSQL_TCP_PORT, 
  19. /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf  

我這里只是每天在出問題的前后半小時開啟下全量日志,結果沒有發現任何 MySQL-client 請求到我們的業務數據庫!該日志格式如下,記錄了所有的連接與命令:

  1. /usr/sbin/mysqld, Version: 5.7.12-log (MySQL Community Server (GPL)). started with
  2. Tcp port: 3306  Unix socket: /opt/data/mysql/mysql.sock 
  3. Time                 Id Command    Argument 
  4. 2017-07-20T21:45:01.880828Z28556028 Quit 
  5. 2017-07-20T21:45:02.708621Z28401469 Query       SELECT 1 
  6. 2017-07-20T21:45:02.736734Z28556029 Connect     ooxx@127.0.0.1 on db_zz_system using TCP/IP 
  7. 2017-07-20T21:45:02.737242Z28556029 Query       /* mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect' 
  8. 2017-07-20T21:45:02.738868Z28556029 Query       SHOW COLLATION 
  9. 2017-07-20T21:45:02.739941Z28556029 Query       SET character_set_results = NULL 
  10. 2017-07-20T21:45:02.740275Z28556029 Query       SET autocommit=1 

那問題基本確定了,客戶端請求都沒到我們這邊就拋出了上述的異常,和平臺方再三溝通確認下,***平臺方查證是因為在執行插入前他們需要先從 SQL task 表取出 SQL 和更新 task 狀態,結果這張表由于在整點存在大量 insert 和 update 并發,導致部分 SQL 等待 lock 超時了。。。

[[198411]] 

3、MySQL 日志分析腳本

由于凌晨是數據倉庫的業務高峰,很多問題都是在這個時候爆發,一些詭異的問題往往是過了這個村就沒這個店了,白天無法復現。如何能捕獲我們關心的日志,便于快速的定位問題,這個是重中之重,這里我寫了個小腳本,crontab 部署,可以選擇時間范圍開啟,每分鐘采樣一次日志,需要說明的是 general log 沒事別輕易開啟,否則對數據庫性能損耗較大。

  1. # crontab 部署方式: 
  2. # */1 0-10 * * * cd /opt/ooxx/script && bash mysql_perf.sh >> logs/mysql_perf.log.`date -I` 2>&1 
  3.  
  4. date -Iseconds 
  5.  
  6. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> top -bn1|head' 
  7. top -bn1|head   
  8. echo 
  9.  
  10. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SHOW ENGINE INNODB STATUS\G ' 
  11. mysql -uroot -pooxx -h127.0.0.1 -e 'SHOW ENGINE INNODB STATUS\G' 
  12. echo 
  13.  
  14. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show open tables where in_use>0;' 
  15. mysql -uroot -pooxx -h127.0.0.1 -e 'show open tables where in_use>0;' 
  16. echo 
  17.  
  18. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show full processlist;' 
  19. mysql -uroot -pooxx -h127.0.0.1 -e 'show full processlist;' 
  20. echo 
  21.  
  22. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`; ' 
  23. mysql -uroot -pooxx -h127.0.0.1 -e 'SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;'  
  24. echo 
  25.  
  26. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SELECT * FROM `information_schema`.`innodb_locks`;' 
  27. mysql -uroot -pooxx -h127.0.0.1 -e 'SELECT * FROM `information_schema`.`innodb_locks`;' 
  28. echo 
  29.  
  30. echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show status like '%lock%';" 
  31. mysql -uroot -pooxx -h127.0.0.1 -e "show status like '%lock%';" 
  32. echo 
  33.  
  34. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show global status like "table_locks%";' 
  35. mysql -uroot -pooxx -h127.0.0.1 -e 'show global status like "table_locks%";' 
  36. echo 
  37.  
  38. echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> too long omit..." 
  39. mysql -uroot -pooxx -h127.0.0.1 -e "select r.trx_isolation_level, r.trx_id waiting_trx_id, r.trx_mysql_thread_id  waiting_trx_thread, r.trx_state  waiting_trx_state, lr.lock_mode waiting_trx_lock_mode, lr.lock_type  waiting_trx_lock_type, lr.lock_table  waiting_trx_lock_table, lr.lock_index  waiting_trx_lock_index, r.trx_query  waiting_trx_query, b.trx_id  blocking_trx_id, b.trx_mysql_thread_id  blocking_trx_thread, b.trx_state  blocking_trx_state, lb.lock_mode blocking_trx_lock_mode, lb.lock_type  blocking_trx_lock_type, lb.lock_table  blocking_trx_lock_table, lb.lock_index  blocking_trx_lock_index, b.trx_query  blocking_query from  information_schema.innodb_lock_waits  w  inner  join  information_schema.innodb_trx b  on  b.trx_id=w.blocking_trx_id  inner  join  information_schema.innodb_trx  r on  r.trx_id=w.requesting_trx_id  inner  join   information_schema.innodb_locks  lb on  lb.lock_trx_id=w.blocking_trx_id inner  join   information_schema.innodb_locks  lr on  lr.lock_trx_id=w.requesting_trx_id\G" 
  40. echo 
  41.  
  42. echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> too long omit..." 
  43. mysql -uroot -pooxx -h127.0.0.1 -e "SELECT r.trx_id waiting_trx_id,  r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id,  b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON  b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON  r.trx_id = w.requesting_trx_id\G" 
  44. echo 
  45.  
  46.  
  47. date -Iseconds 
  48. echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==================================================================================' 
  49. echo 
  50.  
  51. file_name=mysql_perf.log.`date -I` 
  52. if [[ `date +%-H%-M` == 1059 ]] 
  53. then 
  54.     cd /opt/ooxx/script/logs 
  55.     chmod 777 /home/work/ooxx/$file_name 
  56.     find /home/work/ooxx -name 'mysql_perf.log.*' -mtime +7 -delete 
  57.      
  58.     cd /opt/data/mysql 
  59.     cp tjtx-ooxx-slow.log /home/work/ooxx/tjtx-ooxx-slow.log.`date -I` 
  60.     chmod 777 /home/work/ooxx/tjtx-ooxx-slow.log.`date -I` 
  61.     find /home/work/ooxx -name 'tjtx-ooxx-slow.log.*' -mtime +7 -delete 
  62.      
  63.     cp mysqld.log /home/work/ooxx/mysqld.log.`date -I` 
  64.     chmod 777 /home/work/ooxx/mysqld.log.`date -I` 
  65.     find /home/work/ooxx -name 'mysqld.log.*' -mtime +7 -delete 
  66. fi 
  67.  
  68.  
  69. ################ 
  70. # 開啟 general_log 全量明細日志會降低數據庫 5% 性能 
  71. #if [[ "`date +%H%M`" == "0545" ]] 
  72. #then 
  73. #   echo "`date +%H%M` ------- set global general_log=1;" 
  74. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;' 
  75. #elif [[ "`date +%H%M`" == "0630" ]] 
  76. #then 
  77. #   echo "`date +%H%M` ------- set global general_log=0;" 
  78. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;' 
  79. #elif [[ "`date +%H%M`" == "0745" ]] 
  80. #then 
  81. #   echo "`date +%H%M` ------- set global general_log=1;" 
  82. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;' 
  83. #elif [[ "`date +%H%M`" == "0830" ]] 
  84. #then 
  85. #   echo "`date +%H%M` ------- set global general_log=0;" 
  86. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;' 
  87. #elif [[ "`date +%H%M`" == "0001" ]] 
  88. #then 
  89. #   echo "`date +%H%M` ------- set global general_log=1;" 
  90. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;' 
  91. #elif [[ "`date +%H%M`" == "0002" ]] 
  92. #then 
  93. #   echo "`date +%H%M` ------- set global general_log=0;" 
  94. #   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;' 
  95. #fi 
  96.  
  97.  
  98.  
  99.  
  100.  
  101. #[[ 10#`date +%H%M` -lt 10#0550 ||  10#`date +%H%M` -gt 10#0830 ]] && echo "`date +%H%M` ------- set global general_log=0;" && mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;' 
  102.  
  103.  
  104. # mysql -uroot -pooxx -h127.0.0.1 -e 'show open tables where in_use>0;show full processlist;SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;SELECT * FROM `information_schema`.`innodb_locks`;SHOW ENGINE INNODB STATUS\G' 
  105.  
  106. --show variables like '%tx_isolation%'; 
  107. --SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation; 
  108. --  SET GLOBAL tx_isolation = 'READ-COMMITTED'; 
  109. #  
  110. --show variables like '%timeout%'; 
  111. --show variables like 'innodb_lock_wait_timeout'; 
  112. --  SET GLOBAL innodb_lock_wait_timeout=60 
  113. #  
  114. --show variables like 'long_query_time'; 
  115. --  SET global long_query_time=3; 
  116.  
  117.  
  118. --  show variables like 'innodb_rollback_on_timeout'; 
  119.  
  120. --  show VARIABLES like '%max_allowed_packet%'; 
  121. --  set global max_allowed_packet = 100*1024*1024; 
  122.  
  123. # 自動提交 
  124. -- show variables like 'autocommit'; 
  125.  
  126. # 慢查詢 
  127. -- show variables  like '%slow_query_log%'; 
  128. set global 只對當前數據庫生效,如果MySQL重啟后則會失效。如果要***生效,就必須修改配置文件my.cnf(其它系統變量也是如此)。 
  129. set global slow_query_log=1; 
  130. -- show variables like 'long_query_time%'; 
  131. set global long_query_time=4; 
  132. # show global variables like 'long_query_time';  
  133. select sleep(5); 
  134. -- show variables like 'log_queries_not_using_indexes'; 
  135. set global log_queries_not_using_indexes=1; 
  136. -- show variables like 'log_slow_admin_statements'; 
  137. -- show global status like '%Slow_queries%'; 
  138. # http://www.cnblogs.com/kerrycode/p/5593204.html 
  139.  
  140.  
  141.  
  142. -- show variables like "%time_zone%"; 
  143. #set global time_zone = '+8:00'
  144.  
  145. #開啟general_log日志 
  146. -- show variables like 'general%'; 
  147. #可以在my.cnf里添加,1開啟(0關閉),當然了,這樣要重啟才能生效,有點多余了 
  148. #general-log = 1 
  149. #log = /log/mysql_query.log路徑 
  150. #也可以設置變量那樣更改,1開啟(0關閉),即時生效,不用重啟,***當然是這樣的了 
  151. #  set global general_log=1 
  152. #這個日志對于操作頻繁的庫,產生的數據量會很快增長,出于對硬盤的保護,可以設置其他存放路徑 
  153. #set global general_log_file=/tmp/general_log.log 
  154.  
  155. #mysql記錄客戶端IP:init_connect,有super權限的用戶是不記錄的, 
  156. create  table t1 ( cur_user varchar(100), n_user varchar(100),in_time timestamp  default current_timestamp()) ; 
  157. set global init_connect='insert into test.t1 (cur_user,n_user) values (current_user(),user())';    
  158. # SHOW CREATE TABLE mysql.general_log\G ,開啟general_log日志也行: 
  159. # https://dba.stackexchange.com/questions/33654/mysql-logging-activity-from-specific-user-or-ip               
  160. #SELECT REVERSE(SUBSTRING_INDEX(REVERSE(USER()),'@',1)) as ip; 
  161. #SELECT SUBSTRING(USER(), LOCATE('@'USER())+1) as ip; 
  162. #select SUBSTRING_INDEX(host,':',1) as 'ip' from information_schema.processlist WHERE ID=connection_id(); 

Refer:

[1] MySQL批量SQL插入性能優化

http://database.51cto.com/art/201309/411050.htm

[2] MySQL 四種事務隔離級的說明

http://www.cnblogs.com/zhoujinyi/p/3437475.html

[3] innodb_rollback_on_timeout參數對鎖的影響

http://q.fireflyclub.org/?/article/37

[4] 日均萬條數據丟失,一個隱式騷操作導致的奇葩事故!

https://mp.weixin.qq.com/s/OpPV24ILewVc2lRDrV4vvA

[5] mysql之show engine innodb status解讀(轉)

http://www.cnblogs.com/ajianbeyourself/p/6941905.html

http://www.cnblogs.com/olinux/p/5497176.html

[6] Mysql 鎖機制筆記

http://www.jianshu.com/p/fa28035656a9

http://www.jianshu.com/p/ec4a343c49f0

http://hudeyong926.iteye.com/blog/1490687

[7] MySQL索引原理及慢查詢優化

https://tech.meituan.com/mysql-index.html

[8] [譯文]MySQL發生死鎖腫么辦?

http://www.10tiao.com/html/672/201612/2653929751/1.html

[9] MySQL的timeout那點事

http://www.penglixun.com/tech/database/mysql_timeout.html

[10] mysql死鎖(deadlock)分析及解決 (索引 間隙鎖 sql順序)

http://www.youyong.top/article/1158d0e3bcf 

責任編輯:龐桂玉 來源: xrzs的博客
相關推薦

2017-07-27 17:37:44

MySQL死鎖日志

2022-03-16 19:04:33

設計模式場景

2013-08-07 14:19:30

禁用

2017-06-07 16:10:24

Mysql死鎖死鎖日志

2012-12-18 20:13:00

云存儲初志

2011-01-26 10:52:56

2016-12-05 08:46:07

緩存架構設計

2022-01-08 21:33:39

反入侵安全風險攻擊

2014-11-20 13:49:15

2010-05-28 10:48:52

MySQL數據庫

2012-08-15 16:03:25

Ubuntu 12.0服務器

2013-10-14 11:03:48

管理貝索斯

2021-10-18 10:47:29

EDAEventBridge

2020-04-20 10:40:19

紅藍對抗網絡攻擊數據泄露

2021-11-03 06:25:58

確定性網絡網絡無線網絡

2009-10-23 14:44:01

2011-12-30 09:33:02

程序員語言

2017-11-29 14:18:09

面試程序員工程師

2013-07-08 09:26:55

2011-06-01 15:49:00

Android 測試
點贊
收藏

51CTO技術棧公眾號

亚洲日本一区二区| 久久久久久网| 欧美精品一区二区久久久| 国产精品专区在线| 成人午夜影视| 国产一区二区福利| 欧美一级在线播放| 天天操天天摸天天舔| 97久久超碰| 欧洲视频一区二区| 97干在线视频| a中文在线播放| 成人18视频在线播放| 国产精品99免视看9| 久久国产在线视频| 欧美精品一区二区久久| 7777精品久久久大香线蕉| 黄色成人在线看| 欧美日韩xx| 久久综合久久综合亚洲| 5g影院天天爽成人免费下载| av图片在线观看| 女人香蕉久久**毛片精品| 日韩成人在线视频网站| 日本美女视频一区| 亚洲女色av| 一区二区三区小说| 一区二区三区四区五区视频| 神马午夜精品95| 国产精品一区二区果冻传媒| 欧美性在线视频| 麻豆一区二区三区精品视频| 婷婷综合五月| 一区二区三区视频观看| 99久久国产精| 加勒比色老久久爱综合网| 欧美日韩国产在线观看| 男女视频一区二区三区| 香蕉伊大人中文在线观看| 亚洲最大成人网4388xx| 一区二区三区观看| 1024国产在线| 欧美国产激情一区二区三区蜜月 | 99热国产在线观看| 在线精品视频在线观看高清| 日韩专区中文字幕| 影音先锋男人在线| 国产精品日韩精品中文字幕| 日韩电影在线观看中文字幕 | 一区二区美女| 日韩av在线看| 添女人荫蒂视频| 嫩草国产精品入口| 亚洲黄色成人网| 性欧美丰满熟妇xxxx性久久久| 一区中文字幕| 亚洲成人国产精品| 中文字幕在线永久| 欧美国产不卡| 国产视频精品久久久| 加勒比一区二区| 伊人精品一区| 国产一区二区三区日韩欧美| 一级在线观看视频| 99成人在线视频| 超在线视频97| 久久午夜无码鲁丝片| 亚洲日本视频| 日韩免费在线播放| 最近中文字幕在线免费观看| 日本视频中文字幕一区二区三区| 国产精品入口尤物| 国产精品九九九九| 成人一区二区在线观看| 久久av一区二区三区漫画| 青梅竹马是消防员在线| 日本一区二区三区视频视频| 亚洲在线欧美| 丁香花在线高清完整版视频| 天天影视色香欲综合网老头| 欧美日韩大尺度| 91精品福利观看| 日韩精品专区在线影院观看| 亚洲一区二区三区无码久久| 不卡av一区二区| 欧美成人自拍视频| 久久国产黄色片| 蜜桃视频免费观看一区| 91九色在线观看| 暖暖视频在线免费观看| 中文字幕一区二区三区不卡在线 | 久久综合狠狠综合久久综青草| 精品av中文字幕在线毛片 | 成人激情校园春色| 欧美精品人人做人人爱视频| 日本韩国在线视频爽| 亚洲第一在线综合网站| 99久久久无码国产精品6| 一区二区三区| 日韩国产一区三区| 神马午夜精品91| 亚洲每日更新| 91亚洲国产成人久久精品网站 | 在线视频日韩精品| 成人免费看片98| 麻豆精品一区二区| 久久99精品久久久久久水蜜桃| 欧美jizzhd69巨大| 日韩欧美一区二区三区| 女教师高潮黄又色视频| 欧美最新另类人妖| 97激碰免费视频| 国产三级漂亮女教师| 久久久午夜精品| 久久手机在线视频| 成人豆花视频| 国产亚洲激情在线| 国内免费精品视频| 久久av资源网| 日本在线播放一区| 91在线超碰| 91精品久久久久久久久99蜜臂| 久久精品国产亚洲av麻豆| 欧美另类女人| 91情侣偷在线精品国产| 国产高清av在线| 欧美日韩久久久久| 高清中文字幕mv的电影| 亚洲电影在线一区二区三区| 国产精品视频地址| 黄色毛片在线看| 福利一区视频在线观看| 超碰caoprom| 狠狠色丁香久久综合频道 | 亚洲精品**不卡在线播he| 欧美成人中文字幕在线| 国产成人麻豆精品午夜在线| 国产精品高潮久久久久无| 欧美黑人又粗又大又爽免费| 久久视频在线观看| 97色在线视频观看| 日韩一区免费视频| 亚洲高清久久久| 欧美成人精品一区二区综合免费| 中文字幕日韩欧美精品高清在线| 成人久久18免费网站图片| 超碰国产在线| 欧美图片一区二区三区| 神马久久久久久久久久久| 丝袜国产日韩另类美女| 日韩免费电影一区二区| 高清成人在线| 永久免费毛片在线播放不卡| 日韩xxx视频| 国产精品视频免费| 污污的视频免费观看| 综合久久综合| 国产精品二区三区| 蜜桃视频在线观看免费视频| 日韩大陆毛片av| 激情网站在线观看| 国产精品美女视频| 超碰中文字幕在线观看| 欧美日韩国产精品一区二区亚洲| 国产伦精品一区二区三区高清| 91福利在线免费| 亚洲亚裔videos黑人hd| 一级黄色片在线看| 亚洲精品videosex极品| 美女扒开腿免费视频| 亚洲在线观看| 亚洲国产一区二区三区在线| 高清一区二区三区av| 色综合久久88| 日韩av高清在线| 欧美日韩你懂的| 激情综合五月网| 91美女蜜桃在线| 天堂av8在线| 亚洲成色精品| 日韩欧美在线一区二区| 国产免费av国片精品草莓男男| 欧美激情一二三| 国产在线视频福利| 日韩欧美在线网站| 国产成人亚洲欧洲在线| 国产精品理论在线观看| 精品国产乱码久久久久夜深人妻| 老鸭窝毛片一区二区三区| 资源网第一页久久久| 电影一区二区在线观看| 国产精品成人av在线| 中文字幕有码在线视频| 亚洲精品视频久久| 99热这里只有精品5| 日韩欧美主播在线| 黄色片在线观看网站| 久久综合九色综合欧美就去吻| 丰满少妇在线观看| 亚洲一级特黄| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 91国内精品| 国产欧美精品日韩精品| 大桥未久在线视频| 美女国内精品自产拍在线播放| 四虎影视在线观看2413| 日韩三级免费观看| а中文在线天堂| 天天综合色天天综合色h| 人妻久久一区二区| 国产精品区一区二区三| 国产中文字幕一区二区| 国产精品白丝jk白祙喷水网站| 妺妺窝人体色www在线观看| 亚洲一级高清| 成人毛片100部免费看| 成人在线亚洲| 欧美国产一区二区在线| 久久综合另类图片小说| 91丨九色丨国产在线| 亚洲综合av一区二区三区| 91精品国产亚洲| 日韩特级毛片| 久久综合久久美利坚合众国| av基地在线| 亚洲天天在线日亚洲洲精| 亚洲人妻一区二区| 精品国产自在久精品国产| 97人妻精品一区二区三区视频| 欧美午夜宅男影院在线观看| 日本在线观看视频网站| 亚洲综合在线免费观看| 国产一区二区精彩视频| 中文字幕视频一区| a资源在线观看| 国产调教视频一区| 加勒比综合在线| 99re6这里只有精品视频在线观看| 欧美成人精品一区二区综合免费| 国产精选一区二区三区| 成人三级做爰av| 国产一区福利在线| www.com久久久| 韩国一区二区三区| 91插插插影院| 国产美女精品在线| 91大神免费观看| 国产成人精品aa毛片| 美女被爆操网站| 国产69精品久久久久毛片| 麻豆精品国产传媒| 不卡大黄网站免费看| 欧美夫妇交换xxx| 91一区在线观看| 一女三黑人理论片在线| 国产日韩在线不卡| 国产精品酒店视频| 18欧美亚洲精品| 免费在线视频观看| 香蕉乱码成人久久天堂爱免费| 久久精品免费av| 欧美日韩在线免费观看| 老熟妇一区二区三区| 精品污污网站免费看| 国产日韩欧美一区二区东京热| 日韩一级高清毛片| 日韩专区第一页| 亚洲欧美综合另类中字| av在线三区| 久久精品国产91精品亚洲| 五月婷婷视频在线观看| 91精品国产高清久久久久久久久| 免费观看欧美大片| 成人国产精品久久久| 激情久久免费视频| 精品欧美一区二区在线观看视频| 蜜乳av综合| japanese在线视频| 亚洲国产三级| 日本中文字幕高清| 国产福利不卡视频| 久久久亚洲av波多野结衣| 国产精品美女久久久久aⅴ| 亚洲国产成人精品综合99| 午夜视频一区二区| 最近中文字幕在线视频| 精品91自产拍在线观看一区| 欧美在线观看在线观看| 久久成人精品视频| 忘忧草在线日韩www影院| 国产这里只有精品| 欧美a大片欧美片| 中文字幕日韩一区二区三区不卡| 一区久久精品| 国产亚洲视频一区| www久久精品| 免费在线观看一级片| 欧美日韩在线视频一区二区| 国产精品羞羞答答在线| 亚洲精品永久免费| 人人超在线公开视频| 国产精品老牛影院在线观看| 成人香蕉社区| 欧美日韩在线免费观看视频| 国产精品日韩精品欧美精品| 午夜免费一级片| 国产色产综合色产在线视频| 欧美极品aaaaabbbbb| 欧美伊人久久大香线蕉综合69| 嫩草影院一区二区| 欧美精品在线免费| 国产乱子精品一区二区在线观看| 国产一区二区三区四区hd| 91精品在线观看国产| 精品久久久久久中文字幕2017| 成人国产精品视频| 日本福利片在线观看| 欧美在线观看一区二区| 男人的天堂在线免费视频| 97久久精品视频| 日韩免费一级| 中文字幕一区二区三区四区五区六区 | 久久久久久久久久久久久夜| 久久久精品视频在线| 欧美丰满少妇xxxxx高潮对白| 蜜桃成人在线视频| 7m第一福利500精品视频| 91精品导航| 国产片侵犯亲女视频播放| 国产一区二区不卡在线| 人妻无码一区二区三区免费| 日本道色综合久久| 奇米影视888狠狠狠777不卡| 91精品国产精品| 日韩影视高清在线观看| 青青青青草视频| 成人手机在线视频| 精品无码久久久久| 欧美精品一区男女天堂| 美女91在线| 国产精品久久精品国产| 亚洲高清自拍| 折磨小男生性器羞耻的故事| 一区二区三区不卡视频| 亚洲精品国产一区二| 久久6精品影院| 国产精品任我爽爆在线播放| www.射射射| 99精品视频在线观看免费| 美日韩一二三区| 亚洲欧洲视频在线| 你懂得影院夜精品a| 日韩免费电影一区二区| 久久草av在线| 久久久99精品| 亚洲精品动漫久久久久| 免费亚洲电影| 亚洲v国产v| 国模大尺度一区二区三区| 欧美精品一区二区蜜桃| 亚洲第一页自拍| 成人欧美magnet| 亚洲欧美日产图| 国产一区二区三区久久悠悠色av| 欧美成人精品一区二区免费看片| 精品少妇一区二区三区在线播放| 国产极品人妖在线观看| 久久久久se| 日本在线不卡一区| 国产高潮流白浆| 亚洲国产成人一区| 香蕉成人av| 一区一区视频| 成人免费视频免费观看| 亚洲va在线观看| 久久精品人人爽| 看全色黄大色大片免费久久久| 国产淫片av片久久久久久| 1024国产精品| 五十路在线视频| 国产一区欧美二区三区| 黄色av一区| 色婷婷国产精品免| 日韩免费一区二区三区在线播放| 国产在线88av| 一区二区精品免费视频| 99国产精品99久久久久久| 一区二区视频网站| 国内成人精品视频| 日韩av专区| 屁屁影院国产第一页| 欧美午夜精品久久久久久超碰| 中中文字幕av在线| 日本免费高清一区| 国产1区2区3区精品美女| 国产一区二区视频网站| 欧美大奶子在线| 红桃成人av在线播放| 人妻 丝袜美腿 中文字幕| 欧美色图在线观看|