CentOS 下 SQL Server 迁移方案
一 方案总览与选择
| 方案 | 适用场景 | 优点 | 注意点 |
|---|---|---|---|
| 备份/还原(.bak) | 全库迁移、版本跨度不大(如 2017/2019/2022)、停机窗口可控 | 操作简单、一致性好、工具成熟 | 需获取源库备份;还原时处理文件路径与日志;跨版本需满足兼容矩阵 |
| 生成脚本 + 数据导入/导出向导(SSIS) | 选择性迁移(部分表/架构/数据)、跨网络带宽一般 | 粒度可控、可复用包、适合增量同步 | 需配置源/目标连接;大数据量需分批;注意身份与权限 |
| Linux 端 sqlcmd/BACPAC 导入 | 无法在源端使用 SSMS、倾向命令行 | 脚本化、易自动化 | 依赖 sqlpackage;BACPAC 对复杂对象/触发器支持有限 |
二 方案一 备份还原 .bak(推荐)
sudo yum install -y mssql-server;运行 sudo /opt/mssql/bin/mssql-conf setup 完成初始化;sudo systemctl start mssql-server 并设为开机自启。sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent && sudo firewall-cmd --reload。sudo yum install -y mssql-tools unixODBC-devel,并将 /opt/mssql-tools/bin 加入 PATH。RESTORE DATABASE newdbname
FROM DISK = '/var/opt/mssql/backup/a.bak'
WITH
MOVE 'LogicalDataFileName' TO '/var/opt/mssql/data/newdb.mdf',
MOVE 'LogicalLogFileName' TO '/var/opt/mssql/data/newdb_log.ldf',
STATS = 1, REPLACE, RECOVERY;
RESTORE FILELISTONLY FROM DISK = 'a.bak';;还原时确保目标目录(如 /var/opt/mssql/data/)存在且 mssql 用户可写。三 方案二 生成脚本 + SSIS 导入导出向导(选择性迁移)
四 方案三 Linux 端 sqlcmd 与 BACPAC(命令行自动化)
sqlcmd -S <centos_ip>,1433 -U sa -P '<YourPassword>' -i create_schema.sql
sqlcmd -S <centos_ip>,1433 -U sa -P '<YourPassword>' -Q "RESTORE DATABASE newdb FROM DISK = '/var/opt/mssql/backup/a.bak' WITH MOVE '...' TO '...', REPLACE, RECOVERY"
sqlpackage /Action:Export /SourceServerName:<src> /SourceDatabaseName:<db> /TargetFile:<db>.bacpac;将 .bacpac 复制到 CentOS。sqlpackage /Action:Import /SourceFile:/var/opt/mssql/backup/db.bacpac /TargetServerName:<centos_ip>,1433 /TargetDatabaseName:<newdb> /TargetUser:sa /TargetPassword:'<YourPassword>'
五 迁移前后检查与常见问题
sqlcmd -S 127.0.0.1 -U sa -P '<pwd>' -Q "SELECT @@VERSION;" 做本机连通性自检。MOVE 指定实际文件路径;确保目录存在且 mssql 用户有读写权限。firewall-cmd 规则与 SELinux 策略;确保 mssql-server 处于 active (running) 状态。