SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Archive for 11月, 2010

Denali で 2 ノードクラスターを構築

without comments

Denali で 2 ノードクラスターを構築する手順をまとめてみたいと思います。

WSFC は構築をしてあり、MSDTC のリソースは作成済みです。
image

■1 ノード目のインストール

事前準備は終わっていますのでセットアップを起動してクラスターのインストールを行います。
Denali のクラスターのインストールは一台ずつ実施をします。
まずは最初のノードのインストールから。

  1. セットアップを起動すると .NET Framework 3.5 のインストールを確認されますので、[OK] をクリックしてインストールを行います。
    # .NET Framework 4.0 も合わせてインストールがされるようです。
    image
  2. [Installation] から [New SQL Server failover Cluster installation] をクリックします。
    image
  3. [OK] をクリックします。
    image
  4. [Next] をクリックします。
    CTP1 では、Enterprise Evaluation を使用してクラスターを構築します。
    image
  5. [I accept the license terms.] を有効にして、[Next] をクリックします。
    image
  6. [Install] をクリックします。
    image
  7. セットアップルールの検証が開始されます。問題が無ければ [Next] をクリックします。
    以下の画面では、[Microsoft Cluster Serivce (MSCS) Cluste rverification warnings] が発生しています。
    この警告ですが、WSFC のクラスタの検証レポートで警告が発生していたために発生しています。
    image
    image

    私がインストールする場合、インストール時にログオンしているドメインアカウントには最低限の権限 (Domain Users) しか与えていないので、コンピューターアカウントの作成に関してのチェックで警告となります。
    image
    インストール時にログオンしているユーザーにはコンピューターアカウント作成のための権限は委任していませんが、初期状態の 10 台までの作成で対応ができますので、警告は無視ししています。

    クラスターの検証レポートが以下の状態であれば、SQL Server のインストール検証では警告は発生しません。
    image

    また、SQL Server で使用するディスクに関してもインストーラーを実行するノードに移動をしておきます。
    image
    [使用可能記憶域] に属している状態ではインストールには使えませんので注意が必要です。
    image
    インストーラーを実行しているノードで使用可能な共有ディスクがない場合はエラーになります。
    image
    image

  8. インストールする機能を選択し、[Next] をクリックします。
    今回は、SQL Server のデータベースエンジン関連に必要な最低限の機能をインストールしています。
    image
  9. インスタンスの情報を入力して、[Next] をクリックします。
    今回は名前付きインスタンスを使用しています。
    image
  10. [Next] をクリックします。
    image
  11. SQL Server クラスターのグループ名を設定し、[Next] をクリックします。
    グループ名はコンボボックスになっているのでグループ名を変更することが可能です。
    image
    共有ディスクが [使用可能記憶域] に属している場合は、[Next] をクリックすることができませんので一度ほかのグループに移動をしておく必要があります。
    image
  12. チェックボックスで使用するディスクを選択し、[Next] をクリックします。
    image
  13. ネットワークを設定して [Next] をクリックします。
    今回は、DHCP のままでインストールをしてみたいと思います。
    image
  14. クラスターで使用するセキュリティ設定を選択して、[Next] をクリックします。
    今回は、[User service SIDs] を選択しています。
    image
  15. サービスアカウントと照合順序を設定して、[Next] をクリックします。
    image
    image
  16. セキュリティ設定、データディレクトリ、FILESTREAM の設定をして、[Next] をクリックします。
    image
    image
    image
  17. エラー報告をして [Next] をクリックします。
    image
  18. [Next] をクリックします。
    image
  19. [Install] をクリックしてインストールを開始します。
    image
    image
  20. [Close] をクリックしてインストールを完了します。
    image

これで 1 ノード目のインストールは完了です。

 

■2 ノード目のインストール

 

続いて 2 ノード目のインストールを行います。

  1. 2 ノード目でセットアップを実行します。
  2. [OK] をクリックします。
    image
  3. [Installation] から、[Add node to a SQL Server failover cluster] をクリックします。
    image
  4. [OK] をクリックします。
    image
  5. [Next] をクリックします。
    image
  6. [I accept the license terms.] を有効にして、[Next] をクリックします。
    image
  7. [Install] をクリックします。
    image
  8. [Next] をクリックします。
    image
  9. ノードを追加するインスタンスを選択して、[Next] をクリックします。
    image
  10. [Next] をクリックします。
    image
  11. サービスアカウントのパスワードを入力して、[Next] をクリックします。
    image
  12. [Next] をクリックします。
    image
  13. [Next] をクリックします。
    image
  14. [Install] をクリックして、インストールを開始します。
    image
    image
  15. [Close] をクリックしてインストールを完了します。
    image

