Mysql

啟用 slow_query_log 嘗試寫入 slow_log.CSV

  • December 17, 2012

我正在執行 MySQL 5.5

我想截斷慢日誌文件,所以我做了:

SET GLOBAL slow_query_log = 0;

然後截斷文件系統中的文件。

但是,當我重新啟用它時,它會失敗:

SET GLOBAL slow_query_log = 1;
ERROR 13 (HY000): Can't get stat of './mysql/slow_log.CSV' (Errcode: 2)

雖然slow_query_log_file設置顯式到另一個路徑。

SHOW GLOBAL VARIABLES LIKE 'slow_query%';
+------------------------------------+---------------------------------+
| Variable_name                      | Value                           |
+------------------------------------+---------------------------------+
| slow_query_log                     | OFF                             |
| slow_query_log_file                | /home/mysql_data/jobs1-slow.log |
| slow_query_log_timestamp_always    | OFF                             |
| slow_query_log_timestamp_precision | second                          |
| slow_query_log_use_global_control  |                                 |
+------------------------------------+---------------------------------+

怎麼了?我想要 MySQL 日誌到指定的文件。純文字,而不是 CSV。

SHOW GLOBAL VARIABLES LIKE 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+

在我停止之前,記錄很好。

解決了這個問題。

事實證明,表mysql.general_logmysql.slow_log已損壞。

實際上它只有frm文件,但沒有關聯的csv數據文件。

為了解決這個問題,我重新創建了這些表。

mysql> DROP TABLE mysql.general_log;
ERROR 1051 (42S02): Unknown table 'general_log'
mysql> DROP TABLE mysql.slow_log;
ERROR 1051 (42S02): Unknown table 'slow_log'

儘管出現錯誤,但該frm文件已被刪除。所以沒關係。

然後從 5.5 發行版執行 SQL。

-- Create general_log if CSV is enabled.

SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, thread_id INTEGER NOT NULL, server_id INTEGER UNSIGNED NOT NULL, command_type VARCHAR(64) NOT NULL, argument MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="General log"', 'SET @dummy = 0');

PREPARE stmt FROM @str;
EXECUTE stmt;
DROP PREPARE stmt;

-- Create slow_log if CSV is enabled.

SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, query_time TIME NOT NULL, lock_time TIME NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512) NOT NULL, last_insert_id INTEGER NOT NULL, insert_id INTEGER NOT NULL, server_id INTEGER UNSIGNED NOT NULL, sql_text MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="Slow log"', 'SET @dummy = 0');

PREPARE stmt FROM @str;
EXECUTE stmt;
DROP PREPARE stmt;

最後,啟用日誌就好了:

SET GLOBAL slow_query_log = 1;
Query OK, 0 rows affected (0.20 sec)

我認為這是由外部程序或新手引起的,因為之後我關閉並重新登錄就好了。

我做了這些步驟:

  1. set global slow_query_log=0;
  2. 刪除系統中的慢日誌文件
  3. set global slow_query_log=1;

它工作正常,所以我嘗試了以下步驟:

mysql> set global slow_query_log=0;
Query OK, 0 rows affected (0.12 sec)

mysql> set global slow_query_log_file='/tmp/slow.log';
Query OK, 0 rows affected (0.10 sec)

mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.00 sec)

仍然有效,並且新的慢日誌文件生成為/tmp/slow.log.

最後,全域變數的值log_output決定了在哪裡生成通用日誌和慢日誌的輸出,而不是文件格式。

引用自:https://dba.stackexchange.com/questions/30565