MySQLにログをリモートMySQLサーバーにダンプさせる方法はありますか?
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
を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;
一般ログのテキストファイルバージョンで収集したものはすべて、乗車できません。今後、新しいエントリを収集できます。
ターゲットサーバーにNFSマウントをセットアップして、そのマウントへの一般的なログパスを指定するだけです。