温馨提示×

Debian系统下SQL Server的备份与恢复实践

小樊
40
2025-12-04 19:22:02
栏目: 云计算

Debian下SQL Server备份与恢复实践

一 环境与前提

  • Debian上可通过Microsoft 官方 APT 仓库安装并运行SQL Server for Linux,也可在容器中运行。备份与恢复建议使用sqlcmd执行 T‑SQL 的 BACKUP/RESTORE 命令,或借助 SMO/SSMS 完成。为提升可靠性,建议将备份写入本地磁盘 + 远程/云存储的多地点,并定期做恢复演练验证可用性。

二 备份实践

    1. 使用 sqlcmd 执行 T‑SQL 完整备份(示例)
    • 创建备份目录并授权 mssql 运行账户:
      • sudo mkdir -p /var/opt/mssql/backup
      • sudo chown mssql:mssql /var/opt/mssql/backup
    • 执行备份(注意 Linux 路径分隔符为“/”):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “BACKUP DATABASE [YourDatabaseName] TO DISK = ‘/var/opt/mssql/backup/full_$(date +"%Y%m%d%H%M%S").bak’ WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10”
    • 说明:FORMAT 会覆盖同名介质;INIT 初始化介质;STATS 显示进度百分比。
    1. 自动化与保留策略
    • 备份脚本 backup_sql_server.sh(可按需扩展为差异/日志备份):
      • #!/bin/bash
        • set -e
        • BACKUP_PATH=“/var/opt/mssql/backup”
        • DB=“YourDatabaseName”
        • TS=$(date +“%Y%m%d%H%M%S”)
        • FILE=“$BACKUP_PATH/${DB}full${TS}.bak”
        • mkdir -p “$BACKUP_PATH”
        • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “BACKUP DATABASE [$DB] TO DISK = ‘$FILE’ WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10”
        • 可选:保留最近 N 天

        • find “$BACKUP_PATH” -name “*.bak” -mtime +30 -delete
    • 定时任务(每天 02:00 执行并记录日志):
      • 0 2 * * * /opt/mssql-tools/backup_sql_server.sh >> /var/log/sql_server_backup.log 2>&1
    1. 备份到远程/网络位置
    • 可使用UNC 路径写入备份(需确保 SQL Server 服务账户对共享有读写权限),例如:
      • BACKUP DATABASE [YourDatabaseName] TO DISK = ‘\\NetworkPath\YourDatabaseName_$(date +"%Y%m%d%H%M%S").bak’ WITH FORMAT
    • 也可在备份完成后用 rsync/scp 将 .bak 文件复制到远程存储,实现异地冗余

三 恢复实践

    1. 完整恢复(示例)
    • 基本恢复(数据库不存在时):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] FROM DISK = ‘/var/opt/mssql/backup/full_YYYYMMDDHHMMSS.bak’ WITH RECOVERY, STATS = 10”
    • 覆盖现有数据库:
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] FROM DISK = ‘/var/opt/mssql/backup/full_YYYYMMDDHHMMSS.bak’ WITH REPLACE, RECOVERY, STATS = 10”
    1. 差异/日志恢复与“时点恢复”
    • 差异恢复(在完整备份基础上):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] FROM DISK = ‘/var/opt/mssql/backup/diff_YYYYMMDDHHMMSS.bak’ WITH NORECOVERY, STATS = 10”
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] WITH RECOVERY”
    • 时点恢复(完整 + 日志,示例到 2025-12-04 10:00:00):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] FROM DISK = ‘/var/opt/mssql/backup/full_YYYYMMDDHHMMSS.bak’ WITH NORECOVERY, STATS = 10”
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE LOG [YourDatabaseName] FROM DISK = ‘/var/opt/mssql/backup/log_*.trn’ WITH NORECOVERY, STOPAT = ‘2025-12-04T10:00:00’, STATS = 10”
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [YourDatabaseName] WITH RECOVERY”
    1. 还原到新库或移动文件位置
    • 还原到新库并指定新文件路径(NORECOVERY 便于后续日志/差异继续应用):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [NewDB] FROM DISK = ‘/var/opt/mssql/backup/full_YYYYMMDDHHMMSS.bak’ WITH MOVE ‘LogicalDataFileName’ TO ‘/var/opt/mssql/data/NewDB.mdf’, MOVE ‘LogicalLogFileName’ TO ‘/var/opt/mssql/data/NewDB_log.ldf’, NORECOVERY, STATS = 10”
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE DATABASE [NewDB] WITH RECOVERY”
    • 获取逻辑文件名(用于 MOVE):
      • sqlcmd -S localhost -U sa -P ‘YourStrongPassword’ -Q “RESTORE FILELISTONLY FROM DISK = ‘/var/opt/mssql/backup/full_YYYYMMDDHHMMSS.bak’”
    1. 图形化工具
    • 也可使用SSMS在图形界面执行还原,选择设备、设置目标库与文件位置、恢复选项(覆盖/NORECOVERY)等。

四 备份策略与运维要点

    1. 策略建议
    • 关键业务采用每周全量 + 每日差异 + 每小时事务日志;一般业务可每周全量 + 每日差异,并按需开启日志备份,以实现时点恢复最小数据丢失
    1. 存储与保留
    • 备份应写入不同物理位置(本地盘 + 远程/云),并配置定期清理(如保留30天),避免磁盘被占满。
    1. 监控与演练
    • 对备份日志与结果做监控与告警,定期恢复演练验证备份可用性与恢复时间目标(RTO/RPO)。
    1. 自动化与工具
    • 使用sqlcmd + cron实现自动化;在容器/远程场景可结合脚本与远程拷贝完成全链路备份与异地容灾。

0