以上でクラスターのインストールは完了です。

image

クラスターインスタンスのインストールは今までのバージョンと変わらないですね。

Denali では高可用性構成として [HADR] という構成があります。

この構成に関しては次の投稿でまとめてみたいと思います。

Written by Masayuki.Ozawa

11月 13th, 2010 at 1:39 pm

Posted in SQL Server

Tagged with ,

SQL Live Monitor と PAL Tool を使用したモニタリングとレポーティング

without comments

今日は、CodePlex で提供されている [SQL Live Monitor] と [Performance Analysis of Logs (PAL) Tool] を使用した、SQL Server のモニタリングとレポーティングについてまとめてみたいと思います。

■SQL Live Monitor

SQL Live Monitor を使用すると、SQL Server の現状の稼働状況を確認することができます。
image
[SQL Server] の欄に情報を取得する SQL Server 名 (既定のインスタンスの場合はサーバー名、名前付きインスタンスの場合はサーバー名インスタンス名) を入力して、[Start] をクリックすることで情報が取得できます。

パフォーマンスチューニングをするにあたって、いくつかの項目は手動で情報を取得する必要がありますが現状の状態を把握するのにはとても便利なツールだと思います。
データキャッシュ / プロシージャキャッシュのメモリ使用状況は Page Life Expectancy といった定番の情報をリアルタイムに見やすく確認することが可能です。
Cache Hit Ratio 系は SQL Server のサービスが最後に起動してからの情報なのであまり参考にならない可能性がありますが…。
矢印でデータの流れがわかるようになっており、[>->->] であれば、左の項目から右の項目に、[<-<-<-] であれば右の項目から左の項目に対してデータが流れていることになります。

たとえば、[Checkpoints/Sec] ですが、チェックポイントが発生するとダーティーページがデータファイルに対してフラッシュされます。
そのため、[SQL Memory] から [Disk Storage] に対してデータが流れることになります。この矢印の方向を理解しておくと SQL Server のデータの流れが分かるかと思います。

 

情報はパフォーマンスモニタから取得されており、以下のような項目を取得し、画面に表示を行っています。

DiskIdleTime = LogicalDisk% Idle Time
AvgDiskReadSec = LogicalDiskAvg. Disk sec/Read
AvgDiskWriteSec = LogicalDiskAvg. Disk sec/Write
AvgDiskQueueLength = LogicalDiskAvg. Disk Queue Length
DiskReadBytesSec = LogicalDiskDisk Read Bytes/sec
DiskWriteBytesSec = LogicalDiskDisk Write Bytes/sec

TransactionsSec = DatabasesTransactions/sec
LogFlushes = DatabasesLog Flushes/sec
TempDBSize = DatabasesData File(s) Size (KB)tempdb
TempDBLogSize = DatabasesLog File(s) Size (KB)tempdb
TempLogSpaceUsed = DatabasesLog File(s) Used Size (KB)tempdb

CPUPercent = Processor% Processor Time

CompilesSec = SQL StatisticsSQL Compilations/sec
RecompilesSec = SQL StatisticsSQL Re-Compilations/sec
BatchesSec = SQL StatisticsBatch Requests/sec

TargetMemory = Memory ManagerTarget Server Memory (KB)
TotalMemory = Memory ManagerTotal Server Memory (KB)
ConnectionMemory = Memory ManagerConnection Memory (KB)
MemGrantsPending = Memory ManagerMemory Grants Pending

BufferCacheSize = Buffer ManagerDatabase pages
BufferCacheHitRatio = Buffer ManagerBuffer cache hit ratio
UserPageLookups = Buffer ManagerPage lookups/sec
PageLife = Buffer ManagerPage life expectancy
LazyWrites = Buffer ManagerLazy writes/sec
ReadAheads = Buffer ManagerReadahead pages/sec
Checkpoints = Buffer ManagerCheckpoint pages/sec
DiskReads = Buffer ManagerPage reads/sec
DiskWrites = Buffer ManagerPage writes/sec
StolePages = Buffer ManagerStolen pages

LocksPerSecond = LocksLock Requests/sec
LockWaits = LocksLock Waits/sec_Total
AvgLockWaitTime = LocksAverage Wait Time (ms)_Total

