SQL2017 Business Continuity

2017的微軟正以超快的速度向雲端進行數位轉型(非口號),除了擁抱開源軟體之外,對於主流的作業系統、商務軟體都採取開放式的合作模式。然而SQL2017的推出,正是在宣佈 Dotnet framework 開源之後的第二記超強震憾彈。從今以後SQL Server 就可以運行在各大主流的Linux,實在是超酷的!

SQL2017 由CTP(2016年11月的1.0)到RC(2017年8月已經來到2.0),接下來就等著GA了。細節請參考官網,目前能支援的Linux已經有 Red Hat, SUSE, Ubuntu, CentOS,另外也支援以 Docker Engine的方式來佈署。

在開始之前,我們要先談定義,SQL2017對我來說,就是SQL 2016透過SQL PAL這個架構將Windows版本大多數重要功能移植至Linux的一個版本。所以基礎於二個作業系統在架構上的先天性差異或是時程(重要功能會先被移植)問題,許多功能是不容易實現的,比如說 FileTable, XP_cmdshell, CLR對Windows的高度整合, Mirroring(SQL2014之後就不再支援了), Stretch DB, 資料庫引擎外的週邊服務(SSRS, R, StreamInsight, SSAS, DQS, MDS, Polybase...)

在本篇將會示範Windows SQL2016與Ubuntu SQL2017二個資料庫Instance之間,如何先備份,然後將備份檔複製到另一個異質OS的檔案系統中,再還原。同理Log shipping也可以做,但基於權限管理的有點複雜,我規劃另外再寫一篇,以免Confuse大家。當然,若是大家對於SQL Server on Linux還想做更近一步的了解,可以參考這一篇

另外,以下會有頻繁的Windows/Linux切換,主要是用Windows中SSMS的圖形化介面示範如何操作,但是接著會透過Console mode證明其結果,於是我就Putty(一種裝在Windows上面的SSH遠端指令介面工具)模擬我登入到Linux,方便我複製/貼上或是截圖等動作,希望不會Confuse大家。

1. 在Azure上建立Windows SQL2016 SP1環境
等候數分鐘中之後,就可以在Resource Group中找到相關的 Component了
一旦VM執行起來,SQL2016 SP1就已經Ready了,但是為了操作SQL2017,我們還是要升級一下SSMS的版本至17.2,請點選這個網址,就可以開工了

2. 在Azure上建立Ubuntu SQL2017環境
一樣等個幾分鐘之後,就會有 Linux ready可以用,但是資料庫要自己裝。在安裝之前先檢視一下Component吧!
設定一下防火牆,以利二個DB instance 可以互相存取

3. 切換至 Windows VM環境,開始下載 putty(透過SSH方式連線的commend line console)工具 並遠端連線,進行安裝因為我是下載免安裝版,所以有一個Warning,但不影響後續的操作在 Host Name鍵入網址或IP即可開始遠端操作修改Root密碼,並切換成Root以利安裝
安裝的方法,可以參法微軟的官網說明,指令碼可以在網頁上,按下copy按鈕,然後到commend line中貼上,節省登打的時間
下載source
開始安裝嘍!
設定為環境變數後,系統會問是否接受License term使用者授權七種安裝版本,請依據你的需求做出選擇
確認一下SQL2017 運行的狀況
接著是週邊工具(包含ODBC)的安裝
用SQLCMD測試一下
安裝好了,但到底在Ubuntu 的預設安裝路徑哪?答案是 opt/mssql/bin

4. 透過SSMS進行二個DB Instance的相關操作
新增對SQL2017的連線
屬性中,可以看到Linux作業系統的相關資訊為了讓備份可以很直覺地按右鍵就完成了,我們必需把預設的DB Data/Log/Backup 儲存路徑設定好。意思是 SQL2017 安裝在 Linux時並不是像 Windows 會有 C:\Program Files\Microsoft SQL Server\140... 這樣的情況,另外當你在SSMS上面設定了預設路徑,系統會幫你在底層寫入 Windows Registry,當各門各派的Linux有其環境變數的不同設定,所以目前還是需要自行下指令來滿足這個需求
建立目錄並修改權限設定
透過指令設定預設路徑
設定完再重啟SQL服務
回到 SSMS檢視預設路徑的設定是否成功?
建立 DBLinux 測試資料庫
透過 sp_helpdb 指令,檢視DB建立的路徑
建立一個測試table t1,作為待會要備份的 sample data二個備份指令範例,上面是基礎於預設備份路徑比較簡易的寫法,下面是將詳細的路徑完整地寫出來
備份完成後,切換到Linux檢查一下,果然在我們剛才設定的路徑 (/database/mssql/sqlbck) 中出現了
5. 資料還原(加分題)
接下來要做一個進階的備份/還原演練,應用Linux不會Lock使用中檔案的特性,我打算打資料庫的data file刪除,然後用transaction log把資料還原回來,所以會用到 [T-SQL] backup 語法中 error management options 的關鍵字 continue_after_error 功能
先寫一個廻圈不斷地 insert到 t2 table
檢視一下,是不是每隔一秒就有寫入一筆

先檢視一下 datafile
下指令把 datafile 刪除,這個只有在 Linux 可以成功
再次檢視,在 Linux 下真的不會 Lock 使用中的檔案,所以檔案真的被刪掉了
重啟一下 SQL Service
果然 datafile 刪除後開始讀不到資料了,接下來你可以怎麼做?
先看一下系統 log吧!有看到問題源自於,沒有 datafile,所以無法 connect 到指定的 database
接下來是一個複雜且困難的問題了,遇到這個棘手的狀況該如何還原?直接下 Restore指令嗎?千萬不要!資料還在記憶體中,如果你下 Restore記憶體就會被清空了。
==>正確的作法,應該應用 Backup log 指令,保留案發現場,然後才有機會還原被刪除的 datafile
接下來就可以用 data 與 log 檔案透過指令依序還原異常的DB,第一動要搭配 with norecovery 以免有人衝進來連到尚未作業完的DB,等到第二動把剛才從案發現場救回來的資料寫回DB,才可以搭配 with recovery 語法恢復DB 可連線的狀態
還原後,檢視一下資料是否有回來?

李秉錡 Christian Lee
Once worked at Microsoft Taiwan