迁移数据库到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版数据库可以任意选择的前提。我们可以使用数据库的备份还原和分离附件两种方法来达到数据库迁移的目的。

目录
相关文章
|
2天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
14天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
90 0
|
14天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
82 6
|
1天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
29 1
|
2天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
4 0
|
3天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
3天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
3天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(7)Ubuntu20.04 arm64安装Docker
Linux(7)Ubuntu20.04 arm64安装Docker
15 0

热门文章

最新文章