その12 - MySQL HeatWaveでリードレプリカを構成する
Oracle Cloud Infrastructure では、MySQL HeatWaveが利用できます。MySQL HeatWaveはAlways Freeの対象となっています。トライアルアカウント作成時に付与されるクレジットでも使用可能です。
このチュートリアルでは、参照処理の負荷分散を実現できるリードレプリカ(コンソールやドキュメントでの名称は「読取りレプリカ」)を構成し、動きを確認します。リードレプリカもエンドポイントもマネージドで提供されているため、簡単に利用できるのが特徴です。
所要時間 : 約50分 (約30分の待ち時間含む)
前提条件 :
- Oracle Cloud Infrastructure の環境(無料トライアルでも可) と、管理権限を持つユーザーアカウントがあること
- OCIコンソールにアクセスして基本を理解する - Oracle Cloud Infrastructureを使ってみよう(その1) を完了していること
- クラウドに仮想ネットワーク(VCN)を作る - Oracle Cloud Infrastructureを使ってみよう(その2) を完了していること
- インスタンスを作成する - Oracle Cloud Infrastructureを使ってみよう(その3) を完了していること
注意 : チュートリアル内の画面ショットについては Oracle Cloud Infrastructure の現在のコンソール画面と異なっている場合があります。
目次:
- 1. リードレプリカとは?
- 2. 本チュートリアルで作成する構成の構成図
- 3. MySQL HeatWaveの作成(ソースとなるMySQL HeatWave)
- 4. リードレプリカの作成
- 5. リードレプリカの確認(ロードバランサー経由での接続)
- 6. リードレプリカへの接続確認(リードレプリカに直接接続)
- 7. リードレプリカの確認)
リードレプリカは、参照処理を負荷分散する目的で使用される参照専用の複製です。参照処理の同時実行数が多いシステムでは、リードレプリカを使って負荷分散することが効果的です。
MySQL HeatWaveのリードレプリカは非同期レプリケーションを使って構成されています。このためリードレプリカから参照したデータは最新のデータでは無い可能性があることに注意して下さい。ソースのノードで更新したデータは随時リードレプリカに伝搬されるため、参照処理をリードレプリカで処理しても問題ないケースが多いです。ただし、必ず最新のデータを参照する必要がある処理についてはソースのノードから参照する必要があります。
リードレプリカへのアクセス方法は、以下2つの方法があります。なお、ロードバランサーの設定は自動化されているため、ユーザーがロードバランサーの存在や設定を意識する必要はありません。
- ロードバランサーを経由してアクセスする。この場合、接続先はリードレプリカ全体でロードバランスされる。
(Amazon Auroraのリーダーエンドポイントに相当) - リードレプリカ毎に設定されたエンドポイント(プライベートIPアドレス)を使用してアクセスする。この場合、それぞれのリードレプリカに直接接続する。
(Amazon Auroraのインスタンスエンドポイントに相当)
また、リードレプリカに関して、本チュートリアル作成時点(2025年9月時点)で以下の制限事項があります。
リードレプリカの制限事項(2023年3月時点)
- ソースとなるMySQL HeatWaveはECPUが8以上またはOCPUが4以上のシェイプが必要
- リードレプリカの個数は最大18個まで
- ロードバランサーからリードレプリカにアクセスするための帯域は最大8Gbps
- Oracle Cloud Infrastructureネットワーク・ロード・バランサのバックエンド・サーバーとして構成することはできない
- IPv4のみのサブネット上に作成する必要あり
本チュートリアルでは、以下の構成を作成します。

⚠️注意: DBシステム作成時にハードウェアの構成での「HeatWaveクラスタの有効化」はオフにしておいてください。
ソースとなるMySQL HeatWaveのDBシステムを作成します。クラウドでMySQLデータベースを使う - Oracle Cloud Infrastructureを使ってみよう(その9) の手順に従ってソースとなるMySQL HeatWaveを作成します。(その9)と区別するために、MySQL HeatWaveの名前は「WriterMDS」にします。また、「2. MySQL HeatWaveのDBシステムの作成」だけでなく、「3. セキュリティリストの修正(イングレス・ルールの追加)」、「4. MySQLクライアントのインストール」、「5. 作成したMySQL HeatWaveのDBシステムの確認」まで実行し、world
データベース、world_x
データベースも作成しておきます。
この時、前述の制限事項があるためECPUが8以上またはOCPUが4以上のシェイプのMySQL HeatWaveを作成して下さい。ハードウェアの構成部分のシェイプの変更をクリックして、ECPUが8以上またはOCPUが4以上のシェイプを選択します。以下のスクリーンショットは、CPUの種類がE4、CPU数が4 OCPU、メモリーサイズが64GBのシェイプ(MySQL.VM.Standard.E4.4.64GB)を選択した例です。
⚠️注意: スクリーンショットではOCPUのシェイプを使用していますが、2026年3月13日以降、すべてのOCPUシェイプが使用できなくなります。ECPUのシェイプの利用を推奨します。




