pyてよn日記

一寸先は闇が人生

MySQL チートシート

MySQL で使うコマンドで忘れやすいものをまとめる。随時更新。

from command line

コマンドラインで実行する MySQL に関連するコマンド

ホスト、ユーザ名、パスワード、DB を指定して REPL を起動

  • 注意
    • -u-p オプションに指定するユーザ名、パスワード名はオプションとくっつける。例えば、ユーザ名が myuser のとき、-u myuser ではなく、-umyuser のようにオプションと引数の間にスペースを空けないようにする。
# e.g. ローカルで起動している MySQL サーバの REPL を起動
# ホスト:127.0.0.1、ユーザ名:myuser、パスワード:mypass、DB:test_db
mysql -h 127.0.0.1 -umyuser -pmypass test_db

特定の DB に対して SQL ファイルを実行

mysql -h 127.0.0.1 -umyuser -pmypass test_db < init.sql

in REPL

MySQL の REPL で実行するコマンド

MySQLタイムゾーンのチェックと変更

-- 現在の日時を表示
mysql> select current_timestamp;

-- 現在のタイムゾーンを表示
mysql> show variables like '%time_zone%';

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
  • タイムゾーンの変更
    • /etc/mysql/my.cnf(または /etc/mysql/conf.d/my.cnf)に以下のような設定を記述し、MySQL を再起動する。
[mysqld]
default-time-zone = 'Asia/Tokyo'

再起動後、もう一度現在のタイムゾーンを表示。

mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+

CSV、TSV ファイルから DB にデータを入れる

  • infile の引数として CSV、TSV ファイルの絶対パスを指定する。
  • fields terminated by '◯' でセパレータを指定する。CSV なら ','、TSV なら '\t' と記述する。
# csv
load data local infile '/docker-entrypoint-initdb.d/data/book.csv' into table book fields terminated by ','  lines terminated by '\n';

# tsv
load data local infile '/docker-entrypoint-initdb.d/data/stock.tsv' into table stock fields terminated by '\t' lines terminated by '\n';

エラーハンドリング:Loading local data is disabled...

以下のようにデータを CSV、TSV ファイルから DB に入れようとしたとき、以下のようなエラーが起きた。

$ mysql --local-infile=1 -umyuser -pmypass practice_prisma < /docker-entrypoint-initdb.d/05_load_data.sql 
ERROR 3948 (42000) at line 5: Loading local data is disabled; this must be enabled on both the client and server sides

セキュリティ上の問題を回避するための挙動である。詳しくは以下を参照。

stackoverflow.com

mita2db.hateblo.jp

回避方法は以下。セキュリティ的に問題があるので、本番環境ではやらないこと。

エラーメッセージに習い、サーバ側(この場合、REPL)、クライアント側(この場合、シェル)からファイルをロードできるように設定を変更する。

  • サーバ側
mysql> SET GLOBAL local_infile=1;
  • クライアント側
    • --local-infile=1 というオプションを付けて、もう一度 load data infile ... を実行する。
mysql --local-infile=1 -umyuser -pmypass practice_prisma < /docker-entrypoint-initdb.d/05_load_data.sql 

エラーが出なければ、ちゃんと CSV、TSV から DB にデータが入っているはずであるので、確認すれば OK。