茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1670797 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00060.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

DB研討會 : [轉貼]MySQL 啟用 query log 與 slow query log 功能

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]MySQL 啟用 query log 與 slow query log 功能
[MySQL] 啟用query log 與 slow query log功能

以下範例試用在Centos 5.x,MySQL 5.0環境下

啟用query log功能
以drupal的資料庫連結多,開啟此功能,可預期query log檔案很快就變會很大,建議debug問題時才開啟。
    $vi /etc/my.cnf

在[mysqld]區塊內設定加入
    [mysqld]
    log=/var/log/mysqld.general.log

mysql不會自動依設定產生mysqld.general.log,要手動加。
    $ touch /var/log/mysqld.general.log
    $ chown mysql.mysql /var/log/mysqld.general.log

重新啟動mysqld,用瀏覧器連結網站,查看是否有產出log資料
    $ /etc/init.d/mysqld restart
    $ tail -f /var/log/mysqld.general.log

log資料
     2 Query       SELECT * FROM languages ORDER BY weight ASC, name ASC
     2 Query       SELECT data, created, headers, expire, serialized FROM cache WHERE cid = 'variables:zh-hant'
     2 Query       SELECT COUNT(pid) FROM url_alias
     2 Query       SELECT src FROM url_alias WHERE dst = 'node' AND language IN('zh-hant', '') ORDER BY language DESC, pid DESC


啟用slow query log功能
    $ vi /etc/my.cnf

在[mysqld]區塊內設定加入
5.0版
    [mysqld]
    // 單位是秒,預設是10秒,最小值是1
    log-slow-queries = 5
    log-slow-queries = /var/log/mysql-slow.log
    log-long-format

5.1.29版後
    [mysqld]
    slow_query_log
    slow_query_log_file = /var/log/mysql-slow.log
    long_query_time = 5
    log-long-format

mysql不會自動依設定產生mysql-slow.log,要手動加。
    $ touch /var/log/mysql-slow.log
    $ chown mysql.mysql /var/log/mysql-slow.log

重新啟動mysqld,用瀏覧器連結網站,查看是否有產出log資料
    $ /etc/init.d/mysqld restart
    $ tail -f /var/log/mysql-slow.log

log資料
    # Time: 090317 18:46:59
    # User@Host: root[root] @ localhost []
    # Query_time: 12  Lock_time: 0  Rows_sent: 242515  Rows_examined: 242515
    SELECT * FROM `portal`.`search_index`;

使用mysqldumpslow 指令分析mysql-slow.log,結果是耗費最多時間的slow query依順排出。
// query 7次,每次耗費106.43秒
Count: 7  Time=106.43s (745s)  Lock=0.00s (0s)  Rows=9366.9 (65568), aaa[aaa]@localhost
  SELECT * FROM `aaa`.`vtiger_crmentity`
// query 1次,每次耗費58.00秒
Count: 1  Time=58.00s (58s)  Lock=0.00s (0s)  Rows=51515.0 (51515), aaa[aaa]@localhost
  SELECT * FROM `aaa`.`product_mac2`
Count: 1  Time=42.00s (42s)  Lock=0.00s (0s)  Rows=1000.0 (1000), aaa[aaa]@[215.86.72.122]
  SELECT * FROM aaa.product_mac2 LIMIT N
Count: 6  Time=38.00s (228s)  Lock=0.00s (0s)  Rows=130972.3 (785834), aaa[aaa]@localhost
  SELECT * FROM `aaa`.`vtiger_audit_trial`


原文出處:Allen開放源碼研究室 » [MySQL] 啟用query log 與 slow query log功能
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]MySQL General Query Log 和 Slow Query Log
MySQL General Query Log 和 Slow Query Log

紀錄所有執行的 SQL 語句(General Query Log)。
計錄在檔案
    log-output=FILE
    general-log=1
    general_log_file="/var/log/mysql/general_log.log"

記錄在資料庫
選擇紀錄在資料庫時,會紀錄在 mysql.general_log 裡面。
    log-output=TABLE
    general-log=1

