MySQL

About

アイコンはイルカ。

Docker

公式イメージ: https://hub.docker.com/_/mysql

InnoDB

MySQL 5.1ぐらいからデフォルトのストレージエンジンになった。
MySQL 5.7からシステムテーブルでも使われるようになった。

ロック

データ構造

CLI Options

https://dev.mysql.com/doc/refman/8.0/en/option-file-options.html

サーバ、クライアント両対応のオプションっぽい。

Option機能
--defaults-filemy.cnfなどの設定ファイル。これを指定すると一部の例外を除き他の設定ファイルを読まなくなる
--defaults-extra-filemy.cnfなどの設定ファイル。グローバルオプションファイルを読んだ後、ログインパスのファイルを読む前に読み込まれる

NOTE:

  • --defaults-file 等のオプションは他のオプションハンドリングにも関わるから、他のオプションよりも前に指定しないといけない、とドキュメントに書かれている

Because these options affect option-file handling, they must be given on the command line and not in an option file. To work properly, each of these options must be given before other options, with these exceptions:

Specs

CHARSETとCOLLATE

ドキュメント:

キーワード:

  • 🍣🍺問題, ハハパパ問題

SQLでの確認方法:

-- charset
show variables like 'chara%';
-- collation
show variables like 'collation%';

クライアントでの指定

いくつか設定方法がある:

  • my.cnf での指定
  • 接続後にSQLで指定:
    • SET NAMES '<charset>' [COLLATE '<collation>'] <- 基本、これでよさそう

SQL Mode

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

サーバのSQLモード。

  • NO_ZERO_DATE0000-00-00 を日付として許可しない。

権限

https://dev.mysql.com/doc/refman/8.0/en/grant.html

GRANT文やREVOKE文で指定できる権限。

権限付与可能レベル意味
PROCESSグローバルユーザーが SHOW PROCESSLIST を使用してすべてのプロセスを表示できるようにする

INFORMATION_SCHEMA

https://dev.mysql.com/doc/refman/5.6/ja/information-schema.html

メタデータDB

COLUMNS

https://dev.mysql.com/doc/refman/5.6/ja/information-schema-columns-table.html

Features

オンラインDDL

MySQL 5.5 or MySQL 5.1 with InnoDB Pluginで、CREATE/DROP INDEX時にテーブルコピーを行わないように最適化された。
これは高速インデックス作成と呼ばれた。 5.6では更に多くのALTER TABLE操作をテーブルコピーなしでできるようになってる。

How-to

データベースの Rename をどうやるか

  • DB 名指定で RENAME TABLE
    • RENAME TABLE prev_database.t TO new_databaes.t;
  • mysqldump して restore

参考: How to Rename a Database in MySQL | Chartio

遅延レプリケーション

MySQL5.6以降の場合、Slave側で以下を実行:

CHANGE MASTER TO MASTER_DELAY = N; -- Nは正の整数

参考:

タイムゾーンの設定

SQLで変更する場合:

-- SUPER権限があれば、サーバグローバルの設定を変えることができる
-- 稼働中のシステムで実行する場合は最大の注意が必要
SET GLOBAL time_zone = <timezone>;

-- クライアントはセッションごとにタイムゾーン設定を変更できる
SET time_zone = <timezone>;

参考:

Topics

接続のタイムアウトに関する設定

色々パラメータがあって混乱しがちなのでまとめたい。

サーバ側

See https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html

  • net_read_timeout … 接続からデータ読み込みに失敗したら切断
  • net_write_timeout … 接続に対してデータ書き込みに失敗したら切断
  • wait_timeout … クライアントがアイドルになったら切断
  • interactive_timeout … インタラクティブセッションにおけるwait_timeout
  • net_retry_count … 通信失敗時のリトライ回数

参考:

クライアント側

See https://dev.mysql.com/doc/refman/5.6/ja/mysql-options.html

  • MYSQL_OPT_CONNECT_TIMEOUT … サーバにつながらないときにタイムアウト
  • MYSQL_OPT_READ_TIMEOUT … 接続からデータ読み込めないときにタイムアウト
  • MYSQL_OPT_WRITE_TIMEOUT … 接続にデータ書き込めないときにタイムアウト
  • MYSQL_OPT_RECONNECT … 接続が切れたと判断したら再接続

PerlやRubyのクライアントではよく connect_timeout, read_timeout といった接続時のオプションになっている。

タイムゾーン

  • TIMESTAMPはUNIX TIMESTAMP値を保持しており、タイムゾーンによって日時が変わる
  • DATETIMEはタイムゾーンも含めて値を保持している

参考:

Versions

EOL

MySQL :: MySQL Product Support EOL Announcements

参考:

8

8.0.21

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html

  • mysqldumpに PROCESS 権限が必要に(または --no-tablespaces オプション指定)

8.0.16

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html

  • global / schema / tablespaceレベルでDEFAULT ENCRYPTIONを設定可能に

参考:

最終更新 2020-09-15: [mysql] Add EOL info (7293a2970)