SQL Server中的事務日誌管理(9/9):監控事務日誌

来源:http://www.cnblogs.com/woodytu/archive/2016/01/18/5122492.html
-Advertisement-
Play Games

當一切正常時,沒有必要特別留意什麼是事務日誌,它是如何工作的。你只要確保每個資料庫都有正確的備份。當出現問題時,事務日誌的理解對於採取修正操作是重要的,尤其在需要緊急恢複數據庫到指定點時。這系列文章會告訴你每個DBA應該知道的具體細節。對於在我們關註下的所有資料庫,在日誌維護方面,我們的首要目標是最...


當一切正常時,沒有必要特別留意什麼是事務日誌,它是如何工作的。你只要確保每個資料庫都有正確的備份。當出現問題時,事務日誌的理解對於採取修正操作是重要的,尤其在需要緊急恢複數據庫到指定點時。這系列文章會告訴你每個DBA應該知道的具體細節。


對於在我們關註下的所有資料庫,在日誌維護方面,我們的首要目標是最優化寫性能,為了支持SQL Server寫入日誌的所有活動,包括數據修改,數據讀取,索引維護等等。但是,留意下可能的日誌碎片也是重要的,如前面文章介紹的,它會影響需要讀取日誌的過程性能,例如日誌備份和故障恢復過程。

已經配置了合適的物理日誌架構和日誌文件大小,如第8篇所講的,這篇文章會介紹一些可以監控事務日誌大小、增長和活動的方法,為了即時收到異常警告或日誌暴漲,日誌碎片等等。

註意,我們把這篇文章作為全面覆蓋日誌監控的解決方案。例如,我們沒有提供使用擴展事件(Extend Events)進行日誌、SQL Server數據控制器/管理資料庫倉庫(自SQL Server 2008以後的版本即有)的監控。可以查看下這篇文章最後的擴展閱讀部分來看下這些話題的詳細信息。

不管怎樣,我們會討論最常見的監控工具和技術,包括:

  • 監控工具——簡單介紹Windows Performance Monitor和Red Gate SQL Monitor
  • 使用動態管理對象——在伺服器、文件、資料庫等級別上查看日誌活動
  • 使用T-SQL或PowerShell腳本——在所有的伺服器上統計日誌特性和使用率

監控工具

有一些可用的工具,除了別的之外,允許我們在我們的資料庫文件監控活動,包括日誌文件。這裡,我們只簡單介紹兩個,內建的工具(Windows性能監視器)和第三方工具(Red Gate SQL Monitor)。

Windows性能監視器(Windows Perfmon)

對於監控SQL Server活動一個流行的“內建”工具是Windows性能監視器(Perfmon)。它是一個系統監控工具,對伺服器上的記憶體、硬碟I/O、網路使用的監控提供不同計數器,也包括SQL Server的計數器。通常,DBA或系統管理員會從不同的計數器里配置性能監視器,定期記錄統計信息,把數據存入文件,然後導入Excel或類似工具,進行分析。

在多個計數器中,它提供一個數字來衡量磁碟讀寫性能,也有對日誌監控的特定計數器。

在使用性能監視器上,有很多可用的教程,我們不會在這裡重覆這些細節。另外在TechNet上有個文檔,我們建議這個工具的新手來閱讀下列文章:

  • Brent Ozar寫的《SQL Server Permon最佳實踐》,一篇這個工具使用的綜合教程,對於SQL Server的一些推薦計數器,如何分析和以Excel保存。
  • BradMcGehee寫的《SQL Server Profile與性能監視器的結合》。性能監視器使用的一個快速上手教程,還有如何用監控數據結合Profile來跟蹤數據。
  • Brent Ozar的《基線化和基準測試》。一個提供如何使用性能監視器、Profiler概括介紹的視頻教程,包括為什麼和如何進行基準測試。

談到如何對保存日誌(和數據)文件磁碟的常規測試,我們可以監控下列這些成對計數器:

  • Physical Disk\Disk Reads/sec 和 Physical Disk\Disk Writes/sec——我們需要知道這些計數器的值,先建立基線,來看看哪些顯著上升,並調查原因。
  • Physical Disk\Avg. Disk sec/Read 和 Physical Disk\Avg. Disk sec/Write——讀寫磁碟的平均時間(毫秒),這些計數器提供磁碟延遲統計信息,可以用來確定潛在的I/O瓶頸。