紀錄執行太慢的 SQL 語句(Slow Query Log)
計錄在檔案
    log-output=FILE
    slow-query-log=1
    slow_query_log_file="/var/log/mysql/slow.log"
    long_query_time=3 #執行超過3秒就紀錄

記錄在資料庫
選擇紀錄在資料庫時,會紀錄在 mysql.slow_log 裡面。
    log-output=TABLE
    general-log=1

若運行中,不方便重新啟動 MySQL,但又需要觀察 Log,可暫時先修改環境變數。
例如:
開啟 General Query Log
    SET global log_output = 'table';
    SET global general_log = 1;

關閉 General Query Log
    SET global general_log = 0;


原文出處:XYZ的筆記本: MySQL General Query Log 和 Slow Query Log
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]找出 MySQL 哪些 Query 速度較慢

找出 MySQL 哪些 Query 速度較慢

MySQL 中有內建的設定, 在 my.cnf 中設定:
log-slow-queries = [slow_query_log_filename]
即可記錄查詢時間花費超過的 10s的 SQL 語法(Default).
若要改 5秒 可設定如: long_query_time = 5 即設定為 5s 記錄下來.

 

如果要記錄所有 SQL 語法,可以寫入:
log-long-format (查看最常用到的欄位加 index)
# t=time, l=lock time, r=rows
# at, al, 以及 ar 是對應的平均值
Ex: 於 my.cnf ([mysqld]) 加入

log-slow-queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
log-long-format


而那些查詢速度較花時間的語法, 預設會記到 MysSQL 存放處的*-slow.log 

但是要怎麼去分析這個 log file, 就要靠 MySQL 的 mysqldumpslow 來分析.
mysqldumpslow(Perl Script), 由裡面接收變數直接撈出來, 可接受的參數有:
'v+', # verbose
'd+', # debug
's=s', # 排序 (t, at, l, al, r, ar etc)
'r!', # 倒排序 (largest last instead of first)
't=i', # 顯示最高的 n 個查詢
'a!', # 不把所有的數位以 N, 字串以 'S' 顯示
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time

參考: MySQL 自帶的 slow log 分析工具 mysqldumpslow


PS: 另外也是加上 log-query-time 下面的參數: log-queries-not-using-indexes 看起來也不錯, 詳細可見; The Slow Query Log.


原文出處:找出 MySQL 哪些 Query 速度較慢 - Tsung's Blog
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]MySQL 設定 記錄執行過的 SQL 語法

[mysql] 設定 記錄執行過的 SQL 語法

from : http://plog.longwin.com.tw/my_note-programming/2007/06/09/mysql_record_any_sql_command_2007

程式 Debug 有時後從前面第一行追起來很辛苦(程式碼太多或 compile 過), 另一種做法就是從後面追起來, 反正最後寫入的是 DB, 那就從 DB 開始往前推, 所以就是要抓程式是執行哪些 SQL 語法.(以下只以 MySQL 為主)

之前用過的追蹤法是用 tcpdump 或 wireshark 聽 3306 port,這個太苦, 就不再多說~

MySQL 有幾種方法可以用, 將以挑喜歡的其中一種, 加入 /etc/mysql/my.cnf(debian), 再 restart mysql 即可:

第一種: 查 Slow query 的 SQL 語法:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 2 (超過 2秒的 SQL 語法記錄起來, 設短一點來記錄除錯也是一種方法 XD)

第二種: 設 MySQL Replication 用 binlog:

  • log_bin = /var/log/mysql/mysql-bin.log (此檔要用 mysqlbinlog 解來看)
  • mysql 會將所有 INSERT/UPDATE/DELETE 語法記於此(但是語法可能跟你想的不同), 這是要寫給 SLAVE 用的 log 檔

第三種: 推薦此方法, 將 MySQL 執行的每行指令全都記錄起來:

  • log = /tmp/mysql.log

restart mysql 後, tail -f /tmp/mysql.log 就可以看到囉! :)

補充: 最早前的方法是 mysqldump, 然後執行完後再 mysqldump, 再 diff, 但是在 DB > 1G 後就放棄此方法了 XD


原文出處:[mysql] 設定 記錄執行過的 SQL 語法 @ 老周的部落 :: 痞客邦 PIXNET ::
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|