開啟通用查詢日誌
因為為了效能考慮,一般通用查詢日誌general log不會開啟。slow log可以定位一些有效能問題的sql,而general log會記錄所有的SQL。
mysql5.0版本,如果要開啟slow log、general log,需要重啟,從MySQL5.1.6版開始,general query log和slow query log開始支援寫到檔案或者資料庫表兩種方式,並且日誌的開啟,輸出方式的修改,都可以在Global層級動態修改。
+————+| version() |+————+| 5.1.37-log |+————+1 row in set (0.02 sec)
設定日誌輸出方式為檔案(如果設定log_output=table的話,則日誌結果會記錄到名為gengera_log的表中,這表的預設引擎都是CSV):
mysql>set global log_output=file;
Query OK, 0 rows affected (0.00 sec)
設定general log的記錄檔路徑:
mysql>set global general_log_file='/tmp/general.log';
Query OK, 0 rows affected (0.00 sec)
開啟general log:
mysql>set global general_log=on;
Query OK, 0 rows affected (0.02 sec)
過一段時間後,關閉general log:
mysql>set global general_log=off;
Query OK, 0 rows affected (0.02 sec)
通用查詢日誌的系統變數
log_output=[none|file|table|file,table] #通用查詢日誌輸出格式
general_log=[on|off] #是否啟用通用查詢日誌general_log_file[=filename] #通用查詢日誌位置及名字
通用查詢日誌的備份
在Linux或Unix中,你可以通過下面的命令重新命名檔案
並建立一個新檔案:
shell> mv hostname.log hostname-old.logshell> mysqladmin flush-logsshell> cp hostname-old.log to-backup-directoryshell> rm hostname-old.log
在Windows中,伺服器開啟記錄檔期間不能重新命名記錄檔。必須先停止伺服器然後重新命名記錄檔。然後重啟伺服器來建立新記錄檔。
示範通用查詢日誌的使用
a、啟用通用查詢日誌
--示範環境root@localhost[(none)]> show variables like '%version%';
+-------------------------+------------------------------+| Variable_name | Value |+-------------------------+------------------------------+| innodb_version | 5.5.39 || protocol_version | 10 || slave_type_conversions | || version | 5.5.39-log || version_comment | MySQL Community Server (GPL) || version_compile_machine | x86_64 || version_compile_os | Linux |+-------------------------+------------------------------+
--查看系統變數root@localhost[(none)]> show variables like '%general%';
+------------------+----------------------------+| Variable_name | Value |+------------------+----------------------------+| general_log | OFF || general_log_file | /var/lib/mysql/suse11b.log |+------------------+----------------------------+
--查看當前的通用日誌,顯示無記錄檔root@localhost[(none)]> system ls /var/lib/mysql/suse11b.log
ls: cannot access /var/lib/mysql/suse11b.log: No such file or directory
--設定變數general_log以開啟通用查詢日誌root@localhost[(none)]> set @@global.general_log=1;
Query OK, 0 rows affected (0.00 sec)
--再次查看通用記錄檔已存在root@localhost[(none)]> system ls /var/lib/mysql/suse11b.log /var/lib/mysql/suse11b.logroot@localhost[(none)]> select * from tempdb.tb1; --執行查詢
+------+------+| id | val |+------+------+| 1 | jack |+------+------+
--查看通用記錄檔內容root@localhost[(none)]> system more /var/lib/mysql/suse11b.log/usr/sbin/mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sockTime Id Command Argument141003 16:18:12 4 Query show variables like '%general%'141003 16:18:55 4 Query select * from tempdb.tb1
b、更改通用查詢日誌位置
root@localhost[(none)]> exit
Byesuse11b:~ # service mysql stopShutting down MySQL... donesuse11b:~ # mysqld --general_log_file=/tmp/suse11b.log --user=mysql &[1] 47009suse11b:~ # ps -ef|grep mysql|grep -v grepmysql 47009 44514 1 16:22 pts/0 00:00:00 mysqld --general_log_file=/tmp/suse11b.log --user=mysqlroot 47053 44514 0 16:22 pts/0 00:00:00 grep mysqlsuse11b:~ # mysql
root@localhost[(none)]> system ls /tmp/suse11b.log
ls: cannot access /tmp/suse11b.log: No such file or directory
root@localhost[(none)]> show variables like '%gener%';
+------------------+------------------+| Variable_name | Value |+------------------+------------------+| general_log | OFF || general_log_file | /tmp/suse11b.log |+------------------+------------------+
root@localhost[(none)]> set global general_log=on;
Query OK, 0 rows affected (0.01 sec)
--此時從系統變數看出,通用日誌已經到/tmp目錄下root@localhost[(none)]> show variables like '%gener%';
+------------------+------------------+| Variable_name | Value |+------------------+------------------+| general_log | ON || general_log_file | /tmp/suse11b.log |+------------------+------------------+
--發布查詢root@localhost[(none)]> select count(*) from tempdb.tb1;
+----------+| count(*) |+----------+| 1 |+----------+
--查看通用記錄檔內容root@localhost[(none)]> system more /tmp/suse11b.log
mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with:Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sockTime Id Command Argument141003 16:30:03 1 Query show variables like '%gener%'141003 16:30:09 1 Query select count(*) from tempdb.tb1
c、通用查詢日誌輸出方式
--可以輸出為檔案,表以及不輸出,即TABLE,FILE,NONE--系統變數log_outputroot@localhost[(none)]> show variables like 'log_output';
+---------------+-------+| Variable_name | Value |+---------------+-------+| log_output | FILE |+---------------+-------+
--下面修改為輸出為表方式root@localhost[(none)]> set global log_output='TABLE';
Query OK, 0 rows affected (0.00 sec)
root@localhost[(none)]> show variables like 'log_output';
+---------------+-------+| Variable_name | Value |+---------------+-------+| log_output | TABLE |+---------------+-------+
--發布查詢root@localhost[(none)]> select * from tempdb.tb1;
+------+------+| id | val |+------+------+| 1 | jack |+------+------+
root@localhost[(none)]> system more /tmp/suse11b.log
mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with:Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sockTime Id Command Argument141003 16:30:03 1 Query show variables like '%gener%'141003 16:30:09 1 Query select count(*) from tempdb.tb1141003 16:31:00 1 Query show variables like 'log_output'141003 17:00:48 1 Query set global log_output='TABLE' #通用查詢日誌輸出到檔案僅僅記錄到全域變數的修改
--mysql.general_log記錄了通用查詢日誌的資訊root@localhost[(none)]> desc mysql.general_log;
+--------------+------------------+------+-----+-------------------+-----------------------------+| Field | Type | Null | Key | Default | Extra |+--------------+------------------+------+-----+-------------------+-----------------------------+| event_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || user_host | mediumtext | NO | | NULL | || thread_id | int(11) | NO | | NULL | || server_id | int(10) unsigned | NO | | NULL | || command_type | varchar(64) | NO | | NULL | || argument | mediumtext | NO | | NULL | |+--------------+------------------+------+-----+-------------------+-----------------------------+
--從通用查詢日誌表裡查看通用查詢日誌的內容root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log;
+-----------+--------------+---------------------------------------------------------------+| thread_id | command_type | argument |+-----------+--------------+---------------------------------------------------------------+| 1 | Query | show variables like 'log_output' || 1 | Query | select * from tempdb.tb1 || 1 | Query | desc mysql.general_log || 1 | Query | select thread_id,command_type,argument from mysql.general_log |+-----------+--------------+---------------------------------------------------------------+
root@localhost[(none)]> show variables like 'log_output';
+---------------+-------+| Variable_name | Value |+---------------+-------+| log_output | TABLE |+---------------+-------+
--使用FILE,TABLE 2者混合輸出通用日誌root@localhost[(none)]> set global log_output='file,table';
Query OK, 0 rows affected (0.00 sec)
root@localhost[(none)]> select @@global.log_output;
+---------------------+| @@global.log_output |+---------------------+| FILE,TABLE |+---------------------+
root@localhost[(none)]> insert into tempdb.tb1 values(2,'robinson');
Query OK, 1 row affected (0.06 sec)
root@localhost[(none)]> commit;
Query OK, 0 rows affected (0.01 sec)
--驗證結果,表和檔案裡邊存在通用的日誌記錄root@localhost[(none)]> system tail /tmp/suse11b.log|grep robinson
141003 17:41:54 2 Query insert into tempdb.tb1 values(2,'robinson')
root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log -> where argument like '%robinson%';
+-----------+--------------+------------------------------------------------------------------------+| thread_id | command_type | argument |+-----------+--------------+------------------------------------------------------------------------+| 2 | Query | insert into tempdb.tb1 values(2,'robinson') || 2 | Query | select thread_id,command_type,argument from mysql.general_log || | | where argument like ''robinson'' | +-----------+--------------+------------------------------------------------------------------------+
d、關閉通用查詢日誌
--可以通過設定系統變數general_log來關閉通用查詢日誌,此時日誌輸出設定為FILE,TABLE
root@localhost[(none)]> show variables like 'log_output';
+---------------+------------+| Variable_name | Value |+---------------+------------+| log_output | FILE,TABLE |+---------------+------------+
root@localhost[(none)]> set global general_log=off;
Query OK, 0 rows affected (0.01 sec)
root@localhost[(none)]> show variables like '%gener%';
+------------------+------------------+| Variable_name | Value |+------------------+------------------+| general_log | OFF || general_log_file | /tmp/suse11b.log |+------------------+------------------+
root@localhost[(none)]> delete from tempdb.tb1 where id=2;
Query OK, 1 row affected (0.12 sec)
root@localhost[(none)]> commit;
Query OK, 0 rows affected (0.00 sec)
root@localhost[(none)]> system tail -n 1 /tmp/suse11b.log
141003 17:45:13 2 Query set global general_log=off
root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log -> where argument like '%delete%';
Empty set (0.00 sec)--從上面的示範可知,儘管我們設定了log_output為FILE,TABLE,但general_log為OFF,通用日誌無任何記錄產生
root@localhost[(none)]> set global log_output=none;
Query OK, 0 rows affected (0.00 sec)
root@localhost[(none)]> set global general_log=1;
Query OK, 0 rows affected (0.00 sec)
root@localhost[(none)]> truncate table tempdb.tb1;
Query OK, 0 rows affected (0.01 sec)
root@localhost[(none)]> system tail -n 1 /tmp/suse11b.log
Time Id Command Argument--通過上面的示範,在log_output=none,general_log=on的清下下無任何通用日誌輸出。