通常來說磁碟延遲計數器建議:低於10毫秒是優秀,20-30毫秒是好,如果超過50毫秒可以認為是個可能的I/O瓶頸。當然,這些指標取決於你環境里磁碟陣列的規格和配置。

我們簡單演示下Perfmon工具的使用,對一個正在頻繁寫的資料庫,設置下Physical Disk\Avg.Disk sec/Read 和 Physical Disk\Avg. Disk sec/Write counters 作為監控的計數器。

例如,我們對第8篇里,重新創建新版本的Persons資料庫和表的操作進行監控。

點擊開始,運行,輸入Perfmon。在【數據收集器集】【用戶定義】,右擊【新建】【數據收集器集】,選擇【手動創建(高級)】,點擊【下一步】,選擇【創建數據日誌】,勾選【性能計數器】,點擊【下一步】,點擊【添加】,選擇剛纔說的計數器(選擇【PhysicalDisk】),註意定位自己資料庫文件的所在硬碟。

插圖9.1:配置性能監視器

點擊【確定】後,回到嚮導界面,點擊【完成】。

現在我們可以計劃執行這個新的數據採集集。當然,這裡我右擊,點擊【開始】(一會後,新建的數據數據收集器開始位置會有綠色播放標誌出現)。回到SSMS,我們運行如下所示的代碼9.1,創建一個在我們的Persons資料庫頻繁寫。

 1 USE Persons
 2 GO
 3 DECLARE @cnt INT;
 4 
 5 SET @cnt = 1;
 6 -- may take several minutes; reduce the number of loops, if required
 7 WHILE @cnt < 6 
 8     BEGIN;
 9         SET @cnt = @cnt + 1;
10         UPDATE  dbo.Persons
11         SET     Email = LEFT(Email + Email, 7000)
12     END;

代碼9.1:更新Person表

一旦代碼執行完成,回到性能監視器,右鍵剛纔的資料庫收集集,點擊【結束】,回到【報告】【用戶定義】【新的數據收集器集】,定為到剛纔對應的報告,如插圖9.2所示:

插圖9.2:硬碟讀寫活動快照,使用PerfMon。

你可以選擇和取消選擇要顯示你要想要顯示的計數器,通過雙擊其中任何一代,在圖表下的計數器列表裡,你可以在圖上修改它們的樣子,拉伸等等。你可以通過點擊圖表放大圖表區域,拖拽到需要高亮顯示的區域,然後點擊頂部菜單的放大鏡工具(使用底部的滑條回到剛纔的區域)。

在圖上最活躍的部分是在D盤上的寫,那裡有我們的日誌文件。我們可以看到那個期間,延遲有近40毫秒,有頻繁的峰值。我們可以使用在頂部菜單的【更改圖形類型】來修改為【報表】方式,報表顯示在D盤上的平均延遲為55毫秒,這是一個需要考慮是時間段。當然,很多其他PhysicalDisk的計數器,可以提供你磁碟內部性能的內幕信息,在我們下結論前要好好仔細分析下。

另外,同樣的方式,我們也可以收集其他相關的計數器,例如在SQL Server:Databases。這個對象提供日誌活動的各種計數器,也包括其他

  • Log File(s) Size (KB) ——資料庫中所有事務日誌文件的累計大小 (KB)。
  • Log File(s) Used Size (KB)——資料庫中所有日誌文件的累計已用大小。

Red Gate SQL Monitor

如果你使用第三方SQL Server監控工具,很有可能它會對計數器的很多值,收集、存儲並分析。插圖9.3在Red Gate SQL Monitor里展示了日誌文件大小值,對於Persons資料庫的日誌文件在快速增長,因為不正確的大小和配置的日誌。

插圖9.3:SQL Monitor報告的快速日誌增長

SQL Monitor的一個不錯的功能是,與Perfmon相比它更加簡單、容易,在不同期間之間比較同類型的活動。在下拉的時間段(Time range)里,我們可以修改時間段,設置自定義的段,從今天(或這個星期)與昨天(或上個星期)進行比較等等。

動態管理視圖和函數(DMV、DMF)

很多DMV(動態管理視圖或函數的縮寫(Dynamic Management Views and Functions))提供SQL Server引擎內部如何使用磁碟I/O子系統,子系統與I/O輸出能力及系統性能要求的工作量。例如:

  • sys.dm_io_virtual_file_stats——提供所有資料庫數據和日誌文件的使用率統計信息。它是發現熱點的好資源,標識出在不同頻道傳播的機會。
  • sys.dm_io_pending_io_requests——提供SQL Server所有等待完成的I/O操作的列表。

