Mysql

MySQL 通用日誌

  • October 10, 2018

是否可以讓 MySQL 將其日誌轉儲到遠端 MySQL 伺服器?

我想審核 MySQL 連接,但我不希望伺服器將所有資訊本地儲存在自己的硬體上。

我對此有好消息和壞消息。

好消息

您可以將正常日誌用作可以查詢的表

步驟 01) 將此添加到 /etc/my.cnf

[mysqld] 
log
log-output=TABLE 

步驟 02)service mysql restart

OK mysqld 沒有記錄表中的每個查詢mysql.general_log。問題:查看初始佈局mysql.general_log

mysql> show create table mysql.general_log\G 
*************************** 1. row *************************** 
      Table: general_log 
Create Table: CREATE TABLE `general_log` ( 
 `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
 `user_host` mediumtext NOT NULL, 
 `thread_id` int(11) NOT NULL, 
 `server_id` int(10) unsigned NOT NULL, 
 `command_type` varchar(64) NOT NULL, 
 `argument` mediumtext NOT NULL 
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log' 
1 row in set (0.09 sec) 

普通日誌作為 CSV 表有什麼好處

步驟 03) 製作mysql.general_logMyISAM 表並為其編制索引

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
ALTER TABLE mysql.general_log ENGINE = MyISAM; 
ALTER TABLE mysql.general_log ADD INDEX (event_time); 
SET GLOBAL general_log = @old_log_state; 

現在看起來像這樣:

mysql> show create table general_log\G
*************************** 1. row ***************************
      Table: general_log
Create Table: CREATE TABLE `general_log` (
 `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `user_host` mediumtext NOT NULL,
 `thread_id` int(11) NOT NULL,
 `server_id` int(10) unsigned NOT NULL,
 `command_type` varchar(64) NOT NULL,
 `argument` mediumtext NOT NULL,
 KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)

mysql>

使用者和主機值一起附加在 user_host 欄位中。

您如何輪換一般日誌?

以下是如何消隱的範例mysql.general_log

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
CREATE TABLE mysql.general_log_new LIKE mysql.general_log; 
DROP TABLE mysql.general_log; 
ALTER TABLE mysql.general_log_new RENAME mysql.general_log; 
SET GLOBAL general_log = @old_log_state; 

以下是如何保留最後 3 天條目的範例:

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
CREATE TABLE mysql.general_log_new LIKE mysql.general_log; 
INSERT INTO mysql.general_log_new 
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY; 
DROP TABLE mysql.general_log; 
ALTER TABLE mysql.general_log_new RENAME mysql.general_log; 
SET GLOBAL general_log = @old_log_state; 

壞消息

您在正常日誌的文本文件版本中收集的任何內容都不會隨隨便便而來。您可以收集新的條目。

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