如何在SQL Server中将一个数据库的所有表及数据复制到另一数据库
SQL Server 跨库同步dev到poc数据方案
前提:同实例下两个库表结构完全一致,根据你是要一次性导数据还是长期持续同步选对应方案即可。
方案1:一次性全量初始化(适合poc库首次填充数据,不需要后续自动同步的场景)
- 如果总数据量不大(全库百万行级别以内):直接用SSMS自带的脚本生成功能最省事。右键
devdatabase-> 任务 -> 生成脚本 -> 选择所有需要同步的表 -> 进入高级设置,找到「要编写脚本的数据类型」选项,选择「仅数据」,输出目标直接选pocdatabase执行即可,全程不用写代码,不会漏字段。 - 如果表数量少,自己写SQL更快:先按外键依赖顺序清空poc库对应表(先清从表再清主表,避免外键报错),直接跨库插入即可。有自增列的表记得开
IDENTITY_INSERT,示例代码:
-- 开启自增列插入权限 SET IDENTITY_INSERT pocdatabase.dbo.user_info ON; -- 清空poc库目标表 TRUNCATE TABLE pocdatabase.dbo.user_info; -- 全量同步数据,必须显式指定所有列名,包括自增列 INSERT INTO pocdatabase.dbo.user_info (id, username, create_time) SELECT id, username, create_time FROM devdatabase.dbo.user_info; -- 关闭自增列插入权限 SET IDENTITY_INSERT pocdatabase.dbo.user_info OFF;
- 如果数据量很大(单表千万级以上):直接备份dev库再还原为poc库是最快的选择,比逐行插入速度快10倍以上,还原完把poc库的连接配置、权限改成poc环境对应的就行,不用逐表导。
- 小提示:导数据前可以临时禁用poc库的外键约束、触发器,导完再重新启用,能省很多报错排查的时间。
方案2:持续增量同步(后续dev库数据变更后,poc库需要自动同步更新)
- 要求秒级实时一致性:优先用SQL Server自带的事务复制。把
devdatabase配置为发布服务器,选择需要同步的表作为发布项,pocdatabase配置为订阅服务器,初始化快照完成后,dev库的增删改操作会自动实时同步到poc库,延迟基本在1秒以内,配置的时候记得把订阅选项里的「如果目标表已存在则保留」选上,不会覆盖你poc库已有的结构。 - 允许分钟/小时级延迟:直接配SQL Server代理定时作业就行。如果所有业务表都带
update_time更新时间字段,每次作业只同步上次同步时间之后新增、修改的行即可,逻辑简单,出问题排查成本极低。 - 不想改业务表结构:开启dev库对应表的CDC(变更数据捕获)功能,定时作业扫描CDC记录的变更日志同步到poc库即可,不需要给业务表加额外字段,对现有业务零侵入。
注意:不管选哪种方案,操作前先给poc库做一次全量备份,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者Torreygs214
相关产品推荐
相关产品推荐

