Spanner备份与恢复 #

一、备份概述 #

1.1 备份类型 #

text
Spanner备份类型
├── 自动备份
│   ├── 定期自动创建
│   ├── 可配置保留时间
│   └── 可配置备份计划
│
├── 按需备份
│   ├── 手动创建
│   ├── 指定保留时间
│   └── 适合特殊场景
│
└── 时间点恢复(PITR)
    ├── 恢复到任意时间点
    ├── 基于版本历史
    └── 保留期可配置

1.2 备份特点 #

text
备份特点:
├── 全量备份
├── 一致性快照
├── 加密存储
├── 跨区域复制
└── 自动过期删除

二、自动备份 #

2.1 配置自动备份 #

bash
# 创建实例时配置备份
gcloud spanner instances create my-instance \
    --config=regional-us-central1 \
    --nodes=1 \
    --backup-schedule="0 2 * * *" \
    --backup-retention=7d

# 更新现有实例的备份配置
gcloud spanner instances update my-instance \
    --backup-schedule="0 2 * * *" \
    --backup-retention=14d

2.2 备份计划配置 #

text
备份计划格式: cron表达式
├── "0 2 * * *": 每天凌晨2点
├── "0 2 * * 0": 每周日凌晨2点
├── "0 2 1 * *": 每月1日凌晨2点
└── 时区为UTC

2.3 保留时间配置 #

text
保留时间选项:
├── 最小: 1天
├── 最大: 366天
├── 默认: 7天
└── 根据合规要求设置

三、按需备份 #

3.1 创建备份 #

bash
# 创建备份
gcloud spanner backups create my-backup \
    --instance=my-instance \
    --database=my-database \
    --retention-period=7d

# 指定过期时间
gcloud spanner backups create my-backup \
    --instance=my-instance \
    --database=my-database \
    --expiration-date=2024-04-03T00:00:00Z

3.2 使用客户端库创建备份 #

java
// Java创建备份
import com.google.cloud.spanner.Backup;
import com.google.cloud.spanner.Instance;

Instance instance = spanner.getInstanceAdminClient().getInstance(instanceId);

Backup backup = instance.createBackup(
    databaseId,
    backupId,
    Timestamp.now()
).waitFor().getResult();
python
# Python创建备份
from google.cloud import spanner
from datetime import datetime, timedelta

instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

backup = instance.backup(backup_id)
operation = backup.create(expire_time=datetime.utcnow() + timedelta(days=7))
operation.result()

3.3 查看备份 #

bash
# 列出所有备份
gcloud spanner backups list --instance=my-instance

# 查看备份详情
gcloud spanner backups describe my-backup \
    --instance=my-instance

四、恢复数据库 #

4.1 从备份恢复 #

bash
# 从备份恢复数据库
gcloud spanner databases restore my-restored-db \
    --instance=my-instance \
    --source-backup=my-backup

# 恢复到其他实例
gcloud spanner databases restore my-restored-db \
    --instance=target-instance \
    --source-backup=my-backup \
    --source-instance=source-instance

4.2 使用客户端库恢复 #

java
// Java恢复数据库
import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Instance;

Instance instance = spanner.getInstanceAdminClient().getInstance(instanceId);

Database database = instance.restoreDatabase(
    databaseId,
    sourceInstanceId,
    sourceBackupId
).waitFor().getResult();
python
# Python恢复数据库
instance = spanner_client.instance(instance_id)
backup = instance.backup(backup_id)

operation = backup.restore(target_instance_id, target_database_id)
database = operation.result()

4.3 恢复注意事项 #

text
恢复注意事项:
├── 恢复会创建新数据库
├── 目标数据库不能已存在
├── 恢复时间取决于数据量
├── 恢复期间可读取
└── 恢复后需要更新应用配置

五、时间点恢复 #

5.1 启用PITR #

sql
-- PITR默认启用
-- 版本保留时间默认为1小时

-- 查看版本保留时间
SELECT 
    database_name,
    version_retention_period
FROM INFORMATION_SCHEMA.DATABASES;

5.2 配置保留时间 #

bash
# 设置版本保留时间
gcloud spanner databases update my-database \
    --instance=my-instance \
    --version-retention-period=7d

5.3 时间点恢复 #

sql
-- 查询历史数据
SELECT * FROM users
FOR SYSTEM_TIME AS OF TIMESTAMP '2024-03-27T10:00:00Z';

-- 查询时间范围内的数据
SELECT * FROM users
FOR SYSTEM_TIME BETWEEN 
    TIMESTAMP '2024-03-27T09:00:00Z' AND 
    TIMESTAMP '2024-03-27T10:00:00Z';

5.4 使用时间戳恢复 #

java
// Java时间点恢复
import com.google.cloud.spanner.Timestamp;

Timestamp targetTimestamp = Timestamp.ofTimeMicroseconds(1711537200000000L);

// 使用备份恢复到特定时间点
// 需要找到包含目标时间点的备份

六、备份管理 #

6.1 查看备份列表 #

bash
# 列出所有备份
gcloud spanner backups list --instance=my-instance

# 过滤备份
gcloud spanner backups list --instance=my-instance \
    --filter="database:my-database"

6.2 更新备份过期时间 #

bash
# 更新过期时间
gcloud spanner backups update my-backup \
    --instance=my-instance \
    --expiration-date=2024-05-01T00:00:00Z

6.3 删除备份 #

bash
# 删除备份
gcloud spanner backups delete my-backup \
    --instance=my-instance

七、备份监控 #

7.1 监控指标 #

text
备份监控指标:
├── backup/created: 备份创建时间
├── backup/size: 备份大小
├── backup/expired: 备份过期时间
├── backup/count: 备份数量
└── backup/storage: 备份存储量

7.2 告警配置 #

bash
# 创建备份失败告警
gcloud alpha monitoring policies create \
    --display-name="Spanner Backup Failed" \
    --condition-display-name="Backup Failure" \
    --condition-filter='resource.type="spanner_instance" AND metric.type="spanner.googleapis.com/backup/failed"'

7.3 备份状态检查 #

bash
# 检查备份状态
gcloud spanner backups describe my-backup \
    --instance=my-instance \
    --format="value(state)"

八、备份最佳实践 #

8.1 备份策略 #

text
备份策略建议:
├── 配置自动备份
├── 设置合适的保留时间
├── 定期验证备份可用性
├── 重要变更前创建备份
└── 跨区域备份复制

8.2 恢复测试 #

text
恢复测试建议:
├── 定期进行恢复演练
├── 验证数据完整性
├── 测量恢复时间
├── 记录恢复流程
└── 更新应急预案

8.3 成本优化 #

text
备份成本优化:
├── 合理设置保留时间
├── 及时删除不需要的备份
├── 监控备份存储量
├── 评估备份频率
└── 使用增量备份(自动)

九、总结 #

备份类型对比:

类型 特点 使用场景
自动备份 定期自动创建 常规备份
按需备份 手动创建 特殊场景
PITR 时间点恢复 误操作恢复

最佳实践:

text
1. 配置自动备份
   └── 定期自动备份

2. 设置合适的保留时间
   └── 平衡成本和需求

3. 定期测试恢复
   └── 确保备份可用

4. 监控备份状态
   └── 及时发现问题

5. 制定恢复预案
   └── 快速响应

下一步,让我们学习性能优化!

最后更新:2026-03-27