当前位置:网站首页>如何实现容器内的SqlServer的数据库迁移
如何实现容器内的SqlServer的数据库迁移
2022-06-24 15:33:00 【独家雨天】
理解如何备份和恢复在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'[email protected]' --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 [email protected]
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
参考文档
边栏推荐
- An accident caused by a MySQL misoperation, and the "high availability" cannot withstand it!
- 【C语言刷题——Leetcode12道题】带你起飞,飞进垃圾堆
- Who do you want to open a stock account? Is online account opening safe?
- leetcode. 12 --- integer to Roman numeral
- Teach you how to view version information with mongodb
- Task priority motion planning of floating base
- Monitoring and warning | is the website attacked?
- 熬夜整理出的软件测试【高频】面试题大全(2022最新)
- Keyword of ES mapping; Term query add keyword query; Change mapping keyword type
- 【Prometheus】6. Prometheus and kubernetes (incomplete)
猜你喜欢
Oracle RAC configuration multipathing
Multimeter resistance measurement diagram and precautions
Step by step introduction to sqlsugar based development framework (9) -- Realizing field permission control with WinForm control
高速公路服务区智能一体机解决方案
An accident caused by a MySQL misoperation, and the "high availability" cannot withstand it!
Record the range of data that MySQL update will lock
From pair to unordered_ Map, theory +leetcode topic practice
Method after charging the idea plug-in material theme UI
设备通过国标GB28181接入EasyCVR平台,出现断流情况该如何解决?
Bert whitening vector dimension reduction and its application
随机推荐
A simple and powerful developer toolkit box3 cc
【我的OpenGL学习进阶之旅】OpenGL的坐标系的学习笔记
Record the range of data that MySQL update will lock
Which securities company is better and safer for great wisdom to choose when opening an account
"Industry outlook" analysis of five major trends in China's security video surveillance industry
Is industrial securities reliable? Is it safe to open a securities account?
Crmeb multi merchant system applet authorization problem solving paste
Use tuples
手机注册股票开户 炒股开户安全吗
Is it safe to open an account in flush? What preparation is needed
Laravel 8 realizes auth login
Security Analysis on mining trend of dogecoin, a public cloud
Istio practical skill: enable accesslog locally
【Kubernetes】1
Is financial management of securities account safe??
Design of CAN bus controller based on FPGA (Part 2)
Universal file online preview project, open source!
The industrial control security of roaming the Intranet
Use list
From pair to unordered_ Map, theory +leetcode topic practice