本页面介绍了如何保护表、索引和列等模式对象,使其免遭意外删除。
了解模式对象删除安全机制
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:数据库实例的标识符。
- 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:数据库实例的标识符。
- 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:数据库实例的标识符。
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:数据库实例的标识符。
注意事项
模式对象删除保护在以下情况不会被激活:
- 您在过去一小时内创建了该数据库。
- 您在非活跃时长内创建了该模式对象。
- 该对象的读取访问频率较低(每小时少于 10 次)。
默认的读取访问阈值为每小时 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 插入和更新)会被忽略。
- 存储的生成列的写入访问会被忽略。
问题排查
如果模式对象删除失败,并且您无法确定是哪个对象在访问它,请参阅以下内容:
后续步骤
了解如何防止数据库被删除。