如何实现容器内的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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值