UserConnections = General StatisticsUser Connections
LoginsSec = General StatisticsLogins/sec
TempObjectCreate = General StatisticsTemp Tables Creation Rate
TempObjectDestroy = General StatisticsTemp Tables For Destruction
TempActiveTables = General StatisticsActive Temp Tables

ProcedureCacheSize = Plan CacheCache PagesSQL Plans
ProcedureCacheHitRatio = Plan CacheCache Hit RatioSQL Plans

MemPagesSec = MemoryPages/sec
FreePTEs = MemoryFree System Page Table Entries
PagedPool = MemoryPool Paged Bytes
NonPagedPool = MemoryPool Nonpaged Bytes
AvailableSystemRam = MemoryAvailable MBytes

ProcQueueLength = SystemProcessor Queue Length

WorkTables = Access MethodsWorktables Created/sec
WorkFiles = Access MethodsWorkfiles Created/sec
FullScans = Access MethodsFull Scans/sec

msdtc = Exec StatisticsDistributed QueryExecs in progress

手動でパフォーマンス監視をしたいときはこの項目をベースに必要となる項目を追加していくと楽かもしれないですね。

 

Live Monitor でリンクになっている箇所は情報をブレークダウンすることができます。

[User Connections]
image

[Total]
image

[Locks / sec]
image

[Avg Waits]
image

[Latch Stats]
image

[Current Memory]
image

[Plan Cache]
image

[Expensive Queries]
image

[Detailed TempDB Views]
image

 

SQL Live Monitor は現在の使用状況を確認するだけでなく、ログを取得する機能を持っています。
[Option] ボタンを押すことで、ログ取得の設定をすることが可能です。
image

デフォルトではログ取得は有効になっていないのですが、
[Log Data for offline analysis (CSV)]
[Log Blocked Process Details (CSV)]
[Log Data for PAL Analysis]
を有効にすることで、ログを取得することが可能になります。ログですが、SQL Live Monitor を実行したフォルダに取得されます。
# Blocked Process はうまく取得できなかったのですが…。

 

[PAL Analysis] は PAL Tool で解析をするための取得データになり、このデータはパフォーマンスモニタを使用して取得されています。
設定を有効にすると、[mscounters] というユーザー定義のデータコレクタ セットが作成され、このコレクタ セットで PAL Tool で解析するためのパフォーマンス情報が取得されます。
image

この PAL Tool 用のデータですが以下の情報が取得されています。

Network Interface(*)Bytes Total/sec
Network Interface(*)Current Bandwidth
Network Interface(*)Output Queue Length

SystemProcessor Queue Length

Processor(*)% Processor Time
Processor(*)% Privileged Time
Processor(_Total)% Processor Time
Processor(_Total)% Privileged Time
Processor(*)% Interrupt Time

PhysicalDisk(*)% Idle Time
PhysicalDisk(*)Avg. Disk sec/Read
PhysicalDisk(*)Avg. Disk sec/Write

LogicalDisk(*)% Idle Time
LogicalDisk(*)Avg. Disk sec/Read
LogicalDisk(*)Avg. Disk sec/Write
LogicalDisk(C:)Free Megabytes
LogicalDisk(*)Disk Transfers/sec

MemoryFree System Page Table Entries
MemoryPool Nonpaged Bytes
MemoryPool Paged Bytes
MemoryAvailable MBytes
MemoryPages/sec

SystemContext Switches/sec

Process(*)Private Bytes
Process(*)Handle Count
Process(*)Thread Count
Process(*)% Processor Time
Process(*)Virtual Bytes
Process(*)Working Set

MemorySystem Cache Resident Bytes
MemoryPages Input/sec

Paging File(*)% Usage
Paging File(*)% Usage Peak

Process(sqlservr)% Privileged Time
Process(sqlservr)% Processor Time
Process(*)IO Data Operations/sec
Process(*)IO Other Operations/sec

SQL StatisticsBatch Requests/sec

Access MethodsForwarded Records/sec
Access MethodsFreeSpace Scans/sec
Access MethodsFull Scans/sec
Access MethodsIndex Searches/sec
Access MethodsPage Splits/sec
Access MethodsScan Point Revalidations/sec
Access MethodsWorkfiles Created/sec
Access MethodsWorktables Created/sec

