利用sqlcmd實現SQLServerServiceBroker的自動部署

來源:互聯網
上載者:User

       因為工作關係,我們項目用到了Service Broker這項技術。它在功能和效能上真的是沒的說,唯一讓人鬱悶的就是部署。要知道,在加密情況下部署一台伺服器和一台用戶端我們需要以下步驟:

1. 在伺服器端清理環境,

2. 在用戶端清理環境,

3. 在伺服器端建立資料庫,並且建立Service Broker相關對象(Message Type,Contract,Queue,Service,Routing甚至Binding)

4. 在用戶端建立資料庫,並且建立Service Broker相關對象(Message Type,Contract,Queue,Service,Routing甚至Binding)

5. 伺服器端產生認證,拷貝給用戶端,用戶端匯入

6. 用戶端產生認證,拷貝給伺服器,伺服器匯入。

7. 伺服器端授權,建立相關預存程序;

8. 用戶端授權,建立相關預存程序;

如果沒有自動部署工具,手動部署一遍大概要40分鐘時間。因為我們項目現在處於開發階段,資料庫結構經常變,每盩厔少要重新部署3-4次。這麼多時間花在重複性的勞動上明顯是浪費。況且上面的例子還僅僅是一台伺服器和一台用戶端的情況,後面有多台伺服器和多台用戶端的話,我們花在部署上的時間就沒法估算了。

於是我就在考慮能不能用最簡單的bat批處理指令碼實現自動部署。研究發現sqlcmd是一個很好的選擇,再藉助一些簡單的dos命令基本就滿足要求。在這裡和大家分享一下(本例子是基於區域網路的)。

測試連接

要實現自動部署,至少要保證用sqlcmd能訪問到本機(伺服器端)和目標機器(用戶端)的資料庫,測試方法如下:

測試本機:

?
1 sqlcmd -U [username] -P [password] -S localhost

測試目標機器:

?
1 sqlcmd -U [username] -P [password] -S [IP address]SQLEXPRESS

這裡和用Management Studio串連資料庫是所用的Server Name,Login和Password是相同的。 注意:如果目標機器安裝的是SQLExpress或開啟防火牆,有可能串連不通。如遇到類似如下錯誤,可以參照這裡和這裡解決。

“Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : SQL Server Network Interfaces: Server doesn't support requested protocol [xFFFFFFFF]. . Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login timeout expired. Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..”

執行SQL檔案

因為sqlcmd是可以在原生資料庫上執行一個sql檔案裡的語句的,有用的是也可以在其他機器上執行本地檔案系統中的sql。

?
1 sqlcmd -U [username] -P [password] -S [IP address]SQLEXPRESS -i c:Clear.sql

有了它,我就可以把需要執行的sql語句都組織在一起,在命令列裡調用。如果是多台用戶端,甚至可以迴圈調用。

?
1 2 3 4 Set IpList=10.32.0.1 10.32.0.2 for %%a in (%IpListt%) do {  sqlcmd -U [username] -P [password] -S %%aSQLEXPRESS -i C:Clear.sql }

操作共用資料夾

瞭解service broker的朋友們應該知道,service broker的安全機制是很嚴格的。因為我們利用了認證檔案(certificate file)做認證,所以在部署過程中需要建立認證檔案,複製到共用資料夾,再由目標機器匯入。於是,在部署過程中是需要訪問共用資料夾的,是要有刪除,建立和讀取的存取權限的。還有一個前提:我們需要把需要訪問的檔案夾共用給所有人(Everyone),這樣命令列才能即通過slqcmd正常的產生認證檔案,又能拷貝和刪除認證檔案。

?
1 2 3 for %%a in (%IpList%) do (   copy C:share*.* %%ashare )
?
1 2 3 Set IpList=10.32.0.1 10.32.0.2 net use %IpList%share [password] "/USER:[domain][username]" del /s /q %IpList%share*.*

迴圈執行SQL檔案和傳參

因為部署的機器IP和其他一些資訊是有區別的,但我們又希望一次部署多台機器,所以就需要在批次檔中迴圈執行命令把不同的地方通過參數傳進去。下面的例子裡,首先定義了兩個陣列變數。然後,因為我需要在下面的迴圈了賦值,所以執行了命令SETLOCAL ENABLEDELAYEDEXPANSION。最後,在雙重迴圈裡,分別讀出IP和序號資訊,當迴圈序號相同時,執行sqlcmd命令並通過-v傳遞參數。在這裡我截取IP的後6位(因為用了SETLOCAL ENABLEDELAYEDEXPANSION命令,所以迴圈內賦值的變數都需要用!!分隔)。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Set IpList=10.32.0.1 10.32.0.2 Set SerialNumber=PC1001 PC1002   SETLOCAL ENABLEDELAYEDEXPANSION set num1=0 for %%a in (%IpList%) do (   set /a num2=0   for %%b in (%SerialNumberList%) do (     if "!num1!" == "!num2!" (       set temp=%%a       sqlcmd -U [username] -P [password] -S %%a -i c:setup.sql -v IP=!temp:~-6! -v SerialNumber=%%b     )     set /a num2+=1   )   set /a num1+=1 )

而在setup.sql裡,我就可以輕鬆讀到變數,並用來產生相應的對象。下面這段代碼裡,實現了從變數中讀出剛傳過來的IP後6位,並把原生認證檔案儲存在指定目錄下,為建立service broker的安全機製做好準備。

?
1 2 3 4 5 6 7 8 declare @cmd nvarchar(max) = null declare @IP nvarchar(20); set @IP=$(IP); select @cmd = isnull(@cmd,'')+ ' BACKUP CERTIFICATE [TestCert] TO FILE = ''c:backupTestCert'+@hubIP+'.cer''' exec (@cmd) go

總結

通過利用上面提到的這些技術,我們得到了以下好處:

1. 部署時間從40分鐘左右縮短到現在的5分鐘,從原來的14個手工步驟縮短到4個;

2. 部署步驟簡單,沒有技術背景的測試人員也能部署;

3. 實現了一台伺服器對多台用戶端的自動部署,並且部署多台用戶端和部署一台的時間相差不大。

當然,它還不是產品級的,只能是作為內部提高效率的一個工具。這裡只是拋磚引玉,如果有installshield這類企業級工具,利用類似的方法相信就能做出一個產品級的專業的部署工具來的。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。