ubuntu

SQL Server在Ubuntu上的备份与恢复流程

小樊
50
2025-10-09 16:00:13
栏目: 云计算

一、备份流程

1. 准备工作:安装SQL Server命令行工具

在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

2. 创建备份目录并设置权限

为避免权限问题,需将备份目录归属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用户访问

3. 使用sqlcmd执行备份命令

(1)完整备份(Full Backup)

完整备份包含数据库所有数据,是恢复的基础。推荐开启压缩(减少存储空间)和初始化(覆盖旧备份文件):

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"

(2)差异备份(Differential Backup,可选)

差异备份仅记录自上次完整备份后的数据变化,减少备份时间和存储占用。需在完整备份后执行:

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"

(3)事务日志备份(Transaction Log Backup,可选)

事务日志备份记录所有事务操作,用于实现时间点恢复(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"

4. 自动化备份(Crontab定时任务)

通过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查看当前任务列表。

5. 备份文件维护(可选)

为避免备份文件占用过多磁盘空间,可设置定时任务删除超过30天的旧备份:

# 在crontab中添加以下内容(每天凌晨3点执行)
0 3 * * * find /var/opt/mssql/backups -name "*.bak" -mtime +30 -exec rm {} \;

二、恢复流程

1. 准备工作:确认备份文件位置

确保备份文件(.bak)存储在SQL Server可访问的路径(如/var/opt/mssql/backups)。可通过以下命令验证:
ls -lh /var/opt/mssql/backups/

2. 恢复完整备份(基础步骤)

恢复完整备份时,需指定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"

3. 恢复差异备份(若有)

若存在差异备份,需在完整备份后执行,仍使用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"

4. 恢复事务日志备份(若有)

事务日志备份需按顺序恢复(从最早到最新),最后一次恢复使用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"

5. 验证恢复结果

恢复完成后,可通过以下命令检查数据库完整性:

sqlcmd -S localhost -U SA -P 'YourStrongPassword' -Q "DBCC CHECKDB([YourDatabaseName]) WITH NO_INFOMSGS"

若输出无错误,则表示数据库恢复成功。

注意事项

0
看了该问题的人还看了