MySQL 5.0.77サーバーを監視し、すべての着信接続を1日記録したいと思います。誰がデータベースに接続しているかを知る必要があります。
一般的なログを試しましたが、ログが多すぎます多すぎます十分な長さを維持できず、ログファイルの成長が速すぎます。
それを行う方法はありますか?ありがとう
一般的なログは、テキストファイルとしてではなく、MySQLテーブルとして使用する必要があります。
MySQL 5.1以降、次のオプションが導入されました: log-output 。
log-output
をFILE
(デフォルト)に設定すると、ログエントリがテキストファイルに書き込まれます。log-output
をTABLE
に設定すると、ログエントリがmysql.general_log
に書き込まれます。log-output
をTABLE,FILE
に設定すると、ログエントリがmysql.general_log
とテキストファイルに書き込まれます。変更しなければならない重要なことが1つあります。
標準の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ファイルですか?わーい!!!誰がそのための時間を持っていますか?心配しないで、MyISAMテーブルに変えてください
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
すでにMySQLを起動している場合は、代わりに次のようにしてください。
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.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;
この機能は、MySQL 5.1/5、5/5.6で使用できます。 MySQL 5.0.77から最新にアップグレードする必要があります
私はここでもっとたくさん書くことができましたが、これはDBAStackExchangeで何度も議論しました。これがこのテーマに関する私の投稿の一部です:
Feb 11, 2012
: MySQL general log
Jan 07, 2012
: How to enable MySQL general log?
Dec 27, 2011
: How to do MySQL User Accounting
Feb 24, 2011
: Audit logins on MySQL database
これがアイデアですが、うまくいかないかもしれません。
a FIFOパイプを/var/log/mysql/named_pipe
に作成します。一方の端では、MySQLにそれを一般的なログファイルのファイル名として使用させます。
反対側では、次のようなものを設定します
grep "login" < /var/log/mysql/named_pipe > /var/log/mysql/logins
ログから出た後の行を正確にgrepする必要があります。
それはmight動作します。動作しない場合があります。
同じことをする必要がありました。 MySQL5.6およびMySQL5.7には、必要な情報を取得してテーブルに格納する方法があります。これがMySQL 5.0または5.5で可能かどうかはわかりません。これが私がしたことです:
注:ユーザーがスーパーまたはルートのような特権で接続している場合、これは情報をキャプチャしません。
MySQL構成ファイルのmysqldセクションに、次のように追加しました:# ***
以下のパラメーターは、ユーザー接続をログに記録します
init_connect='CALL connectionlogging.usp_InsertUserConnection'
取得する必要がある情報は、ユーザーID、接続要求の送信元のホスト、ユーザーが接続しているデータベース、接続に関する情報、およびタイムスタンプです。
この情報を使用して、暗号化された接続を使用しているユーザー、接続しているデータベース、およびユーザーがいつ接続するかを判別します。