迁移数据库到SQL on Linux Docker
問題引入
前一篇文章,菜鳥找到了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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LEANSOFT领航员 – 基于Dock
- 下一篇: .NET跨平台之旅:博问站点迁移至ASP