概念
Powershell 是運行在windows機器上實現系統和應用程序管理自動化的命令行腳本環境。你可以把它看成是命令行提示符cmd.exe的擴充,不對,應當是顛覆。 powershell需要.NET環境的支持,同時支持.NET對象。微軟之所以將Powershell 定位為Power,並不是誇大其詞,因為它完全支持對象,面向對象的便捷可想而知了。其可讀性,易用性都非常的完美。
在運維windows 服務器的時候,其作用是非常大的。簡潔高效等等。這里我簡單用一個我應用的地方來展示一下。
背景
有時候我們需要監視來自特定用戶電腦對於數據庫的連接。比如該用戶說,他偶爾會斷開連接或者有時連接某個程序時出現問題,而數據庫就是我的數據庫。這個問題一開始真的很讓我着急(FUCK),因為問題不是經常能夠重現難以追蹤。即使重現了錯誤,可能提供的信息也不夠完整。
為了幫助實現對此類問題的troubleshoot ,我編寫了兩個PowerShell 腳本。腳本能夠可以無人值守,並且日志在一段時間后查詢。我打算在用戶的PC上運行這個腳本,並且該PC在不同的網絡或者不同的子網。也可以在同一時間在SQLServer服務器運行腳本。會產生三個不同的日志文件,然后進行比較。這些腳本是對於cpu使用和負載占用很少的輕量級程序。但是必須要謹慎使用運行的查詢,盡量針對一些小的表進行查詢等,比如select count(*)from 小表。
基本上所有這些腳本主要實現是:連接SQLServer並且執行查詢。循環執行查詢知道手動終止它。假如有錯誤重現了,就會記錄日志到日志文件然后再次連接->執行查詢。
OpenConnQueryCloseConn.ps1 - 這個腳本作用就是打開連接數據庫實例,運行sql指令,然后關閉連接。這個處理將會一次又一次的重復直到你手動關閉它。
OpenConnLoopQuery_Long.ps1 - 第二個腳本的功能就是打開連接,讓它保持打開然后重復執行查詢腳本,直到你手動終止循環才會中斷循環關閉連接。
圖1 最大區別在於循環位置
兩個腳本都會在終端和日志記錄日志。如果連接產生問題我們也希望在日志文件中看到錯誤信息。當錯誤信息只在一個日志文件中,那么有時就能引導我們發現網絡或者特定的某種錯誤。
PowerShell腳本的概述
首先我們來看一下OpenConnQueryCloseConn.ps1這個腳本。這個腳本一開始先設定連接參數。確保下面的參數是可用的參數。
21-27行就是我們的連接參數和查詢命令變量 。
圖2 主要的參數變量
$serverName="服務器名稱" $databaseName="數據庫名稱" $uid="User ID" $pwd="user Password " $sqlCommand="命令語句-比如查詢一個小表的行數" $logLoaction="記錄日志文件的位置. --- c:\ps\OpenConnQueryCloseConn.log"
腳本的底部就是循環的主要部分。
圖3 循環部分
fn_HitSQL 函數大部分工作已經完成了。打開數據庫連接然后不斷去執行查詢。有很多地方主要的工作就是日志記錄。如下:
圖4 日志記錄部分
還有一個函數去記錄連接和錯誤。函數fn_WriteToLog 將錯誤信息附加上日期后記錄到終端然后添加到日志文件中。
做好了以上所有工作后,執行腳本,當法傷網絡連接問題時,就會產生日志文件錯誤日志。如下:
錯誤日志信息
第二個腳(OpenConnLoopQuery_Long.ps1 )本基本上與第一個一樣如圖1 中所示一樣就是在執行語句后面緊跟着一個循環語句這樣避免了關閉連接。在一個連接中不斷重復語句。這里也就不仔細講解了。
運行兩個腳本需要執行powershell 腳本,指令如下,當然也可以自己拼寫:
PowerShell.exe -ExecutionPolicy Bypass -File C:\PS\OpenConnLoopQuery_Long.ps1
PowerShell.exe -ExecutionPolicy Bypass -File C:\PS\OpenConnQueryCloseConn.ps1
需要注意的是要提前設定好路徑“C:\PS”
腳本下載地址:
沒找到如何上傳腳本...,有哪位大神可以告知。具體腳本可向我詢問留言即可。發郵箱
謝謝博友提供方式。
下載地址:
http://files.cnblogs.com/files/wenBlog/OpenConnLoopQuery_Long.zip
http://files.cnblogs.com/files/wenBlog/OpenConnQueryCloseConn.zip
總結
本篇主要介紹了自己開發的一個利用powershell來實現的循環監測連接出現網絡異常的腳本。本質上就是循環連接查詢數據庫,記錄連接失敗或者查詢失敗的信息。之前通過C#和其他開發工具也都實現過不論是windowsService 還是其他小程序。但是感覺powershell開發起來更簡單,對機器性能影響更小,當然python也是一樣的道理。之所以選擇使用powershell主要是學習響應的語法便於將來運維windows服務器。越來越發現PowerShell的強大,與高手相比還有很大空間要去學習。