アプリケーション整合性スナップショットを作成するために、システムは書き込みリクエストを一時停止し、スナップショットに取り込まれるデータの整合性と一貫性を確保します。 アプリケーション整合性スナップショットを使用してデータをリストアすると、データの破損や損失のリスクを軽減できます。 これにより、MySQL などのアプリケーションが期待どおりに起動し、データがスナップショットの作成時と同じ状態に保たれます。 このトピックでは、MySQL 8.0 を搭載した CentOS 7.9 Elastic Compute Service (ECS) インスタンスのアプリケーション整合性スナップショットを作成し、スナップショットを使用して期待どおりにデータをリストアできるかどうかを確認する方法について説明します。
前提条件
ECS インスタンスに接続されているディスクは、マルチアタッチが無効になっている企業向け SSD (ESSD) です。
ECS インスタンスは [実行中] 状態です。 クラウドアシスタントはインスタンス上で通常の状態です。 クラウドアシスタントのステータスを表示する方法については、「Cloud Assistant のステータスを表示し、異常を処理する」をご参照ください。
MySQL は ECS インスタンスにインストールされています。 MySQL のユーザー名とパスワードを取得します。 詳細については、「Linux ECS インスタンスに MySQL データベースをデプロイする」をご参照ください。
Resource Access Management (RAM) ロールが ECS インスタンスにアタッチされ、アプリケーション整合性スナップショットの権限を含むカスタムポリシーが RAM ロールにアタッチされています。 詳細については、「インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。
説明アプリケーション整合性スナップショットを作成する場合は、クラウドアシスタントを呼び出して ECS インスタンスにアクセスし、コマンドを実行する必要があります。 クラウドアシスタントを呼び出す前に、RAM ロールを使用してクラウドアシスタントに必要な権限を付与します。
AppSnapshotRoleName などのカスタム RAM ロールを設定します。
カスタムポリシーを RAM ロールにアタッチします。 次のサンプルコードはカスタムポリシーを示しており、RAM ロールにはスナップショットのクエリ、スナップショットの作成、タグの追加、ディスク情報のクエリを行う権限があることを示しています。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
ワークフロー
次の図は、アプリケーション整合性スナップショットを作成して、データベースのステータスがアプリケーション整合性スナップショットの作成時のステータスと同じであることを確認し、アプリケーションの整合性を確保するために実行する必要がある操作を示しています。
手順 1: prescript.sh および postscript.sh スクリプトファイルを作成する
アプリケーション整合性スナップショットを作成するための prescript.sh および postscript.sh スクリプトファイルを作成します。 prescript.sh スクリプトは、スナップショットの作成前にデータベースの書き込み操作を一時停止します。 postscript.sh スクリプトは、スナップショットの作成後にデータベースの書き込み操作を再開します。
データベーステーブルとストアドプロシージャを作成して、データ書き込み操作をシミュレートし、後でアプリケーション整合性スナップショットを検証します。 MySQL データベースのアプリケーション整合性スナップショットを作成するために、システムはデータベースを一時停止します。 このセクションでは、データベースのアプリケーション整合性スナップショットを作成する前に、TestPIT ストアドプロシージャを呼び出して MySQL データベースにデータを挿入する方法について説明します。 これにより、後から MySQL データベースが一時停止されているかどうか、および作成されたスナップショットを使用して期待どおりにデータをリストアできるかどうかを確認できます。
手順 3: ECS コンソールでアプリケーション整合性スナップショットを作成する
MySQL データベースが存在する Linux ECS インスタンスのアプリケーション整合性スナップショットを作成し、スクリプトを実行してデータベースの書き込み操作を一時停止および再開します。 アプリケーション整合性スナップショットを作成すると、データの整合性を確保するためにデータベースへの書き込み操作が一時的に停止されます。
手順 4: アプリケーション整合性スナップショットが作成されているかどうかを確認する
クラウドアシスタントのコマンド実行結果を表示して、スナップショットが期待どおりに作成されているかどうかを確認し、データベースの書き込み操作が一時停止および再開された時点を表示します。
手順 5: アプリケーション整合性スナップショットを使用して期待どおりにデータをリストアできるかどうかを確認する
アプリケーション整合性スナップショットを使用して、Linux ECS インスタンスに接続されているディスク上のデータをリストアします。 次に、MySQL データベースにデータが最後に書き込まれた時刻と prescript.sh スクリプトが実行された時刻を比較して、データがアプリケーション整合性スナップショットに適切にバックアップされ、スナップショットから期待どおりにリストアされたかどうかを判断します。
MySQL データベースにデータが最後に書き込まれた時刻が prescript.sh スクリプトが実行された時刻よりも前の場合、一時停止中に MySQL データベースへの書き込み操作は実行されませんでした。 MySQL データは、アプリケーション整合性スナップショットの作成時の状態にリストアされ、ステータス整合性が実現します。
MySQL データベースにデータが最後に書き込まれた時刻が prescript.sh スクリプトが実行された時刻以降の場合、一時停止中にも MySQL データベースへの書き込み操作が実行されていました。 MySQL データは、アプリケーション整合性スナップショットと整合性がありません。
手順
手順 1: prescript.sh および postscript.sh スクリプトファイルを作成する
このトピックで使用されている prescript.sh および postscript.sh スクリプトファイルは参照用です。 アプリケーションのアプリケーション整合性スナップショットを作成する場合は、ビジネスシナリオに基づいて prescript.sh および postscript.sh スクリプトファイルをコンパイルできます。 詳細については、「アプリケーション整合性スナップショットを作成する」をご参照ください。
ルートユーザーとして ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
/tmp/prescript.sh スクリプトファイルを作成し、スクリプトファイルにデータを書き込みます。
ルートアカウントを使用して、/tmp/prescript.sh スクリプトファイルを作成します。
vim /tmp/prescript.shIキーを押して、挿入モードに切り替えます。アプリケーションに基づいて prescript.sh ファイルを書き込みます。
Escキーを押し、:wqと入力し、Enter キーを押してスクリプトファイルを保存して閉じます。スクリプトファイルの読み取り、書き込み、および実行権限をルートアカウントのみに付与します。
重要セキュリティ上の理由から、ルートアカウントのみにスクリプトファイルの読み取り、書き込み、および実行権限 (chmod 700) が付与されていることを確認してください。 そうしないと、権限設定が無効になり、スクリプトを実行できません。
chmod 700 /tmp/prescript.sh
/tmp/postscript.sh スクリプトファイルを作成し、スクリプトファイルにデータを書き込みます。
ルートアカウントを使用して、/tmp/postscript.sh スクリプトファイルを作成します。
vim /tmp/postscript.shIキーを押して、挿入モードに切り替えます。アプリケーションに基づいてスクリプトファイルを書き込みます。
Escキーを押し、:wqと入力し、Enter キーを押してスクリプトファイルを保存して閉じます。スクリプトファイルの読み取り、書き込み、および実行権限をルートアカウントのみに付与します。
重要セキュリティ上の理由から、ルートアカウントのみにスクリプトファイルの読み取り、書き込み、および実行権限 (chmod 700) が付与されていることを確認してください。 そうしないと、権限設定が無効になり、スクリプトを実行できません。
chmod 700 /tmp/postscript.sh
/tmp ディレクトリに移動し、スクリプトファイルの権限を確認します。
cd /tmp ls -l次のコマンド出力は、スクリプトファイルの権限が正しく設定されていることを示しています。