Buffer ManagerBuffer cache hit ratio
Buffer ManagerLazy writes/sec
Buffer ManagerCheckpoint pages/sec
Buffer ManagerFree pages
Buffer ManagerPage life expectancy
Buffer ManagerPage lookups/sec
Buffer ManagerPage reads/sec
Buffer ManagerPage writes/sec

General StatisticsLogins/sec
General StatisticsLogouts/sec
General StatisticsUser Connections

LatchesLatch Waits/sec
LatchesTotal Latch Wait Time (ms)

Memory ManagerMemory Grants Pending
Memory ManagerTarget Server Memory (KB)
Memory ManagerTarget Server Memory(KB)
Memory ManagerTotal Server Memory (KB)
Memory ManagerTotal Server Memory(
KB)

SQL StatisticsSQL Compilations/sec
SQL StatisticsSQL Re-Compilations/sec

Locks(_Total)Lock Requests/sec
Locks(_Total)Lock Waits/sec
Locks(_Total)Lock Wait Time (ms)
Locks(_Total)Lock Timeouts (timeout > 0)/sec
Locks(_Total)Number of Deadlocks/sec

このログを使用して PAL Tool でレポートを作成することが可能となります。

 

■Performance Analysis of Logs (PAL) Tool

 

PAL Tool はパフォーマンスモニタで取得した情報を解析しレポートを作成することができるツールになります。
# PowerShell 2.0 と .NET Framework 3.5 の Chart Control が必要になります。
Live Monitor では、PAL Tool の [Microsoft SQL Server 2005/2008] のテンプレートに合わせた情報を取得していますので、取得したデータをすぐに PAL Tool にかけてレポートを作成することが可能です。

こちらが PAL Tool を起動した画面になります。
image

レポートの作り方は簡単で、[Counter Log] から Live Monitor で取得したパフォーマンスモニタのログデータを選択し、
image

[Threshold File] から、[SQL Server 2005/2008] をテンプレートとして設定をし、
image

[Execute] から [Finish] をクリックすることでレポートを作成することが可能です。
image

そうすると裏で PowerShell が実行されレポートが作成されます。
image

PAL Tool の実行が完了するとこのようなレポートが生成されます。
# デフォルトだと PAL Tool を実行したユーザーの [ドキュメントPAL Reports] に出力されます。
image

CPU の使用率の警告やメモリの空きの警告など基本的な情報を出力してくれるほかに SQL Server 固有のレポートが生成されます。
たとえば、Page Life Expectancy は 300 以上を推移しているのが良好な状態というのが定番になっていますが、そのレポートに関しても作成がされています。
# 300 を超えていない場合は赤くなって警告のレポートが作成されます。
image

こちらは CPU の使用率のグラフになるのですが、80%~100% は注意が必要な範囲 (Critical) なので赤くなっているのが確認できます。
以下のグラフでは瞬間的に Clitical の領域に達していることが確認できます。

image

ただし、別のグラフ (Processor の Queue) では Warning / Critical には達していませんので瞬間的な CPU の負荷であって、CPU のスペックの限界までは達していない (処理能力には余裕がある) 状態であると考察することができます。
image

Live Monitor で取得したデータを基に SQL Server の状態と、サーバーの基本的な状態をレポートとして確認をできますので、複数のグラフを見比べサーバーの状態を確認することが可能となります。

パフォーマンス チューニングではベースラインとして現状を確認することが重要になりますので、これらのツールを組み合わせると一からベースライン情報の取得を考えなくてもよいので楽になるかと思います。

グラフをどう読み解いていくかが難しいところではあるのですが、最初の一歩としては Warning / Critical となっている箇所を注視して、他のグラフと重ね合わせていくとよいのかな~と。

Written by Masayuki.Ozawa

11月 12th, 2010 at 12:15 am

Posted in SQL Server

Microsoft SQL Server code-named ‘Denali’ CTP1 の提供開始

without comments

本日 [Microsoft SQL Server code-named ‘Denali’ CTP1] の提供が開始されました。

Code Name Denali ですが、次期 SQL Server の CTP 版になります。
# SQL Server 2011 になるのかなと。
image

SSMS が VIsutal Studio 2010 ベース (.NET Framework 4.0 もインストールされます) に変更されています。
image

SSMS が刷新され、レポートが Word 形式でもエクスポートできるようになりました。
image

PDF のレポートに関してもフォントが埋め込まれるようになったみたいですね。
image

Availability Groups という機能が増えているようなのですが、これは WSFC の必要があるようですね。

