SQL Server在Ubuntu上的備份與恢復技巧
在Ubuntu上使用SQL Server進行備份恢復前,需完成基礎環境配置:
sudo apt-get install -y mssql-server
),并通過sudo /opt/mssql/bin/mssql-conf setup
配置SA密碼及實例設置。sudo apt-get install -y mssql-tools unixodbc-dev
,安裝后需將工具路徑加入環境變量(echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
并執行source ~/.bashrc
)。完整備份是基礎,包含數據庫所有數據和對象。推薦使用WITH FORMAT
選項覆蓋舊備份,WITH COMPRESSION
減少文件大小,WITH STATS
顯示進度。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backup/YourDatabaseName_full.bak' WITH FORMAT, COMPRESSION, STATS 10"
注意:備份目錄需提前創建并授權SQL Server用戶(sudo mkdir -p /var/opt/mssql/backup && sudo chown mssql:mssql /var/opt/mssql/backup
)。
差異備份僅備份自上次完整備份以來修改的數據,節省時間和存儲空間。需在完整備份后執行,使用WITH DIFFERENTIAL
選項。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backup/YourDatabaseName_diff.bak' WITH DIFFERENTIAL, INIT, SKIP"
提示:差異備份需與完整備份配合使用,恢復時需先恢復完整備份,再恢復最新的差異備份。
事務日志備份記錄自上次日志備份以來的所有事務,支持時間點恢復(Point-in-Time Recovery)。需在完整備份后執行,使用WITH INIT
選項覆蓋舊日志。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "BACKUP LOG [YourDatabaseName] TO DISK='/var/opt/mssql/backup/YourDatabaseName_log.bak' WITH INIT, SKIP"
適用場景:對數據一致性要求高的業務(如金融系統),需定期執行日志備份。
通過Linux的crontab
設置定時任務,實現無人值守備份。編輯當前用戶的crontab(crontab -e
),添加如下內容(每天凌晨2點執行完整備份):
0 2 * * * /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourPassword' -Q "BACKUP DATABASE [YourDatabaseName] TO DISK='/var/opt/mssql/backup/YourDatabaseName_full_$(date +\%Y\%m\%d).bak' WITH FORMAT, COMPRESSION, STATS 10"
注意:日期格式需轉義(\%Y\%m\%d
),避免cron解析錯誤。
恢復完整備份時,使用WITH NORECOVERY
選項(若需后續恢復差異或日志備份),或WITH RECOVERY
選項(直接使數據庫可用)。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "RESTORE DATABASE [YourDatabaseName] FROM DISK='/var/opt/mssql/backup/YourDatabaseName_full.bak' WITH NORECOVERY"
說明:若無需后續恢復,直接使用WITH RECOVERY
即可。
恢復差異備份時,需指定差異備份文件,并使用WITH NORECOVERY
(若有后續日志備份)或WITH RECOVERY
(直接可用)。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "RESTORE DATABASE [YourDatabaseName] FROM DISK='/var/opt/mssql/backup/YourDatabaseName_diff.bak' WITH NORECOVERY, MOVE 'YourDatabaseName_Data' TO '/var/opt/mssql/data/YourDatabaseName.mdf', MOVE 'YourDatabaseName_Log' TO '/var/opt/mssql/data/YourDatabaseName_log.ldf'"
提示:MOVE
選項用于指定數據文件和日志文件的新路徑(可選,若路徑未改變可省略)。
恢復事務日志備份時,需依次恢復所有日志文件,最后使用WITH RECOVERY
使數據庫可用。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "RESTORE LOG [YourDatabaseName] FROM DISK='/var/opt/mssql/backup/YourDatabaseName_log1.bak' WITH NORECOVERY"
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "RESTORE LOG [YourDatabaseName] FROM DISK='/var/opt/mssql/backup/YourDatabaseName_log2.bak' WITH RECOVERY"
注意:日志恢復需按順序執行,遺漏或順序錯誤會導致恢復失敗。
恢復完成后,使用DBCC CHECKDB
命令檢查數據庫完整性,確保存儲結構無損壞。
示例命令:
sqlcmd -S localhost -U SA -P 'YourPassword' -Q "DBCC CHECKDB([YourDatabaseName]) WITH NO_INFOMSGS, ALL_ERRORMSGS"
說明:若輸出無錯誤,則數據庫完整性正常;若有錯誤,需進一步修復(如使用REPAIR_ALLOW_DATA_LOSS
選項,但會丟失部分數據)。
rclone
工具),防止本地磁盤故障導致數據丟失。示例同步命令:rclone sync /var/opt/mssql/backup remote:sql_backup
。STATS
選項或日志監控備份進度,確保備份成功完成。若備份失敗,及時排查原因(如磁盤空間不足、權限問題)。sysadmin
角色),避免因權限不足導致操作失敗。