mysqlにすべてのクエリを記録する


279

mysqlデータベースで監査ログをオンにすることはできますか?

基本的にすべてのクエリを1時間監視し、ログをファイルにダンプします。



読者にとってのメリット:上記のコメントの質問を必ずお読みください。

ここに投稿された私の既存の回答を参照できます。dba.stackexchange.com/ a / 62477/6037
Peter Venderberghe '19

回答:


165

mysqlを--logオプションで起動します。

mysqld --log=log_file_name

または、my.cnfファイルに以下を配置します。

log = log_file_name

どちらも、すべてのクエリをlog_file_nameに記録します。

--log-slow-queries代わりにオプションを使用して、遅いクエリのみをログに記録することもできます--log。デフォルトでは、10秒以上かかるクエリは遅いと見なさlong_query_timeれます。クエリがログに記録されるまでに実行にかかる秒数に設定することで、これを変更できます。


61
言うまでもありませんが、これをプロダクションボックスでオンのままにしておくと、非常に面白くなくなります。g
ceejayoz 2008年

6
この方法でロギングを有効にできない場合は、mysqlユーザーが適切なファイルの場所に書き込むことができることを確認してください。
Jon Topper、

3
1つの特定のdb /テーブルのみのクエリをログに記録することは可能ですか?
テムジン

2
@Temujin phpmyadminには、ログ(「バージョン」)を指定するテーブルの「追跡」オプションがあり、時間とクエリ全体に関する情報とともに、それに影響するクエリの記録を保持します。
gadget00 2013

3
この承認された回答は、MySQL 5.6以降では機能しないという事実を反映するように削除または編集する必要があります。
itoctopus

233

:mysql-5.6 +の場合、これは機能しません。下にスクロールするか、ここをクリックすると、mysql-5.6 +に適用される解決策があります。)

MySQLサーバーが不要または再起動できない場合は、実行中のサーバーで次のように処理できます。

  • mysqlデータベースにログテーブルを作成する
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned 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'
  • データベースでクエリログを有効にする
SET global general_log = 1;
SET global log_output = 'table';
  • ログを見る
select * from mysql.general_log
  • データベースのクエリロギングを無効にする
SET global general_log = 0;

14
これがMySQLのすべてのバージョンに当てはまるかどうかはわかりませんが(私は5.5を使用しています)、テーブルを作成する必要はありませんでした。:私は、ここに記載されたテーブルを作成し、同じアドバイスマイナス、続いstackoverflow.com/a/678310/135101
タイラーコリア

たぶん、何らかの理由ですでに作成されているのかもしれません。@ TylerCollier
Alexandre Marcondes

3
CREATE TABLEコマンドは(テーブルがまだ存在しない場合)mysql、ユーザーが作成したデータベースではなく、データベースで実行する必要があることに注意してください。おそらく、SQLステートメントはそれを反映するように更新できます。
Robert Rossmann、2015年

2
ログSELECT * FROM mysql.general_log order by (event_time) descを表示する方が良いでしょう。ただ言うだけです。:-)
vinrav

注に同意しないでください -サーバーのバージョン5.6.37では完全に正しく動作します。ありがとう。
Dmitriy Olhovsky 2017年

215

私がここで遭遇したものに加えて、再起動せずにクエリをログファイルにダンプする最も簡単な方法は、以下を実行すること

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

でオフにすることができます

SET global general_log = 0;

6
絶対にこれが大好きで、DBの既存の接続と新しい接続で機能します
Carlton

1
いくつかの統計エントリがありました-それらが何であるかはわかりませんが、そうでなければ、本当にうまくいきます。
Snowcrash、2015

:これは、ユーザーがグローバルDBの特権であるので、特定のスキーマまたは表に限定することはできませんSUPER権限を持っている必要があります動作させるためにGRANT SUPER ON *.* TO user1@localhost
RobM

できれば何度も賛成します。ブックマークにここを指定しています:)どうもありがとうございました。
19

124

mysql 5.6以降では、トップアンサーが機能しません。代わりにこれを使用してください:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

my.cnf / my.iniファイル

Ubuntu / Debian:/etc/mysql/my.cnf
Windows:c:\ ProgramData \ MySQL \ MySQL Server 5.x
wamp:c:\ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp:c:\ xampp \ mysql \ bin \ my.ini。


これを使用したことがある場合、上記のパフォーマンスへの影響を教えていただけますか?この方法でログを有効にするのは賢明でしょうか?
Ramesh Pareek、2016年

1
Rameshのパフォーマンスへの影響は、パフォーマンスが約5〜15%低下するようです。詳細情報はこちらpercona.com/blog/2009/02/10/...
Firze

1
Mysql 5.6でクエリからログファイルを設定できないのはなぜですか?あなたが唯一のサーバーのディレクトリツリーへのアクセス権を持っていますがないとき、後のMySQL 5.6でのすべてのクエリをログに記録し、する方法phpMyAdmin
Vicky Dev 2016年

これらの変更後、xamppコントロールパネルからmysqlサービスを再起動します。
Paramjeet 2017

これは私のローカルXampp Apache環境で機能しましたが、phpMyAdminを介してログをオンにする必要がありました。また、/ usr / logフォルダーでファイルを見つけることも、作成することもできませんでしたが、次のようにgeneral_log_file=filename.log
正常に機能し

36

テーブルのログを有効にする

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

選択クエリごとにログを表示

select * from mysql.general_log

すべてのテーブルを記録するワイルドカードはありますか?(かなりたくさんあります:C)
RicardoE

おかげで、mysql-serverをダウンさせることができなかったので、この設定は私にとって非常に役に立ちました。ログをログテーブルに表示したい
Gunnar Sigfusson '21 / 08/21

14

再起動せずにMySQL General Query Logを有効にする簡単な方法。

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

私は、homebrewを介してmysqlをインストールしました。mysqlバージョン:mysql Ver 14.14 Distrib 5.7.15、EditLineラッパーを使用するosx10.11(x86_64)用


6

参考までに、general_logおよびslow_logは5.1.6で導入されました。

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

5.2.1。一般クエリとスロークエリのログ出力先の選択

MySQL 5.1.6以降、MySQLサーバーでは、一般クエリログとスロークエリログへの出力先を柔軟に制御できます(これらのログが有効になっている場合)。ログエントリの可能な宛先は、mysqlデータベース内のログファイルまたはgeneral_logおよびslow_logテーブルです。


5

mysqlのログオンは実際にパフォーマンスに影響を与えることに注意する必要がありますが、それは賢明なことです。

私は通常、それを開発サーバー上に置いたままにします(それが私たちを狂気に駆り立てるときを除いて:))


2

OS / mysqlバージョン:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

ロギングを追加する(例、/var/log/...Mac OSでの最良のパスではないと思いますが、それでうまくいきました:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

Mysqlを再起動しました

結果:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.