迁移数据库到SQL on Linux Docker

简介: 这篇文章谈到了两种将SQL Server数据库从SQL on Windows迁移到SQL on Linux Docker的方法:数据库的备份还原和数据库分离附加的方式。

问题引入

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

构建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;
GO

USE TestAttach
GO
IF OBJECT_ID('dbo.tb_Test', 'U') IS NOT NULL
    DROP TABLE dbo.tb_Test
GO

CREATE TABLE dbo.tb_Test(
RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY
,Name VARCHAR(36) NOT NULL
);

INSERT INTO dbo.tb_Test
SELECT NEWID() UNION ALL SELECT NEWID();

SELECT * FROM dbo.tb_Test;

IF DB_ID('TestBackRestore') IS NULL
    CREATE DATABASE TestBackRestore;
GO

USE TestBackRestore
GO
IF OBJECT_ID('dbo.tb_Test', 'U') IS NOT NULL
    DROP TABLE dbo.tb_Test
GO

CREATE TABLE dbo.tb_Test(
RowID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY
,Name VARCHAR(36) NOT NULL
);

INSERT INTO dbo.tb_Test
SELECT NEWID() UNION ALL SELECT NEWID();

SELECT * FROM dbo.tb_Test;

SELECT physical_name,* FROM sys.master_files
WHERE database_id = DB_ID('TestAttach');

执行结果截图如下:
图片1.png

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

USE master
GO
ALTER DATABASE TestAttach SET OFFLINE;

USE master
GO
EXEC 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 master
GO
--Verify backup file
RESTORE 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 Database
USE master
GO
RESTORE 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=2
GO

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

附加数据库到SQL on Linux Docker

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

USE master
GO
-- Create database via attach
CREATE 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;

对比迁移前后数据库测试表中的数据是否一致:
图片2.png

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

写在最后

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

目录
相关文章
|
3天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
6天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
19 11
|
1天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
9 2
|
14天前
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
16 1
|
14天前
|
SQL 安全 数据库
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
43 1
|
9天前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
17 0
|
13天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
27 0
|
17天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
30 0
|
17天前
|
SQL 数据处理 数据库
|
17天前
|
SQL 存储 调度

热门文章

最新文章