MySQL道普請便り
第122回 DockerでMySQLをもっと便利に活用してみる
本連載でも,
検証環境
今回はMacでDocker for Macを利用して検証を行っております。また,
初期値のロードを自動化したい
第113回 anemoeaterを使ってスローログを可視化してみるでは,--secure-file-priv
を起動時に設定して起動していました。--secure-file-priv
は,
以下の起動コマンドでは--secure-file-priv
に/tmp
を指定しているので,/tmp
配下にマウントされたファイルを任意にロードすることができるようになります。
docker run --name michibushin -v "/tmp:/tmp" -v "$PWD/config:/etc/mysql/conf.d" -v "$PWD/logs/mysql:/var/log/mysql" -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 -d mysql:8.0.18 --secure-file-priv=/tmp
起動後にMySQLにログインして,
この方法でも,
対象となるディレクトリは/docker-entrypoint-initdb.
で,.sh
,.sql
,.sql.
,.sql.
のファイルが実行されます。該当するファイルが複数ある場合の実行の順番はアルファベット順で実行されるので,
前回までと同様に,/docker-entrypoint-initdb.
にマウントするディレクトリを以下のように作成します。
$ ls docker-entrypoint-initdb.d 1_ddl.sql 2_load_data_infile.sql KEN_ALL_UTF8.CSV
続いて,
$ cat 1_ddl.sql DROP SCHEMA IF EXISTS zipcode; CREATE DATABASE zipcode CHARACTER SET utf8mb4; use zipcode; CREATE TABLE zipcode.zipcode( code varchar(12) NOT NULL, old_zipcode varchar(5) NOT NULL, zip_code varchar(7) NOT NULL, prefecture_kana varchar(255) NOT NULL, city_kana varchar(255) NOT NULL, town_kana varchar(255) NOT NULL, prefecture varchar(128) NOT NULL, city varchar(128) NOT NULL, town varchar(128) NOT NULL ) DEFAULT CHARACTER SET= utf8mb4;
上記の1_
は,
$ cat 2_load_data_infile.sql LOAD DATA INFILE '/docker-entrypoint-initdb.d/KEN_ALL_UTF8.CSV' INTO TABLE zipcode.zipcode FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (code, old_zipcode, zip_code, prefecture_kana, city_kana, town_kana, prefecture, city, town, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy);
上記の2_
では,
最後にKEN_
ですが,.CSV
のため実行されることはありません。
この状態で以下のように実行をしてMySQLを起動してみましょう。今回ロードしたいデータは/docker-entrypoint-initdb.
に存在しているので,--secure-file-priv
の指定を変更します。
$ docker run --name michibushin -v "$PWD/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 -d mysql:8.0.20 --secure-file-priv=/docker-entrypoint-initdb.d
この状態で起動すると,
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | zipcode | +--------------------+ 5 rows in set (0.00 sec) mysql> show tables; +-------------------+ | Tables_in_zipcode | +-------------------+ | zipcode | +-------------------+ 1 row in set (0.00 sec) mysql> select COUNT(*) from zipcode; +----------+ | COUNT(*) | +----------+ | 124340 | +----------+ 1 row in set (0.10 sec)
DockerのMySQLクライアントで日本語を扱う方法
新規環境やMySQLを初めて評価する場合などに,
特に今の時期だと,
ただ,
- ターミナルに日本語の入力ができない
- 日本語の出力が文字化けする
実際にdockerで起動したコンテナ内部に入り,?
になってしまい,
mysql> select * from zipcode limit 1; +-------+-------------+----------+-----------------+--------------+-----------------+------------+--------+------------+ | code | old_zipcode | zip_code | prefecture_kana | city_kana | town_kana | prefecture | city | town | +-------+-------------+----------+-----------------+--------------+-----------------+------------+--------+------------+ | 01101 | 060 | 0600000 | ??????? | ???????????? | ??????????????? | ??? | ?????? | ?????????? | +-------+-------------+----------+-----------------+--------------+-----------------+------------+--------+------------+ 1 row in set (0.00 sec)
これらの問題の原因は,
Dockerfile
FROM mysql:8.0.20
RUN apt-get update
RUN apt-get -y install locales-all
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ビルドからMySQLの起動までを以下にまとめます。
$ docker build -t mysql_with_utf . $ docker run --name michibushin -v "$PWD/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 -d mysql_with_utf --secure-file-priv=/docker-entrypoint-initdb.d $ docker exec -it michibushin /bin/sh # mysql -uroot -pmy-secret-pw zipcode mysql >
上記の操作で,
続いて,
mysql> select * from zipcode limit 1; +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+ | code | old_zipcode | zip_code | prefecture_kana | city_kana | town_kana | prefecture | city | town | +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+ | 01101 | 060 | 0600000 | ホッカイドウ | サッポロシチュウオウク | イカニケイサイガナイバアイ | 北海道 | 札幌市中央区 | 以下に掲載がない場合 | +-------+-------------+----------+-----------------------+--------------------------------------+-----------------------------------------------+------------+--------------------+--------------------------------+ 1 row in set (0.00 sec)
ということで,
まとめ
今回は,
バックナンバー
MySQL道普請便り
- 第138回 オンラインスキーママイグレーションツール gh-ostを使ってみよう[その1]
- 第137回 MySQLTunerを使ってチューニングの足がかりを見つけてみる
- 第136回 CHECK制約を利用してみよう
- 第135回 MySQL 8.0で追加されたoptimizer_switchのフラグについて
- 第134回 DDLと暗黙的なコミットについて
- 第133回 Partial Revokesによる権限の一部剥奪について
- 第132回 Internal Temporary Table(内部テンポラリテーブル)について[その2]
- 第131回 mysqldumpslowを使ってスロークエリログを解析してみる
- 第130回 クエリをプロファイリングしてみる
- 第129回 Internal Temporary Table(内部テンポラリテーブル)について[その1]