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

MySQL死鎖與日志相關經驗分享

移動開發 開發
最近線上 MySQL 接連發生了幾起數據異常,都是在凌晨爆發,由于業務場景屬于典型的數據倉庫型應用,白天壓力較小無法復現。甚至有些異常還比較詭異,最后 root cause 分析頗費周折。那實際業務當中咱們如何能快速的 ...

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

MySQL

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

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

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

SHOW ENGINE INNODB STATUS\G

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

------------------------
LATEST DETECTED DEADLOCK
------------------------
2017-07-17 04:09:01 0x7f6de03c8700
*** (1) TRANSACTION:
TRANSACTION 215208479, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
LOCK WAIT 5 lock struct(s), heap size 1136, 3 row lock(s)
MySQL thread id 27844824, OS thread handle 140092183037696, query id 412503674 10.126.95.84 zeye Searching rows for update
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'
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
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
Record lock, heap no 304 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 10; hex 323031372d30372d3136; asc 2017-07-16;;
 1: len 1; hex 30; asc 0;;
 2: len 4; hex 80000010; asc     ;;
 3: len 4; hex 8009055e; asc    ^;;

*** (2) TRANSACTION:
TRANSACTION 215208474, ACTIVE 0 sec fetching rows
mysql tables in use 3, locked 3
6 lock struct(s), heap size 1136, 7 row lock(s)
MySQL thread id 27844825, OS thread handle 140109890225920, query id 412503669 10.135.6.41 zeye Searching rows for update
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'
*** (2) HOLDS THE LOCK(S):
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
Record lock, heap no 304 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 10; hex 323031372d30372d3136; asc 2017-07-16;;
 1: len 1; hex 30; asc 0;;
 2: len 4; hex 80000010; asc     ;;
 3: len 4; hex 8009055e; asc    ^;;

...

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
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
Record lock, heap no 168 PHYSICAL RECORD: n_fields 32; compact format; info bits 0
 0: len 4; hex 80090569; asc    i;;
 1: len 6; hex 00000cd3b9d0; asc       ;;
...

*** 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也會使用間隙鎖!

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

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

可以看到這張表的索引極不合理:有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 默認是自動提交的:

show variables like 'autocommit';
+-----------------+---------+
| Variable_name   | Value   |
|-----------------+---------|
| autocommit      | ON      |
+-----------------+---------+

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

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

show VARIABLES LIKE 'innodb_rollback_on_timeout'
+----------------------------+---------+
| Variable_name              | Value   |
|----------------------------+---------|
| innodb_rollback_on_timeout | OFF     |
+----------------------------+---------+

官方手冊里這樣描述:

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 時間太短或者鎖沖突的問題。但是回頭一想不應該?。窟@不一直好好的嗎?而且基本都是單表單任務,不存在多人沖突。

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

show variables like 'innodb_lock_wait_timeout';
+--------------------------+---------+
| Variable_name            |   Value |
|--------------------------+---------|
| innodb_lock_wait_timeout |      50 |
+--------------------------+---------+

默認 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 對數據庫的性能有一定損耗,由于是全量日志,量非常巨大,所以開啟一定要謹慎:

-- general_log 日志默認關閉,開啟會影響數據庫 5% 左右性能:
show variables like 'general%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
|------------------+---------------------------------|
| general_log      | OFF                             |
| general_log_file | /opt/data/mysql/tjtx-103-26.log |
+------------------+---------------------------------+

-- 全局 session 級別開啟:
set global general_log=1

-- 如果需要對當前 session 生效需要:
set general_log=1

-- set 指令設置的動態參數在 MySQL 重啟后失效,如果需要***生效需要在 /etc/my.cnf 中配置靜態變量/參數。
-- 如果不知道 my.cnf 位置,可以根據 mysql -? | grep ".cnf" 查詢
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

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