到操作系統級別,DMV的“sys.dm_os_”類型提供在SQL Server和操作系統之間交互的大量不同數據。這個提供了提交請求到操作系統里實際工作的具體工作量呈現。註意,sys.dm_os_wait_stats記錄了每次一個在完成它工作需要等待時間的長短,請求的資源。它是用來找出什麼引起回話等待的實用DMV,當然包括I/O等待。

DMV的“sys.dm_os_”類型也提供sys.dm_os_performance_counters,它展示了性能計數器,還有在我們系統里的隊列。通過不同資源衡量,例如每秒磁碟讀寫,處理器隊列長度,可用記憶體等等。它幫助我們找出請求給定資源的地方,還有過多要求的理由。

到資料庫級別,SQL Sever 2012添加了sys.dm_db_log_space_usage的DMV,提供了一個獲得基本事務日誌大小和空間使用率數據的非常簡單的方式,和通過DBCC SQLPERF(LOGSPACE)返回的類似。

這裡,我們只演示3個例子,首先是sys.dm_db_log_space_usage,然後是sys.dm_io_virtual_file_stats,最後是ys.dm_os_performance_counters,顯示日誌活動和增長的詳細信息。

使用sys.dm_db_log_space_usage(僅SQL Server 2012)

如果你已經使用SQL Server 2012,那麼獲取基本日誌大小和空間信息非常簡單,如代碼9.2所示。我們在Persons2012資料庫上運行這個代碼,和Persons資料庫一樣,除了名稱。

1 SELECT  DB_NAME(database_id) AS DatabaseName ,
2   database_id ,
3   CAST(( total_log_size_in_bytes / 1048576.0 ) AS DECIMAL(10, 1))
4                                                         AS TotalLogSizeMB ,
5   CAST(( used_log_space_in_bytes / 1048576.0 ) AS DECIMAL(10, 1))
6                                                         AS LogSpaceUsedMB ,
7   CAST(used_log_space_in_percent AS DECIMAL(10, 1)) AS LogSpaceUsedPercent
8 FROM    sys.dm_db_log_space_usage;

代碼9.2:日誌大小和空間使用

使用sys.dm_io_virtual_file_stats

對於每個SQL Server使用的資料庫文件,數據文件和日誌文件,sys.dm_io_virtual_file_stats 提供了累計的物理I/O統計信息,表明自上一次伺服器重啟後,用作被資料庫讀寫的文件的使用頻率。它也提供了在"I/O停滯"時間形式里一個非常有用的維度,表明用戶處理需要等待完成的I/O總時間,在文件問題里。註意這個DMV只衡量物理I/O。從緩存讀取的邏輯I/O操作不會在這裡顯示。這個函數接受資料庫ID(database_id)和文件ID(file_id),我們可以用來調查特定文件或資料庫,或者我們可以直接返回伺服器上的所有資料庫。

為了從一張白紙開始,重新運行Persons腳本來刪除和重建Persons資料庫和表,並插入100萬條記錄,然後運行代碼9.3忘臨時表裡插入伺服器的一些基線數據。

 1 SELECT  DB_NAME(mf.database_id) AS databaseName ,
 2         mf.physical_name ,
 3         divfs.num_of_reads ,
 4         divfs.num_of_bytes_read ,
 5         divfs.io_stall_read_ms ,
 6         divfs.num_of_writes ,
 7         divfs.num_of_bytes_written ,
 8         divfs.io_stall_write_ms ,
 9         divfs.io_stall ,
10         size_on_disk_bytes ,
11         GETDATE() AS baselineDate
12 INTO    #baseline
13 FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS divfs
14         JOIN sys.master_files AS mf ON mf.database_id = divfs.database_id
15                                        AND mf.file_id = divfs.file_id

代碼9.3:在臨時表裡從sys.dm_io_virtual_file_stats捕獲磁碟I/O基線

代碼9.4展示對 #baseline表的查詢,對Person資料庫返回一些讀寫統計信息。

1 SELECT  physical_name ,
2         num_of_reads ,
3         num_of_bytes_read ,
4         io_stall_read_ms ,
5         num_of_writes ,
6         num_of_bytes_written ,
7         io_stall_write_ms
8 FROM    #baseline
9 WHERE   databaseName = 'Persons'

