在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的機器上,透過lftp
將mydb.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.mdf
、mydb_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';
相關連結
- 在Ubuntu下安裝Microsoft SQL Server 2022
- 在Ubuntu下進行mssql-server之資料桶(Catalog)備份與異地還原
- 在Ubuntu下安裝sqlcmd(for mssql-server)
- 在Ubuntu下透過cron執行SQL完整備份