问题引入

前一篇文章,菜鸟找到了SQL on Linux Docker容器销毁后,容器中的数据库文件可以得以保留的方法,老鸟非常开心。所以,今天又提出了新的问题:“鸟儿,如果我想把我的数据库从SQL on Windows迁移到SQL on Linux Docker,如何才能做到呢?”。
菜鸟一听这个问题,头脑迅速反应出数据库迁移的两种方法:备份还原和分离附加。就让我们来试试吧。详细的过程可以参见我录制的Youku视频:http://v.youku.com/v_show/id_XMjUwNzQyNTU4OA==.html

构建SQL on Windows测试数据库

为了测试从SQL on Windows迁移数据库到SQL on Linux Docker的两种方法:备份还原和数据库附加。我们在SQL on Windows数据库实例中创建两个测试数据库,TestAttach和TestBackRestore,然后分别在两个数据库下创建一张测试表,接下来插入两条NEWID测试数据,最后查看这两条数据。

IF DB_ID('TestAttach') IS NULL    CREATE DATABASE TestAttach;
GOUSE TestAttachGOIF OBJECT_ID('dbo.tb_Test', 'U') IS NOT NULLDROP TABLE dbo.tb_TestGOCREATE TABLE dbo.tb_Test(RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,Name VARCHAR(36) NOT NULL);INSERT INTO dbo.tb_TestSELECT NEWID() UNION ALL SELECT NEWID();SELECT * FROM dbo.tb_Test;IF DB_ID('TestBackRestore') IS NULL    CREATE DATABASE TestBackRestore;
GOUSE TestBackRestoreGOIF OBJECT_ID('dbo.tb_Test', 'U') IS NOT NULLDROP TABLE dbo.tb_TestGOCREATE TABLE dbo.tb_Test(RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,Name VARCHAR(36) NOT NULL);INSERT INTO dbo.tb_TestSELECT NEWID() UNION ALL SELECT NEWID();SELECT * FROM dbo.tb_Test;SELECT physical_name,* FROM sys.master_filesWHERE database_id = DB_ID('TestAttach');

执行结果截图如下:

为了可以直接复制mdf和ldf文件,我们需要下线数据库TestAttach,然后备份数据库TestBackRestore。

USE masterGOALTER DATABASE TestAttach SET OFFLINE;USE masterGOEXEC xp_create_subdir 'C:\temp\' GO BACKUP DATABASE [TestBackRestore]    TO DISK = 'C:\temp\TestBackRestore_full_20170210.bak' WITH STATS = 2 ;

传输数据库文件

由于我是在Mac系统安装Windows虚拟机来测试的,所以,首先我需要将Windows虚拟机中的文件复制到Mac系统。比如:我将下面三个文件复制到Mac的~/Downloads目录:

C:\SQL2K14_DATA\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestAttach.mdf
C:\SQL2K14_DATA\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestAttach_log.ldf
C:\temp\TestBackRestore_full_20170210.bak

接下来,我需要在Mac系统中,将这三个文件复制到SQL on Linux Docker容器中,方法如下:

docker cp ~/Downloads/TestAttach.mdf linuxsql41433:/var/opt/mssql/data/TestAttach.mdf
docker cp ~/Downloads/TestAttach_log.ldf linuxsql41433:/var/opt/mssql/data/TestAttach_log.ldf
docker cp ~/Downloads/TestBackRestore_full_20170210.bak linuxsql41433:/var/opt/mssql/data/TestBackRestore_full_20170210.bak

备份文件、数据库数据文件和日志文件准备完毕后,接下来该是还原数据库和附加数据库了。

还原数据库到SQL on Linux Docker

这个和SQL on Windows还原操作没有什么两样,思路还是先检查备份文件的完整性,然后使用Restore语句还原数据库。使用SSMS连接到SQL on Linux Docker中,执行以下脚本:

USE masterGO--Verify backup fileRESTORE FILELISTONLY FROM DISK = N'C:\var\opt\mssql\data\TestBackRestore_full_20170210.bak';RESTORE VERIFYONLY FROM DISK = N'C:\var\opt\mssql\data\TestBackRestore_full_20170210.bak';-- Restore DatabaseUSE masterGORESTORE DATABASE [TestBackRestore]FROM DISK = N'C:\var\opt\mssql\data\TestBackRestore_full_20170210.bak'WITH MOVE N'TestBackRestore' TO N'C:\var\opt\mssql\data\TestBackRestore.mdf',MOVE N'TestBackRestore_log' TO N'C:\var\opt\mssql\data\TestBackRestore_log.ldf',STATS=2GO

最后是附加数据库到SQL on Linux Docker的操作。

附加数据库到SQL on Linux Docker

附加数据库方法也和SQL on Windows一样,使用Create Database for Attach方法。同样,使用SSMS连接到SQL on Linux Docker,执行以下数据库附加操作脚本:

