理解如何备份和恢复在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
参考文档