一、备份流程
在Ubuntu上使用sqlcmd工具需先安装对应客户端包,执行以下命令:
sudo apt-get update && sudo apt-get install -y mssql-tools unixodbc-dev
安装完成后,将工具路径加入环境变量(便于全局调用):
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc && source ~/.bashrc
为避免权限问题,需将备份目录归属mssql用户(SQL Server默认运行用户):
sudo mkdir -p /var/opt/mssql/backups # 创建备份目录
sudo chown mssql:mssql /var/opt/mssql/backups # 修改所有者
sudo chmod 700 /var/opt/mssql/backups # 限制仅mssql用户访问
完整备份包含数据库所有数据,是恢复的基础。推荐开启压缩(减少存储空间)和初始化(覆盖旧备份文件):
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backups/YourDatabaseName_Full_$(date +%Y%m%d).bak' WITH INIT, COMPRESSION, STATS=10"
STATS=10:每完成10%显示进度;$(date +%Y%m%d):自动添加日期后缀,便于区分备份版本。差异备份仅记录自上次完整备份后的数据变化,减少备份时间和存储占用。需在完整备份后执行:
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backups/YourDatabaseName_Diff_$(date +%Y%m%d).bak' WITH DIFFERENTIAL, INIT, STATS=10"
事务日志备份记录所有事务操作,用于实现时间点恢复(Point-in-Time Recovery)。需在完整备份后定期执行(如每小时):
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP LOG [YourDatabaseName] TO DISK='/var/opt/mssql/backups/YourDatabaseName_Log_$(date +%Y%m%d_%H%M).bak' WITH INIT, STATS=10"
通过crontab设置定时任务,实现无人值守备份。编辑当前用户的crontab:
crontab -e
添加以下内容(示例:每天凌晨2点执行完整备份,每小时执行事务日志备份):
# 每天凌晨2点执行完整备份
0 2 * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backups/YourDatabaseName_Full_$(date +\%Y\%m\%d).bak' WITH INIT, COMPRESSION, STATS=10"
# 每小时执行事务日志备份(需提前完成完整备份)
0 * * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "BACKUP LOG [YourDatabaseName] TO DISK='/var/opt/mssql/backups/YourDatabaseName_Log_$(date +\%Y\%m\%d_\%H\%M).bak' WITH INIT, STATS=10"
保存后,cron会自动加载任务。可通过crontab -l查看当前任务列表。
为避免备份文件占用过多磁盘空间,可设置定时任务删除超过30天的旧备份:
# 在crontab中添加以下内容(每天凌晨3点执行)
0 3 * * * find /var/opt/mssql/backups -name "*.bak" -mtime +30 -exec rm {} \;
二、恢复流程
确保备份文件(.bak)存储在SQL Server可访问的路径(如/var/opt/mssql/backups)。可通过以下命令验证:
ls -lh /var/opt/mssql/backups/
恢复完整备份时,需指定WITH NORECOVERY(表示未完成恢复,后续可能需要应用差异/日志备份):
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE DATABASE [YourDatabaseName] FROM DISK='/var/opt/mssql/backups/YourDatabaseName_Full_20250930.bak' WITH NORECOVERY, REPLACE, STATS=10"
REPLACE:若数据库已存在,则替换(需谨慎使用,避免覆盖现有数据);NORECOVERY:保留数据库在“恢复中”状态,允许后续应用差异/日志备份。若存在差异备份,需在完整备份后执行,仍使用WITH NORECOVERY:
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE DATABASE [YourDatabaseName] FROM DISK='/var/opt/mssql/backups/YourDatabaseName_Diff_20250930_1800.bak' WITH NORECOVERY, STATS=10"
事务日志备份需按顺序恢复(从最早到最新),最后一次恢复使用WITH RECOVERY(使数据库可用):
# 恢复第一个日志备份
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE LOG [YourDatabaseName] FROM DISK='/var/opt/mssql/backups/YourDatabaseName_Log_20250930_1800.bak' WITH NORECOVERY, STATS=10"
# 恢复第二个日志备份(若有)
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE LOG [YourDatabaseName] FROM DISK='/var/opt/mssql/backups/YourDatabaseName_Log_20250930_1900.bak' WITH NORECOVERY, STATS=10"
# 最后一次恢复,使数据库可用
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "RESTORE LOG [YourDatabaseName] FROM DISK='/var/opt/mssql/backups/YourDatabaseName_Log_20250930_2000.bak' WITH RECOVERY, STATS=10"
恢复完成后,可通过以下命令检查数据库完整性:
sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "DBCC CHECKDB([YourDatabaseName]) WITH NO_INFOMSGS"
若输出无错误,则表示数据库恢复成功。
注意事项
mssql:mssql),避免因权限不足导致操作失败;sqlcmd的-P参数交互式输入,或通过配置文件(如~/.sqlcmd)管理凭证;