image

日本語の照合順序に関しては、[Japanese_XJIS_100] が最新のようですね。
image

 

まだ、ヘルプが見れないので新規にどのような機能が入ったのかは調べられていないのですがクラスタに関しては今週中に構築してみたいと思います。

Written by Masayuki.Ozawa

11月 9th, 2010 at 9:55 pm

Posted in SQL Server

Tagged with

Microsoft SQL Server code-named 'Denali' CTP1 の提供開始

without comments

本日 [Microsoft SQL Server code-named ‘Denali’ CTP1] の提供が開始されました。

Code Name Denali ですが、次期 SQL Server の CTP 版になります。
# SQL Server 2011 になるのかなと。
image

SSMS が VIsutal Studio 2010 ベース (.NET Framework 4.0 もインストールされます) に変更されています。
image

SSMS が刷新され、レポートが Word 形式でもエクスポートできるようになりました。
image

PDF のレポートに関してもフォントが埋め込まれるようになったみたいですね。
image

Availability Groups という機能が増えているようなのですが、これは WSFC の必要があるようですね。

image

日本語の照合順序に関しては、[Japanese_XJIS_100] が最新のようですね。
image

 

まだ、ヘルプが見れないので新規にどのような機能が入ったのかは調べられていないのですがクラスタに関しては今週中に構築してみたいと思います。

Written by Masayuki.Ozawa

11月 9th, 2010 at 9:55 pm

Posted in SQL Server

Tagged with

SSMS を RemoteApp で使ってみる

without comments

SQL Server の管理をするために使用する SQL Server Management Studio (SSMS) ですが、サーバーにはインストールをしているケースが多いと思いますが、保守用のクライアントには入っていないことがあるかもしれないです。

そんな時に便利なのが RemoteApp。

正確に言うと以下の更新プログラムをインストールすることで使用できるようになる、アプリケーションのコンソールリダイレクト機能を使用します。
# Windows 7 / 2008 / 2008 R2 は更新プログラムをインストールしないでも使用できます。

RemoteApp? を有効にするための WindowsR XP SP3 用の更新プログラム
RemoteApp? を有効にするための WindowsR Vista SP1 以降用の更新プログラム

残念ながら Windows Server 2003 用はないのですよね…。
これが使用できるのは、Windows XP SP3 / Windows Vista SP1 以降 / Windows 7 / Windows Server 2008 / Windows Server 2008 R2 上で実行されているプログラムをクライアントで使用したいときに限定がされます。

 

XP / Vista の初期で使用されている、RDP 6.x 系でも使用できます。
最新の RDP 7.0 を使用したい場合は以下の更新プログラムをインストールします。
Windows XP 用の更新プログラム (KB969084)
Windows Vista 用の更新プログラム (KB969084)

 

有効にするための方法はいろいろとあるのですが一番単純なのは、起動したいアプリケーションがインストールされているサーバー (今回は SQL Server をインストールしているサーバー) で以下のレジストリを 1 にすることだと思います。
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTerminal ServerTsAppAllowList]
[fDisabledAllowList] (REG_DWORD)
image
image

デフォルトは [0] になっていますのでこれを [1] に変更します。
# 再起動は不要です。

これでサーバーで起動できるアプリケーションをリモートデスクトップ経由でリダイレクトできるようになります。
サーバーのアプリケーションを利用したい端末で以下の内容を記載した [.rdp] という拡張子のファイルを作成します。
IP アドレスを記載している部分は接続したいサーバーの IP アドレスに変更してください。
# 最後の行は改行されてしまっていますが一行で記載します。

full address:s:192.168.0.1
server port:i:3389
remoteapplicationmode:i:1
remoteapplicationname:s:SQL Server Management Studio
remoteapplicationprogram:s:C:Program Files (x86)Microsoft SQL Server100ToolsBinnVSShellCommon7IDESsms.exe

リモートデスクトップを使用していますので、サーバー側でリモートデスクトップを有効にする必要もあります。
# 3389 はリモートデスクトップのポートですので。
image

上の画像では、NLA (ネットワーク レベル認証) で設定をしていますが、NLA でない設定でも問題はありません。

 

後は作成した RDP ファイルを実行して、リモートデスクトップ接続をすれば RemoteApp で SSMS を起動することが可能です。
image

SSMS が起動してきているのですが、[(リモート)] となっているのが確認できます。
これはリモートデスクトップ経由でアプリケーションが実行されていることになります。
image