なお、現在MySQL HeatWaveでサポートされているシェイプについては、こちらのドキュメントを参照して下さい。
リードレプリカを2つ作成します。
-
先ほど作成したMySQL HeatWave(WriterMDS)をコンソールから選択し、画面左下のリソース → 読取りレプリカ をクリックします。そして表示された画面から読取りレプリカの作成をクリックします。
-
名前に「ReadReplica1」と入力し、読取りレプリカの作成をクリックします。ReadReplica1の状態が作成中になり、15分〜20分程度で状態がアクティブに変わります。また、読取りレプリカのアクティブの数が
1
になっていることも確認します。 (本ステップの待ち時間に、先行して次のステップも実行することでトータルの待ち時間を短縮できます)
-
同様の手順で2つ目のリードレプリカを作成します。名前は「ReadReplica2」で作成します。
作成したリードレプリカへロードバランサー経由で接続する方法を確認します。
-
WriterMDSをコンソールから選択し、画面左下のリソース → エンドポイント をクリックします。そして表示された画面から読取りレプリカ・ロード・バランサのIPアドレスを確認します。
-
確認した読取りレプリカ・ロード・バランサのIPアドレスを使用してリードレプリカに接続し、「
SHOW GLOBAL VARIABLES LIKE 'bind_address'
」を実行します。システム変数bind_address
の設定値に含まれるIPアドレスより、どちらのリードレプリカに接続しているかを判断できます。以下の実行例では、設定値に「10.0.1.245(ReadReplica1のIPアドレス)」が含まれているため、ReadReplica1に接続できていることが確認できます。(ReadReplica2に接続される場合もあります)実行コマンド(コピー&ペースト用)
SHOW GLOBAL VARIABLES LIKE 'bind_address';
実行例
mysql> SHOW GLOBAL VARIABLES LIKE 'bind_address'; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | bind_address | 10.0.1.245/mysql,10.5.96.6/loadbalancer | +---------------+-----------------------------------------+ 1 row in set (0.00 sec)
-
ロードバランサー経由の接続では、自動的にリードレプリカ間でロードバランスされることを確認します。前ステップの操作を繰り返し実行し、接続先が切り替わることを確認します。以下の実行例では、
mysql
コマンドラインクライアントの-e
オプションを使用し、MySQL HeatWaveへ接続して「SHOW GLOBAL VARIABLES LIKE 'bind_address'
」を実行することを繰り返し実行しています。(コマンドラインに直接パスワードを指定することに対する警告が出力されていますが、ここでは無視して下さい)
接続によって「10.0.1.245(ReadReplica1のIPアドレス)」と「10.0.1.240(ReadReplica2のIPアドレス)」が切り替わっていることから、ロードバランスされていることが確認できます。実行コマンド例(コピー&ペースト用)
mysql -u root -pMySQL_8.0 -h 10.0.1.145 -e "SHOW GLOBAL VARIABLES LIKE 'bind_address'"
実行例
[opc@testvm1 ~]$ mysql -u root -pMySQL_8.0 -h 10.0.1.145 -e "SHOW GLOBAL VARIABLES LIKE 'bind_address'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | bind_address | 10.0.1.245/mysql,10.5.96.6/loadbalancer | +---------------+-----------------------------------------+ [opc@testvm1 ~]$ mysql -u root -pMySQL_8.0 -h 10.0.1.145 -e "SHOW GLOBAL VARIABLES LIKE 'bind_address'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | bind_address | 10.0.1.245/mysql,10.5.96.6/loadbalancer | +---------------+-----------------------------------------+ [opc@testvm1 ~]$ mysql -u root -pMySQL_8.0 -h 10.0.1.145 -e "SHOW GLOBAL VARIABLES LIKE 'bind_address'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------+ | bind_address | 10.0.1.240/mysql,10.5.51.254/loadbalancer | +---------------+-------------------------------------------+ [opc@testvm1 ~]$ mysql -u root -pMySQL_8.0 -h 10.0.1.145 -e "SHOW GLOBAL VARIABLES LIKE 'bind_address'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | bind_address | 10.0.1.245/mysql,10.5.96.6/loadbalancer | +---------------+-----------------------------------------+
作成したリードレプリカへ直接接続する方法を確認します。
-
WriterMDSをコンソールから選択し、画面左下のリソース → エンドポイント をクリックします。そして表示された画面からReadReplica1とReadReplica2のIPアドレスを確認します。2つのIPアドレスが異なるため、それぞれのIPアドレスを使用することで、任意のリードレプリカにアクセスできます。
-
確認したReadReplica1のIPアドレスを使用してリードレプリカに接続後、「
SHOW GLOBAL VARIABLES LIKE 'bind_address'
」を実行します。以下の実行例では、システム変数bind_address
の設定値に「10.0.1.245(ReadReplica1のIPアドレス)」が含まれているため、ReadReplica1に接続できていることが確認できます。実行コマンド(コピー&ペースト用)
SHOW GLOBAL VARIABLES LIKE 'bind_address';
実行例 (ReadReplica1で実行)
mysql> SHOW GLOBAL VARIABLES LIKE 'bind_address'; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | bind_address | 10.0.1.245/mysql,10.5.96.6/loadbalancer | +---------------+-----------------------------------------+ 1 row in set (0.00 sec)
-
同様に、確認したReadReplica2のIPアドレスを使用してリードレプリカに接続後、「
SHOW GLOBAL VARIABLES LIKE 'bind_address'
」を実行します。以下の実行例では、設定値に「10.0.1.240(ReadReplica2のIPアドレス)」が含まれているため、ReadReplica2に接続できていることが確認できます。実行コマンド(コピー&ペースト用)
SHOW GLOBAL VARIABLES LIKE 'bind_address';
実行例 (ReadReplica2で実行)
mysql> SHOW GLOBAL VARIABLES LIKE 'bind_address'; +---------------+-------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------+ | bind_address | 10.0.1.240/mysql,10.5.51.254/loadbalancer | +---------------+-------------------------------------------+ 1 row in set (0.00 sec)
リードレプリカにはソースのMySQL HeatWaveのスキーマやデータが複製され、その後の更新処理も伝播されることを確認します。また、リードレプリカは参照専用であることも確認します。
-
ReadReplica1に接続後、「
SHOW DATABASES
」を実行します。world
データベース、world_x
データベースが存在するため、リードレプリカ作成時点のWriterMDSが複製されていることが分かります。実行コマンド(コピー&ペースト用)
SHOW DATABASES;
実行例 (ReadReplica1で実行)
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | | world_x | +--------------------+ 6 rows in set (0.00 sec)
-
ソースのMySQL HeatWaveで実行した更新処理がリードレプリカに反映されることを確認します。WriterMDSで
test
データベース、test.test
テーブルを作成し、データを追加します。その後、ReadReplica1でtest.test
テーブルが存在することを確認し、追加されたデータが参照できることを確認します。以下の実行例ではそれぞれのMySQL HeatWaveでの操作をまとめて掲載していますが、コンソールを2つ開いてそれぞれWriterMDSとReadReplica1に接続し、1ステップずつ実行することで、各ステップ毎にリードレプリカに処理内容がレプリケーションされていることが確認できます。実行コマンド(コピー&ペースト用:WriterMDSで実行)
CREATE DATABASE ReadReplica;
CREATE TABLE ReadReplica.test(id int AUTO_INCREMENT, col1 CHAR(10), PRIMARY KEY(id));
INSERT INTO ReadReplica.test VALUES(1, "TEST");
SELECT * FROM ReadReplica.test;
実行コマンド(コピー&ペースト用:ReadReplica1で実行)
SHOW DATABASES;
USE ReadReplica;
SHOW TABLES;
SELECT * FROM ReadReplica.test;
実行例 (WriterMDSで実行)
mysql> CREATE DATABASE ReadReplica; Query OK, 1 row affected (0.01 sec) mysql> CREATE TABLE ReadReplica.test(id int AUTO_INCREMENT, col1 CHAR(10), PRIMARY KEY(id)); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO ReadReplica.test VALUES(1, "TEST"); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM ReadReplica.test; +----+------+ | id | col1 | +----+------+ | 1 | TEST | +----+------+ 1 row in set (0.00 sec)
実行例 (ReadReplica1で実行)
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | ReadReplica | | world | | world_x | +--------------------+ 7 rows in set (0.00 sec) mysql> USE ReadReplica; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | test | +----------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM ReadReplica.test; +----+------+ | id | col1 | +----+------+ | 1 | TEST | +----+------+ 1 row in set (0.00 sec)
-
リードレプリカが参照専用であることを確認します。ReadReplica1で
test.test
テーブルにデータを追加しようとするとエラーが発生します。システム変数read_only
及びsuper_read_only
がON
に設定されているため、参照専用になっていることが分かります。
(read_only
によりMySQLサーバーを参照専用に設定できますが、read_only
だけではCONNECTION_ADMIN
権限もしくはSUPER
権限を持った管理者ユーザーによる更新処理をブロックできません。super_read_only
はCONNECTION_ADMIN
権限もしくはSUPER
権限を持った管理者ユーザーによる更新処理をブロックするために、MySQL 5.7で追加されたシステム変数です)実行コマンド(コピー&ペースト用:ReadReplica1で実行)
INSERT INTO ReadReplica.test VALUES(2, "READ ONLY");
SHOW GLOBAL VARIABLES LIKE '%read_only';
実行例 (ReadReplica1で実行)
mysql> INSERT INTO ReadReplica.test VALUES(2, "READ ONLY"); ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement mysql> mysql> SHOW GLOBAL VARIABLES LIKE '%read_only'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | ON | | transaction_read_only | OFF | +-----------------------+-------+ 4 rows in set (0.01 sec)
これで、この章の作業は終了です。
この章では、リードレプリカを作成し、ソースのMySQL HeatWaveで実行した更新処理がリードレプリカにレプリケーションされることや、リードレプリカが参照専用に設定されていることを確認しました。参照処理の同時実行数が多いシステムでは、リードレプリカを使って負荷分散することで効率良くシステムを拡張できるので、活用して下さい。