在Ubuntu下進行mssql-server之資料桶(Catalog)備份與異地還原

今天有一個小需求,必須針對mssql-server的資料桶(Catalog)進行備份(之後簡稱Sql-A),並還原到另外一台mssql-server(之後簡稱Sql-B),這裡記錄一下過程。

透過SSMS備份Sql-A資料庫

Step 1. 進入SSMS連線到Sql-A,在資料桶(Catalog)右鍵點選工作>備份,備份類型選擇完整,路徑是預設的/var/opt/mssql/data/mydb.bak,點選確定後,應該就可以在對應的目錄看到mydb.bak

Step 2. 接著透過類似lftp之類的工具,將mydb.bak先拉到FTP主機,以利之後放到Sql-B的對應目錄。

lftp ftp://user:password@yourftp.server.com
put mydb.bak

將資料庫備份檔案上傳到Sql-B

Step 1. 在Sql-B的機器上,透過lftpmydb.bak上傳到Sql-B的對應目錄。

lftp ftp://user:password@yourftp.server.com
lcd /var/opt/mssql/data
get mydb.bak

Step 2. 記得更改mydb.bak的檔案權限,讓它屬於mssql這個使用者。

sudo chown mssql:mssql /var/opt/mssql/data/mydb.bak

透過SSMS將備份檔案還原到Sql-B

Step 1. 進入SSMS連線到Sql-B,檢查備份檔案相關資訊。

RESTORE FILELISTONLY 
FROM DISK = N'/var/opt/mssql/data/mydb.bak';

理論上你應該可以看到相關資訊,例如mydb:/var/opt/mssql/data/mydb.mdfmydb_log:/var/opt/mssql/data/mydb_log.ldf

Step 2. 接著就可以開始還原了,這裡的WITH REPLACE是為了強制覆蓋原有的資料庫。

RESTORE DATABASE mydb
FROM DISK = N'/var/opt/mssql/data/mydb.bak'
WITH MOVE N'mydb' TO N'/var/opt/mssql/data/mydb.mdf',
     MOVE N'mydb_log' TO N'/var/opt/mssql/data/mydb_log.ldf',
     REPLACE;

經過這樣一番操作後,應該就可以看到Sql-B的資料庫中有mydb這個資料桶(Catalog)了。

資料庫使用者的重建

一般來說還原完後,我們會需要重新指定使用者,可是尷尬的是原本的Sql-A機器上假設有一個user有權限針對mydb這個資料庫進行操作,那麼他會隨著mydb.bak檔案被帶過來Sql-B上,但這個使用者的密碼等資訊限不會被帶過來,因此我們在Sql-B上就必須重新建立這個使用者並且給予權限。

USE mydb;
DROP USER [user];

後續你可以透過SSMS的使用者介面,重新建立這個使用者並指派其為db_owner

如果權限設計得很複雜,也可以考慮先在Sql-B上建立一個user並賦予密碼後,然後透過指令直接將原先Sql-A的使用者指派為Sql-B。

USE mydb;
EXEC sp_change_users_login 'Auto_Fix', 'user';

相關連結

MicrosoftSqlServer Linux Ubuntu Backup Restore BakFiles