一、准备工作
sudo apt-get update
sudo apt-get install -y mssql-server mssql-tools unixodbc-dev
sudo ln -sfn /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd # 添加sqlcmd到系统路径
sudo mkdir -p /var/opt/mssql/backup
sudo chown mssql:mssql /var/opt/mssql/backup
sudo chmod 700 /var/opt/mssql/backup
二、备份流程
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [YourDatabaseName]
TO DISK='/var/opt/mssql/backup/YourDatabaseName_Full_$(date +%Y%m%d).bak'
WITH FORMAT, COMPRESSION, STATS=10" # FORMAT覆盖旧备份,COMPRESSION节省空间,STATS显示进度
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [YourDatabaseName]
TO DISK='/var/opt/mssql/backup/YourDatabaseName_Diff_$(date +%Y%m%d).bak'
WITH DIFFERENTIAL, INIT, STATS=10" # DIFFERENTIAL仅增量,INIT覆盖上次差异备份
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP LOG [YourDatabaseName]
TO DISK='/var/opt/mssql/backup/YourDatabaseName_Log_$(date +%Y%m%d_%H%M).bak'
WITH INIT, STATS=10" # INIT覆盖上次日志备份
通过crontab定时执行备份脚本,减少人工干预:
/opt/mssql/scripts/backup.sh):#!/bin/bash
BACKUP_DIR="/var/opt/mssql/backup"
DB_NAME="YourDatabaseName"
DATE=$(date +%Y%m%d)
# 完整备份(每周日凌晨2点执行,可通过crontab判断星期几)
if [ $(date +%u) -eq 1 ]; then
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [$DB_NAME]
TO DISK='$BACKUP_DIR/${DB_NAME}_Full_$DATE.bak' WITH FORMAT, COMPRESSION, STATS=10"
else
# 差异备份(其他时间)
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [$DB_NAME]
TO DISK='$BACKUP_DIR/${DB_NAME}_Diff_$DATE.bak' WITH DIFFERENTIAL, INIT, STATS=10"
fi
chmod +x /opt/mssql/scripts/backup.sh
crontab -e
# 添加以下行(根据需求调整频率)
0 2 * * * /opt/mssql/scripts/backup.sh
三、恢复流程
恢复顺序:完整备份 → 差异备份(若有) → 事务日志备份(若有),最后用WITH RECOVERY使数据库可用。
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE DATABASE [YourDatabaseName]
FROM DISK='/var/opt/mssql/backup/YourDatabaseName_Full_20251020.bak'
WITH NORECOVERY, REPLACE, STATS=10" # REPLACE覆盖现有数据库,NORECOVERY保持数据库不可用
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE DATABASE [YourDatabaseName]
FROM DISK='/var/opt/mssql/backup/YourDatabaseName_Diff_20251021.bak'
WITH NORECOVERY, STATS=10"
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE LOG [YourDatabaseName]
FROM DISK='/var/opt/mssql/backup/YourDatabaseName_Log_20251021_1200.bak'
WITH RECOVERY, STATS=10" # 最后一步用RECOVERY使数据库可用
恢复完成后,使用DBCC CHECKDB检查数据库完整性(避免数据损坏):
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "DBCC CHECKDB([YourDatabaseName]) WITH NO_INFOMSGS"
若输出无错误,则恢复成功。
四、注意事项
mssql用户访问,避免未授权修改。