タスクマネージャーから確認をしても同様に (リモート) となっています。
image

 

リモートデスクトップで接続ができる環境にインストールされているプログラムを透過的に利用したい場合は結構便利だと思います。

私は、XP の環境で Hyper-V マネージャーを使用したい場合にもこの方法を使用して使っていたりします。
# UAC が働くので、一度ダイアログが表示されてしまいますが。
image
image

Written by Masayuki.Ozawa

11月 8th, 2010 at 12:02 am

Posted in Windows Server

Resource データベースについて

without comments

先日、
@IT などを運営されている
アイティメディア株式会社様

の会議スペースをお借りして開催された、SQL Server の勉強会に参加をしてきました。

その勉強会の中で SQL Server の [Resource] データベースについて質問を受けたので、このデータベースについて少し書いてみたいと思います。

Resource データベースに関しては、Books Online で以下のように記載されています。

Resource データベースは、読み取り専用のデータベースで、SQL Server に含まれるすべてのシステム オブジェクトがこれに格納されます。
SQL Server システム オブジェクト (sys.objects など) は、物理的には Resource データベースに保存されていますが、論理的にはすべてのデータベースの sys スキーマ内にあるように扱われます。
Resource データベースには、ユーザーのデータやユーザーのメタデータは保持されません。

各データベースのシステムビューやシステムストアドプロシージャーなどで使用されている、[sys.xxxx] 関連の情報は [Resource] データベースの内容を透過的に参照している形になります。
# Resource データベースは SSMS (SQL Server Management Studio) には表示されません。
imageimage

普段何気なく使用している、[sys.master_files] のようなシステムビューですが、これは [ビュー] と名前がついている用に実体ではなく、実表を参照しているものになります。

ではこの実体はどこに格納されているかというと実体は [master] データベースに保存されています。
試しに [sys.master_files] のビュー定義を確認してみたいと思います。
確認するためには、[SELECT OBJECT_DEFINITION(OBJECT_ID(‘sys.master_files’))] というように OBJECT_DEFINITION を使います。

CREATE VIEW sys.master_files AS  
SELECT
    database_id  = f.dbid,
    file_id   = f.fileid,
    file_guid   = f.fileguid,
    type   = f.filetype,
    type_desc  = ft.name,
    data_space_id  = f.grpid,
    name    = f.lname,
    physical_name  = f.pname,
    state   =
        convert(tinyint,
            case f.filestate  — Map enum EMDFileState to AvailablityStates         
                when 0 then 0 when 10 then 0 — ONLINE       
                when 4 then 7 — DEFUNCT       
                when 5 then 3
                when 9 then 3 — RECOVERY_PENDING       
                when 7 then 1
                when 8 then 1
                when 11 then 1 — RESTORING       
                when 12 then 4 — SUSPECT       
            else 6 end), — OFFLINE   
    state_desc  = st.name,
    f.size,
    max_size    = f.maxsize,
    f.growth,
    is_media_read_only  = sysconv(bit, f.status & 8),  — FIL_READONLY_MEDIA
    is_read_only    = sysconv(bit, f.status & 16), — FIL_READONLY
    is_sparse    = sysconv(bit, f.status & 256), — FIL_SPARSE_FILE
    is_percent_growth  = sysconv(bit, f.status & 32), — FIL_PERCENT_GROWTH
    is_name_reserved  = sysconv(bit, case f.filestate when 3 then 1 else 0 end), — x_efs_DroppedReusePending
    create_lsn   = GetNumericLsn(f.createlsn),
    drop_lsn    = GetNumericLsn(f.droplsn),
    read_only_lsn   = GetNumericLsn(f.readonlylsn),
    read_write_lsn  = GetNumericLsn(f.readwritelsn),
    differential_base_lsn = GetNumericLsn(f.diffbaselsn),
    differential_base_guid = f.diffbaseguid,
    differential_base_time = nullif(f.diffbasetime, 0),
    redo_start_lsn   = GetNumericLsn(f.redostartlsn),
    redo_start_fork_guid = f.redostartforkguid,
    redo_target_lsn  = GetNumericLsn(f.redotargetlsn),
    redo_target_fork_guid = f.forkguid,
    backup_lsn   = GetNumericLsn(f.backuplsn)
