遷移資料庫到SQLonLinuxDocker

風移發表於2017-02-14

問題引入

前一篇文章,菜鳥找到了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:	emp`
GO
BACKUP DATABASE [TestBackRestore] 
    TO DISK = `C:	empTestBackRestore_full_20170210.bak` WITH STATS = 2 ;

傳輸資料庫檔案

由於我是在Mac系統安裝Windows虛擬機器來測試的,所以,首先我需要將Windows虛擬機器中的檔案複製到Mac系統。比如:我將下面三個檔案複製到Mac的~/Downloads目錄:

C:SQL2K14_DATAMSSQL12.MSSQLSERVERMSSQLDATATestAttach.mdf
C:SQL2K14_DATAMSSQL12.MSSQLSERVERMSSQLDATATestAttach_log.ldf
C:	empTestBackRestore_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:varoptmssqldataTestBackRestore_full_20170210.bak`;
RESTORE VERIFYONLY 
    FROM DISK = N`C:varoptmssqldataTestBackRestore_full_20170210.bak`;
-- Restore Database
USE master
GO
RESTORE DATABASE [TestBackRestore]
FROM DISK = N`C:varoptmssqldataTestBackRestore_full_20170210.bak`
WITH MOVE N`TestBackRestore` TO N`C:varoptmssqldataTestBackRestore.mdf`
    ,MOVE N`TestBackRestore_log` TO N`C:varoptmssqldataTestBackRestore_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:varoptmssqldataTestAttach.mdf`),
    ( FILENAME = N`C:varoptmssqldataTestAttach_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版資料庫可以任意選擇的前提。我們可以使用資料庫的備份還原和分離附件兩種方法來達到資料庫遷移的目的。


相關文章