代碼9.4:查詢#baseline臨時表。

已經提過,這個函數提供的數據是從伺服器上一次重啟後累積的,換句話說,數據列的值是不斷增長的,從上一次伺服器重啟的時間點。這樣的話,數據的單個“快照”並無用處,就本身來說。我們要做的是,建立一個“基線”標準,等待一定的時間,或許當一系列操作完成後,然後建立第二個“基線”並減掉,這樣的話,你會看到哪裡的I/O是增長的。

重新運行代碼9.1來更新我們的Persons表,並運行代碼9.5來收集第2批數據,減掉基線數據值(這裡我們從輸出忽略了一些列,為了可以更直觀的看結果)。

 1 WITH  currentLine
 2         AS ( SELECT   DB_NAME(mf.database_id) AS databaseName ,
 3                         mf.physical_name ,
 4                         num_of_reads ,
 5                         num_of_bytes_read ,
 6                         io_stall_read_ms ,
 7                         num_of_writes ,
 8                         num_of_bytes_written ,
 9                         io_stall_write_ms ,
10                         io_stall ,
11                         size_on_disk_bytes ,
12                         GETDATE() AS currentlineDate
13              FROM     sys.dm_io_virtual_file_stats(NULL, NULL) AS divfs
14                         JOIN sys.master_files AS mf
15                           ON mf.database_id = divfs.database_id
16                              AND mf.file_id = divfs.file_id
17              )
18   SELECT  currentLine.databaseName ,
19         LEFT(currentLine.physical_name, 1) AS drive ,
20         currentLine.physical_name ,
21         DATEDIFF(millisecond,baseLineDate,currentLineDate) AS elapsed_ms,
22         currentLine.io_stall - #baseline.io_stall AS io_stall_ms ,
23         currentLine.io_stall_read_ms - #baseline.io_stall_read_ms
24                                                       AS io_stall_read_ms ,
25         currentLine.io_stall_write_ms - #baseline.io_stall_write_ms
26                                                       AS io_stall_write_ms ,
27         currentLine.num_of_reads - #baseline.num_of_reads AS num_of_reads ,
28         currentLine.num_of_bytes_read - #baseline.num_of_bytes_read
29                                                       AS num_of_bytes_read ,
30         currentLine.num_of_writes - #baseline.num_of_writes AS num_of_writes ,
31         currentLine.num_of_bytes_written - #baseline.num_of_bytes_written
32                                                       AS num_of_bytes_written
33   FROM  currentLine
34       INNER JOIN #baseline ON #baseLine.databaseName = currentLine.databaseName
35         AND #baseLine.physical_name = currentLine.physical_name 
36   WHERE #baseline.databaseName = 'Persons' ;  

代碼9.5:自基線衡量後,捕獲磁碟I/O統計信息。

在這個例子里,顯然我們強制了一些在日誌文件上,非常頻繁的寫活動!通常,找出高I/O積累的原因,並解決問題,是一個比較複雜的過程。如果你懷疑I/O積累率引起的問題,那麼行動的第一步是嘗試減少全局的I/O到可接受的級別。例如,我們可以從執行的或索引相關的DMV來使用數據,通過調優和索引優化來降低全局I/O。我們也可以增加記憶體量,這樣的話更多的資料庫會被緩存,這樣的話會減少物理文件都的併發。使用I/O停滯率和數據讀寫量,我們也可以使用分區,或者把表放到不同的文件組。

最終,不管怎樣,高的I/O停滯率直接意味著硬碟I/O子系統不足以處理需要的I/O輸出。如果不能把全局的I/O載入降到接受的級別,那麼只能嘗試增加更多或更快的硬碟,更多或更快的I/O路徑,或者調查下I/O子系統配置的潛在問題。

最後,記住這個DMV反饋的數據只是硬碟I/O的SQL Server角度的數據。如果磁碟子系統是共用的,在伺服器級別,有其他的應用,另一個應用可能會是拖垮硬碟性能的原因,而不是SQL Server。進一步說,SAN的使用,虛擬軟體等等,在SQL Server和具體的硬碟存儲之間常會有很多“中介”層。

簡答來說,在做出行動前,仔細分析從這個DMV獲得的數據,結合考慮下從系統計數器、Profile和其他DMV獲得的數據。

