サーバーの起動時に --innodb-read-only
構成オプションを有効にすることで、MySQL データディレクトリが読取り専用メディアにある InnoDB
テーブルをクエリーすることができます。
有効にする方法
読み取り操作用にインスタンスを準備するには、必要なすべての情報が読み取り専用メディア上に格納される前に、データファイルにフラッシュされることを確認します。 変更バッファーが無効になっている (innodb_change_buffering=0
) サーバーを実行し、低速シャットダウンを実行します。
MySQL インスタンス全体にわたって読み取り専用モードを有効にするには、サーバーの起動時に次の構成オプションを指定します。
--innodb-read-only=1
インスタンスが DVD や CD などの読み取り専用メディア上にある場合、または
/var
ディレクトリがすべてのユーザーから書き込み可能でない場合:--pid-file=
およびpath_on_writeable_media
--event-scheduler=disabled
-
--innodb-temp-data-file-path
。 このオプションは、InnoDB
一時テーブルスペースデータファイルのパス、ファイル名およびファイルサイズを指定します。 デフォルト設定はibtmp1:12M:autoextend
で、ibtmp1
一時テーブルスペースデータファイルがデータディレクトリに作成されます。 読取り専用操作のためにインスタンスを準備するには、innodb_temp_data_file_path
をデータディレクトリ外の場所に設定します。 パスは、データディレクトリに対する相対パスである必要があります。 例:--innodb-temp-data-file-path=../../../tmp/ibtmp1:12M:autoextend
MySQL 8.0 の時点では、innodb_read_only
を有効にすると、すべてのストレージエンジンのテーブルの作成および削除操作が防止されます。 これらの操作により、mysql
システムデータベースのデータディクショナリテーブルが変更されますが、これらのテーブルは InnoDB
ストレージエンジンを使用し、innodb_read_only
が有効な場合は変更できません。 ANALYZE TABLE
、ALTER TABLE
など、データディクショナリテーブルを変更する操作にも同じ制限が適用されます。
tbl_name
ENGINE=engine_name
また、mysql
システムデータベースの他のテーブルでは、MySQL 8.0 の InnoDB
ストレージエンジンが使用されます。 これらのテーブルを読取り専用にすると、テーブルを変更する操作が制限されます。 たとえば、CREATE USER
, GRANT
, REVOKE
および INSTALL PLUGIN
操作は読取り専用モードでは許可されません。
使用シナリオ
この操作モードは、次のような状況に適しています。
DVD や CD などの読み取り専用ストレージメディア上に、MySQL アプリケーションまたは MySQL データセットを配布する。
(一般に、データウェアハウス構成で) 同じデータディレクトリで同時にクエリーを実行する複数の MySQL インスタンス。 この方法を使用すれば、負荷の高い MySQL インスタンスで発生する可能性のあるボトルネックを回避したり、さまざまなインスタンスに対してさまざまな構成オプションを使用して、特定の種類のクエリーを個別に調整したりできる場合があります。
安全性またはデータの完全性の理由により読み取り専用の状態になったデータ (アーカイブされたバックアップデータなど) のクエリーを実行する。
この機能の目的は、読み取り専用の側面に基づいた生のパフォーマンスではなく、主に配布および配備する際の柔軟性です。 サーバー全体を読み取り専用にする必要なしで、読み取り専用クエリーのパフォーマンスを調整する方法については、セクション8.5.3「InnoDB の読み取り専用トランザクションの最適化」を参照してください。
動作
--innodb-read-only
オプションを使用して、サーバーが読み取り専用モードで実行されると、特定の InnoDB
機能およびコンポーネントが減少したり、完全に無効になったりします。
変更バッファー (特に、変更バッファーからのマージ) は実行されません。 読み取り専用操作用にインスタンスを準備するときに、変更バッファーが空になっていることを確認するには、変更バッファーを無効にして (
innodb_change_buffering=0
)、まず低速シャットダウンを実行します。起動時にはクラッシュリカバリフェーズがありません。 インスタンスを読み取り専用状態にする前に、低速シャットダウンが実行されている必要があります。
読み取り専用操作では Redo ログが使用されないため、インスタンスを読み取り専用にする前に、
innodb_log_file_size
を最小限のサイズ (1M バイト) に設定できます。ほとんどのバックグラウンドスレッドはオフになります。 I/O の読取りスレッドと、読取り専用モードで許可される一時ファイルへの書込み用の I/O 書込みスレッドおよびページフラッシュコーディネータスレッドは残ります。 バッファプールのサイズ変更スレッドもアクティブなままになり、バッファプールのオンラインサイズ変更が可能になります。
デッドロックに関する情報やモニターの出力などは、一時ファイルに書き込まれません。 その結果、
SHOW ENGINE INNODB STATUS
で出力が生成されなくなります。構成オプションの設定を変更すると、通常は書き込み操作の動作が変更されますが、サーバーが読み取り専用モードになっている場合は影響がありません。
分離レベルを強制的に適用する MVCC 処理が無効になります。 更新も削除もできないため、すべてのクエリーで最新バージョンのレコードが読み取られます。
Undo ログは使用されません。
innodb_undo_tablespaces
およびinnodb_undo_directory
構成オプションの設定を無効にします。