温馨提示×

CentOS SQL Server数据库迁移方法

小樊
62
2025-09-20 10:56:41
栏目: 云计算

1. 迁移前准备工作

  • 版本兼容性检查:确保目标CentOS上的SQL Server版本不低于源服务器版本(如源为SQL Server 2019,目标不能为2017及以下),避免因版本降级导致数据丢失。
  • 网络与工具配置:确认源服务器与目标CentOS服务器网络连通(可通过ping命令测试);在CentOS上安装必要工具:mssql-tools(含sqlcmd命令行工具,用于数据导入导出)、unixODBC-devel(ODBC驱动支持),通过以下命令安装:
    sudo yum install -y mssql-tools unixODBC-devel
    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile  # 配置环境变量
    source ~/.bash_profile
    ```。  
    
  • 源数据库完整性验证:使用SSMS或T-SQL命令检查源数据库完整性,避免迁移过程中因数据损坏导致失败:
    USE [YourDatabaseName];
    DBCC CHECKDB WITH NO_INFOMSGS;  -- 检查数据库完整性
    ```。  
    
    

2. 常见迁移方法

方法一:备份与还原(推荐,适用于所有版本)

这是SQL Server跨平台迁移的最可靠方式,步骤如下:

  • 在源服务器上创建备份
    • 图形化操作:通过SSMS连接到源SQL Server,右键目标数据库→“任务”→“备份”,选择“完整备份”类型,指定备份文件路径(如C:\Backup\YourDB.bak),点击“确定”。
    • 命令行操作:使用T-SQL生成备份文件(适用于无SSMS的场景):
      BACKUP DATABASE [YourDatabaseName] 
      TO DISK = N'/mnt/backup/YourDB.bak'  -- 源服务器上的备份路径(需提前创建/mnt/backup目录)
      WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Backup', STATS = 10;
      
  • 传输备份文件到目标CentOS:使用scp(安全复制)工具将.bak文件从源服务器复制到目标CentOS的指定目录(如/var/opt/mssql/backup):
    scp user@source_server_ip:/mnt/backup/YourDB.bak /var/opt/mssql/backup/
    
  • 在目标CentOS上还原数据库
    • 登录目标服务器,使用sqlcmd执行还原命令(需调整文件路径为Linux格式):
      RESTORE DATABASE [YourDatabaseName] 
      FROM DISK = N'/var/opt/mssql/backup/YourDB.bak'
      WITH FILE = 1,  -- 备份文件中的第一个备份集
           MOVE N'YourDatabaseName_Data' TO N'/var/opt/mssql/data/YourDB.mdf',  -- 指定数据文件新路径
           MOVE N'YourDatabaseName_Log' TO N'/var/opt/mssql/data/YourDB.ldf',    -- 指定日志文件新路径
           NOUNLOAD, STATS = 10;  -- 显示还原进度
      
    • 验证还原结果:执行USE [YourDatabaseName]; SELECT COUNT(*) FROM YourTableName;查询数据记录数,确认数据完整性。

方法二:sqlcmd导出/导入(适用于小规模数据迁移)

通过sqlcmd工具直接导出/导入表数据,适合少量数据或特定表的迁移:

  • 导出数据到CSV:连接到源服务器,执行以下命令将指定表数据导出为CSV(以逗号分隔,换行符为\n):
    sqlcmd -S source_server_ip -U username -P password -d YourDatabaseName -Q "SELECT * FROM YourTableName" -s "," -W -o /tmp/export.csv
    
  • 导入CSV到目标服务器:连接到目标服务器,执行BULK INSERT命令将CSV数据导入目标表(需提前创建表结构):
    sqlcmd -S target_server_ip -U username -P password -d YourDatabaseName -Q "BULK INSERT YourTableName FROM '/tmp/export.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')"
    
  • 注意事项:导出前需确保目标表结构已创建;若数据包含特殊字符(如逗号),需调整-s参数(如用|分隔)。

方法三:sqlpackage工具(适用于SQL Server 2017及以上版本)

通过sqlpackage工具生成BACPAC文件(包含数据库架构与数据),实现结构与数据的一体化迁移:

  • 安装sqlpackage:在CentOS上通过Microsoft仓库安装:
    sudo yum install -y https://packages.microsoft.com/config/rhel/7/prod.repo
    sudo yum install -y mssql-tools sqlpackage
    
  • 导出BACPAC文件:连接到源服务器,执行以下命令生成BACPAC(如YourDB.bacpac):
    sqlpackage export -ServerName source_server_ip -DatabaseName YourDatabaseName -Username username -Password password -OutputFile /tmp/YourDB.bacpac
    
  • 导入BACPAC文件:连接到目标服务器,执行以下命令将BACPAC导入目标数据库(需提前创建空数据库):
    sqlpackage import -ServerName target_server_ip -DatabaseName YourTargetDatabaseName -Username username -Password password -File /tmp/YourDB.bacpac
    
  • 优势:支持增量迁移、冲突解决,适用于复杂数据库结构(如存储过程、触发器)。

方法四:bcp工具(适用于大型数据批量迁移)

bcp(Bulk Copy Program)是SQL Server的高性能命令行工具,适合迁移大量数据(如百万级记录):

  • 导出数据到文件:在源服务器上执行以下命令,将指定表数据导出为文本文件(如YourTable.dat):
    bcp YourDatabaseName.dbo.YourTableName out /tmp/YourTable.dat -c -t, -S source_server_ip -U username -P password
    
    -c表示使用字符数据类型,-t,表示字段分隔符为逗号)
  • 导入文件到目标服务器:在目标服务器上执行以下命令,将文本文件数据导入目标表:
    bcp YourTargetDatabaseName.dbo.YourTableName in /tmp/YourTable.dat -c -t, -S target_server_ip -U username -P password
    
  • 注意事项:导出前需创建目标表结构;可通过-F(起始行)和-L(结束行)参数分批次迁移,减少内存占用。

3. 迁移后验证

  • 数据完整性检查:在目标数据库中执行与源数据库相同的查询(如SELECT COUNT(*) FROM YourTableName),对比记录数是否一致;抽样检查关键字段(如ID、金额)的值是否正确。
  • 应用连接测试:更新应用程序的数据库连接字符串(如将Server=source_ip;Database=YourDB;改为Server=target_ip;Database=YourTargetDB;),测试应用是否能正常访问目标数据库(如登录、查询、提交数据)。
  • 性能优化:根据目标服务器配置(如CPU、内存),调整SQL Server参数(如最大内存max server memory、并行度max degree of parallelism),提升数据库性能。

0