はじめに
MySQL Database Service(MDS) は Oracle Cloud Infrastructure(OCI) で使用できるフルマネージド・データベース・サービスです。その性質上、バイナリパッケージやディスク構成の管理など、基盤側の設定については考慮することなく MySQL を使用することが可能であり、利便性に優れています。
一方で、設定ファイル(my.cnf)の記載や初期パラメータなど、普段クラウド環境でフルマネージド・データベース・サービスを使用されていない方にとっては、どのように設定されているのか見えづらくなっている部分があり、少々不安を持たれるかもしれません。
今回はこうした疑問点について、実際に MDS を立ち上げて、どのような設定や変更ができるのかなどの基本的な内容を確認してみたいと思います。
検証内容
環境
今回、以下の 2 つの環境で比較をおこないました。
- MySQL Database Service(MDS)
- バージョン : MySQL 8.0.23 (最新のバージョンが自動でインストールされます)
- スペック : MySQL.VM.Standard.E3.1.8GB(OCPU 1 コア / メモリー 8GB)
- CentOS 7 上の MySQL 環境
- バージョン : MySQL 8.0.23
- スペック : vCPU 1 コア / メモリー 8GB
初期構築時点で異なるパラメーター
ファイルパスなど環境によって異なる可能性があるパラメータを除くと、初期構築時点で 73 個ほど異なるパラメーターが存在していました。そのなかでも、特に気になったパラメーターについて以下に記載しています。
- core_file = ON (デフォルト値 : OFF)
障害発生時のコアファイルの取得が有効になっているようです。何か問題が発生した際に調査をおこなうためでしょうか。なお、innodb_buffer_pool_in_core_file は無効になっていたため、パフォーマンスへの影響はそれほどなさそうです。 -
disabled_storage_engines = MyISAM,MRG_MYISAM,FEDERATED,CSV,ARCHIVE,BLACKHOLE,MEMORY,NDB (デフォルト値 : empty)
実質的に InnoDB ストレージエンジンしか使用できないようになっています。今ではほぼ影響はないかと思いますが、念のため注意が必要です。 -
innodb_adaptive_hash_index = OFF (デフォルト値: ON)
適応型ハッシュインデックス(AHI) が無効になっています。有効にすることでセマフォロック競合が発生する環境は多いため、あらかじめ無効にしているようです。 -
innodb_buffer_pool_size = 2GB (デフォルト値 : 128MB)
innodb_buffer_pool_instances とあわせて、インスタンスサイズ(シェイプ)によって自動調整がおこなわれているようです。搭載されているメモリーに対してかなり余裕をもって設定されているので、必要に応じて引き上げても良いかと思います。 -
innodb_io_capacity = 2000 (デフォルト値 : 200)
innodb_io_capacity_max とあわせて、バックグラウンドスレッドの I/O 数の制限がデフォルト値から大きく引き上げられています。シェイプに応じて値が増えていくようです。 -
local_infile = ON (デフォルト値 : OFF)
LOAD DATA コマンドの LOCAL オプションが許容されています。また、secure_file_priv が NULL に設定されているため、MySQL サーバー内にデータのエクスポートはできない設定になっています。 -
max_connect_errors = 18446744073709500000 (デフォルト値 : 100)
ユーザー認証エラーの許容数がほぼ最大に引き上げられています。基本的に MDS はプライベートネットワーク内からしか接続できないため、セキュリティリスクは低いという判断なのでしょうか。なお、max_connections は 500 でしたが、シェイプに応じて値が増えていくようです。 -
temptable_use_mmap = OFF (デフォルト値 : ON)
TempTable ストレージエンジンがディスク上の内部テーブルを mmap() を使用してメモリーにマッピングせず、InnoDB ストレージエンジンを使用する設定になっています。 -
version = 8.0.23-cloud (デフォルト値 : 8.0.23-commercial)
オンプレミス MySQL との完全互換と言われていますが、表記上はクラウド専用のバージョンという扱いのようです。調査時などで環境を識別する際には役立ちそうです。
この他にも、各種バッファ領域の値やディスク周りの設定などは、シェイプに合わせて適切に調整されていくように見受けられました。
なお、MDS の設定項目については、ナビゲーションメニューの「MySQL -> 構成」から、各シェイプを立ち上げた際のデフォルト値を確認することができるようになっています。ここに記載されているパラメーターは、基本的に通常の MySQL のデフォルト値から変更になっているパラメーターがまとめられているため、興味のある方はご確認いただければと思います。
設定の変更方法(GUI)
MDS の各設定値を変更するために、構築時に作成したユーザーでグローバルレベルでの変更を試みても、適切な権限がないためエラーになってしまいます。なお、セッションレベルであればシステム権限は不要なので実行することが可能です。
1 2 |
mysql> SET GLOBAL innodb_buffer_pool_size=5*1024*1024*1024; ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation |
そのため、グローバルレベルでサーバーの設定変更をおこないたい場合は、以下の手順でインスタンスに適用させるための構成(設定ファイル)を作成および変更して、MDS インスタンスを再起動させる必要があります。
1. まず、ナビゲーションメニューの「MySQL -> 構成」から、「MySQL 構成の作成」を選択します。
2. 「MySQL構成の作成」ダイアログが表示されるため、構成の名前や対象とするシェイプを選択してから、「次」を選択します。
なお、対象とするシェイプと MDS インスタンスのシェイプが一致していないと、構成を適用することができないので注意してください。
3. 「変数名」プルダウンから設定したい変数を選択して、「変数値」を選択します。「+別の変数」を選択することで、他のシステム変数を追加することができます。
4. 「作成」を押すと、指定したコンパートメント内に MySQL の構成が新しく作成されます。
5. 「MySQL -> MySQL DB システム」から構成を変更したいインスタンスを選択して、「編集」を選択します。
6. 「MySQL DB システムの編集」ダイアログが表示されるため、「構成の選択 -> 構成の変更」を選択します。
7. 先ほど作成した構成を選択して、「構成の選択」を選択します。
8. 「変更の保存」を選択することで、インスタンスが再起動して、新しい構成が反映されます。
変更できる内容
2021 年 2 月 9 日時点において、設定できる MDS のシステム変数は以下の通りです。
- autocommit
- completion_type
- connect_timeout
- cte_max_recursion_depth
- default_authentication_plugin
- foreign_key_checks
- group_replication_consistency
- information_schema_stats_expiry
- innodb_buffer_pool_size, innodb_buffer_pool_instances
- フルテキストインデックス関連 : innodb_ft_enable_stopword, innodb_ft_max_token_size, innodb_ft_min_token_size, innodb_ft_num_word_optimize, innodb_ft_result_cache_limit, innodb_ft_server_stopword_table
- innodb_lock_wait_timeout
- innodb_max_purge_lag, innodb_max_purge_lag_delay
- local_infile
- mandatory_roles
- max_connections, max_connect_errors
- max_execution_time
- max_prepared_stmt_count
- mysql_firewall_mode
- X プロトコル関連 : mysqlx_deflate_default_compression_level, mysqlx_deflate_max_client_compression_level, mysqlx_lz4_default_compression_level, mysqlx_lz4_max_client_compression_level, mysqlx_zstd_default_compression_level, mysqlx_zstd_max_client_compression_level
- parser_max_mem_size
- sql_mode
- sql_require_primary_key
- sql_warnings
- transaction_isolation
何故か含まれている group_replication_consistency が気になるところではあります。後々 Group Replication を実装するための準備でしょうか。
なお、innodb_buffer_pool_size を各シェイプの搭載メモリー以上の値にしても特にエラーは出力されないため、誤って大きな値に設定しないようにご注意ください。
CLI での構成の作成方法
構成を作成する場合、CLI を利用して JSON 形式のファイルを読み取らせることも可能です。
なお、CLI の利用開始方法については公式リファレンスに記載されているので、そちらをご確認いただければと思います。
CLI で構成を作成する場合、まずは以下のように "name":value
形式のシステム変数のリストファイルを作成します。
1 2 3 4 5 |
{ "autocommit": true, "connect_timeout": 20, "sql_require_primary_key": true } |
その後、以下のようなコマンドを実行することで、新しい構成を作成することができます。
1 2 3 4 5 |
oci mysql configuration create -c <compartment_ocid> --shape-name VM.Standard.E2.1 --display-name UserConfig001 --description "this is a user-defined configuration" --variables file://config.json |
それぞれのオプションの意味は以下の通りです。
- c(compartment-id) : 構成を作成するコンパートメントの OCID
- shape-name : 構成の対象となるシェイプ名
- display-name : 構成の表示名
- description : コメント
- variables : 読み取らせるファイル名やシステム変数のリスト
なお、variables は以下のように、直接値を記入しても問題ありません。
1 2 |
(...省略...) --variables '{ "autocommit": true, "connect_timeout": 20, "sql_require_primary_key": true }' |
作成に成功すると、以下のような出力があり、結果を確認することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
{ "data": { "compartment-id": "ocid1.compartment.oc1..******************************", "defined-tags": { "Oracle-Tags": { "CreatedBy": "*-******@*-*****.co.jp", "CreatedOn": "2021-02-09T05:33:29.960Z" } }, "description": "this is a user-defined configuration", "display-name": "UserConfig001", "freeform-tags": {}, "id": "ocid1.mysqlconfiguration.oc1.******************************", "lifecycle-state": "ACTIVE", "parent-configuration-id": "ocid1.mysqlconfiguration.oc1..******************************", "shape-name": "VM.Standard.E2.1", "time-created": "2021-02-09T05:33:29.963000+00:00", "time-updated": "2021-02-09T05:33:29.963000+00:00", "type": "CUSTOM", "variables": { "autocommit": true, "binlog-expire-logs-seconds": 3600, "completion-type": null, "connect-timeout": 20, "cte-max-recursion-depth": null, "default-authentication-plugin": null, "foreign-key-checks": null, "generated-random-password-length": null, "information-schema-stats-expiry": null, "innodb-buffer-pool-instances": 4, "innodb-buffer-pool-size": 2684354560, "innodb-ft-enable-stopword": null, "innodb-ft-max-token-size": null, "innodb-ft-min-token-size": null, "innodb-ft-num-word-optimize": null, "innodb-ft-result-cache-limit": 33554432, "innodb-ft-server-stopword-table": null, "innodb-lock-wait-timeout": null, "innodb-max-purge-lag": null, "innodb-max-purge-lag-delay": 300000, "local-infile": true, "mandatory-roles": "public", "max-connections": 500, "max-execution-time": null, "max-prepared-stmt-count": null, "mysql-firewall-mode": null, "mysql-zstd-default-compression-level": null, "mysqlx-connect-timeout": null, "mysqlx-deflate-default-compression-level": null, "mysqlx-deflate-max-client-compression-level": null, "mysqlx-document-id-unique-prefix": null, "mysqlx-enable-hello-notice": null, "mysqlx-idle-worker-thread-timeout": null, "mysqlx-interactive-timeout": null, "mysqlx-lz4-default-compression-level": null, "mysqlx-lz4-max-client-compression-level": null, "mysqlx-max-allowed-packet": null, "mysqlx-min-worker-threads": null, "mysqlx-read-timeout": null, "mysqlx-wait-timeout": null, "mysqlx-write-timeout": null, "mysqlx-zstd-default-compression-level": null, "mysqlx-zstd-max-client-compression-level": null, "parser-max-mem-size": null, "query-alloc-block-size": null, "query-prealloc-size": null, "sql-mode": null, "sql-require-primary-key": true, "sql-warnings": null, "transaction-isolation": null } }, "etag": "******************************" } |
このとき、variables の内容が GUI で設定できる内容と少しずれています。以下の値については、値の指定はできるものの、現時点では実際の構成には反映されないため、設定しても意味がない点にご注意ください。
- generated_random_password_length
- mysql_zstd_default_compression_level ※存在しないシステム変数
- mysqlx_connect_timeout
- mysqlx_document_id_unique_prefix
- mysqlx_enable_hello_notice
- mysqlx_max_allowed_packet
- mysqlx_min_worker_threads
- mysqlx_read_timeout
- mysqlx_wait_timeout
- mysqlx_write_timeout
- query_alloc_block_size
- query_prealloc_size
まとめ
ここまで、MDS で設定できるシステム変数やその反映方法について確認してきました。
設定できる項目はシステム変数全体から見ると多くはないですが、オンプレミス環境で考慮が必要な値の多くを、シェイプに応じて透過的に設定することができるのは大きな利点であるかと思います。
また、デフォルトの MySQL から変更されているパラメーターについては構成から確認することができるので、変更されている内容が簡単にチェック可能なのも、安心できる点かと思います。
最近の MySQL のリリースを見ていると、MDS を意識しているようなパラメーターや機能の更新が散見されます。そのため、これからますます活発になっていくであろう MDS の動向には、是非注目していきたいところです。