web-dev-qa-db-ja.com

MySQL一般ログ

MySQLにログをリモートMySQLサーバーにダンプさせる方法はありますか?

MySQL接続を監査したいのですが、サーバーにすべての情報をローカルのハードウェアに保存させたくありません。

5
MrNemus

これについては良いニュースと悪いニュースがあります。

良いニュース

クエリできるテーブルとして一般ログを使用できます

ステップ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をMyISAMテーブルにしてインデックスを作成する

 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の値は、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; 

悪いニュース

一般ログのテキストファイルバージョンで収集したものはすべて、乗車できません。今後、新しいエントリを収集できます。

7
RolandoMySQLDBA

ターゲットサーバーにNFSマウントをセットアップして、そのマウントへの一般的なログパスを指定するだけです。

1
atxdba