SQL Server On Linux(25)——SQL on Linux 備份和還原(2)——還原

本人新書上市,請多多關照:《SQL Server On Linux運維實戰 2017版從入門到精通》

在這裏插入圖片描述

接上文 SQL Server On Linux(24)——SQL on Linux 備份和還原(1)——備份, 本文演示“備份”的配套工作——還原。

  還原操作在兩個平臺上都類似,可以使用SQL命令或者SSMS圖形界面操作,比較常見的差異在於你需要還原的數據庫來自於別的地方(如別的服務器或者專用備份設備),然後在還原過程中需要對文件夾授權(包括讀取備份文件和還原數據庫時數據庫文件寫入對應磁盤的權限)。
  這種情況什麼時候會發生呢?在作者的經歷中,出現在環境遷移的時候,比如有一個系統以前運行在Windows上,需要還原到Linux上,一般的操作是:

  1. 在Windows上備份數據庫,通過某些方式如SCP傳到Linux上,這是第一次授權,需要確保備份文件能夠寫到Linux上。可能這個文件夾還不是備份需要存放的地方。只是臨時移動所用,所以你可能需要再次調整權限在Linux上把備份文件移動到指定的備份文件夾。這是第二次權限調整。
  2. 如果你的數據庫打算直接還原到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的命令行環境。

  1. 分離數據庫
    分離之前我們先要檢查一下數據庫的文件所在路徑,以免分離後找不到文件:
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'
  1. 移動文件到另外一個目錄
      這裏創建一個新目錄,新目錄爲/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來校驗。當然其他服務器空間充足的話可以在別的服務器實施。
  • 數據庫能否打開
      有時候還原過程無誤,但是發現數據庫變成只讀或者根本沒法打開,要檢查一下權限的問題,也有可能備份文件有損壞。
  • 還原過程失敗
      本人最常見的就是還原的數據庫無法寫入指定的文件夾,說白了就是權限問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章