理解如何備份和恢復在Docker中的SqlServer中的database。
預處理:
- Docker engine 1.8 及以上
- 最小2G磁盤空間和2G的內存空間
- 具有超級用戶權限
- 對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
命令,主要分爲兩個參數:
- 容器名,shackdemo1, 緊接冒號後面的就是容器內需要複製的文件路徑
- 宿主主機的路徑。
例如,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中。同樣的存在如下的兩個參數:
- 宿主主機的路徑
- 容器名+:+容器內的目錄
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 DATABASE
和 BACKUP 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
參考文檔