推薦使用 SQL Server 的備份和還原功能把數據庫從 Windows 遷移到 Linux 上。本教程中,你將會使用備份和還原技術通過需要的步驟移動一個數據庫到 Linux 上。
- 在 Windows 使用 SSMS 創建一個備份文件
- 在 Windows 上安裝一個 Bash shell
- 從 Bash shell 移動備份文件到 Linux 上
- 使用 Transact-SQL 還原備份文件
- 運行一個查詢語句驗證遷移
開始之前,需要在 Windows 上安裝:
- SQL Server
- SQL Server Management Studio
- 要遷移的目標數據庫
Linux 需要安裝:
- 帶有命令行工具的 SQL Server
在 Windows 上創建一個備份
在 Windows 上有許多方法創建一個備份文件。下面的步驟使用 SQL Server Management Studio (SSMS)創建。
- 在你的 Windows 機器上啓動 SQL Server Management Studio
- 在連接對話框中,輸入 localhost
- 在對象瀏覽器中,展開 數據庫
- 右鍵你的目標數據庫,選擇 任務,然後點擊 備份
5. 在備份數據庫對話框中,確認 備份類型 爲 完整,並且 備份到 爲 磁盤。注意文件的名稱和位置。例如,你的一個在 SQL Server 2016 上的一個名稱爲 YourDB 的數據庫有一個默認的備份路徑 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak。
6. 點擊 確定 備份你的數據庫
注意:
另外一種創建備份文件的選擇是運行一個 Transact-SQL 語句。下面的 Transact-SQL 命令爲名稱爲 YourDB 的數據庫執行和前面步驟相同的操作:
BACKUP DATABASE [YourDB] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak' WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
在 Windows 上安裝一個 Bash shell
爲了還原數據庫,你必須把備份文件從 Windows 傳輸到目標 Linux 上。在本教程中,我們通過運行在 Windows 上的 Bash shell 移動備份文件到 Linux 上:
- 在你的 Windows 機器上安裝 Bash shell,以支持 scp (secure copy) 和 ssh (遠程登錄) 命令。兩個示例包含:
- Windows Subsystem for Linux (Windows 10)
- Git Bash Shell (https://git-scm.com/downloads) - 在 Windows 上打開一個 Bash 會話
複製備份文件到 Linux
1. 在你的 Bash 會話中,導航到包含你的備份文件的目錄中。例如:
cd 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'
2. 使用 scp 命令傳輸文件到目標 Linux 機器。下面的示例傳輸 YourDB.bak 到 IP 地址爲 192.0.2.9 的 Linux 上用戶 User1 的 home 目錄:
scp YourDB.bak user1@192.0.2.9:./
提示:
對於使用 scp 傳輸文件,也存在替代的方法。一個是使用 Samba 在 Windows 和 Linux 之間配置一個 SMB 網絡共享。在 Ubuntu 上的演練,查看 How to Create a Network Share Via Samba。一旦建立共享網絡,你可以從 Windows 上作爲一個網絡文件訪問它,例如 \\machinenameorip\share。
在還原之前轉移備份文件
此時,備份文件在你的 Linux 服務器的用戶的 home 目錄中。在還原數據庫到 SQL Server 之前,你必須把備份文件放到 /var/opt/mssql 的子目錄中,由於它是用戶 mssql 和 組 mssql 擁有的。如果你想改變默認的備份位置,查看文章 Configure with mssql-conf。
- 在同一個 Windows Bash 會話中,使用 ssh 遠程連接你的目標 Linux 機器。下面的示例使用用戶 user1 連接到 Linux 機器 192.0.2.9:
ssh user1@192.0.2.9
- 進入超級用戶模式
sudo su
- 創建一個新的備份目錄。-p 參數表示如果目錄已經存在的話,不會做任何操作
mkdir -p /var/opt/mssql/backup
- 移動備份文件到這個目錄中。在下面的示例中,備份文件在 user1 的 home 目錄中。修改命令匹配你的備份文件的位置和文件名:
mv /home/user1/YourDB.bak /var/opt/mssql/backup/
- 退出超級用戶模式
exit
在 Linux 上還原你的數據庫
爲了還原數據庫備份,你可以使用 RESTORE DATABASE Transact-SQL(TQL)命令:
注意:
下面的步驟使用了 sqlcmd 工具。如果你沒有安裝 SQL Server Tools,查看 Install SQL Server command-line tools on Linux。
- 在同一個終端中,啓動 sqlcmd。下面的示例使用 SA 用戶連接到本地 SQL Server 實例。當出現提示符時輸入密碼,或者通過添加 -P 參數指定密碼。
sqlcmd -S localhost -U SA
- 在 >1 提示符處,輸入下面的 RESTORE DATABASE 命令,在每一行之後摁下 ENTER(你不可以一次複製和粘貼多行命令)。使用你的數據庫的名字替換掉出現的所有的 YourDB:
RESTORE DATABASE YourDB FROM DISK = '/var/opt/mssql/backup/YourDB.bak' WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf', MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf' GO
RESTORE DATABASE 可能會返回一個像下面示例中的錯誤:
File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf'. Use WITH MOVE to identify a valid location for the file. Msg 5133, Level 16, State 1, Server servername, Line 1 Directory lookup for the file "Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).
在這個例子中,數據庫包含了第二個文件。如果這些文件沒有在 RESTORE DATABASE 語句中使用 MOVE 指定,還原處理過程將會嘗試作爲源服務器在同一個路徑中創建它們。
你可以列出備份中包含的所有文件:
RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak' GO
你應該會得到一個像下面的列表(僅僅列出了前兩列):
LogicalName PhysicalName .............. ---------------------------------------------------------------------------------------------------------------------- YourDB Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf .............. YourDB_Product Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf .............. YourDB_Customer Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf .............. YourDB_log Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf ..............
你可以使用這個列表爲額外的文件創建 MOVE 語句。在這個示例中, RESTORE DATABASE 是:
RESTORE DATABASE YourDB FROM DISK = '/var/opt/mssql/backup/YourDB.bak' WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf', MOVE 'YourDB_Product' TO '/var/opt/mssql/data/YourDB_Product.ndf', MOVE 'YourDB_Customer' TO '/var/opt/mssql/data/YourDB_Customer.ndf', MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf' GO
- 通過列出服務器上所有的數據庫來驗證還原。被還原的數據庫應該被列出來:
SELECT Name FROM sys.Databases GO
- 在你遷移的數據庫上運行另外的查詢。下面的命令切換上下文到 YourDB 數據庫,選擇了它的一個表的行:
USE YourDB SELECT * FROM YourTable GO
- 當你使用完 sqlcmd 後,輸入 exit 退出
- 當你在遠程 ssh 會話完成工作後,再次輸入 exit