手順 2: データベース検証環境を準備する
/root/test.sql スクリプトを作成します。
/root/test.sql スクリプトファイルを作成して開きます。
vim /root/test.sqlIキーを押して挿入モードに切り替えます。スクリプトファイルをコンパイルします。
このスクリプトには、PointInTime という名前のデータベーステーブルを作成するために使用される SQL 文と、TestPIT という名前のストアドプロシージャを作成するために使用される SQL 文が含まれています。 サンプルスクリプト:
USE AdventureWorks; CREATE TABLE PointInTime(id int, t datetime); DELIMITER $$ CREATE PROCEDURE `TestPIT`() BEGIN DECLARE i int; SET i=1; WHILE i < 180 DO INSERT INTO PointInTime VALUES(i, now()); SELECT SLEEP(1); SET i=i+1; END WHILE; END $$ DELIMITER ;Escキーを押し、:wqと入力し、Enter キーを押してスクリプトファイルを保存して閉じます。
MySQL にログオンします。
次のコマンドを入力し、Enter キーを押し、プロンプトが表示されたら MySQL パスワードを入力します。
mysql -u <mysqlUserName> -p<mysqlUserName>を実際の MySQL ユーザー名に置き換えます。AdventureWorks という名前のデータベースを作成します。
CREATE DATABASE AdventureWorks;スクリプトを実行します。
source /root/test.sqlTestPIT ストアドプロシージャを呼び出します。
CALL TestPIT;重要TestPIT ストアドプロシージャの実行に必要な 3 分間のウィンドウ内で、アプリケーション整合性のあるスナップショットを作成する必要があります。
ステップ 3: ECS コンソールでアプリケーション整合性スナップショットを作成する
ECS コンソール - スナップショット整合性グループ に移動します。
上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。
[スナップショット整合性グループ] タブで、[スナップショット整合性グループの作成] をクリックします。
[スナップショットの作成] ダイアログボックスで、次の表に示すパラメーターを構成します。
デフォルトでは、[リソースタイプ]パラメーターは [インスタンス] に設定されています。
[インスタンスの選択] ドロップダウンリストからインスタンスを選択します。次に、[クラウドディスクの選択] セクションで、スナップショットを作成するインスタンスから ESSD を選択します。
[高度な設定] を展開し、アプリケーション整合性スナップショット設定を構成します。
[アプリケーション整合性スナップショットの有効化] を選択します。
prescript.sh スクリプトのパスと postscript.sh スクリプトのパスを、ステップ 1 で作成したスクリプトのパスと同じに設定します。
[有効化する] を選択してファイルシステム I/O の一時停止および再開機能を有効にし、タイムアウト期間を指定します。
[OK] をクリックします。
スナップショット整合性グループが作成されると、クラウドアシスタントコマンド ID とタスク ID が含まれたメッセージが表示されます。タスク ID に基づいて、アプリケーション整合性スナップショットが作成されたかどうかを確認できます。
ステップ 4: アプリケーション整合性スナップショットが作成されたかどうかを確認する
ECS クラウドアシスタントページで、タスク ID をクリックし、コマンドの実行結果を表示します。

