本人新書上市,請多多關照:《SQL Server On Linux運維實戰 2017版從入門到精通》
接上文 SQL Server On Linux(24)——SQL on Linux 備份和還原(1)——備份, 本文演示“備份”的配套工作——還原。
還原操作在兩個平臺上都類似,可以使用SQL命令或者SSMS圖形界面操作,比較常見的差異在於你需要還原的數據庫來自於別的地方(如別的服務器或者專用備份設備),然後在還原過程中需要對文件夾授權(包括讀取備份文件和還原數據庫時數據庫文件寫入對應磁盤的權限)。
這種情況什麼時候會發生呢?在作者的經歷中,出現在環境遷移的時候,比如有一個系統以前運行在Windows上,需要還原到Linux上,一般的操作是:
- 在Windows上備份數據庫,通過某些方式如SCP傳到Linux上,這是第一次授權,需要確保備份文件能夠寫到Linux上。可能這個文件夾還不是備份需要存放的地方。只是臨時移動所用,所以你可能需要再次調整權限在Linux上把備份文件移動到指定的備份文件夾。這是第二次權限調整。
- 如果你的數據庫打算直接還原到SQL Server現在的文件目錄,那權限基本上不用調整,但是如果你需要把庫還原到別的文件夾,就會引入第3次的權限調整。
下面我們來還原一下前面備份的數據庫,只是把庫名改成“AdventureWorks2017_Test”:
RESTORE DATABASE [AdventureWorks2017_Test] FILE = N'AdventureWorks2017'
FROM DISK = N'/var/sqlbackup/AdventureWorks2017.bak' WITH FILE = 1,
MOVE N'AdventureWorks2017' TO N'/var/opt/mssql/data/AdventureWorks2017_Test.mdf',
MOVE N'AdventureWorks2017_log' TO N'/var/opt/mssql/data/AdventureWorks2017_Test_0.ldf', NOUNLOAD, STATS = 10
GO
除了直接的還原,還有一種“還原”數據庫的操作——附加數據庫。從效果來說,通常附加的速度快,但是分離附加(配套操作)在常規運維當中不應該納入數據庫“備份還原”範疇,作者更願意相信它只是一個應急操作。畢竟暴力分離操作很多時候會導致日誌異常。
下面我們先把剛還原的“AdventureWorks2017_Test”分離,然後移動到另外一個文件夾再附加。因爲SSMS操作沒什麼特別的需要演示的,所以作者儘量使用命令行的方式,同時爲了讓讀者更加習慣使用Linux的命令行環境。
- 分離數據庫
分離之前我們先要檢查一下數據庫的文件所在路徑,以免分離後找不到文件:
SELECT name,physical_name
FROM sys.master_files
WHERE database_id=db_id('AdventureWorks2017_Test')
由於Linux界面輸出結果沒有格式化(需要安裝第三方工具,但是作者不想引入過多這些工具),所以這裏可以使用SSMS來查詢,本環境結果如下圖,注意圖中的name是邏輯文件名,physical_name是物理文件名,這兩個跟數據庫名並不總是一致的。
然後回到Linux界面,使用SQLCMD執行T-SQL命令來分離數據庫:
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2017_Test'
- 移動文件到另外一個目錄
這裏創建一個新目錄,新目錄爲/var/opt/mssql/testdata/,並用命令授權。下面3個命令用於創建和授權:
~$ sudo mkdir /var/opt/mssql/testdata/
~$ sudo chown mssql /var/opt/mssql/testdata
~$ sudo chgrp mssql /var/opt/mssql/testdata
然後使用cp來複制文件然後用rm刪除舊文件夾的文件,其實可以用mv(等於Windows的剪切),但是剪切過程如果出現如斷網、關機之類的情況,會導致無法恢復,相對危險,所以建議使用cp。
在實際copy之前,我們要切換到mssql這個賬號,由於這個賬號並沒有提供密碼(安裝過程沒有提供),在不得不修改mssql這個賬號的密碼之前,我們還有其他辦法,就是先切換root(~$ sudo su – root
),再切換mssql(~# su – mssql
),注意前面的$已經變成了#,同時“-”前後都有空格。
然後就可以開始copy操作:
cp -rv /var/opt/mssql/data/AdventureWorks2017_Test* /var/opt/mssql/testdata/
cp、-rv、和*號之間均有空格,*代表模糊匹配,把所有AdventureWorks2017_Test開頭的文件複製到對應目錄。-rv用於顯示進度,雖然並沒有實際的進度條。在複製完畢之後,可以用exit退出mssql這個賬號的作用域,回到root作用域,然後~# su – superdbadmin 回到我們正常的賬號作用域中。
文件複製完畢之後,可以進行附加操作:
USE [master]
GO
CREATE DATABASE [AdventureWorks2017_Test] ON
( FILENAME = N'/var/opt/mssql/testdata/AdventureWorks2017_Test.mdf' ),
( FILENAME = N'/var/opt/mssql/testdata/AdventureWorks2017_Test_0.ldf' )
FOR ATTACH
GO
結果如下圖:
數據庫的備份還原基礎演示就到這裏,對於初學者來說,基本上夠用了,當然命令行確實比較累,真正工作過程不妨使用SSMS來操作大部分的過程。不過還是建議讀者多聯繫Linux上的操作。
另外要提醒一下,備份是爲了還原,不能還原的備份是沒有意義的,但是除了真正還原一個數據庫並且對數據庫做詳細的檢查之外,沒有任何一種方式能夠100%確保備份的有效性。同時數據庫的數量之大、容量之大,往往上班8小時都不夠用於校驗全部數據庫的備份,但是作爲DBA,又不能不做,所以作者日常工作會週期性或不定期抽檢。大概方式如下,任何一步失敗或者異常都應該當作本次“備份失敗”,流程圖如下:
這不是官方的流程,只是個人工作總結,僅供參考,下面針對內容挑一些來解釋一下:
- 備份文件體積差異且無法解釋
有時候體積差異是可以解釋的,比如大批量歷史數據歸檔,那麼現有數據庫的體積可能會比前一個備份文件小很多。 - 如果服務器的空間不足以再次還原一個庫
那麼就用RESTORE VERIFY來校驗。當然其他服務器空間充足的話可以在別的服務器實施。 - 數據庫能否打開
有時候還原過程無誤,但是發現數據庫變成只讀或者根本沒法打開,要檢查一下權限的問題,也有可能備份文件有損壞。 - 還原過程失敗
本人最常見的就是還原的數據庫無法寫入指定的文件夾,說白了就是權限問題。