このページでは、テーブル、インデックス、列などのスキーマ オブジェクトが誤って削除されないように保護する方法について説明します。
スキーマ オブジェクトの削除の安全性について
Spanner のスキーマ オブジェクトの削除保護では、スキーマ オブジェクト アクセス統計情報に基づいて、オブジェクトを安全に削除できるかどうかを判断します。システムがオブジェクトを安全でないと判断した場合、システムはスキーマ オブジェクトの削除に対するユーザーのリクエストを拒否します。このようなオブジェクトを削除すると、そのオブジェクトにアクセスしているクライアント ジョブが失敗する可能性があります。また、データ損失を発生させずに、削除されたオブジェクトを復元することは非常に困難か、不可能です。
このため、Spanner は各スキーマ オブジェクトのアクセス統計情報を追跡します。このアクセスには、DML の挿入、更新、削除、SQL クエリ、API 書き込み、API 読み取りが含まれます。Spanner は、これらのアクセス統計情報を使用して、スキーマ オブジェクトがまだ使用されているかどうかを判断します。オブジェクトが最近アクセスされた場合、そのオブジェクトはまだ使用されている可能性があります。
スキーマ オブジェクトの削除保護を有効にする
削除保護を有効にするには、削除保護の非アクティブ期間を 24h や 2d など、ゼロ以外の期間値に設定します。最小期間は 0s、最大期間は 7d です。非アクティブ期間は 24h 以上に設定する必要があります。
非アクティブ期間を 24h に設定した場合、スキーマ オブジェクトを削除できるのは、過去 24 時間以内にオブジェクトにアクセスしていない場合に限られます。
GoogleSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_inactivity_period="DURATION" )'
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_ID: データベース インスタンスの ID。
- DURATION: 0s(この値を含む)から 7d(この値を含む)の間。推奨値: 24h。
PostgreSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME" SET spanner.schema_drop_protection_inactivity_period="DURATION" '
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_ID: データベース インスタンスの ID。
- DURATION: 0s(この値を含む)から 7d(この値を含む)の間。推奨値: 24h。
スキーマ オブジェクトの削除保護を無効にする
削除保護を無効にするには、非アクティブ期間をゼロ期間値(0s)に設定するか、オプション値を null に設定します。
GoogleSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_inactivity_period=null )'
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_ID: データベース インスタンスの ID。
PostgreSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET spanner.schema_drop_protection_inactivity_period=null'
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_ID: データベース インスタンスの ID。
注意点
次のシナリオでは、スキーマ オブジェクトの削除保護は有効になりません。
- データベースが過去 1 時間以内に作成されている。
- 非アクティブ期間内にスキーマ オブジェクトを作成した。
- オブジェクトの読み取りアクセス頻度が低い(1 時間あたり 10 回未満)。
デフォルトの読み取りアクセスしきい値は 1 時間あたり 10 回ですが、次のデータベース オプションを使用してデフォルトをオーバーライドできます。
GoogleSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_usage_lowerbound=<threshold> )'
PostgreSQL
詳細については、ALTER DATABASE をご覧ください。
gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET spanner.schema_drop_protection_usage_lowerbound=<threshold> '
次のケースではアクセス統計情報は収集されません。
- 失敗したアクセス(クエリ、DML など)は、ユーザー アクセスとしてカウントされません。
- システム アクセスはカウントされません。
- インデックスでは、書き込みアクセス(DML の挿入と更新を含む)は無視されます。
- 保存された生成列では、書き込みアクセスは無視されます。
トラブルシューティング
スキーマ オブジェクトのドロップに失敗し、アクセス対象を特定できない場合は、以下をご覧ください。
次のステップ
データベースの削除を防ぐ方法を確認する。