Ubuntu上 SQL Server 数据同步技巧
一、方法总览与选型
- 备份还原(全量):一次性或周期性把数据库从源实例备份到 .bak,在 Ubuntu 上还原。适合初始化、低频全量、跨版本升级等场景。要点是还原时用 WITH MOVE 指定 Ubuntu 默认数据目录 /var/opt/mssql/data/,并依据需要选择 RECOVERY/NORECOVERY。
- bcp 批量导入导出(表级/分区级):用 bcp out/in 在源与目标之间搬运 CSV/定界文本,适合大表、批量同步、一次性割接或回灌。
- SSIS 数据同步(持续/复杂转换):在 SSDT 中设计数据流(转换、映射、清洗),可部署到 SSIS Catalog 按计划执行,适合跨库、跨平台、含复杂转换的同步。
- 第三方图形化工具(轻量/快速):如 Navicat for Linux、DBConvert,支持“数据同步/迁移”向导,适合快速上手与小规模同步。
二、快速上手流程
- 准备环境与工具
- Ubuntu 20.04/22.04 LTS,安装 SQL Server 2022(或目标版本),并安装客户端工具 sqlcmd、bcp(建议将 /opt/mssql-tools/bin 加入 PATH)。
- 如需远程连接,开放防火墙 1433 端口(如 sudo ufw allow 1433)。
- 全量同步(备份还原)
- 源端:在 SSMS 或 sqlcmd 执行完全备份(如 BACKUP DATABASE [YourDB] TO DISK=‘…’ WITH INIT)。
- 传输:用 SCP/SFTP 将 .bak 传到 Ubuntu(如 /tmp/YourDB.bak)。
- 目标端:先获取逻辑文件名(RESTORE FILELISTONLY),再还原并 MOVE 到 /var/opt/mssql/data/,例如:
RESTORE DATABASE [YourDB]
FROM DISK = '/tmp/YourDB.bak'
WITH MOVE 'YourDB_Data' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf',
REPLACE, RECOVERY;
- 表级/批量同步(bcp)
- 导出:bcp YourDB.dbo.YourTable out /tmp/YourTable.csv -c -t, -T -S source_server
- 导入:bcp YourDB.dbo.YourTable in /tmp/YourTable.csv -c -t, -U SA -P ‘YourPassword’ -S localhost
- 复杂转换/自动化(SSIS)
- 在 Visual Studio + SSDT 创建 SSIS 项目,配置源/目标连接(Windows SQL Server → Ubuntu SQL Server),设计转换与错误输出,部署到 SSIS Catalog 后用 SQL Agent 或计划任务执行。
三、持续同步与自动化
- 定时全量(cron + sqlcmd)
- 在源端定时做 FULL 备份并 SCP 到 Ubuntu;在 Ubuntu 端用 sqlcmd 执行还原(必要时先 DROP/REPLACE)。适合允许窗口期的数据同步。
- 增量/日志传送思路(Linux 上的 SQL Server 2019/2022)
- 若需近实时,可在源端定期做 差异备份 或 事务日志备份,Ubuntu 端按顺序还原(WITH NORECOVERY 直至最终 WITH RECOVERY),形成“滚动升级”的同步链。
- SSIS 包调度
- 将 SSIS 包部署到 SSIS Catalog,在 SSMS 中创建 SQL Server Agent 作业按日程执行,适合复杂转换与跨平台同步。
- 第三方工具
- Navicat for Linux 提供“数据同步”功能,可对比并同步表结构与数据;DBConvert 支持多对多数据库迁移与同步,适合快速交付。
四、性能与稳定性优化
- 大表与批量
- 使用 bcp 原生格式(-n) 或批量导入选项,减少解析开销;按业务键或时间键分区/分批导入,避免长事务与锁争用。
- 还原与文件权限
- 还原前确认 /var/opt/mssql/data/ 对 mssql 服务账户具备读写权限;大数据量还原可配合 STATS = 5/10 观察进度。
- 网络与连接
- 保证源/目标网络稳定;必要时在同网段或专线中传输备份文件;远程连接确保 1433 端口与认证方式正确。
- 资源与参数
- 迁移后根据服务器资源调整 max server memory、max degree of parallelism;对大表执行 重建索引/更新统计信息 提升查询性能。
五、常见问题与排查
- 逻辑文件名不匹配
- 还原时报“找不到逻辑文件”时,先执行:RESTORE FILELISTONLY FROM DISK=‘/path/YourDB.bak’,用返回的逻辑名替换 MOVE 参数。
- 权限/路径错误
- 确保 /var/opt/mssql/data/ 权限正确(如 sudo chown -R mssql:mssql /var/opt/mssql/data/),并以具备权限的账户执行还原。
- 连接失败
- 检查 sudo ufw allow 1433、SQL Server 是否运行(sudo systemctl status mssql-server)、以及连接字符串/防火墙/认证方式。
- 版本与兼容性
- 一般高版本 SQL Server 可还原低版本备份;跨平台时注意已弃用/不兼容特性(如 ntext → nvarchar(max) 等)并先行改造。