在Debian上可通过Microsoft 官方 APT 仓库安装并运行SQL Server for Linux,也可在容器中运行。备份与恢复建议使用sqlcmd执行 T‑SQL 的 BACKUP/RESTORE 命令,或借助 SMO/SSMS 完成。为提升可靠性,建议将备份写入本地磁盘 + 远程/云存储的多地点,并定期做恢复演练验证可用性。
二 备份实践
使用 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 显示进度百分比。
自动化与保留策略
备份脚本 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”
BACKUP DATABASE [YourDatabaseName] TO DISK = ‘\\NetworkPath\YourDatabaseName_$(date +"%Y%m%d%H%M%S").bak’ WITH FORMAT
也可在备份完成后用 rsync/scp 将 .bak 文件复制到远程存储,实现异地冗余。
三 恢复实践
完整恢复(示例)
基本恢复(数据库不存在时):
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”
差异/日志恢复与“时点恢复”
差异恢复(在完整备份基础上):
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”
还原到新库或移动文件位置
还原到新库并指定新文件路径(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’”