FROM
    master.sys.sysbrickfiles f
    LEFT JOIN
        sys.syspalvalues st
        ON
        st.class = ‘DBFS’
        AND
        st.value = f.filestate
    LEFT JOIN
        sys.syspalvalues ft
        ON         ft.class = ‘DBFT’
        AND ft.value = f.filetype
WHERE
    f.dbid < 0x7fff — consistent with sys.databases
    AND
    f.pruid = 0
    AND
    f.filestate NOT IN (1, 2) — x_efs_Dummy, x_efs_Dropped
    AND
    has_access(‘MF’, 1) = 1 

ビューの元になるデータは [master.sys.sysbrickfiles] というテーブルになっています。
Resource データベースはこのようなシステムビューやシステムストアドプロシージャを格納し、master 上に格納されている情報を透過的に見せるために使用されています。
# 今回のベース表になっている、[master.sys.sysbrickfiles] は直接参照できないので。

この Resource データベースですが、以下の 2 つのファイルから構成されています。

  • mssqlsystemresource.mdf
  • mssqlsystemresource.ldf

通常、システムデータベースは
[C:Program FilesMicrosoft SQL ServerMSSQL10_50.<インスタンス ID>MSSQLDATA]
というディレクトリに格納されるのですが、リソースデータベースのファイルは、
[C:Program FilesMicrosoft SQL ServerMSSQL10_50.<インスタンス ID>MSSQLBinn]
に格納がされます。
インスタンスのプログラム扱いでファイルが格納されていますね。

この Resource データベースですが、バージョンがあり [SELECT SERVERPROPERTY(‘ResourceVersion’)] というクエリを実行することでバージョンを確認することができます。

このバージョンですが、SQL Server のバージョンと一致するようで、

  • SQL Server 2008 R2 RTM : [10.50.1600]
  • SQL Server 2008 R2 CU4 : [10.50.1746]

となります。

修正プログラムをインストールすると、Resource データベースのバージョンも更新されます。

Resouce データベースには実データではなく実データを見せるための定義が格納されているので、Books Online で

SQL Server では、Resource データベースをバックアップできません。
ファイル ベースまたはディスク ベースのバックアップは、mssqlsystemresource.mdf ファイルをデータベース ファイルではなくバイナリ (.EXE) ファイルのように実行できますが、SQL Server を使用してバックアップを復元することはできません。
mssqlsystemresource.mdf のバックアップ コピーの復元は手動でのみ実行できます。
また、現在の Resource データベースを古いバージョンや安全でない可能性のあるバージョンで上書きしないように注意する必要があります。

と書かれているのは、実データは含まれず定義のみが格納されており適切なバージョンの SQL Server をインストールすれば最適な状態になるからだと思います。

 

Resource データベースは SSMS に表示がされないので通常はどのような情報が格納されているのか見ることはできないのですが、実はデータベースのファイルをコピーしてアタッチすることで内容を確認することができます。
# mssqlsystemresource.mdf / ldf は読み取り専用で SQL Server 上で認識されているのでオンラインでもコピー可能です。

通常のアタッチでは、以下のようなエラーになります。
image
image

このエラーですが、[mssqlsystemresource] というデータベース名でアタッチをしようとしたために発生しています。
# Resource データベースですが内部的には、[mssqlsystemresource] で認識されているためだと思います。

[次の名前でアタッチ] のデータベースの名前を変更することで Resource データベースをアタッチすることが可能です。
今回は、Resource というデータベース名でアタッチしています。
image

アタッチをすることで Resource データベースの内容を直接確認することが可能になります。
image

通常、[sys.xxxxx] はシステム ビューやシステム ストアド プロシージャーとして認識されているのですが、アタッチした Resource データベースではユーザービュー / ユーザー ストアド プロシージャーとして認識がされます。
# システムビューやシステム ストアド プロシージャーとしても認識はされるのですが。

imageimage

システム ビュー / システム ストアド プロシージャーの状態では、スクリプト化ができないため [OBJECT_DEFINITION] を介して定義を確認していました。
image

ユーザーオブジェクトになっていればスクリプト化が可能なため、[sys.xxxx] といったものも簡単に内容を確認できます。
imageimage

 

Resource データベースは SQL Server 2005 になってから搭載されたものなのですが、通常使用している中ではあまり意識はしないので、どんなデータが入っているのかイメージがしにくいのですよね…。
# 私は、sys. 系の定義が入っているだけだと考えているのですが。

Written by Masayuki.Ozawa

11月 7th, 2010 at 10:54 pm

Posted in SQL Server