温馨提示×

SQL Server在Debian上的备份恢复方法

小樊
31
2025-12-20 14:33:38
栏目: 云计算

在 Debian 上使用 SQL Server 的备份与恢复

一 支持与前提

  • Debian 上可以使用 Microsoft SQL Server 2017/2019/2022 for Linux 的官方发行包,部署和管理方式与 Ubuntu 等 Linux 发行版一致。备份与恢复可通过 sqlcmd 执行 T‑SQL 完成,亦可在 Windows 端用 SSMS 远程操作。为减少兼容与维护风险,生产环境更推荐在受支持的 Ubuntu/CentOS/RHELWindows 上运行;若必须在 Debian 上运行,建议采用容器化方式以获得更稳定的支持边界。

二 备份方法

  • 完整备份(示例)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "BACKUP DATABASE [YourDB] TO DISK = '/var/backups/YourDB_$(date +%F_%H-%M-%S).bak' WITH FORMAT, INIT, COMPRESSION, STATS = 5;"
    
  • 差异备份(示例)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "BACKUP DATABASE [YourDB] TO DISK = '/var/backups/YourDB_diff_$(date +%F_%H-%M-%S).bak' WITH DIFFERENTIAL, INIT, COMPRESSION, STATS = 5;"
    
  • 事务日志备份(需数据库处于 FULLBULK_LOGGED 恢复模型)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "BACKUP LOG [YourDB] TO DISK = '/var/backups/YourDB_log_$(date +%F_%H-%M-%S).trn' WITH INIT, COMPRESSION, STATS = 5;"
    
  • 常用选项说明
    • FORMAT:首次创建介质集时覆盖;INIT:覆盖现有备份集;COMPRESSION:启用压缩;STATS = n:每完成 n% 输出进度。
    • 备份目标路径必须对 mssql 系统用户可读写(建议放在 /var/backups 并设好权限与保留策略)。

三 恢复方法

    1. 仅还原完整备份(数据库不存在或需重建)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB] FROM DISK = '/var/backups/YourDB_2025-09-01_10-00-00.bak' WITH REPLACE, RECOVERY;"
    
    1. 完整 + 差异(差异用于缩短恢复时间)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB] FROM DISK = '/var/backups/YourDB_full.bak' WITH NORECOVERY, REPLACE;"
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB] FROM DISK = '/var/backups/YourDB_diff.bak' WITH RECOVERY;"
    
    1. 完整 + 日志(时间点恢复,需数据库为 FULL 恢复模型)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB] FROM DISK = '/var/backups/YourDB_full.bak' WITH NORECOVERY, REPLACE;"
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE LOG [YourDB] FROM DISK = '/var/backups/YourDB_log.trn' WITH RECOVERY;"
    
    1. 还原到新库名或移动数据文件(避免与现有文件冲突)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB_New] FROM DISK = '/var/backups/YourDB_full.bak' WITH REPLACE, RECOVERY,
           MOVE 'YourDB_Data' TO '/var/opt/mssql/data/YourDB_New.mdf',
           MOVE 'YourDB_Log'  TO '/var/opt/mssql/data/YourDB_New.ldf';"
    
    • 提示:逻辑文件名可用如下查询获取
      sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
        -Q "RESTORE FILELISTONLY FROM DISK = '/var/backups/YourDB_full.bak';"
      
    1. 时间点恢复(PITR,精确到某时刻)
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE DATABASE [YourDB] FROM DISK = '/var/backups/YourDB_full.bak' WITH NORECOVERY, REPLACE;"
    sqlcmd -S <主机名或IP>,1433 -U <SA或域账户> -P '<密码>' \
      -Q "RESTORE LOG [YourDB] FROM DISK = '/var/backups/YourDB_log.trn' WITH RECOVERY, STOPAT = '2025-09-01 10:05:00';"
    
  • 关键选项说明
    • WITH RECOVERY:使数据库可用;WITH NORECOVERY:保留为可继续还原状态(用于后续差异/日志);WITH REPLACE:覆盖同名数据库;MOVE:将数据/日志文件重定位到新路径;STOPAT:指定恢复到的时间点。

四 恢复模型与策略建议

  • 恢复模型选择
    • SIMPLE:不保留事务日志,不支持日志备份,适用于可容忍数据丢失到最近一次完整/差异备份的场景。
    • FULL:保留完整日志,支持时间点恢复,需定期日志备份以控制日志增长。
    • BULK_LOGGED:在大量导入/批量操作期间减少日志,但不支持时间点恢复到日志中的任意时刻。
  • 备份策略建议
    • 采用“定期完整备份 + 更频繁的差异备份 + 高频事务日志备份”的组合;保留足够的历史以满足 RPO/RTO;对备份文件做 异地/离线 副本与定期恢复演练,验证可用性与完整性。

五 常见问题与排错

  • 权限与路径:确保运行 mssql 的系统用户对备份目录(如 /var/backups)具备读写权限;使用绝对路径,避免相对路径导致失败。
  • 端口与连接:确认 TCP 1433 已在防火墙放行;使用 sqlcmd -S <IP>,1433 测试连通性;远程恢复时确保网络稳定与凭据正确。
  • 恢复失败排查:优先检查错误日志(/var/opt/mssql/log/errorlog);若提示文件被占用或路径冲突,使用 WITH REPLACEMOVE 选项;还原到新库名时,务必先通过 RESTORE FILELISTONLY 获取正确的逻辑文件名。

0