USE masterGO-- Create database via attachCREATE DATABASE [TestAttach]    ON ( FILENAME = N'C:\var\opt\mssql\data\TestAttach.mdf'),( FILENAME = N'C:\var\opt\mssql\data\TestAttach_log.ldf')    FOR ATTACH;
GO

最后确认

最后确认操作,只需要检查下这两个数据库下的测试表数据是否和迁移之前一致即可。

SELECT * FROM TestAttach.dbo.tb_Test;SELECT * FROM TestBackRestore.dbo.tb_Test;

对比迁移前后数据库测试表中的数据是否一致:

从最后的确认结果来看,迁移前后的数据库测试数据完全一致,本次迁移数据使用的两种方法都是成功的,可靠的。

写在最后

SQL on Windows上的数据库,可以非常平滑的迁移到SQL on Linux Docker中来,这个是Windows版和Linux版数据库可以任意选择的前提。我们可以使用数据库的备份还原和分离附件两种方法来达到数据库迁移的目的。

相关文章:

  • SQL Server 急救包(First Responder Kit)入门教程

  • SQL Server on Linux 理由浅析

  • SQLServer On Linux Package List on CentOS

  • SQL Server on Linux的文件和目录结构

  • 个性化配置你的SQL Server on Linux

  • SQL on Linux Run on Docker

  • 如何使Mac Docker支持SQL on Linux容器Volume特性

原文地址:https://yq.aliyun.com/articles/69550


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

迁移数据库到SQL on Linux Docker相关推荐

  1. 利用DBMS_FILE_TRANSFER迁移数据库从AIX至Linux

    环境描述 源端 目标端 操作系统 AIX 6100-03-10-1119 RHEL6.5 x64 集群 Oracle RAC+ASM Oracle RAC+ASM 数据库版本 11.2.0.3.0 1 ...

  2. 在.NET Core类库中使用EF Core迁移数据库到SQL Server

    前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...

  3. linux数据库分析报告,写linux数据

    Linux 内存管理机制简介 在 Linux 中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这方面,区别于 Windo ...

  4. 如何使Mac Docker支持SQL on Linux容器Volume特性

    问题引入 这天老鸟火急火燎的找到菜鸟:"鸟儿啊,按照你之前的文章SQL on Linux Run on Docker,当我销毁SQL on Linux Docker容器以后,我容器中的所有数 ...

  5. 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...

  6. SQL Server in Docker - 还原数据库

    SQL Server in Docker 还原数据库 上一回演示了如果在Docker环境下安装SQL Server(使用Docker运行SQL Server),这次我们来演示下如何还原一个数据库备份文 ...

  7. 应用程序的数据库从Sql Server迁移到Oracle

    应用程序的数据库从Sql Server迁移到Oracle 迁移案例一:数据库: Sql Server 2008到Oracle 9i 工具: Sybase PowerDesiner 12 试用版, PL ...

  8. SQL on Linux Run on Docker

    摘要 SQL Server 2016以及SQL on Linux版本已经支持跑在Docker容器中,也展示微软拥抱开源的决心和勇气.这篇博文就是以SQL on Linux为例,看看如何将SQL Ser ...

  9. 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库

    In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...

最新文章

  1. 微信聊天加密大法,再也不怕对象偷看了!
  2. UVa1588 - Kickdown
  3. python 实现队列功能 queue insert() pop()
  4. SpringBoot+Vue实现指定账号审批单据时前端进行语音播报
  5. 卡片游戏 数学期望
  6. 线程队列,线程池和协程
  7. struts2中实现文件的上传
  8. docker-ce私有仓库搭建
  9. Diversity HDU - 6725
  10. go语音protobuf_golang 使用 protobuf 的教程
  11. mysql数据库连接空闲超时设置不生效,未区分全局变量及interactive_timeout设置
  12. 最详细 Spring Boot 入门(-)
  13. 卸载掉360之后无法删除360safe文件夹解决办法!
  14. 内网通3.4.3045版本 免广告码 积分码 算法
  15. 电磁散射特性与SAR影像之间的关联,典型地物的散射特性
  16. 什么是安全性测试(security testing)?
  17. 关闭小米系统自动更新通知
  18. Java SSM面试篇
  19. cp2k 编译安装教程
  20. 小米路由器3HD内网穿透成功

热门文章

  1. 机器学习-tensorflow
  2. poj-1980 Unit Fraction Partition **
  3. 程序怎么跑着 就卡死,句柄泄漏,内存泄漏了
  4. 使用WTMPlus快速搭建发卡网
  5. 为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...
  6. 牛!又一顶级大厂开招.NET,5年35k!
  7. 最近看了两本低代码的书
  8. 技术 Leader 怎样带跨一个团队?
  9. 使用BeetleX在Linux下部署.NET多站点服务
  10. Istio 中的多集群部署与管理