タスクでアプリケーション整合性スナップショットが作成された場合、[ExitCode] の戻り値は
0であり、作成されたアプリケーション整合性スナップショットの ID とスナップショット整合性グループがコマンド出力に表示されます (前の図を参照)。説明[ExitCode] の戻り値が
0でない場合は、エラーが発生しています。[ExitCode] 列に返されたエラーコードに基づいてエラーをトラブルシューティングします。詳細については、「エラーコード」をご参照ください。クラウドアシスタントの戻りデータで、データベースが一時停止および再開された時点を確認します。
戻りデータで、prescript.sh スクリプトの実行が開始された時間と postscript.sh スクリプトの実行が停止された時間を確認します。
prescript.sh スクリプトは
2024-08-27 15:27:55に実行を開始しました。これは、データベースがこの時点で書き込み操作を一時停止したことを示しています。
postscript.sh スクリプトは
2024-08-27 15:27:57に実行を停止しました。これは、データベースがこの時点で書き込み操作を再開したことを示しています。
作成されたスナップショット整合性グループとディスクスナップショットを表示します。
ECS コンソール - スナップショット整合性グループ に移動します。
[スナップショット整合性グループ] タブで、作成したスナップショット整合性グループを見つけ、スナップショット整合性グループの ID をクリックしてスナップショットの詳細を表示します。
[スナップショット情報] セクションで、スナップショットに追加されたタグに基づいて、スナップショット整合性グループで作成されたスナップショットがアプリケーション整合性スナップショットであるかどうかを確認します。
作成されたスナップショットがアプリケーション整合性スナップショットの場合、
APPConsistent:Trueタグがスナップショットに対応する [タグ] 列に表示されます (次の図を参照)。
MySQL データベースに接続して、挿入操作が一時停止された時間を表示します。
Linux ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
MySQL にログオンします。
次のコマンドを入力し、Enter キーを押してから、プロンプトが表示されたら MySQL パスワードを入力します。
mysql -u <mysqlUserName> -p<mysqlUserName>を実際の MySQL ユーザー名に置き換えます。PointInTime テーブルの内容をクエリします。
USE AdventureWorks; SELECT * FROM PointInTime;クエリ結果で、データベースが一時停止された時点を確認します。
コマンド出力は、
2024-08-27 15:27:55から2024-08-27 15:27:58までの期間にデータが挿入されなかったことを示しています。
ステップ 5: アプリケーション整合性スナップショットを使用してデータを想定どおりに復元できるかどうかを確認する
作成したスナップショット整合性グループを使用してディスクをロールバックします。
詳細については、「スナップショット整合性グループを使用してディスクをロールバックする」をご参照ください。
MySQL にログオンし、PointInTime テーブルの内容をクエリします。
Linux ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
MySQL にログオンします。
次のコマンドを入力し、Enter キーを押してから、プロンプトが表示されたら MySQL パスワードを入力します。
mysql -u <mysqlUserName> -p<mysqlUserName>を実際の MySQL ユーザー名に置き換えます。PointInTime テーブルの内容をクエリします。
USE AdventureWorks; SELECT * FROM PointInTime;クエリ結果で、データが復元された後に MySQL データベースに最後に書き込まれた時刻を確認します。
コマンド出力は、データベースに最後に挿入されたデータレコードが
2024-08-27 15:27:54であることを示しています。これは、ステップ 4 でクエリされた2024-08-27 15:27:55よりも前です。したがって、アプリケーション整合性スナップショットは MySQL のデータを正しくバックアップしました。手順 4