1. 程式人生 > 其它 >在 Docker 容器中還原 SQL Server 資料庫(.bak檔案)

在 Docker 容器中還原 SQL Server 資料庫(.bak檔案)

技術標籤:資料庫dockerlinux

系統環境:
macOS BigSur 版本11.0.1
本文預設系統已經在docker中拉取完成sqlserver映象.

  1. 首先在Docker Dashboard中執行sqlserver映象

在這裡插入圖片描述
要檢視 Docker 容器,請使用 docker ps 命令

sudo docker ps -a

如果“狀態”列顯示“正常執行”,則 SQL Server 將在容器中執行,並偵聽“埠”列中指定的埠 。
在這裡插入圖片描述

  1. 將備份檔案複製到容器中
    ①首先,使用 docker exec 來建立備份資料夾。 以下命令在 SQL Server 容器中建立 /var/opt/mssql/backup 目錄 。
sudo docker exec -it sqlserver mkdir /var/opt/mssql/backup

②使用 docker cp 將備份檔案複製到 /var/opt/mssql/backup 目錄的容器中 。

sudo docker cp 檔名.bak sqlserver:/var/opt/mssql/backup
  1. 還原資料庫
    備份檔案現在位於容器內。 在還原備份之前,請務必瞭解備份中的邏輯檔名和檔案型別。 以下 Transact-SQL 命令使用容器中的 sqlcmd 檢查備份並執行還原 。
    ①在容器中執行 sqlcmd,列出備份中的邏輯檔名和路徑 。 這是通過“RESTORE FILELISTONLY”Transact-SQL 語句實現的 。
sudo docker exec -it sqlserver /opt/mssql-tools/bin/sqlcmd -S localhost \
   -U SA -P '<YourNewStrong!Passw0rd>' \
   -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/檔名.bak"' \
   | tr -s ' ' | cut -d ' ' -f 1-2

YourNewStrong!Passw0rd 部分要替換成安裝資料庫時設定好的密碼
.bak檔案的 檔名 部分要替換成實際的檔名

會得到 類似於

下面的輸出:

LogicalName   PhysicalName
------------------------------------------
WWI_Primary   D:\Data\WideWorldImporters.mdf
WWI_UserData   D:\Data\WideWorldImporters_UserData.ndf
WWI_Log   E:\Log\WideWorldImporters.ldf
WWI_InMemory_Data_1   D:\Data\WideWorldImporters_InMemory_Data_1

②呼叫 RESTORE DATABASE 命令,還原容器中的資料庫 。 為上一步中的每個檔案指定新路徑。

這裡以 WideWorldImporters 資料庫為例,實際使用時要將程式碼中的資料庫名、檔名、目錄按需求更改。

sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
   -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/wwi.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'

會得到類似於下面的輸出:

Processed 1464 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1.
Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1.
Processed 33 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1.
Processed 3862 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1.
Converting database 'WideWorldImporters' from version 852 to the current version 869.
Database 'WideWorldImporters' running the upgrade step from version 852 to version 853.
Database 'WideWorldImporters' running the upgrade step from version 853 to version 854.
Database 'WideWorldImporters' running the upgrade step from version 854 to version 855.
Database 'WideWorldImporters' running the upgrade step from version 855 to version 856.
Database 'WideWorldImporters' running the upgrade step from version 856 to version 857.
Database 'WideWorldImporters' running the upgrade step from version 857 to version 858.
Database 'WideWorldImporters' running the upgrade step from version 858 to version 859.
Database 'WideWorldImporters' running the upgrade step from version 859 to version 860.
Database 'WideWorldImporters' running the upgrade step from version 860 to version 861.
Database 'WideWorldImporters' running the upgrade step from version 861 to version 862.
Database 'WideWorldImporters' running the upgrade step from version 862 to version 863.
Database 'WideWorldImporters' running the upgrade step from version 863 to version 864.
Database 'WideWorldImporters' running the upgrade step from version 864 to version 865.
Database 'WideWorldImporters' running the upgrade step from version 865 to version 866.
Database 'WideWorldImporters' running the upgrade step from version 866 to version 867.
Database 'WideWorldImporters' running the upgrade step from version 867 to version 868.
Database 'WideWorldImporters' running the upgrade step from version 868 to version 869.
RESTORE DATABASE successfully processed 58455 pages in 18.069 seconds (25.273 MB/sec).

③驗證還原的資料庫
執行以下查詢以在容器中顯示資料庫名稱的列表:

sudo docker exec -it sqlserver /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
   -Q 'SELECT Name FROM sys.Databases'

資料庫列表中應會顯示 WideWorldImporters 。

此時在Datagrip中重新整理資料庫,還原出的資料庫就成功顯示出來了!