/usr/sbin/mysqld, Version: 5.7.12-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /opt/data/mysql/mysql.sock
Time                 Id Command    Argument
2017-07-20T21:45:01.880828Z28556028 Quit
2017-07-20T21:45:02.708621Z28401469 Query       SELECT 1
2017-07-20T21:45:02.736734Z28556029 Connect     ooxx@127.0.0.1 on db_zz_system using TCP/IP
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'
2017-07-20T21:45:02.738868Z28556029 Query       SHOW COLLATION
2017-07-20T21:45:02.739941Z28556029 Query       SET character_set_results = NULL
2017-07-20T21:45:02.740275Z28556029 Query       SET autocommit=1

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

[[198279]]

3、MySQL 日志分析腳本

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

# crontab 部署方式:
# */1 0-10 * * * cd /opt/ooxx/script && bash mysql_perf.sh >> logs/mysql_perf.log.`date -I` 2>&1

date -Iseconds

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> top -bn1|head'
top -bn1|head  
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SHOW ENGINE INNODB STATUS\G '
mysql -uroot -pooxx -h127.0.0.1 -e 'SHOW ENGINE INNODB STATUS\G'
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show open tables where in_use>0;'
mysql -uroot -pooxx -h127.0.0.1 -e 'show open tables where in_use>0;'
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show full processlist;'
mysql -uroot -pooxx -h127.0.0.1 -e 'show full processlist;'
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`; '
mysql -uroot -pooxx -h127.0.0.1 -e 'SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;' 
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SELECT * FROM `information_schema`.`innodb_locks`;'
mysql -uroot -pooxx -h127.0.0.1 -e 'SELECT * FROM `information_schema`.`innodb_locks`;'
echo

echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show status like '%lock%';"
mysql -uroot -pooxx -h127.0.0.1 -e "show status like '%lock%';"
echo

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> show global status like "table_locks%";'
mysql -uroot -pooxx -h127.0.0.1 -e 'show global status like "table_locks%";'
echo

echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> too long omit..."
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"
echo

echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> too long omit..."
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"
echo


date -Iseconds
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=================================================================================='
echo

file_name=mysql_perf.log.`date -I`
if [[ `date +%-H%-M` == 1059 ]]
then
    cd /opt/ooxx/script/logs
    chmod 777 /home/work/ooxx/$file_name
    find /home/work/ooxx -name 'mysql_perf.log.*' -mtime +7 -delete
    
    cd /opt/data/mysql
    cp tjtx-ooxx-slow.log /home/work/ooxx/tjtx-ooxx-slow.log.`date -I`
    chmod 777 /home/work/ooxx/tjtx-ooxx-slow.log.`date -I`
    find /home/work/ooxx -name 'tjtx-ooxx-slow.log.*' -mtime +7 -delete
    
    cp mysqld.log /home/work/ooxx/mysqld.log.`date -I`
    chmod 777 /home/work/ooxx/mysqld.log.`date -I`
    find /home/work/ooxx -name 'mysqld.log.*' -mtime +7 -delete
fi


################
# 開啟 general_log 全量明細日志會降低數據庫 5% 性能
#if [[ "`date +%H%M`" == "0545" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=1;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;'
#elif [[ "`date +%H%M`" == "0630" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=0;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;'
#elif [[ "`date +%H%M`" == "0745" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=1;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;'
#elif [[ "`date +%H%M`" == "0830" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=0;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;'
#elif [[ "`date +%H%M`" == "0001" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=1;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=1;'
#elif [[ "`date +%H%M`" == "0002" ]]
#then
#   echo "`date +%H%M` ------- set global general_log=0;"
#   mysql -uroot -pooxx -h127.0.0.1 -e 'set global general_log=0;'
#fi





#[[ 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;'


# 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'

# --show variables like '%tx_isolation%';
# --SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
# --  SET GLOBAL tx_isolation = 'READ-COMMITTED';
# 
# --show variables like '%timeout%';
# --show variables like 'innodb_lock_wait_timeout';
# --  SET GLOBAL innodb_lock_wait_timeout=60
# 
# --show variables like 'long_query_time';
# --  SET global long_query_time=3;


# --  show variables like 'innodb_rollback_on_timeout';

# --  show VARIABLES like '%max_allowed_packet%';
# --  set global max_allowed_packet = 100*1024*1024;

# 自動提交
# -- show variables like 'autocommit';

# 慢查詢
# -- show variables  like '%slow_query_log%';
# set global 只對當前數據庫生效,如果MySQL重啟后則會失效。如果要***生效,就必須修改配置文件my.cnf(其它系統變量也是如此)。
# set global slow_query_log=1;
# -- show variables like 'long_query_time%';
# set global long_query_time=4;
# show global variables like 'long_query_time'; 
# select sleep(5);
# -- show variables like 'log_queries_not_using_indexes';
# set global log_queries_not_using_indexes=1;
# -- show variables like 'log_slow_admin_statements';
# -- show global status like '%Slow_queries%';
# http://www.cnblogs.com/kerrycode/p/5593204.html



# -- show variables like "%time_zone%";
#set global time_zone = '+8:00';

#開啟general_log日志
# -- show variables like 'general%';
#可以在my.cnf里添加,1開啟(0關閉),當然了,這樣要重啟才能生效,有點多余了
#general-log = 1
#log = /log/mysql_query.log路徑
#也可以設置變量那樣更改,1開啟(0關閉),即時生效,不用重啟,***當然是這樣的了
#  set global general_log=1
#這個日志對于操作頻繁的庫,產生的數據量會很快增長,出于對硬盤的保護,可以設置其他存放路徑
#set global general_log_file=/tmp/general_log.log

#mysql記錄客戶端IP:init_connect,有super權限的用戶是不記錄的,
# create  table t1 ( cur_user varchar(100), n_user varchar(100),in_time timestamp  default current_timestamp()) ;
# set global init_connect='insert into test.t1 (cur_user,n_user) values (current_user(),user())';   
# SHOW CREATE TABLE mysql.general_log\G ,開啟general_log日志也行:
# https://dba.stackexchange.com/questions/33654/mysql-logging-activity-from-specific-user-or-ip              
#SELECT REVERSE(SUBSTRING_INDEX(REVERSE(USER()),'@',1)) as ip;
#SELECT SUBSTRING(USER(), LOCATE('@', USER())+1) as ip;
#select SUBSTRING_INDEX(host,':',1) as 'ip' from information_schema.processlist WHERE ID=connection_id();
責任編輯:張子龍 來源: PHPChina開發者社區
相關推薦

2017-07-28 15:40:01

數據庫MySQL死鎖與日志

2015-03-10 11:30:00

MySQL日志維護

2009-12-22 16:03:03

WCF異常

2017-06-07 16:10:24

Mysql死鎖死鎖日志

2014-01-07 15:17:08

YARN配置

2010-01-13 18:09:09

VB.NET動態生成代

2009-12-21 13:27:45

WCF服務配置信息

2010-05-28 10:48:52

MySQL數據庫

2010-06-13 09:09:34

MySQL 4.0.2

2009-12-18 17:24:12

Ruby配置Mysql

2011-06-01 15:49:00

Android 測試

2010-03-31 18:47:08

Oracle時間

2010-01-07 15:29:59

VB.NET表達式

2021-07-26 12:10:37

FacebookMySQL 8.0數據庫

2022-09-27 21:32:14

Dapr指標與日志

2009-02-17 09:51:00

2009-07-21 16:23:26

2009-09-28 10:52:00

CCNA考試經驗CCNA

2021-05-12 13:40:16

JVM調優經驗

2023-11-17 09:50:38

云原生監控
點贊
收藏

51CTO技術棧公眾號

精品国产一区二区在线| 亚洲一区在线视频观看| 国产精品欧美亚洲777777| 又色又爽的视频| 国产在线不卡一区二区三区| 亚洲自拍偷拍av| 日本一区网站| 精品人妻少妇嫩草av无码专区| 国产欧美大片| 久久伊人精品一区二区三区| 亚洲国产精品成人综合久久久| 高清无码视频直接看| 色偷偷男人天堂| 99国产精品免费网站| 在线观看免费成人| 久久综合久久网| 91网页在线观看| 99久久综合国产精品| 国产欧美精品日韩精品| 91午夜视频在线观看| 色135综合网| 亚洲摸下面视频| av不卡中文字幕| 日本一区二区三区中文字幕| 婷婷激情综合网| 国产一级黄色录像片| 在线观看h片| 久久综合给合久久狠狠狠97色69| 亚洲伊人久久综合| 一级黄色免费片| 美女精品网站| 国内精品久久久久久| 欧美日韩黄色网| 欧美freesextv| 一区二区三欧美| 李宗瑞91在线正在播放| 狼人天天伊人久久| 亚洲成人网在线| 免费不卡的av| 亚洲三级av| 日韩一区二区三区在线视频| 亚洲一区日韩精品| 久久av影院| 欧美日韩国产欧美日美国产精品| 国产一区二区视频免费在线观看| 深夜福利视频一区二区| 性做久久久久久久免费看| 日韩极品视频在线观看 | av电影天堂一区二区在线| 成人在线精品视频| 国产男男gay网站| 国产真实乱偷精品视频免| 成人福利网站在线观看| 在线亚洲欧美日韩| 紧缚捆绑精品一区二区| 成人欧美一区二区三区黑人| 国产影视一区二区| 国产美女娇喘av呻吟久久| 91在线观看免费观看 | 亚洲电影免费观看高清完整版在线观看 | 一区二区三区我不卡| 最新真实国产在线视频| 中文字幕亚洲区| 一区二区三区四区久久| 国产黄大片在线观看画质优化| 亚洲三级免费电影| 免费特级黄色片| 色戒汤唯在线观看| 色噜噜夜夜夜综合网| 北条麻妃视频在线| 日本午夜免费一区二区| 日韩精品在线一区二区| 自拍偷拍亚洲综合| 日韩乱码在线视频| 粉嫩av蜜桃av蜜臀av| 九一亚洲精品| 日韩最新中文字幕电影免费看| 手机免费观看av| 在线国产精品一区| 欧洲成人午夜免费大片| 中文字幕在线观看国产| 国产高清一区日本| 精品视频第一区| 爱久久·www| 亚洲男人的天堂在线观看| 日本wwwcom| 午夜激情成人网| 欧美一级免费大片| 极品白嫩丰满美女无套| 日韩精品2区| 欧美激情乱人伦| 波多野结衣视频在线看| 国产久卡久卡久卡久卡视频精品| 激情视频一区二区| 麻豆av免费在线观看| 午夜伦理一区二区| 亚洲综合av在线播放| 加勒比久久高清| 色偷偷噜噜噜亚洲男人的天堂| 日本免费在线播放| 日本aⅴ免费视频一区二区三区| 91青青草免费观看| 毛片在线播放网址| 亚洲自拍偷拍网站| 国产一伦一伦一伦| 日日天天久久| 色综合久久久久久中文网| 精品久久久久久久久久久国产字幕 | 夜夜嗨av一区二区三区四区| 欧美黄色免费看| 欧美aaaaa成人免费观看视频| 成人在线视频网址| 日本在线天堂| 日本高清成人免费播放| 无码人妻丰满熟妇区毛片蜜桃精品| 国产精品免费99久久久| 97高清免费视频| 99国产精品久久久久久久成人| 久久精品在这里| 日韩免费一级视频| 视频一区中文字幕精品| 深夜成人在线观看| 亚洲不卡在线视频| 99精品在线免费| 日本香蕉视频在线观看| 99热这里有精品| 在线成人激情黄色| 亚洲第一网站在线观看| aaa欧美日韩| 日本阿v视频在线观看| 国产精品一区二区三区av| 这里只有精品在线播放| 波多野结衣绝顶大高潮| 久久久美女艺术照精彩视频福利播放 | 欧美理论在线观看| 日韩欧美在线看| 亚洲一区二区三区四区五区六区 | 欧美另类老女人| 国产女18毛片多18精品| 国产精品久久福利| 狠狠干狠狠操视频| 97在线精品| 国产精品美腿一区在线看| 岛国大片在线观看| 在线观看日韩毛片| 久久久国产一级片| 麻豆国产精品一区二区三区| 亚洲精品久久久久久一区二区| 欧美va视频| 中文字幕精品在线| 一区精品在线观看| 国产精品国产自产拍高清av | 久久久黄色大片| 久久久久国产精品麻豆| 中文字幕永久视频| 久久综合电影| 91在线视频免费| 女人天堂av在线播放| 亚洲第一黄色网| 午夜精品三级久久久有码| 久久婷婷国产综合精品青草| 99精品在线免费视频| 亚洲美女15p| 国产欧美日韩精品专区| 一级毛片视频在线| 欧美一级日韩一级| 久久精品国产亚洲AV无码麻豆| av动漫一区二区| 国产免费人做人爱午夜视频| 欧美综合一区| 91免费版黄色| 免费观看一级欧美片| 中文字幕精品www乱入免费视频| 在线观看黄色国产| 亚洲精品成人悠悠色影视| 成熟妇人a片免费看网站| 久久九九免费| 大桥未久一区二区三区| 精品自拍偷拍| 国产精品日韩精品| 国产偷倩在线播放| 亚洲人a成www在线影院| 国产伦理吴梦梦伦理| 亚洲国产成人av| 亚洲精品国产91| 国产原创一区二区| 中国丰满人妻videoshd| 国产精品97| 精品91免费| 精品久久在线| 97香蕉久久夜色精品国产| 99reav在线| 亚洲国产精品va在线| 日本视频www色| 亚洲综合在线视频| 丰满的亚洲女人毛茸茸| 成人午夜视频在线观看| 日本999视频| 一区二区亚洲| 亚洲一二三区在线| 五月天亚洲色图| 91精品在线国产| 性感美女一区二区在线观看| 久久99久久99精品中文字幕| 成年女人的天堂在线| 亚洲成人网av| 99在线无码精品入口| 欧美性大战xxxxx久久久| 日本中文字幕在线免费观看| 中文字幕一区二区在线观看| 亚洲一级中文字幕| 成av人片一区二区| 三级av免费看| 欧美aaaaaa午夜精品| 欧美亚洲一二三区| 激情婷婷欧美| 99久re热视频精品98| 成人在线视频免费观看| 久久艳妇乳肉豪妇荡乳av| 91精品啪在线观看国产爱臀| 成人免费看片视频| 欧美啪啪网站| 国产精品久久久久久网站| 性欧美又大又长又硬| 久久久亚洲精选| 色婷婷在线播放| 大量国产精品视频| 激情影院在线观看| 三级精品视频久久久久| 国产中文字幕在线看| 日韩精品亚洲元码| 亚洲 欧美 激情 小说 另类| 精品少妇一区二区三区在线视频 | 精品黑人一区二区三区久久| 国产麻豆91视频| 欧美疯狂做受xxxx富婆| 中文字幕一区二区人妻| 欧美性一二三区| 久久永久免费视频| 色综合天天在线| 午夜毛片在线观看| 精品国产1区2区| 精品成人久久久| 精品国产福利在线| 欧美精品二区三区| 欧美视频在线免费看| 精品欧美一区二区三区免费观看 | 一级特黄aaa大片| 欧美日韩电影一区| 97超碰资源站| 91精品国产一区二区三区| 国产美女免费视频| 日韩美女在线视频| 三级小视频在线观看| 日韩av一区二区在线观看| 欧美孕妇性xxxⅹ精品hd| 亚洲欧洲在线播放| 又爽又大又黄a级毛片在线视频| 日韩在线视频网站| www.久久ai| 久久久久久久久中文字幕| 9999精品成人免费毛片在线看| 97视频免费看| 视频二区不卡| 成人伊人精品色xxxx视频| 日日夜夜精品视频| 国内外成人免费视频| 国产精品一在线观看| 亚洲看片网站| 国产综合自拍| 丝袜老师办公室里做好紧好爽| 久热精品在线| 91小视频在线播放| 成人国产精品免费网站| 精品少妇人妻一区二区黑料社区| 中文字幕不卡在线| 免费在线观看黄视频| 欧美日韩一区免费| 91国产精品一区| 亚洲成年人在线| 番号集在线观看| 久久久久久久爱| 亚洲a∨精品一区二区三区导航| 91免费在线视频网站| 日韩超碰人人爽人人做人人添| 天堂精品一区二区三区| 影音先锋久久久| 欧美少妇性生活视频| 国产成人在线影院| 中文字幕有码在线播放| 亚洲激情五月婷婷| 精品无码一区二区三区的天堂| 欧美一个色资源| 成人精品福利| 国内精品久久久久久久久| 国产精品诱惑| 久久大片网站| 欧美三级不卡| 亚洲美女性囗交| 久久综合色天天久久综合图片| 日韩国产第一页| 在线观看欧美日本| 五月天激情婷婷| 欧美成人精品一区| 日韩欧美精品电影| 精品一区二区久久久久久久网站| 91成人精品| 婷婷激情四射五月天| 97se亚洲国产综合自在线不卡 | 欧美区日韩区| 亚洲 国产 图片| 久久精品人人做人人爽97| 国产一级免费观看| 7777精品伊人久久久大香线蕉超级流畅 | www.一区二区.com| 麻豆国产精品777777在线| 亚洲国产欧美视频| 亚洲动漫第一页| www.国产免费| 精品国产一区二区三区在线观看 | 精品日韩美女| 精品999网站| 中文字幕av一区二区三区人妻少妇| 日本一区二区三区视频视频| 精品人妻无码一区二区性色| 亚洲国产精久久久久久 | 亚洲香肠在线观看| 一区二区三区黄色片| 伊人久久综合97精品| 成人做爰视频www网站小优视频| 麻豆精品视频| 亚洲美女色禁图| 无码国产69精品久久久久网站| 亚洲精品久久嫩草网站秘色| 国产免费高清av| 久久福利网址导航| 成人国产精品久久| 男女啪啪的视频| 国产一区二区三区免费在线观看| 午夜精品久久久久99蜜桃最新版| 精品视频一区三区九区| av资源种子在线观看| 国产免费一区二区三区在线观看| 欧美日韩在线观看视频小说| 黄色片视频在线| 国产精品久久久久久亚洲毛片| 中文字幕免费高清在线观看| 在线视频精品一| 国产亚洲精品精品国产亚洲综合| 亚洲国产精品久久久久婷婷老年| 日本成人中文字幕在线视频| 又嫩又硬又黄又爽的视频| 欧美精三区欧美精三区| 成人直播在线| wwwxx欧美| 日韩视频不卡| 四虎永久免费在线观看| 欧美亚洲综合在线| 九七久久人人| 国产精品福利视频| 免播放器亚洲| 美女网站视频色| 日韩三级在线观看| av在线网页| 日本欧美精品久久久| 麻豆成人在线观看| 麻豆changesxxx国产| 亚洲毛片在线观看.| 99蜜月精品久久91| 好吊色这里只有精品| 成人av免费在线| 亚洲男人天堂网址| 久久人人爽人人爽爽久久| 超碰成人在线观看| 日本老熟妇毛茸茸| 亚洲三级在线看| 色吊丝在线永久观看最新版本| 国产精品国产三级国产aⅴ9色| 综合国产在线| 久久久精品人妻无码专区| 欧美日韩精品福利| 暧暧视频在线免费观看| 日韩av电影免费播放| 国产精品一级在线| 日日骚av一区二区| 欧美精品一本久久男人的天堂| 色爱av综合网| 亚洲综合在线一区二区| 精品美女久久久久久免费| √天堂资源地址在线官网| 狠狠色综合一区二区| 国精产品一区一区三区mba视频| 日韩精品一区二区av| 色婷婷综合成人av| 欧美交a欧美精品喷水| 午夜免费看视频| 一本到不卡精品视频在线观看| 91在线中文| 亚洲人成77777| 91女人视频在线观看|