问题引入
前一篇文章,菜鸟找到了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
原文地址:https://yq.aliyun.com/articles/69550
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注