如何實現容器內的SqlServer的數據庫遷移

理解如何備份和恢復在Docker中的SqlServer中的database。

預處理:

  1. Docker engine 1.8 及以上
  2. 最小2G磁盤空間和2G的內存空間
  3. 具有超級用戶權限
  4. 對Docker有些基本的概念和熟悉基本操作

如何在Docker容器內備份和恢復數據庫

安裝並運行數據庫

根據自己的需求指定SqlServer版本

docker pull microsoft/mssql-server-linux:2017-latest

然後在Docker中後臺運行SqlServer容器。

docker run -e ‘ACCEPT_EULA=Y’ -e ‘MSSQL_SA_PASSWORD=SQLShack$2018’ –name shackdemo1 -p 1401:1433 -d microsoft/mssql-server-linux:latest

連接數據庫

容器啓動之後,進入SqlServer容器內。

docker exec –it shackdemo1 bash

進入容器之後 ,尋找sqlcmd命令。在Docker啓動的sqlserver 服務器中,該腳本存放在 /opt/mssql-tools/bin/sqlcmd中。下面主要翻譯和說明下sqlcmd命令的重要參數。

例如,連接本地的SqlServer服務器中的SQLTestDB數據庫。輸入命令爲

sqlcmd -S 127.0.0.1 -U sa -d SQLTestDB -P Password123

主要命令:

  • -S 表示SqlServer服務器的地址
  • -U 表示SqlServer數據庫的用戶名
  • -d 表示這次操作使用的數據庫
  • -P 表示連接該數據庫的用戶密碼
  • -Q 表示可以直接接需要進行SQL操作的語句

然後創建一個SQLShackDemo數據庫,並且插入一些table數據用來測試。(select name from sys.databases;go 可以看到系統內的所有數據庫)

1> create database SQLShackDemo;
2> go
1> use SQLShackDemo;
2> go
Changed database context to 'SQLShackDemo'.
1> create table SQLAuthor (id int,name char(20));
2> go
1> insert into SQLAuthor values(1,'Prashanth Jayaram');
2> go

(1 rows affected)
1>

備份數據庫

然後,利用以下命令來實現數據庫的備份。

BACKUP DATABASE [SQLShackDemo] TO DISK = N'/var/opt/mssql/backup/SQLShackDemo.bak' WITH FORMAT, INIT, COMPRESSION,STATS = 10

然後我們離開容器來測試這個備份文件沒有被container容器擦除。通過 docker cp 可以很方便的實現容器內數據和宿主主機的數據的互相傳輸。

簡單的看下 docker cp 命令,主要分爲兩個參數:

  1. 容器名,shackdemo1, 緊接冒號後面的就是容器內需要複製的文件路徑
  2. 宿主主機的路徑。

例如,docker ps shackdemo1:/var/opt/mssql/backup/SQLShackDemo.bak /tmp/,執行完命令,可以在宿主主機查看一下 ls -l /tmp/SQLShackDemo.bak

恢復數據庫

主要內容爲如何在別的SqlServer容器中根據backup文件恢復數據庫?

新建一個容器,shackdemo2

docker run -e ‘ACCEPT_EULA=Y’ -e ‘MSSQL_SA_PASSWORD=SQLShack$2018’ –name shackdemo2 -p 1402:1433 -d microsoft/mssql-server-linux:latest

然後進入新建的容器

docker exec -it shackdemo2 bash

進入指定的命令行

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA Password:

輸入如下 select name from sys.databases;go 命令,查詢新建的容器現有的系統數據庫信息。

退出容器,複製前面備份的文件到容器shackdemo2中。同樣的存在如下的兩個參數:

  1. 宿主主機的路徑
  2. 容器名+:+容器內的目錄
Docker cp /tmp/SQLShackDemo.bak sqldemo2:var/opt/mssql/data/

接下來,登錄shackdemo2容器,並且進入 sqlcmd控制檯 之後,運行如下的恢復操作。

RESTORE DATABASE [SQLShackDemo] FROM DISK = N’/var/opt/mssql/data/SQLShackDemo.bak’ with REPLACE

恢復完成之後,可以通過前面的select name from sys.databases;go屬性進行查詢。

利用Docker裏面的數據卷實現數據庫的遷移

通常的情況下,可以將數據信息存在一個數據卷容器中,這樣,當停止或者銷燬SqlServer的容器時候,數據庫的存儲信息還能夠繼續的保持。並且能夠方便高效的在不同容器件傳遞數據

啓動一個新的容器,並且掛載創建數據卷sqlservervolume

docker run -e'ACCEPT_EULA=Y' -e'MSSQL_SA_PASSWORD=thanVitha@2015' --name sqldemo  –v sqlservervolume:/var/opt/mssql -d microsoft/mssql-server-linux:2017-latest

然後,進入容器內部,進行一些數據庫的操作。

$ docker exec -it sqldemo bash
# /opt/mssql-tools/bin.sqlcmd -U SA -P thanVitha@2015
1> create database sqlvolumeetestDB;
2>go

創建完之後,離開SQL shell 並且退出。停止和移除sqldemo 容器。

docker stop sqldemo
docker rm sqldemo

在停止和移除 sqldemo 之後,前面新建的數據卷依然存在

docker volume ls

然後重新,新啓動一個容器,並且依舊掛載前面的數據卷。掛載成功之後,你會發現,該容器還是依舊存在。

補充學習的部分

Security

針對數據庫的備份,建議將TRUSTWORTHY 設置爲OFF。具體詳細請參考官網完整設置ALTER DATABASE SET 選項 (Transact-SQL)

ALTER DATABASE database_name SET TRUSTWORTHY OFF

權限

默認情況下,sysadmin、db_owner和db_backoperator等角色需要授予 BACKUP DATABASEBACKUP LOG 權限。

如何使用 Transact-SQL

通過執行BACKUP DATABASE 語句創建完整的數據庫備份,同時制定

  • 要備份的數據庫名稱
  • 寫入完整數據庫備份的備份設備。

基本語法定義如下:

BACKUP DATABASE database TO backup_device [ , ...n ] [ WITH with_options [ , ...o ] ] ;

假定,希望備份數據庫 ‘SQLTestDB’ 中的數據庫內容備份到磁盤。

USE SQLTestDB;
GO
BACKUP DATABASE SQLTestDB
TO DISK = 'c:\tmp\SQLTestDB.bak'
   WITH FORMAT,
      MEDIANAME = 'SQLServerBackups',
      NAME = 'Full Backup of SQLTestDB';
GO

參考文檔


  1. Understanding Backup and Restore operations in SQL Server Docker Containers
  2. Restore a SQL Server database in Docker - SQL Server | Microsoft Docs
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章