修改AZURE SQL 3张互有外键关联的表前,最优备份方案是什么?
针对Azure SQL Server 3张关联表的最优备份方案
优先推荐同库按版本拷贝表结构+数据的方案,完全满足保留原ID、所有数据不变、外键关联一致性的要求,操作效率远高于整库备份,适合迭代间的快速备份恢复。
具体操作步骤
备份操作(每次迭代校验完成后执行)
- 给备份表加迭代版本号后缀,直接复制原表的结构、约束、所有数据:
-- 替换{N}为当前迭代完成的版本号,比如第1次迭代完成就写_1 SELECT * INTO 表1_备份_{N} FROM 表1; SELECT * INTO 表2_备份_{N} FROM 表2; SELECT * INTO 表3_备份_{N} FROM 表3;
注:
SELECT INTO会完整复制原表的所有列属性、主键、ID值,不会破坏数据一致性,且Azure SQL下执行速度极快,3张表的备份可以在几秒内完成。
- (可选)如果需要保留原表的外键约束定义,可以额外执行语句导出约束创建脚本存到本地,或者直接在备份表上重建外键,大部分场景下迭代恢复只需要数据一致,这一步可以省略。
恢复操作(迭代失败回滚时执行)
- 先按照外键依赖顺序清空原表,避免外键约束报错:
-- 先删子表,再删主表,顺序和你表的外键依赖一致 TRUNCATE TABLE 表3; TRUNCATE TABLE 表2; TRUNCATE TABLE 表1;
- 如果表ID是自增IDENTITY类型,需要先开启IDENTITY_INSERT允许写入原ID值,按主表到子表的顺序恢复数据:
-- 恢复主表 SET IDENTITY_INSERT 表1 ON; INSERT INTO 表1 (列1,列2,列3...) SELECT * FROM 表1_备份_{N-1}; SET IDENTITY_INSERT 表1 OFF; -- 恢复第二张表 SET IDENTITY_INSERT 表2 ON; INSERT INTO 表2 (列1,列2,列3...) SELECT * FROM 表2_备份_{N-1}; SET IDENTITY_INSERT 表2 OFF; -- 恢复子表 SET IDENTITY_INSERT 表3 ON; INSERT INTO 表3 (列1,列2,列3...) SELECT * FROM 表3_备份_{N-1}; SET IDENTITY_INSERT 表3 OFF;
如果你的ID列不是自增IDENTITY类型,可以省略所有IDENTITY_INSERT相关语句,直接执行INSERT操作即可。
3. 恢复完成后校验3张表的数据量、关联关系和备份前一致即可重新执行迭代。
备选方案
如果需要跨实例存储备份,或者备份需要长期归档,可以用bcp命令行工具逐表导出为本地数据文件:
- 导出命令:
bcp 库名.用户名.表1 out 表1_backup.dat -S Azure服务器地址 -U 用户名 -P 密码 -n - 导入逻辑和上面的SQL恢复逻辑一致,先清空表,按外键顺序导入即可。
注意事项
- 备份和恢复的时候都要严格按照外键依赖顺序操作,避免触发约束报错
- 不要用整库恢复的方案,会浪费大量无关资源,且操作时间更长
- 迭代完成确认无问题后,可以删除旧版本的备份表释放存储空间
内容的提问来源于stack exchange,提问作者John John
相关产品推荐
相关产品推荐

