Help us understand the problem. What is going on with this article?

my.cnfを書くのが面倒な時に使うローカルMySQLコンテナ docker run コマンド

More than 3 years have passed since last update.

代わりに docker run が長くなるだけなんですけどね…

コマンド

MySQLサーバーの起動

docker run -d -i -t \
  --name="my-db" \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD="mysql" \
  -e MYSQL_DATABASE="my_db" \
  -v /var/lib/mysql \
  mysql:5.6 \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_unicode_ci \
    --log-error=/var/log/mysql/error.log \
    --general-log=true \
    --general-log-file=/var/log/mysql/general.log \
    --slow-query-log=true \
    --slow-query-log-file=/var/log/mysql/slow-query.log \
    --long-query-time=1 \
    --innodb-file-format=Barracuda \
    --innodb-file-per-table=true \
    --innodb-large-prefix=true \
    --performance-schema=false \
    --table-definition-cache=400

項目
Docker コンテナ名 my-db
MySQL データベース名 my_db
MySQL ポート 3306
MySQL root ユーザー root / mysql
character set  utf8mb4
collation utf8mb4_unicode_ci
  • mysqld の標準出力を見るときは docker logs -f my-db
  • 特定のキーワードに絞りたければ docker logs -f my-db | grep --line-buffered 'HOGEHOGE'
  • エラーログ、一般ログ、スロークエリログを見るには docker exec -i -t my-db sh -c 'tail -f /var/log/mysql/*.log'

データを永続化するには

MySQL 起動時にデータディレクトリをホストにマウントしてもよければ、上のコマンドのオプションに

-v /path/to/my-data:/var/lib/mysql:rw

などを追加。

データボリュームコンテナを使って運用するとか、たまに取り出したい程度であれば、別途一過性のコンテナで吸い出します。

docker run --rm -i -t \
  --volumes-from=my-db \
  -v $(pwd):/host-dir:rw \
  busybox \
  tar czf /host-dir/mysql-data.tar.gz /var/lib/mysql

解説という名の蛇足

※ ここからMySQL自体の細かい話になるので、興味がある方だけどうぞ。

本題からちょっと逸れますが、 MySQL のパラメータに何を指定してるかを軽く解説します。
これらのパラメータはアンダースコア区切りにすれば my.cnf の設定と同じです。

生で確認したければ docker run --rm -it mysql:5.6 --verbose --help

一般ログを取る

--general-log=true
--general-log-file=/dev/stdout

この例では標準出力にしてますが MySQL 実行ユーザーが書き込めるフルパスを指定してファイル出力も可。

遅いクエリのログを取る

--slow-query-log=true
--slow-query-log-file=/dev/stdout
--long-query-time=1

一般ログ同様、ファイル出力も可。
この例では1秒以上かかるクエリを取るようにしています。

(MySQL 5.5.14+) 767 bytes より大きい INDEX を貼れるようにする

割りと踏み抜いた人も多いであろう ERROR 1071 の地雷。

--innodb-file-format=Barracuda
--innodb-file-per-table=true
--innodb-large-prefix=true

これをいれておくと、 ROW_FORMAT=[DYNAMIC|COMPRESSED] なテーブルであれば 3072 bytes までの INDEX を貼れるようになります。

(MySQL 5.6.?) メモリ消費を抑える

パフォーマンススキーマの無効化と、 MySQL Bugs: #68287 対策。

--performance-schema=false
--table-definition-cache=400

パフォーマンススキーマはその名の通りパフォーマンス測定に有効な機能を提供するためのスキーマなので、使いたい場合は true でいいと思います。(指定しない場合はデフォで true)

table-definition-cache は 400~1400 の値を取り、キャッシングするテーブル定義の数を指定します。デフォルト値は400のはずですが、5.6.xのほとんどで1400になっている模様。

他のテーブルキャッシュと違って、ファイルディスクリプタではなくメモリを使うため、最小値に下げておくことで大幅にメモリ消費量が減ります。具体的には 400MB とか食ってたのが 数十MB まで下がるほどの効果。


以上です。

誤りの指摘や追加情報等は、随時コメント or 編集リクエストでお寄せください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away