使用sys.dm_os_performance_counters

一般來說,如剛纔談到的,使用性能監視器(PerfMon)收集性能計數器最簡單。然而,如果你更喜歡在資料庫表裡保存統計信息,並用SQL在查詢的話,sys.dm_os_performance_counters這個DMV是個非常有用的工具。只要寫從這個DMV獲取數據的查詢,增加INSERT INTO CounterTrendingTableName...你就有了初步的監控系統!另外,你總不能直接訪問PerfMon,從不同的機器訪問它會很慢。

遺憾的時候,使用這個DMV並不一帆風順,它繁瑣的詳細介紹不是我們的討論範圍。不過,你可以看下這本可以免費下載電子書《使用DMV進行性能調優》來做參考。

代碼9.6簡單提供瞭如何在日誌增長或收縮事件上做報表的一個例子。

 1 SET @object_name = CASE WHEN @@servicename = 'MSSQLSERVER' THEN 'SQLServer'
 2                         ELSE 'MSSQL$' + @@serviceName
 3                    END + ':Databases'
 4 
 5 DECLARE @PERF_COUNTER_LARGE_RAWCOUNT INT 
 6 SELECT  @PERF_COUNTER_LARGE_RAWCOUNT = 65792
 7 
 8 SELECT  object_name ,
 9         counter_name ,
10         instance_name ,
11         cntr_value
12 FROM    sys.dm_os_performance_counters
13 WHERE   cntr_type = @PERF_COUNTER_LARGE_RAWCOUNT
14         AND object_name = @object_name
15         AND counter_name IN ( 'Log Growths', 'Log Shrinks' )
16         AND cntr_value > 0
17 ORDER BY object_name ,
18         counter_name ,
19         instance_name

代碼9.6:捕獲日誌增長和收縮事件

輸出結果表明Persons資料庫(初始日誌2MB日誌大小,自動增長率2MB)正遭受大量日誌增長事件,由於100萬條記錄的插入和在代碼9.2里的更新操作。這顯然是引起關註的原因,DBA需要調查下日誌大小和增長設置,很可能進行一次性的收縮,並調整為合適的大小,如第8篇所介紹的。

T-SQL和PowerShell腳本

對於SQL Server實例,你資料庫文件的大小和屬性,包括其他東西有很多腳本的方法來監控。這篇文章不會覆蓋所有的方法來收集這些信息,我們只談談我們需要知道的最好的。

T-SQL和SSIS

在Rodney Landrum的《SQL Server的釣魚盒》里,他提供了收集伺服器行為和資料庫信息的各種T-SQL腳本,包括日誌和數據文件增長。

  • 伺服器信息——SQL Server名稱,SQL Server版本,排序信息等等。
  • 資料庫管理——主要做到數據和日誌文件增長監控
  • 資料庫備份——備份運行成功了麽?哪些資料庫在完整、簡單和大容量日誌模式?我們在進行完整恢複數據庫的日誌常規備份麽?
  • 安全性——誰訪問了並做了什麼?
  • SQL代理作業——哪個會包含這些運行你資料庫備份

然後他演示瞭如何自動化收集這些信息,在所有的伺服器間,使用SSIS,把它們保存到DBA專屬的資料庫里,用來檢查和分析。

如果這聽起來像你需要的方法,下載這個電子書,連同代碼,並使用它。

PowerShell

PowerShell,和伺服器管理對象,構成了一個管理和文檔化SQL Server資料庫的強大的自動化工具。對於DBA來說,學習T-SQL和可視化界面的管理工具,學習梯度很陡峭,但幾個短的腳本就可以在你的所有的伺服器和所有的資料庫版本間收集數據的所有行為。

接下來的2個腳本來自Phil Factor的《PowerShell伺服器管理對象:只寫一次》。

代碼9.7的PowerShell會列出SQL Server實例清單,在這些伺服器實例里檢查所有的資料庫,通過SMO(伺服器管理對象)列出:

  • 日誌文件和路徑名稱
  • 自動增長設置(KB或百分比)
  • 當前文件大小(MB),已使用空間量(MB)和最大文件大小(MB)
  • 硬碟讀數,硬碟寫數
  • 從磁碟讀的位元組數,寫到磁碟的位元組數

