公式のdockerイメージを使用し、mysql:5.7
カスタム.cnfファイルを使用してmysqlを設定しgeneral_log_file
てログインしてlogs_error
いますが、エラーログを設定すると次のエラーが発生します。
$ sudo docker-compose up
db_1 | Initializing database
db_1 | Initializing database
db_1 | Initializing database
....
^CGracefully stopping... (press Ctrl+C again to force)
$ cat mysql-custom.cnf
[mysqld]
general_log_file = /var/log/mysql/mysqld.log
general_log = 1
log_error = /var/log/mysql/error.log # When i put this then getting above error.
ここでエラーが発生してlog_error
orを入力しましたがslow_query_log_file
、この単純なものがdockerで機能しない理由を知っている人はいますか?
ベストアンサー1
コンテナ内では、基本オペレーティングシステムの機能を完全にサポートできない可能性があります。これは、特定の目的のためにより安全で制限された環境を望むので、意図的に設計されています。
したがって、MySQLログの場合は、おそらくMYSQL DB /テーブルに記録したいと思います。
バージョン5.x(5.1、5.2、覚えていません)の場合、SQLはファイルの代わりにMySQL DB /テーブルへのロギングをサポートし、既定では2つのテーブルがすでに作成されていますmysql.general_log
。mysql.slow_log
使用を設定するには、次のものが必要です。
に追加/etc/mysql/my.cnf
:
[mysqld]
slow-query-log
general_log=1
log-output=TABLE
その後、mysqlを再起動します。
毎日バックアップするには、データベース照会権限を持つシステムで以下を実行できます。
mysqldump mysql general_log --lock-tables=0 > general_log_errors.db
mysqldump mysql slow_log --lock-tables=0 > slow_log_errors.db
(lock-tables = 0を使用する必要があります。そうしないと、エラーメッセージが表示されます。
mysqldump: Got error: 1556: You can't use locks with log tables. when doing LOCK TABLES
)
次に、次のクエリを実行してテーブルをクリーンアップします。
TRUNCATE TABLE mysql.general_log;
TRUNCATE TABLE mysql.slow_log;
これが一般的な考えです。過去数日間のログをアーカイブしようとする可能性があるため、MySQL TRUNCATE / DELETEクエリがより冗長になります。
テーブルはデフォルトでそこにある必要があり、そのDockerイメージから消去された可能性があります。
したがって、v5.7では、次のように生成できます。
CREATE TABLE IF NOT EXISTS `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`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` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
CREATE TABLE IF NOT EXISTS `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) 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` mediumblob NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
追加資料:テーブルへのログの書き込み
error_fileの作成に関しては、/var/logがdockerファイルに存在しない可能性があります。上記の2つのロギングオプションが不十分な場合は、MySQLユーザーが所有するディレクトリにテスト用のファイルを作成できます。 MySQLのあるディレクトリの1つは通常/var/lib/mysqlです。