是否有MySQL将其日志转移到远程MySQL Server上?

我想审核MySQL连接,但我不希望服务器在其自己的硬件上存储所有本地信息。

有帮助吗?

解决方案

我对此有个好消息和坏消息。

好消息

您可以将常规日志用作表格您可以查询

步骤01)将其添加到/etc/my.cnf

[mysqld] 
log
log-output=TABLE 

步骤02) service mysql restart

好的,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_log 迈萨姆桌并索引

 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>

用户和主机值在用户_ -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; 

坏消息

您在通用日志的文本文件版本中收集的任何内容都不会出现。您可以收集新的条目。

其他提示

您可以将NFS安装安装设置为目标服务器,并将一般日志路径指向该安装座。

而不是重新启动mySQL,您可以做到这一点:

SET GLOBAL log_output = 'TABLE';

服务器将立即开始登录到 `mysql`.`general_log`.

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top