直接修改腳本為你的伺服器實例名,從系統里的PowerShell里運行它。

 1 #Load SMO assemblies
 2 $MS='Microsoft.SQLServer'
 3 @('.SMO') |
 4      foreach-object {
 5         if ([System.Reflection.Assembly]::LoadWithPartialName("$MS$_") -eq $null) 
 6            {"missing SMO component $MS$_"}
 7      }
 8 set-psdebug -strict
 9 $ErrorActionPreference = "stop" # you can opt to stagger on, bleeding
10                                 # if an error occurs
11 
12 $My="$MS.Management.Smo" 
13 @("YourServerPath\InstanceName","MySecondServer") |
14    foreach-object {new-object ("$My.Server") $_ } | # create an SMO server object
15     Where-Object {$_.ServerType -ne $null} | # did you positively get the server?
16       Foreach-object {$_.Databases } | #for every server successfully reached 
17         Where-Object {$_.IsSystemObject -ne $true} | #not the system objects
18           foreach-object{$_.Logfiles} |
19            Select-object @{Name="Server"; Expression={$_.parent.parent.name}}, 
20                          @{Name="Database"; Expression={$_.parent.name}},  
21                          Name, Filename, 
22                          @{Name="Growth"; Expression={"$($_.Growth)
23                                                                                      $($_.GrowthType)"}},  
24                          @{Name="size(mb)"; Expression={"{0:n2}" –f
25                                                                                    ($_.size/1MB)}}, 
26                          @{Name="MaxSize(mb)"; Expression={"{0:n2}" –f
27                                                                                      ($_.MaxSize/1MB)}}, 
28                          NumberOfDiskReads,NumberOfDiskWrites,
29                          BytesReadFromDisk,BytesWrittenToDisk |
30                Out-GridView 

代碼9.7:使用PowerShell和SMO調查日誌文件大小,位置和活動。

我們在網格視圖裡顯示我們的輸出,並過濾了只顯示“persons”。如果你想輸出到Excel,把Out-GridView替換為:

1 Convertto-csv –useculture > Export.csv

如果你在SSMS里運行這個腳本,右擊伺服器或資料庫選擇【啟動PowerShell】。如果你使用的伺服器版本不止2012,那麼首先你要下載,導入並安裝sqlps模塊,這樣可以訪問Out-GridView和Convertto-csv cmdlets。可以參考下Michael Sorens的文章 ,2個選擇1個,替換掉最後行的FormatTable。

代碼9.8展示了第2個腳本,調查日誌文件碎片。同樣,在所有指定的資料庫實例上使用SMO來查詢每個資料庫。它通過T-SQL查詢了DBCC LogInfo來獲得每個日誌文件的VLF數。對於每個資料庫,它分組了虛擬日誌文件的結果個數,最大的VLF大小單位是MB,最小的VLF單位是MB,所有VLF的平均和總大小。這次我們使用FormatTable來作為輸出格式。

 1 #Load SMO assemblies
 2 $MS='Microsoft.SQLServer'
 3 @('.SMO') |
 4      foreach-object {
 5         if ([System.Reflection.Assembly]::LoadWithPartialName("$MS$_") -eq $null) 
 6            {"missing SMO component $MS$_"}
 7      }
 8 set-psdebug -strict
 9 $ErrorActionPreference = "stop" # 
10 
11 $My="$MS.Management.Smo" #
12 @("YourServerPath\InstanceName","MySecondServer") |
13    foreach-object {new-object ("$My.Server") $_ } | # create an SMO server object
14     Where-Object {$_.ServerType -ne $null} | # did you positively get the server?
15       Foreach-object {$_.Databases } | #for every server successfully reached 
16          Foreach-object { #at this point you have reached the database
17          $Db=$_
18          $_.ExecuteWithResults(‘dbcc loginfo’).Tables[0] | #make the DBCC query
19            Measure-Object -minimum -maximum -average -sum FileSize |
20                                                              #group the results by filesize
21              Select-object @{Name="Server"; Expression={$Db.parent.name}}, 
22                            @{Name="Database"; Expression={$Db.name}},  
23                            @{Name="No.VLFs"; Expression={$_.Count}}, 
24                            @{Name="MaxVLFSize(mb)"; Expression={"{0:n2}" –f
25                                                                                        ($_.Maximum/1MB)}}, 
26                            @{Name="MinVLFSize(mb)"; Expression={"{0:n2}" –f
27                                                                                        ($_.Minimum/1MB)}}, 
28                            @{Name="AverageVLF(mb)"; Expression={"{0:n2}" –f
29                                                                                        ($_.Average/1MB)}},
30                            @{Name="SumVLF(mb)"; Expression={"{0:n2}" –f
31                                                                                        ($_.Sum/1MB)}}
32                            } | Format-Table * -AutoSize

代碼9.8:使用PowerShell和SMO調查日誌碎片(從輸出已經忽略伺服器名稱)

小結

這個系列的最後一篇文章就回顧了對於日誌增長和性能監控,DBA可用的幾個工具,包括Windows的性能監視器,第三方工具,動態管理視圖(DMV),PowerShell和T-SQL腳本。我們努力提供了每個工具可用做的合理感覺,這樣的話,如果這個工具符合你需要的話,你可用進一步深入研究。

維持一個健康的事務日誌是每個DBA的基本職責。理想的,這會包括單個日誌文件,在特定的RAID 1+0的陣列(或接近你能獲得的最理想狀態),為了支持最大的寫性能和吞吐量。我們必須捕獲在典型工作負荷下,描述日誌寫性能的“基線”統計信息,然後多次監控這些數據,檢查不正常的活動,或性能里的突然惡化。

同樣,我們也要按當前和預見的數據量定義大小,而不是讓SQL Server”通過自動增長事件來管理日誌增長。我們應該啟用SQL Server的自動增長的便利性,但只作為一個保護措施,當日誌增長時,DBA應該收到一個警告,並去調查。通過仔細監控日誌增長,我們可以避免日誌滿的情形,或大量日誌碎片,它會降低日誌讀取的操作性能,例如日誌備份和故障恢復過程。

擴展閱讀

感謝

我們將感謝:

本文演示代碼下載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • xml界面佈局代碼: 1 2 8 9 17 18 代碼實現: 1 package com.gzcivil.ui; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Hand...
  • 前言:因為時間緣故,很少進行通俗易懂的演算法思路講解,這裡先展示動態圖片效果,然後後面的內容我就直接上關鍵源碼了。效果展示圖;源碼百度雲盤下載鏈接: http://pan.baidu.com/s/1eQOOixc 密碼: duu8源碼: 1 // PhotoCell.h 2 // 自定義流水佈局 .....
  • AGConnectionNet對系統網路請求進行簡單封裝,可便利的進行網路請求,並將數據解析與網路請求封裝在同一方法下,使用更加便利(JSON 解析採用自身解析方法, XML 解析採用第三方 ReadXML 進行解析).方法具體參數說明初始化方法:/*** 類方法,實例化當前數據請求對象 (單例)*...
  • 一、Apache伺服器 1. 使用最廣的 Web 伺服器 2. Mac自帶,只需要修改幾個配置就可以,簡單,快捷 3. 有些特殊的伺服器功能,Apache都能很好的支持 目的:讓有一個自己專屬的測試環境二、準備工作 1.設置用戶密碼 2.MAC 10.10及以上三、配置伺服器(此過程會用...
  • 資料庫欄位startDate 開始時間 endDate 結束時間 -兩個參數比如查2-2 至2-6 在資料庫中是否與其他時間有重疊四個條件有一項滿足則有重疊時間思路是這樣子 以開始和結束時間參數為條件分開查詢 開始時間是否包含在其他時間段內、結束時間是否包含在其他時間段內、是否有其他時間包含在參數....
  • SQL Server中@@ROWCOUNT返回受上一語句影響的行數,返回值類型為 int 整型。如果行數大於 20 億,則需要使用 ROWCOUNT_BIG。@@ROWCOUNT和@@ERROR變數的值,在執行完一條語句後總是會發生變化,所以我們將他們作為判斷的依據的時候應該首先保存在局部變數中。他...
  • 一、創建用戶# useradd spark# passwd spark二、下載軟體JDK,Scala,SBT,Maven版本信息如下:JDK jdk-7u79-linux-x64.gzScala scala-2.10.5.tgzSBT sbt-0.13.7.zipMaven apache-maven...
  • 這個在SQL2005之後最見的一種分頁方式,也是Linq預設生成的執行分頁的方法(skip,take),當然在性能上小數量沒有問題,在數據達到百萬時會很慢,這是我們要清楚的,有時我們在LINQ環境下也需要分頁寫SQL,這時如何去分佈就成為了一個很不好處理的問題,所以大叔還是把準備的分頁代碼貢獻一下D...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...