スマートスタイル TECH BLOG|データベース&クラウドの最新技術情報を配信

MySQL8.0 小ネタ集

この記事では、MySQL8.0について調査している中で分かった些細な内容を、小ネタ集としてまとめてみました。

1. バイナリログを無効にしたいときは

17.1.6.4 Binary Logging Options and Variables

Binary logging is enabled by default, with the log_bin system variable set to ON.

上記のマニュアルの通り、MySQL8.0から、バイナリログがデフォルトで有効になりました。これにより特に意識しなくてもレプリケーションを使うことができますし、障害発生後のPITRなどでも役立ちます。

しかし、テスト環境やリソースに制限がある環境などでは、バイナリログを無効にしたいという要望もあるかと思います。これまでであれば、my.cnf に “log_bin” パラメータを書かなければよかったのですが、8.0からはそうもいきません。
また、”log_bin = OFF” や “log_bin = 0” といったパラメータを設定すると、『OFF.000001』のような名前のバイナリログが生成されてしまいます。

MySQL8.0でバイナリログを無効にする場合は、my.cnf に “disable-log-bin”(もしくは”skip-log-bin”)というパラメータを記載します。または、mysqld の起動時に –disable-log-bin オプションを指定しても構いません。

2. コンポーネントとは?

これまでMySQLで特定の機能を追加したい場合は、以下のように「Plugin」(プラグイン)を使用するのが一般的でした。

MySQL8.0からは、上記に加え「Components」(コンポーネント)という機能が追加されました。両者は基本的に同じようなものですが、Componentsはプラットフォームの種類に左右されずにインストールできるというメリットがあるようです。

5.5 MySQL Server Components

This means that a given INSTALL COMPONENT statement can be executed uniformly across platforms.

現在有効となっているコンポーネントの確認は、以下のクエリで行います。初期状態では「component_validate_password」のみが有効となっています。これはMySQL5.7で導入されたvalidate_passwordプラグインの後継です。

コンポーネントの場合、設定する変数名もプラグインとは異なります。component_validate_passwordの場合は以下のようになります。設定の変更は引き続き SET GLOBAL文で行うことができます。

※ その他、詳細については下記のマニュアルを参照してください。
6.5.3 The Password Validation Component

また、コンポーネントのインストール / アンインストール方法は以下の通りです。

3. Undoログの自動拡張がデフォルト有効に

素の状態の MySQL5.7 と MySQL8.0 のデータディレクトリを見比べてみると、MySQL8.0には「undo_001」なるファイルが作られていることに気が付きます。

これは、MySQL8.0から innodb_undo_tablespaces 変数のデフォルト値が「0」から「2」に変更になったことが原因です。このパラメータ変数は、Undoログの切り捨て機能で使用されます。
従来のMySQLでは長時間実行されるトランザクションなどがあると、Undoログが肥大化してしまい、元に戻すことは難しいケースが多くありました(MySQLの再起動が必要)。しかし、上記の機能を使えばUndoログのみ共通テーブルスペース(ibdata1)から切り離すことができ、なおかつMySQLが自動で肥大化した領域を削除するようになります。これにより、MySQL運用者の負担は軽減されるのではないでしょうか。

4. 予約語がテーブルで管理される

MySQL自体がシステム上使用する英単語などは、予約語とされテーブル名などに使用できません。従来は予約語に関しては内部的に管理されており、触れることができませんでしたが、MySQL8.0からは information_schema の KEYWORDS テーブルで管理されるようになりました。

このKEYWORDSテーブルを改変しようとしても、以下のようにrootユーザでも権限で弾かれます。

ちなみに、以下のようにオブジェクト名を引用符で囲ってしまえば、例え予約語であっても使用できてしまいます。もちろん、推奨はしません。

5. MySQL5.7 / MySQL8.0 のデータディレクトリ比較

最後にMySQL5.7とMySQL8.0のデータディレクトリを比較してみましょう。両者ともOracle公式のyumリポジトリでインストールしており、my.cnfは変更していません。

※ バージョンは MySQL8.0.11 / MySQL 5.7.22 です

まずはデータディレクトリ内の使用データ量です。MySQL8.0の方が30MBほど大きいのが分かります。

次にデータディレクトリ内に含まれるファイル / ディレクトリを比較します。
ls -R でデータディレクトリ内に存在する全ファイルの一覧を出力し、diffコマンドで比較します。
(件数が多いので一部省略しています)

気になる点をいくつかピックアップします。

  • MySQL8.0は log_bin がデフォルト有効なので、バイナリログが作成されています。
  • MySQL5.7には .frm / .MYD / .opt などのファイルがありますが、MySQL8.0は .ibd ファイルのみになっています。これは、MySQL8.0からシステムテーブル(mysqlスキーマ)がInnoDBになり、なおかつInnoDBのデータディクショナリの構成が変更になったためです。
  • MySQL8.0 には .sdi というファイルが作成されています。このファイルは、「Serialized Dictionary Information」と呼ばれ、従来のメタファイルと同等の内容が含まれています。なおInnoDBテーブルでは作成されません。

まとめ

GA版のリリースノートの長さから分かる通り、MySQL8.0にはかなり大きな改良が加えられています。その全貌を明らかにするにはまだまだ時間も紙面も足りませんが、今後も少しずつ情報発信できればと思います。


MySQL

 

Return Top