Quantcast
Channel: Microsoft SQL Server Japan Support Team Blog
Viewing all 293 articles
Browse latest View live

SQL Server における数値定数 2147483647 と 2147483648 の違い

$
0
0

 

神谷 雅紀
SQL Server Escalation Engineer

 

小数点記号 “.” なしの整数は、通常は int と解釈されますが、int のデータ範囲 (-2^31 (-2147483648) ~ 2^31-1 (2147483647)) を超える値は bigint ではなく numeric として解釈されます。

この違いは、通常あまり意識されることはないと思いますが、データ型不一致の問題や算術オーバーフローなどを発生させる可能性がありますので、cast や convert 関数、パラメーター化クエリのパラメーターとして明示的にデータ型を指定するなどの考慮が必要です。

例えば、以下の最初の式は「メッセージ 8115、レベル 16、状態 2、expression をデータ型 int に変換中に、算術オーバーフロー エラーが発生しました。」となりますが、二つ目は計算結果 2147483649 を返します。三つ目のように明示的にデータ型を指定すれば、2147483647+1 もエラーにはなりません。

 

-- エラー 8115 になる。
select 2147483647+1

-- 2147483649 が返される。     
select 2147483648+1

-- 2147483648 が返される。

select cast(2147483647 as bigint)+1

 

定数のデータ型は以下の方法で確認することができます。

 

select SQL_VARIANT_PROPERTY(2147483647,'BaseType') as 'Type'
go

Type
-----------------------------------------
int

 

select SQL_VARIANT_PROPERTY(2147483648,'BaseType') as 'Type'
go

Type
-----------------------------------------
numeric

 

※ numeric と decimal は等価です。

 

int、bigint、smallint、および tinyint (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms187745.aspx


NUMERIC/DECIMAL の演算結果の有効桁数と小数点以下桁数

$
0
0

 

神谷 雅紀
SQL Server Escalation Engineer

 

 

numeric/decimal データ型は、有効桁数 (精度) と小数点以下桁数 (スケール) が固定ではないため、演算を行う場合には考慮が必要です。

 

 

NUMERIC/DECIMAL の演算結果の精度とスケールの決定方法

 

numeric/decimal の演算を行った場合、その結果の精度とスケールは以下のようになります。

e1, e2 はそれぞれ以下のように定義されているとします。

 

e1 numeric(p1, s1)
e2 numeric(p2, s2)

 

演算

結果の精度

結果のスケール

e1 + e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 - e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 * e2p1 + p2 + 1s1 + s2
e1 / e2p1 - s1 + s2 + max(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 UNION e2max(s1, s2) + max(p1-s1, p2-s2)max(s1, s2)
e1 % e2min(p1-s1, p2 -s2) + max( s1,s2 )max(s1, s2)

※ CASE, INTERSECT, EXCEPT も UNION と同じ方法です。

 

例えば、

e1 numeric(10,3)
e2 numeric(20,1)

である場合、e1 + e2 の結果の精度とスケールを上の表の計算式に従って計算すると、

精度 = max(3, 1) + max(10-3, 20-1) + 1 = 3 + 19 + 1 = 23
スケール = max(3, 1) = 3

となるため、e1 + e2 の結果のデータ型は

numeric(23,3)

となります。

整数部 7 桁、小数部 3 桁の数値と整数部 19 桁、小数部 1 桁の数値を足した結果を格納するためには、整数部 20 桁と小数部 3 桁が必要であるため、numeric(23, 3) が計算結果のデータ型となるのは、理解しやすいと思います。

これは以下のような SQL_VARIANT_PROPERTY 関数を使った T-SQL バッチで確認することができます。

declare @e1 numeric(10,3)
declare @e2 numeric(20,1)
set @e1=1111111.111
set @e2=2222222222222222222.2
select
@e1+@e2 as R,
sql_variant_property(@e1+@e2, 'Precision') as Precision,
sql_variant_property(@e1+@e2, 'Scale') as Scale
go

R                        Precision  Scale
------------------------ ---------- --------
2222222222223333333.311  23         3

 

もし、この結果を変数に格納しようとしている場合には、その変数は numeric(23, 3) もしくはそれを超える精度とスケールの変数として定義されている必要があります。

 

 

これだけであればそれほど複雑ではありませんが、精度の計算結果が最大精度である 38 を超えるようになると若干複雑になります。

 

 

最大精度 38 を超える場合

 

精度が numeric/decimal の最大精度である 38 を超える場合、小数部よりも整数部が優先され、可能な限り整数部で切り捨てが発生しないようにスケールが調整されます。

例えば、

e1 numeric(38,3)
e2 numeric(38,1)

である場合、e1 + e2 の結果は、

精度 = max(3, 1) + max(38-3, 38-1) + 1 = 3 + 37 + 1 = 41
スケール = max(3, 1) = 3

となりますが、41 は最大精度 38 を超えているため、精度は最大精度と等しい 38 になります。一方、スケールは、整数部が可能な限り切り捨てられないようにするために調整されます。

精度の計算上の値が最大精度を超える場合については、スケールが何になるのかを以下のような T-SQL を用いて確認する必要があります。

-- 加算の例
declare @e1 numeric(38,3)
declare @e2 numeric(38,1)
set @e1=1111111.111
set @e2=2222222222222222222.2
select
@e1+@e2 as R,
sql_variant_property(@e1+@e2, 'Precision') as Precision,
sql_variant_property(@e1+@e2, 'Scale') as Scale
go

R                        Precision  Scale
------------------------ ---------- --------
2222222222223333333.3    38         1

 

 

関数を使う場合

SUM 関数を numeric/decimal データに対して使う場合の戻り値のデータ型は numeric(38, s) です。

そのため、スケールの異なる列に対して CASE や UNION を行う場合には、結果のスケールを考慮しておく必要があります。

以下の例を見てみます。

 

create table t1 (c1 numeric(10, 3))
create table t2 (c1 numeric(10, 5))
go
insert into t1 values (1111111.111)
insert into t2 values (11111.11111)
go

t1.c1 の SUM() の結果は t1.c1 が numeric(10, 3) なので numeric(38, 3) になります。

select SUM(c1) as A,
sql_variant_property(SUM(c1), 'Precision') as Precision,
sql_variant_property(SUM(c1), 'Scale') as Scale
from t1
go

A            Precision  Scale
------------ ---------- ------
1111111.111  38         3

 

t2.c1 の SUM() の結果は t2.c1 が numeric(10, 5) なので numeric(38, 5) になります。

select SUM(c1) as A,
sql_variant_property(SUM(c1), 'Precision') as Precision,
sql_variant_property(SUM(c1), 'Scale') as Scale
from t2
go

A            Precision  Scale
------------ ---------- ------
11111.11111  38         5

t1.c1 と t2.c1 の UNION は、numeric(38, 3) になります。その結果、t1.c2 の小数部は 3 桁となり、4 桁目以降は切り捨てられることになります。

select A,
sql_variant_property(A, 'Precision') as Precision,
sql_variant_property(A, 'Scale') as Scale
from
(select SUM(c1) as A from t1
  union
  select SUM(c1) as A from t2) T
go

A                  Precision    Scale
------------------ ------------ --------
11111.111          38           3
1111111.111        38           3

 

こういった切り捨てが発生しないように、もしくは、発生してもそれが問題とならないように、予め対策を行っておくことをお勧めします。(対策はシステム要件などにより異なると思いますので、ここでは特に言及しません。)

 

参考資料

 

有効桁数、小数点以下桁数、および長さ (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms190476.aspx

SUM (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms187810.aspx

 

Windows AzureのIaaS機能でSQL Serverを使ってみよう

$
0
0

Windows AzureのIaaS機能でSQL Serverを使ってみよう

この度、新しい仮想マシンおよび仮想ネットワーク機能を含むWindows AzureのIaaS機能が一般公開(日本語訳はこちら)されました。Windows Azure 仮想マシンではオンプレミスの SQL Server をそのまま利用することが出来ます。(注意:制限事項・ポイントがあります。このBlogで後述します。)そこで、簡単に簡易作成画面のリストから選択可能なSQL Serverが含むイメージを使って仮想マシンを作成し、外部からWindows Azure上に構成したSQL Server に接続する方法を紹介します。

このBlogでは以下の内容を説明します。

1. SQL Serverが含まれる仮想マシンの作成方法
2. 仮想マシンにリモートデスクトップ(RDP)接続する方法
3. 仮想マシンのSQL Serverに外部のコンピュータから接続する方法
4. 仮想マシンのモニタリング・サイズ変更
5. 仮想マシン上でSQL Serverを利用する際の制限事項やポイント

前提

Windows Azureアカウントをすでにお持ちで、Windows Azure管理ポータルにアクセスできることが作業の前提となります。

なお、まだWindows Azureアカウントをお持ちでなければ、無償トライアルにサインアップして、すぐにお試し頂けます。ぜひご活用ください

それでは、順番に説明します。

1.SQL Serverが含まれる仮想マシンの作成方法

Windows Azure 管理ポータルにアクセスし、「仮想マシン」をクリックし、左下に表示される「+新規」 のマークをクリックします。

clip_image002

表示された以下のメニューで「簡易作成」をクリックします。

clip_image004

DSN名を入力します。ここではSQLTESTJPを指定して作成しています。また、「イメージ」のドロップダウンリストボックスをクリックして表示される一覧から、「SQL Server 2012 SP1 Standard On Windows Server 2008 R2 SP1」を選択します。

clip_image006

ここではサイズは「S(1コア、1.75 GBメモリ)」を指定しています。(SQL Server Enterprise Editionを使用する場合、仮想マシンのサイズとしてL以上が推奨されます。SQL Server BI 配置では、XL の仮想マシン サイズが推奨されます。詳細は 5.仮想マシン上でSQL Serverを利用する際の制限事項やポイント をご覧ください。)

clip_image008

次にユーザー名、パスワードを指定します。ここではユーザー名に 「SQLTESTJP」 を指定しています。また、作成するデータセンターの地域を指定します。ここでは「東アジア」を指定しています。

clip_image010

すべての項目が設定できたら、設定内容を確認し、「仮想マシンの作成」をクリックし、仮想マシンを作成します。

clip_image012

仮想マシンの作成が開始され、状態欄に「開始中(プロビジョニング)」と表示されます。DNS名欄には SQLTESTJP.cloudapp.net が表示されています。こちらは後ほど使用するので、必要に応じてメモをとっておきます。

clip_image014

プロビジョニング中に次の画面が表示されます。仮想マシンを利用するための情報がまとめられています。

clip_image016

プロビジョニングが終了すると、状態欄に、「実行中」と表示され、使用する準備ができたことがわかります。

clip_image018

2.仮想マシンにリモートデスクトップ(RDP)接続する方法

それでは実際に接続してみましょう。作成した仮想マシン「SQLTESTJP」をクリックし、左下に表示される「接続」のアイコンをクリックします。

clip_image020

SQLTESTJP.rdpを開くか保存するように求めるポップアップが表示されるので、「Open」または「Save」をクリックします。

clip_image022

Remote Desktop Connectionのダイアログが表示されます。Remote Computerの名前が先ほどのDNS名になっていることを確認し、「Connect」をクリックします。

clip_image024

次に認証情報を求められます。仮想マシン作成時に設定した認証情報を入力し、「OK」をクリックします。

clip_image026

正しく認証が行われると、次の画面が表示されるので「YES」をクリックします。

clip_image028

仮想マシンのリモートデスクトップの画面が開きます。

clip_image030

スタートメニューから「SQL Server Management Studio 」を開きます。

clip_image032

Server Nameに「SQLTESTJP」(ローカル)が指定されていることを確認し、Connectをクリックします。

clip_image034

仮想マシン上にインストールされた SQL Server 2012 SP1 に接続することができました。

clip_image036

3.仮想マシンのSQL Serverに別のコンピュータから接続する方法

別のコンピュータから接続するには以下の設定が必要です。(今回のようにドメイン環境が構成されていない場合 ※)

・ 仮想マシン上のTCPエンドポイントの設定 ー1433ポートを追加する
・ SQL Server の認証モードを Windows認証モードから混合モード認証に変更する
・ 仮想マシン上のWindows FirewallにてIncomingのTCPポート 1433を許可する

※ Windows Azure の SQL Server 仮想マシンを、Windows Azure 仮想ネットワークを通じて、Windows Azure またはオンプレミスで運用しているドメイン環境に追加できます。ドメイン環境がない場合、SQL Server データベース エンジンで Windows 認証を使用することはできません。別のコンピューターからデータベースエンジンに接続するには、混合モード認証用に SQL Server を構成します。詳細は以下のサイトをご覧ください。
Windows Azure 仮想マシンにおける SQL Server の接続に関する考慮事項
http://msdn.microsoft.com/ja-jp/library/dn133152.aspx

まず、仮想マシン上のTCPエンドポイントの設定ー1433ポートを追加します。

Windows Azure ポータル画面から、「仮想マシン」 - 「sqltestjp」をクリックし、表示されるメニューから「エンドポイント」をクリックします。(既定でRemoteDesktop用のエンドポイントが設定されています。)

clip_image038

次に画面左下に表示される「エンドポイントの追加」ボタンをクリックします。

clip_image040

エンドポイントの追加が選択された状態で「次へ」ボタンをクリックします。

clip_image042

エンドポイントの名前を指定し(ここではSQLとします)、プロトコルはTCP、ポートは1433を指定し、「次へ」をクリックします。

clip_image044

操作の状況が表示され、エンドポイントが追加されます。

clip_image046

次に、仮想マシン上においてSQL Server の認証モードを Windows認証モードから混合モード認証に変更する設定を行います。先ほどのリモートデスクトップ画面上で実行中のSQL Server Management Studio から、サーバーを右クリックし、「Properties」をクリックします。左ペインのメニューから「Security」をクリックし、「SQL Server and Windows Authentication mode」を選択し、OKをクリックします。

clip_image048

SQL Server の再起動が必要であることを示すダイアログ ボックスが表示されるのでそちらも「OK」をクリックします。

SQL Serverを再起動します。

次に、SQL Server認証ログインを設定します。ここではSQL Server認証ログインとしてsa ログインを使用します。インストール中に 「Windows 認証モード」が選択された場合、sa ログインは無効となっています。sa ログインを有効にするには、SQL Server Management Studioのサーバーを展開し、「Security」- 「Logins」の順に展開、「sa」を右クリックして「Properties」を表示します。「Status」ページから、「Login」- 「Enabled」を選択し、「OK」をクリックします。

clip_image050

上記の操作の詳細は下記のサイトの「セキュリティ認証モードを変更するには」と「saログインを有効にするには」をご覧ください。

サーバーの認証モードの変更
http://msdn.microsoft.com/ja-jp/library/ms188670.aspx

最後に仮想マシン上のWindows FirewallにてIncomingのTCPポート 1433を許可する設定を行います。Windows Firewallから「New Inbound Rule Wizard」を実行します。「Port」を選択し、「Next」をクリックします。

clip_image052

「TCP」を選択し、「Specific Local ports」に1433を指定します。「Next」をクリックします。

clip_image054

許可するコネクションの種類、 ルールの名前(ここではSQLと指定)を設定して「Finish」をクリックします。

詳細は下記をご覧ください。

[INF] ファイアウォール経由での SQL Server との通信に必要な TCP ポートhttp://support.microsoft.com/kb/287932/ja

それでは、別のマシンにあるSQL Server Management Studio から接続をしてみましょう。

まずDNS名を再度Windows Azureポータル画面のダッシュボード - 概要の欄から確認します。今回 sqltestjp.cloudapp.net が設定されています。

clip_image056

SQL Server Management Studio からデータベースエンジンの接続を行います。上記のDNS名をサーバー名に指定し、sa でログインとパスワードを入力し、「接続」をクリックします。

clip_image058

sqltestjp.cloudapp.net データベースエンジンのツリーが表示され、接続できました。

clip_image060

4.仮想マシンのモニタリング・サイズ変更

Windows Azure ポータル画面から、現在以下の仮想マシンの監視項目(メトリック)をモニタリングできます。

clip_image062

また、仮想マシンのサイズは「構成」画面から変更可能です。

clip_image064

5.仮想マシン上でSQL Serverを利用する際の制限事項やポイント

・仮想マシン上に SQL Server を配置した場合の制限事項
現時点では、SQL Server 2012 の新機能である AlwaysOn の Availability Group リスナー (仮想名) をサポートしていません。この機能は将来的に対応する予定です。リスナーを利用するには、1 つまたは複数の Floating IP を必要としますが、現時点の Windows Azure ではサポートされていないことが理由です。

詳細は下記をご覧ください。
Windows Azure 自習書シリーズ - 仮想マシン (IaaS) 編

・パフォーマンスに関するベスト プラクティスについて

こちらも上記自習書をご覧ください。

IaaS上でサポートされるSQL Serverについて
64-bit バージョンのMicrosoft SQL Server 2008 以降となります。詳細は下記のサイトをご確認ください。
Microsoft server software support for Windows Azure Virtual Machines
ハードウェア仮想化環境で実行している Microsoft SQL Server 製品のサポート ポリシー
※ IaaS上でサポートされるSQL ServerはKB2721672の内容が優先されます。

Windows Azure 仮想マシン ギャラリーで使用可能な SQL Server イメージについて
下記をご覧ください。
Windows Azure 仮想マシンギャラリーで使用可能な SQL Server イメージ
なお、テンプレートのイメージギャラリーに現在存在していないイメージについてはVHDイメージをアップロードすることでそこからVMを作成可能です。方法は、下記自習書の「2.4 仮想マシンのアップロード」をご覧ください。
Windows Azure 自習書シリーズ - 仮想マシン (IaaS) 編

・オンプレミスのデータベースのバックアップファイルを利用して仮想マシン上にデータベースを復元する方法について
下記のサイトの「Windows Azure 仮想マシンにデータベース スキーマとデータ ファイルを移動する方法」にWindows Azure 仮想マシンにファイルを移動するときに使用できる一般的な転送方法がまとめられています。この転送方法を利用してオプレミスのデータベースのバックアップファイルを仮想マシン上に転送し、復元することが可能です。
Windows Azure 仮想マシン内の SQL Server への移行

Reporting Services, Analysis Services に関して
下記をご覧ください。
SQL Server 仮想マシン ギャラリー イメージにインストールされている BI 機能の一覧・一般的な推奨事項とベストプラクティス

※ 2013 年 4 月 28 日現在の情報です。仕様については変更される可能性があります。

--

SQL Server / Windows Azure SQL Database Support

Kayoko Gray

オンプレミスのSQL Server データベースのバックアップ先としてクラウドを活用しよう

$
0
0

このSQL Server 2012 SP1 CU2 または SQL Server 2008 R2 CU6から、新しい機能が追加され、オンプレミスのSQL Serverのデータベースのバックアップ先としてWindows AzureのBlobストレージを指定することができるようになりました。また逆にWindows AzureのBlobストレージにあるバックアップファイルからオンプレミスにデータベースをリストアすることも可能になりました。

この機能により、バックアップの取得先としてテープ等のデバイスが不要になったりと、コスト削減につながる可能性がでてきます。

イメージとしては以下のようになります。

clip_image004[6]

それでは実際に操作してみましょう。

まず、バックアップファイル格納先のストレージを作成しておきます。Windows Azure 管理ポータルにアクセスし、「ストレージ」をクリック後、左下に出てくる「新規」をクリックします。

clip_image006[4]

「ストレージ」-「簡易作成」をクリックします。

clip_image008[4]

「URL」欄に名称を指定、格納先のデータセンターの場所を一覧から選び、「ストレージアカウントの作成」をクリックします。

clip_image010[4]

作成の進行状況が表示されます。

clip_image012[4]

作成が完了すると、「オンライン」と表示されます。

clip_image014[4]

次にコンテナーを作ります。先ほど作成したストレージ名をクリックすると、下記の画面になります。「コンテナー」をクリックし、「アクセスキーの管理」をクリックします。

clip_image016[4]

「コンテナーを作成する」をクリックします。

clip_image018[4]

新しいコンテナーの名前を指定します。ここではsqlbackupと指定しています。アクセス方法を選びます。今回は「プライベート」を指定し、Windows Azureアカウントの認証に必要な情報を指定できるユーザーだけがアクセスできるように設定します。

clip_image020[4]

コンテナーが作成されます。URLをコピーしておきます。ここでは http://kayobkup.blob.core.windows.net/sqlbackupとなります。

clip_image022[6]

また、アクセスするのに必要なアクセスキー情報もここでコピーしておきます。「アクセスキーの管理」をクリックします。

clip_image024[6]

プライマリアクセスキー値をコピーします。

clip_image026[6]

次に、バックアップの取得元のオンプレミスのSQL ServerにSQL Server Management Studio で接続します。

clip_image029
 

今回は AdventureWorks2012 データベースのバックアップをBlobストレージに取得してみます。また、その後、取得したバックアップをもとにリストアも試してみましょう。

まず、Blobストレージにアクセスするための資格情報を作成します。これは、SQL Serverでは、Windows Azureのアカウント名とアクセスキー認証をSQL Server資格情報に格納する必要があるためです。

資格情報を作成するには下記のコマンドを実行します。

CREATE CREDENTIAL myCredential ---任意の名前を指定します。

WITH IDENTITY='kayobkup', ---ストレージ名を指定します。

SECRET='アクセス���ーの管理からコピーしたプライマリアクセスキー値を指定します';

次にバックアップを取得します。下記のコマンドを実行します。下記のhttp://kayobkup.blob.core.windows.net/sqlbackupの部分には先ほど作成したコンテナーのURLを指定してください。また、バックアップファイル名は任意ですが、日付情報を指定しておくとよいでしょう。

BACKUP DATABASE AdventureWorks2012 TO

URL='http://kayobkup.blob.core.windows.net/sqlbackup/AdventureWorks2012_5_8_2013.bak'

WITH COMPRESSION, CREDENTIAL='myCredential', STATS=5;

実行状況がOutput欄に出力されます。

clip_image032[4]

コンテナーを見てみると、バックアップが取得され、取得日時とサイズが確認できます。

clip_image034[4]

それでは、データベースのリストアを試してみましょう。ここではAdventureWorks2012データベースを置き換えてリストアするマンドを実行します。

CREATE CREDENTIAL myCredential

WITH IDENTITY='kayobkup',

SECRET='アクセスキーの管理からコピーしたプライマリアクセスキー値を指定します';

RESTORE DATABASE AdventureWorks2012 FROM

URL='http://kayobkup.blob.core.windows.net/sqlbackup/AdventureWorks2012_5_8_2013.bak'

WITH CREDENTIAL='myCredential', STATS=5, REPLACE

clip_image038[6] 

リストアができました。

ここで、URLにはhttp://を指定していますが、https://を指定し通信を暗号化することもできます。(推奨)

上記のコマンドのオプションについての詳細はこちらをご覧ください。


参考
SQL Server 2012 SP1 CU2とSQL Server 2008 R2 CU6にて新しく追加された機能の詳細
Description of new features in Cumulative Update 2 for SQL Server 2012 SP1 and Cumulative Update 6 for SQL Server 2008 R2

Windows Azure BLOB ストレージ サービスを使用した SQL Server のバックアップと復元
http://msdn.microsoft.com/ja-jp/library/jj919148.aspx

※ 2013 年 5月 8 日現在の情報です。仕様については変更される可能性があります。

--

SQL Server / Windows Azure SQL Database Support

Kayoko Gray

DBCC SHRINKFILE 実行時のメッセージ

$
0
0

本間 崇
SQL Server Support Escalation Engineer

現象

トランザクションログファイルを圧縮するために、DBCC SHRINKFILE コマンドを実行した場合に、メッセージと共に圧縮が行えないことがあります。

例えば、以下のようなメッセージで圧縮が行えないような状況です。

DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。
ログ ファイル 2 (shrinktest_log) を圧縮できません。要求されたサイズ (448512 KB) が最後の論理ログ ファイルの開始位置よりも大きくなります。
DbId   FileId      CurrentSize MinimumSize UsedPages   EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
14     2           64000       64000       64000       64000

 

(1 行処理されました)

 

DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

問い合わせ自体は多くいただくものではありませんが、ここでパターンを整理しておこうと思います。

前提知識

このポストで説明する内容を理解するためには、以下の 2 つの技術的なポイントを抑えておく必要があります。

1. トランザクションログファイルは仮想ログファイルで構成されている
2. DBCC SHRINKFILE コマンドは、ファイルの末尾の空いている仮想ログファイルを解放する

まず、1.についてですが、SQL Server の Books Online 等でも説明している通り、SQL Server ではトランザクションログファイルを複数の仮想ログファイル(VLF)という箱に区切って管理しています。イメージとしては、以下のような感じでしょうか。1 つのファイルが 4 つの VLF に区切られている感じです。

image 

もう1つのポイントである、DBCC SRINKFILE コマンドの動作ですが、ファイルの末尾の空いている VLF を解放する、という動作になります。上記の色のついている部分が使用中で、色のついていない部分が空きとすると、ファイル末尾にある VLF4 だけが、空いている状況です。

この状態で、DBCC SHRINKFILE コマンドを実行すると、以下のように VLF4 だけが解放される形となります。VLF3 の空いている部分については解放されません。

image

メッセージについて

さて、それでは DBCC SHRINKFILE 実行時に見ることがあるメッセージについて確認しましょう。

おそらく、作業の際に目にするのは、以下の 3 つだと思います。

1. ログ ファイル 2 (xxxxxx) を圧縮できません。ファイルの末尾にある論理ログ ファイルが使用中です。
2. ログ ファイル 2 (xxxxxx) を圧縮できません。要求されたサイズ (448512 KB) が最後の論理ログ ファイルの開始位置よりも大きくなります。
3. ログ ファイル 2 (xxxxxx) を圧縮できません。論理ログ ファイルの総数を 2 未満にはできません。

まず、1 つ目ですが、これは以下のような状態です。ファイル末尾の VLF3 が現在使用中なので、圧縮できないという状態です。VLF1、VLF2 が空いているのでトランザクションログファイルの使用率としては低いですが、圧縮できない状態です。VLF3 が一杯になって、現在のログの位置が VLF1 に移動した後に、もう一度トランザクションログの切捨てが発生してVLF3が空けば、VLF3 が解放できるようになります。

image

2 つ目は、DBCC SHRINKFILE コマンドに、target_size を指定した場合に、発生するメッセージとなります。

わかり易くするため、VLF1 ~ VLF4 まで、それぞれ100MBで、トータル400MBのトランザクションログファイルと仮定します。この状態で、target_size に 300MB より大きい値を設定した場合、末尾の VLF4 の途中を指定したことになるため、解放すべき VLF がなくなります。VLF という単位で行っていることを理解していれば、メッセージの通りということがお分かりいただけると思います。

image

最後の3つ目は、本当に VLF が 2 つしかないので、圧縮できないパターンです。SQL Server では、最小の VLF の数を 2 と定めているため、それ以下には圧縮できません。そのために出力されるメッセージとなります。

image

いずれのパターンも VLF と DBCC SHRINKFILE コマンドの動作を理解いただければ、メッセージの通りの状態であり、致命的な状態ではないというのはご理解いただけるのではないかと思います。

参考

タイトル:トランザクション ログの圧縮
URL:http://msdn.microsoft.com/ja-jp/library/ms178037(v=sql.105).aspx

タイトル:DBCC SHRINKFILE (Transact-SQL)
URL:http://msdn.microsoft.com/ja-jp/library/ms189493(v=sql.105).aspx

[Windows Azure SQL Reporting] Visual Studio でファイルエクスポートをするプログラムを書いてみよう

$
0
0

横井 羽衣子
SQL Developer Senior Support Engineer

 

みなさんごきげんよう。今日は、Windows Azure SQL Database の SQL レポートを、レポートマネージャ等の GUI を経由せず、レポートをエクスポートするプログラムを書いてみましょう。 Reporting Service が公開している Web サービスを利用すると簡単にエクスポートができちゃいます。なお題材は Azure ですが、実は、オンプレミスの Reporting Services も全く同じ手順で実現できてしまいます。
構成としては以下の通りとなります。


- クライアント端末は、IE など Web ブラウザを通じて、サーバーサイドの ASP.NET Web アプリケーションにアクセスします。
- ASP.NET Web アプリケーションは、Reporting Services の Web サービスにアクセスし、処理を行い、その結果をクライアントに返します。

clip_image001

エクスポートについては、ReportExecutionService クラスRender メソッドにより実施することが可能です。
では、早速やってみましょう。まずは、レポートを作ってみるところからですね。

目次

はじめに : Windows Azure SQL Database Reporting Services でレポートを作ってみよう

1. ASP.NET Web アプリケーションを作ってみよう

2. 参照設定をしてみよう

3. 処理を実装してみよう

4. 実行してみよう


はじめに : Windows Azure SQL Database Reporting Services でレポートを作ってみよう

まずは、以下のドキュメントをもとに、レポートを作ってみましょう。

[SQL Azure] SQL Azure Reporting Previewを使ってみよう
http://blogs.msdn.com/b/dsazurejp/archive/2011/11/08/sql-azure-reporting-preview.aspx

上記ドキュメントは旧ポータル + SQL レポートのプレビュー版をもとにしていますが、SQL reportを作った後は、同じ手順でレポートを作成できます。新ポータルでは、以下に SQL Database Reporting Services があります。左のピラーの一番下の [新規+] を押すと、作成が可能です。

新ポータル : https://manage.windowsazure.com

clip_image002clip_image004

clip_image006

作成されると、”正常に作成されました” と表示されます。

clip_image008

clip_image010

ポータルの [SQL レポート] から、作成したサービスの “Web サービス URL” をクリックするとログイン画面になります。ログインするとサーバーの中がみられます。

clip_image012

まだ、レポートを作成していないと、空っぽです。上述のドキュメントに従って、レポートを作ってみてください。

clip_image014

完成すると、ブラウザでこんな風にみられます。これを、今回ファイル出力する!というのが目標です。以下は、作成したレポートをブラウザでみた図です。

clip_image015

ちなみに、Windows Phone 8 でもきれいに見えます。晴れ(HTC Windows Phone 8x でテスト)

image

まだ、Windows Phone 8 は日本では出ていないので、エミュレータをご利用いただくことになると思います。Windows Phone エミュレータは以下をご参照ください。

Windows Phone エミュレーター
http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/ff402563(v=vs.105).aspx

iphone シミュレータでもきれいにレポートを見ることができます。

clip_image017

※ iPhone シミュレータは Electric Mobile Studio からゲットしてみました。

clip_image019

それではアプリケーションを作ってみましょう!

1. ASP.NET Web アプリケーションを作ってみよう

1. Visual Studio を管理者権限で起動します。今回は、2012 でやってみます。
2. [ファイル(F)] – [新規作成(N)] – [プロジェクト(P)] を選択します。
3. [Web] を左ペインで選択し、"ASP.NET Web フォームアプリケーション" を選択し、任意の場所に作成します。
clip_image021

4. ツールボックスから、Button をクリックし、Form 上にドラッグ & ドロップします。
※ ツールボックスが見当たらない場合は、[表示(V)] – [ツールボックス] を選択してください。

clip_image023

5. WebForm 上のボタンをダブルクリックすると、Button1_Click イベントが追加され、コードのビューに移動します。今回は、ボタンが押されたタイミングで出力するようにしますので、Button1_Click イベント中にコードを追加していくことになります。

次のステップでは、Windows Azure SQL Database Reporting Services の Web サービスを参照して、プログラム中で使えるようにします。

2. 参照設定をしてみよう

Visual Studio のソリューション中で、サービス追加を行うことでレポート サーバーのサービスを利用することが出来ます。エクスポート処理は、レポート サーバーで公開している Web サービスのうち、"ReportExecutionService" を参照追加頂くことで利用可能です。

ReportExecutionService.Render メソッド
http://msdn.microsoft.com/ja-jp/library/reportexecution2005.reportexecutionservice.render.aspx

上記ページでは、mhtml 形式でのエクスポート (バイト配列への出力)、エクスポートされたデータのファイルへの書き込みといった一連の作業についてのサンプルコードが紹介されています。例えば、PDF ファイルへのエクスポートを行いたいときは、Render メソッドで指定される format に PDF を指定します。

上記例では、Windows Application (コンソール) でファイルへの書き出しを行っていますが、ASP.NET Web アプリケーションであれば、Response.BinaryWrite() メソッドを用いてファイルなどを保存することなどが可能です。

それでは、まずは参照を追加してみましょう。

1. Visual Studio のソリューション エクスプローラーの [参照設定] を右クリックし、[サービス参照の追加(S)...] を選択します。

clip_image025

2. [サービス参照の追加] ダイアログが開いたら、[詳細設定(V)...] をクリックし、[サービス参照設定] ダイアログを出します。

imageclip_image027

2. さらに、[Web 参照の追加(W)...] をクリックすると、[Web 参照の追加] ダイアログが開きます。

clip_image029

2-a. "URL(U)" には、下記のように、ご利用の Reporting Services Web サービスの URL を入力し、[->] ボタンを押します。 何度も [セキュリティの警告] ダイアログが表示されますが、ひたすら [いいえ(N)] を押しまくります。(実際の URL は適宜環境に合わせてください。)

例) レポートサーバーの Web サ���ビス URL が https://xxxxxxxxxx.reporting.windows.net/reportserverの場合
https://xxxxxxxxxx.reporting.windows.net/reportserver/ReportExecution2005.asmx?wsdl

clip_image031

2-b. 正常に Web サービスが参照されれば、"この URL で見つかった Web サービス(S):" に "1 個のサービスが見つかりました - ReportService2005" が表示されます。

image

2-c. [参照の追加(R)] ボタンを押します。

5. Web References 配下に、net.windows.reporting.<SQL Reporting Services のサーバ名> で Web サービスの参照が追加されます。

clip_image035

例) サーバ名が xxxxxxxxxの場合

net.windows.reporting.xxxxxxxxx

6. ソース中に "名前区間名.net.windows.reporting.<SQL Reporting Services のサーバ名>"を宣言します。

clip_image037

例) 名前空間 WebApplication1 / Reporting Services のサーバ名が xxxxxxxxxの場合

using WebApplication1.net.windows.reporting.xxxxxxxxx

3. 処理を実装してみよう

以下、上記の MSDN のコードからデータ出力部分のみに構成しなおし、解説を加え、Web アプリケーション用に若干の変更を加えたものとなります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplication1.net.windows.reporting.xxxxxxxxx;// サービス参照追加後に宣言を追記。今回、名前空間はWebApplication1 にしてるので、上記のようになります。
using System.Configuration;
using System.Net;
namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            ReportExecutionService rs = new ReportExecutionService();
             // レポート URL 指定。黄色部分 xxxxxxxxxがサーバー名。Windows Azure SQL Database の Reporting Services のサーバー名を指定。ここを自分のサーバ名に変えます。
            rs.Url = String.Format("https://xxxxxxxxx.reporting.windows.net:443/ReportServer/reportExecution2005.asmx", "xxxxxxxxx.reporting.windows.net");
            rs.CookieContainer = new CookieContainer();

           //第一引数 = User ID第二引数 パスワード第三引数サーバー名
            rs.LogonUser("testuser", "Passw0rd!", "xxxxxxxxx.reporting.windows.net");
            byte[] result = null;

            // レポートのパスです。
            // 例 :https://xxxxxxxxx.reporting.windows.net/ReportServer/incometaxmapの場合
            string reportPath = "/incometaxmap";

            // レポートを表示する形式です。この引数は、表示拡張機能にマップされます。
            // サポートされる拡張機能には、XML、NULL、CSV、IMAGE、PDF、HTML4.0、HTML3.2、MHTML、EXCEL、Word があります。
            // サポートされる拡張機能の一覧は、ListRenderingExtensions メソッドを呼び出すことによって取得できます。
            string format = "PDF";
            string historyID = null;
            string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"; // そのままで構いません。
            string encoding;
            string mimeType;
            string extension;
            Warning[] warnings = null;
            string[] streamIDs = null;

            // ExecutionInfo オブジェクトは、レポートの実行に使用した設定または使用する設定を確認するために使用されます。
            // レポートの実行にパラメータと資格情報が必要かどうかを確認する場合、および Render メソッドを呼び出す前に必要なパラメータと資格情報を提供する場合にも使用されます。
            //
http://msdn.microsoft.com/ja-jp/library/reportexecution2005.executioninfo(v=sql.100).aspx
             ExecutionInfo execInfo = new ExecutionInfo();
            ExecutionHeader execHeader = new ExecutionHeader();
            rs.ExecutionHeaderValue = execHeader;
            execInfo = rs.LoadReport(reportPath, historyID);
            String SessionId = rs.ExecutionHeaderValue.ExecutionID;

            try
            {
                // レポートの出力を result に取得します。結果は byte[] なので、Windows アプリケーションで実装する場合、後の処理でファイルストリームに書き込むようにするとよいでしょう。
                result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
                execInfo = rs.GetExecutionInfo();
                }
            catch (Exception se)
            {
                System.Diagnostics.Debug.WriteLine(se.StackTrace);
            }
            // 出力処理実施
            try
            {
                Response.Clear();
                Response.Buffer = true;
                Response.ContentType = "application/octet-stream";
                // ダウンロードする場合 "attachment; filename=Test.pdf" として、Test.PDF というファイル名で保存
                Response.AppendHeader("Content-Disposition", "attachment; filename=Test.PDF");
                Response.BinaryWrite(result);
                Response.Flush();
                Response.End();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
            }
        }
    }

 

4. 実行してみよう

ブラウザで、ASP.NET Web アプリケーションを実行してみます。まずは、Visual Studio でデバッグ実行でも OK です。F5 を押すとデバッグ実行が開始されます。

Web ブラウザで、ページが開かれます。

clip_image039

Button をクリックしますと、しばらくすると、ダウンロードのダイアログが出てきます。

clip_image041

ダウンロードフォルダに PDF が保存されます。

image

今回、コード中では、”Test.pdf” で保存をしているので、これで OK です。保存して開くと、レポートを見ることができます。

clip_image043

いかがでしたでしょうか。レポートを自動的に出力したいときなど、ちょっと便利じゃないですか?よかったら、やってみてくださいね!オンプレミスでも同じ手順でできますので。

それではみなさん、ごきげんよう。

SQL Server 2012 におけるパーティションインデックス再構築時の統計情報更新

$
0
0

 

神谷 雅紀    
SQL Server Escalation Engineer

 

 

DO's&DONT's #8: やってはいけないこと - インデックス再構築 (REBUILD) 後のインデックス統計情報更新 (UPDATE STATISTICS)でインデックス再構築後にインデックス統計情報の更新を行うとサンプル率が下がるという話をしました。

SQL Server 2012 においても、基本的には違いはないのですが、パーティションインデックスについては動作が異なります。

SQL Server 2012 のパーティションインデックスの再構築時の統計情報更新は、サンプル率 100% ではなく、UPDATE STATISTICS に明示的なサンプル率が指定されない時に使用されるサンプル率と同じ方法で決定されたサンプル率 (データ量を基に計算されたサンプル率) が使用されます。そのため、SQL Server 2012 のパーティションインデックスについては、インデックス再構築後にインデックス統計情報を更新しても、統計情報更新を二度行うという点では無駄ではあるものの、以前のバージョンのように、サンプル率を大幅に低下させるということはありません。反対に、以前のバージョンと同じサンプル率 100% で統計情報を作成したい場合は、明示的に FULLSCAN オプションを指定した UPDAE STATISTICS を実行しなければならない場合があります。

 

これ自体は、Books Online CREATE INDEX, ALTER INDEX, データベースエンジン機能の動作変更に記載されている内容ですが、以前に関連する内容を書いていたため、改めて取り上げてみました。

 

以下は、簡単な動作確認用のスクリプトです。

 

CREATE DATABASE parttest    
ON PRIMARY (NAME = partf0, FILENAME = N'C:\temp\partf0.mdf'),    
FILEGROUP fg1 (NAME = partf1,FILENAME = N'C:\temp\partf1.mdf'),    
FILEGROUP fg2 (NAME = partf2,FILENAME = N'C:\temp\partf2.mdf'),    
FILEGROUP fg3 (NAME = partf3,FILENAME = N'C:\temp\partf3.mdf'),    
FILEGROUP fg4 (NAME = partf4,FILENAME = N'C:\temp\partf4.mdf')    
LOG ON (NAME = partlog,FILENAME = N'C:\temp\partlog.ldf')    
GO

USE parttest    
GO    
CREATE PARTITION FUNCTION pf1 (int) AS RANGE LEFT FOR VALUES (100000, 200000, 300000)    
GO    
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 TO (fg1, fg2, fg3, fg4)    
GO    
CREATE TABLE dbo.partt (c1 int not null, c2 nchar(100)) ON ps1(c1)    
GO    
ALTER TABLE dbo.partt ADD CONSTRAINT pk_partt PRIMARY KEY (c1)    
GO

DECLARE @d int    
SET @d = 0    
BEGIN TRAN    
WHILE @d < 400000    
BEGIN    
  INSERT INTO dbo.partt VALUES (@d, cast(@d as nchar(6))+replicate(N'X',94))    
  SET @d+=1    
END    
COMMIT    
GO

ALTER TABLE dbo.partt REBUILD    
GO    
DBCC SHOW_STATISTICS ([dbo.partt], pk_partt)    
GO

 

※ パーティションインデックスは、Enterprise, Developer, Evaluation エディションのみで利用可能な機能です。

SQL Server 2008 R2 Service Pack のクラスター環境への適用手順

$
0
0

皆さん、こんにちは。今回は、SQL Server 2008 R2 Service Pack の MSFC ( Microsoft Failover Cluster) 環境への適用手順についてご紹介します。

SQL Server のフェールオーバー クラスタ環境への Service Pack 適用手順は下記の文書にて公開していますが、 2008 R2  の Service Pack  2 適用手順について画面イメージを含めた具体的な手順をご紹介します。

 

       SQL Server 2008 フェールオーバー クラスタにローリング更新プログラムおよび Service Pack を適用する方法

       http://support.microsoft.com/kb/958734/

 

※本手順の適用対象は、SQL Server 2008 R2 の Service Pack 1 および Service Pack 2 です。

※SQL Server 2008 から、Service Pack  の適用方法が変更になりました。SQL Server 2005 以前は Service Pack  の適用方法が異なりますのでご注意ください。

 

この例では、SQL Server 2008 R2 SP2 適用作業の開始時、MSFC の SQL Server  リソースは下記の状態となっています。

===========================

Active ノード : MACHINE_0011

Passive ノード : MACHINE_0010

===========================

 

SP2 適用手順の概要は下記の通りです。

===================================================================

1. 現在の Passive ノード (MACHINE_0010) への SP2 の適用

2. SP2 の適用が完了した ノード (MACHINE_0010) への、SQL Server リソースの移動

3. 新しく Passive ノードになった ノード (MACHINE_0011) への SP2 の適用

4. SP2 の適用が完了した ノード (MACHINE_0011) への、SQL Server リソースの 再移動

===================================================================

詳細な手順を下記にご紹介します。

 

1. 現在の Passive ノード (MACHINE_0010) への SP2 の適用

         

(1) Passive ノード (MACHINE_0010) でフェールオーバー クラスター マネージャーを起動します。

capt_1

 

(2) [サービスとアプリケーション] – [SQL Server(MSSQLSERVER)] を選択します。現在の所有者がActive ノード (MACHINE_0011)  になっていることを確認します。

capt_2

 

(3) Passive ノード (MACHINE_0010) でコマンドプロンプトを開き、下記のコマンドを実行してSQL Server のリソースの所有者が Active ノード (MACHINE_0011)  になっていることを再確認します。

        =====================

           cluster.exe resource

       =====================

            

capt_3

 

(4) フェールオーバー クラスター マネージャー に戻り、IPアドレスを右クリックして [プロパティ] を選択します。

capt_4

 

(5) [詳細なポリシー] タブを選択し、実行可能な所有者から、Passive ノード (MACHINE_0010)  のチェックをはずし、「適用」をクリックします。

     ※この操作は、Service Pack 適用中のノードへフェールオーバーが行われ、セットアップが失敗する等の現象を避けるためにおこないます。

capt_5

 

(6) [OK] をクリックします。

capt_6

 

(7) Passive ノード (MACHINE_0010) で SQL Server 2008 R2 SP2 のファイルをダブルクリックして起動します。

capt_7

 

(8) [セキュリティの警告] ダイアログが表示される場合は、[実行] ボタンをクリックして実行します。

capt_8

 

(9) [ファイルの展開] ダイアログが表示されます。

capt_9

 

(10) [SQL Server 2008 R2 セットアップは現在の操作を処理しています。しばらくお待ちください。] ダイアログが表示されます。

capt_10

 

(11) [SQL Server 2008 R2 の更新プログラム] 画面が表示されます。ルールチェックが完了するまで、しばらく待ちます。

capt_11

 

(12) [操作が完了しました] というメッセージが表示されます。[詳細の表示] ボタンをクリックします。

capt_12

 

(13) 詳細画面が表示されます。エラーが表示されていないことを確認し、[次へ] をクリックします。

capt_13

 

(14)  [ライセンス条項] 画面が表示されます。内容を確認し、[ライセンス条項に同意する] にチェックを入れ、[次へ] をクリックします。

capt_14

 

(15) [機能の選択] 画面が表示されます。[MSSQLSERVER] にチェックがついていることを確認し、[次へ] をクリックします。

capt_15

 

(16) [使用中のファイルの確認] 画面が表示されます。[次へ] をクリックします。

capt_16

 

(17) [更新準備完了] 画面が表示されます。[更新] をクリックします。

capt_17

 

(18) [更新の進行状況] 画面が表示されます。更新が完了するまでしばらく待ちます。

capt_18

 

(19) [完了] 画面が表示されます。エラーが表示されていないことを確認し、[閉じる] をクリックします。

capt_19

 

(20) SP2 の適用が完了したPassive ノード (MACHINE_0010) のサーバー再起動をおこないます。

    

2. SP2 の適用が完了した ノード (MACHINE_0010) への、SQL Server リソースの移動

 

(1) サーバーの再起動完了後、Passive Node (MACHINE_0010) でフェールオーバー クラスター マネージャーを起動します。

capt_22

 

(2) [サービスとアプリケーション] – [SQL Server(MSSQLSERVER)] を選択します。

capt_23

 

(3) IPアドレスを右クリックし、[プロパティ] を選択します。

capt_24

 

(4) [詳細なポリシー] タブを選択し、[実行可能な所有者] のPassive Node (MACHINE_0010) にチェックをつけ、[適用] をクリックします。

capt_25

 

(5) [OK] をクリックします。

capt_26

 

(6) [サービスとアプリケーション] – [ SQL Server(MSSQLSERVER)] を右クリックし、[このサービスまたはアプリケーションを別のノードに移動] – [1-ノード MACHINE_0010 に移動] を選択します。

capt_27

 

(7) [動作の確認] 画面が表示されます。[SQL Server (MSSQLSERVER) を MACHINE_0010 に移動する] を選択します。

    ※MACHINE_0010 へのグループの移動が完了するまで、SQL Server が停止している状態になりますので、ご注意ください。

capt_28

 

(8) MACHINE_0010 へグループの移動がおこなわれます。グループの移動が完了するまで、しばらく待ちます。

capt_29

 

(9) [状態] がすべてオンラインになり、グループの移動が完了しました。

capt_30

 

(10) 新しく Active ノードになったMACHINE_0010 で、SQL Server Management Studio を起動します。

capt_1158

 

(11) データベースエンジンに接続します。

capt_1159

 

(12) 「新しいクエリ」を選択します。

capt_1160

 

(13) [クエリ] - [結果の出力] - [結果をテキストで表示] を選択します。

capt_1161

 

(14) 下記のコマンドを実行します。

       ===================

           select @@version

       ===================

capt_1162

 

(15) SP2 が表示されることを確認します。

capt_1163

 

(16) [接続] – [Analysis Services] を選択します。

A-1

 

(17) “Microsoft 分析サーバー” のバージョンが、”10.50.4000.0'” になっていることを確認します。

A-2

 

(18) フェールオーバー クラスター マネージャーを起動します。

capt_1

 

(19) IPアドレスを右クリックし、[プロパティ] を選択します。

capt_31

 

(20) [詳細なポリシー] タブを選択し、実行可能な所有者から、新しく Passive ノードになった MACHINE_0011  のチェックをはずし、[適用] をクリックします。

       ※この操作は、Service Pack 適用中のノードへフェールオーバーが行われ、セットアップが失敗する等の現象を避けるためにおこないます。

capt_32

 

(21) [OK] をクリックします。

capt_33

 

(22) 新しく Passive ノードになった MACHINE_0011 でコマンドプロンプトを開き、下記のコマンドを実行してSQL Server のリソースの所有者が  MACHINE_0010  になっていることを再度確認します。

       ===================

           cluster.exe resource

       ===================

capt_34

 

 

3. 新しく Passive ノードになった ノード (MACHINE_0011) への SP2 の適用

 

(1) Passive ノード (MACHINE_0011) で SQL Server 2008 R2 SP2 のファイルをダブルクリックして起動します。

capt_35

 

(2) [セキュリティの警告] ダイアログが表示される場合は、[実��] ボタンをクリックして実行します。

capt_36

 

(3) [ファイルの展開] ダイアログが表示されます。

capt_37

 

(4) [SQL Server 2008 R2 セットアップは現在の操作を処理しています。しばらくお待ちください。] ダイアログが表示されます。

capt_38

 

(5) [SQL Server 2008 R2 の更新プログラム] 画面が表示されます。ルールチェックが完了するまで、しばらく待ちます。

capt_39

 

(6) [操作が完了しました] というメッセージが表示されます。[詳細の表示] ボタンをクリックします。

capt_40

 

(7) 詳細画面が表示されます。エラーが表示されていないことを確認し、[次へ] をクリックします。

capt_41

 

(8) [ライセンス条項] 画面が表示されます。内容を確認し、[ライセンス条項に同意する] にチェックを入れ、[次へ] をクリックします。

capt_42

 

(9) [機能の選択] 画面が表示されます。[MSSQLSERVER] にチェックがついていることを確認し、[次へ] をクリックします。

capt_43

 

(10) [使用中のファイルの確認] 画面が表示されます。[次へ] をクリックします。

capt_44

 

(11) [更新準備完了] 画面が表示されます。[更新] をクリックします。

capt_45

 

(12) [更新の進行状況] 画面が表示されます。更新が完了するまでしばらく待ちます。

capt_45-2

 

(13) [完了] 画面が表示されます。エラーが表示されていないことを確認し、[閉じる] をクリックします。

capt_46

 

(14) SP2の適用が完了したPassive ノード (MACHINE_0011) のサーバー再起動をおこないます。

 

4. SP2 の適用が完了した ノード (MACHINE_0011) への、SQL Server リソースの 再移動

 

(1) サーバーの再起動完了後、Passive ノード (MACHINE_0011) でフェールオーバー クラスター マネージャーを起動します。

capt_49

 

(2) [サービスとアプリケーション] – [SQL Server(MSSQLSERVER)] を選択します。

capt_49-2

 

(3) IPアドレスを右クリックし、[プロパティ] を選択します。

capt_50

 

(4) [詳細なポリシー] タブを選択し、[実行可能な所有者] のPassive Node (MACHINE_0011) にチェックをつけ、[適用] をクリックします。

capt_51

 

(5) [OK] をクリックします。

capt_52

 

(6) [サービスとアプリケーション] – [ SQL Server(MSSQLSERVER)] を右クリックし、[このサービスまたはアプリケーションを別のノードに移動] – [1-ノード MACHINE_0011 に移動] を選択します。

capt_53

 

(7) [動作の確認] 画面が表示されます。[SQL Server (MSSQLSERVER) を MACHINE_0011 に移動する] を選択します。

   ※MACHINE_0011 へのグループの移動が完了するまで、SQL Server が停止している状態になりますので、ご注意ください。

capt_54

 

(8) MACHINE_0011 へグループの移動がおこなわれます。グループの移動が完了するまで、しばらく待ちます。

capt_56

 

(9) [状態] がすべてオンラインになり、グループの移動が完了しました。

capt_56

 

(10) 新しくActive ノードになった MACHINE_0011 でコマンドプロンプトを開き、下記のコマンドを実行してSQL Server のリソースの所有者が MACHINE_0011  になっていることを再度確認します。

       ===================

           cluster.exe resource

       ===================

capt_57

 

(11) Active ノード (MACHINE_0011) で、SQL Server Management Studio を起動します。

capt_58

 

(12) データベースエンジンに接続します。

capt_59

 

(13) [新しいクエリ]を選択します。

capt_60

 

(14) [クエリ] - [結果の出力] - [結果をテキストで表示] を選択します。

capt_61

 

(15) 下記のコマンドを実行します。

       ==================

           select @@version

       ==================

 

capt_62

 

(16) SP2 が表示されることを確認します。

capt_63

 

(17) [接続] – [Analysis Services] を選択します。

A-1

 

 

(18) “Microsoft 分析サーバー” のバージョンが、”10.50.4000.0'” になっていることを確認します。

A-2

 

以上で、SQL Server 2008 R2 の MSFC ( Microsoft Failover Cluster) 環境への SP2 適用は完了です。

 

 

 

 


[SSRS] Reporting Services ���詳細ログ

$
0
0

SQL Server Support Engineer

福原 宗稚

  

概要

Reporting Services で何か問題があった場合に、まずは Reporting Services のトレースログを見ることがよくあります。 トレースログには、Reporting Services サービスの起動に関する情報や、エラー、設定変更等さまざまな情報が出力されています。既定では、「例外、再起動、警告、状態メッセージ」が出力される設定になっていますが、「詳細モード」に変更することで、どのユーザーによって何のレポートが参照されたのか、どのような形式 (Excel や PDF 等) でのエクスポート要求があったのかという詳細な情報も出力されます。

また、SQL Server 2008 以降では、HTTP ログが出力されるように設定することで、HTTP 要求や HTTP 応答に関する情報も出力されるようになります。

そのため、これらの情報は、何か問題があったという報告を受けた際に、どのような要求がサーバーに来ていたのか、サーバー側でもエラーが発生していなかったのかという調査に非常に有効です。

今回は、Reporting Services のトレースログを詳細モードに変更し、HTTP ログの出力を有効にするための手順をご紹介します。SQL Server 2005 と SQL Server 2008 以降では、設定するためのファイルが異なるため、それぞれ分けて記載しています。

 

SQL Server 2008 以降の設定手順

1) 事前に、ReportingServicesService.exe.config ファイルをコピーして保存しておきます。 詳細モードを解除して、 設定をもとに戻す時に使用します。

既定では、下記のフォルダに配置されています。

- SQL Server 2008
C:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\ReportServer\bin

- SQL Server 2008 R2
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin

- SQL Server 2012
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\bin
 

※赤字部分が、Reporting Services のインスタンス名になります。Reporting Services を既定のインスタンスとしてインストールしている場合には、ここが MSSQLSERVER になります。名前付きインスタンスとしてインストールしている場合には、インスタンス名となります。(該当のフォルダが分からない場合には、後述の 「Reporting Services のインストール先の確認方法」をご覧ください。)

2) ReportingServicesService.exe.config ファイルを開きます。
3) ReportingServicesService.exe.config 内の DefaultTraceSwitch の値を 4 に変更します。
 
設定例:

  <system.diagnostics>
    <switches>
      <add name="DefaultTraceSwitch" value="4" />
    </switches>
  </system.diagnostics>


4) RStrace セクションに上書きする形で以下のセクション全体を貼り付けます。

<RStrace>
      <add name="FileName" value="ReportServerService_" />
      <add name="FileSizeLimitMb" value="32" />
      <add name="KeepFilesForDays" value="14" />
      <add name="Prefix" value="tid, time" />
      <add name="TraceListeners" value="debugwindow, file" />
      <add name="TraceFileMode" value="unique" />
      <add name="HttpTraceFileName" value="ReportServerService_HTTP_" />
      <add name="HttpTraceSwitches" value="date,time, clientip,username,serverip,serverport,host,method,uristem,uriquery,protocolstatus,bytesreceived,timetaken,protocolversion,useragent,cookiereceived,cookiesent,referrer" />
      <add name="Components" value="all:4,http:4" />
< /RStrace>


5) Reporting Services を再起動します。 

※Reporting Services 構成マネージャーや、SQL Server 構成マネージャー 、net stop/net start コマンド、サービス画面等、任意の方法で結構です。
※詳細ログの取得終了後は、ReportingServicesService.exe.config を事前にコピーしておいたものと入れ替え、Reporting Services を再起動すると元の設定に戻せます。 
 
6) ログフォルダに詳細ログが出力されます。

既定では、下記のフォルダがログフォルダになります。

- SQL Server 2008
C:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\Logfiles

- SQL Server 2008 R2
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\Logfiles

- SQL Server 2012
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\Logfiles  

   

SQL Server 2005 の設定手順

1) 事前に、Web.config ファイルをコピーして保存しておきます。 詳細モードを解除して、 設定をもとに戻す時に使用します。

既定では、下記のフォルダに配置されています。

C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer

 

※ 「MSSQL.3」の数値部分は、該当環境にインストールされているインスタンス数やインストールした順番によって異なります。この数値は、次のレジストリキーで確認可能です。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\RS]

※該当のフォルダが分からない場合には、後述の 「Reporting Services のインストール先の確認方法」をご覧ください。

 

2) Web.config 内の DefaultTraceSwitch の値を 4 に変更します。

設定例:

<system.diagnostics>
  <switches>
    <!-- 1 = error, 2 = warning, 3 = info, 4 = verbose –>
    <add name="DefaultTraceSwitch" value="4" />
  </switches>


3) Reporting Services 構成マネージャを起動し、Reporting Services を再起動します。   

※Reporting Services 構成マネージャや、SQL Server 構成マネージャ、net stop/net start コマンド、サービス画面等、任意の方法で結構です。
※詳細ログの取得終了後は、Web.config を事前にコピーしておいたものと入れ替え、Reporting Services を再起動すると元の設定に戻せます。

 

4) ログフォルダに詳細ログが出力されます。

既定では、下記のフォルダがログフォルダになります。

C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\LogFiles

※SQL Server 2005 の Reporting Services は、Web サーバーとしてIIS を使用しています。HTTP 要求やHTTP 応答を確認する場合には、IIS ログもあわせて確認します。IIS ログは既定で下記フォルダに出力されています。

C:\WINDOWS\system32\LogFiles\W3SVC1

 

Reporting Services のインストール先の確認方法

1) [SQL Server 構成マネージャー] を起動します。

01

2) [SQL Server のサービス] で、対象の Reporting Services を右クリックし、[プロパティ] を選択します。

3) [SQL Server Reporting Services (<インスタンス名>)のプロパティ] で、[サービス] タブを選択します。

4) [バイナリパス] に、Reporting Services の実行ファイルのパスが表示されています。

02

例えば、SQL Server 2008 R2 で既定のインスタンスの場合、下記のように表示されています。赤字部分でインストール先のフォルダと判断できます。この配下に、LogFiles フォルダも配置されています。

バイナリパス : “C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\ReportingServicesService.exe”

 

参考資料

今回変更した設定項目の詳細は、下記ページでもご案内していますので、あわせてご参照ください。

- SQL Server 2008 以降

レポート サーバー サービスのトレース ログ
http://msdn.microsoft.com/ja-jp/library/ms156500.aspx

レポート サーバーの HTTP ログ
http://msdn.microsoft.com/ja-jp/library/bb630443.aspx

- SQL Server 2005

Reporting Services のトレース ログ
http://msdn.microsoft.com/ja-jp/library/ms156500(v=sql.90).aspx

SQL Server Reporting Services カスタムアセンブリの設定方法

$
0
0

Reporting Services のカスタム アセンブリの使用方法について以下のステップを通し簡単に説明します。

 

1) Visual Studio でカスタムアセンブリ(dll)を作成する

2) 作成したカスタムアセンブリを参照するReporting Services のレポートを作成する

3) Reporting Services のレポートで、作成したカスタムアセンブリの参照設定を行う

4) Reporting Services のレポートで、カスタムアセンブリを使用した式を指定する

 

またこのBlogでは下記からダウンロードできるデータベースと、Visual Studio 2010 を利用して説明します。

AdventureWorksDW2008R2
http://adventureworksdw2008.codeplex.com/


それでは、順番にみていきましょう。

=====================================      
Visual Studio でカスタムアセンブリ(dll)を作成する
=====================================

1. Visual Studio から新しいプロジェクトを開きます。   
 
image

2. クラスライブラリプロジェクトを作成します。言語、名前は任意ですがここでは Visual Basicを使用し、名前は SampleAssembly とします。 Reporting Services が .NET Framework 2.0 ベースなので、.NET Framework2.0 でプロジェクトを作成します。    
     
clip_image002

3. ソリューション・エクスプローラで、Class1.vbの名前をSample.vbに変更します。

clip_image003

変更する際に名前の変更をするとすべての参照設定が変更される旨の通知がありますがそのままYESを選びます。

clip_image004

4. Sample.vbのコード欄に以下を追加します。

Public Class Sample

Public Shared Function Calculate(ByVal inputDate As Date) As Integer

Return DateDiff(“yyyy”, inputDate, DateTime.Now())

End Function

End Class

image

5. 次に厳密な名前でアセンブリに署名します。

プロジェクトを右クリックしてプロパティを開きます。
image

6. Sign the assembly にチェックを入れます

   image

New… を選択します。

clip_image008

キーの名前を SNsnk とし、パスワードで保護はしないので、チェックをはずし、OKをクリックします。

clip_image009

キーファイルが作成されます。プロパティ画面を閉じます。

clip_image010

7. 次に、AssemblyInfo.vb に必要な情報を追加します。
ソリューション・エクスプローラーのツールボタンからすべてのファイルを表示するボタン(下の図の黄色でハイライトした部分)をクリックします。

clip_image011

ファイルが表示されます。表示された中から、My Project を開き、AssemblyInfo.vbをダブルクリックし開きます。    

clip_image012

以下の黄色のコードを追加します。
<Assembly: AllowPartiallyTrustedCallers()>を追加することで、Reporting Services がアセンブリにアクセスすることができるようになります。

clip_image013

8. ここでプロジェクトをビルドします。
SampleAssemblyプロジェクトがあるフォルダにSampleAssembly.dll が作成されます。

clip_image014

9. 作成された Sample.dll を以下のフォルダ以下にそれぞれコピーします。(ドラッグアンドドロップ)

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\
C:\Windows\assembly\

 

========================================================
作成したカスタムアセンブリを参照するReporting Services のレポートを作成する========================================================

10. 次に、アセンブリを参照させるためのレポートを作成します。
SQL Server Business Intelligence Development Studio (BIDS)を開き、レポートサーバープロジェクトを作成します。

clip_image015

11. 新しいデータソースを選択し、任意の名前を入力して編集ボタンをクリックすると「接続のプロパティ」が開きます。
ここで接続先のデータベースを指定します。 データベースはサンプルとしてCodeplexからダウンロードしたAdventureWorksDW2008R2 を使います。

clip_image016     
    
OKをクリックし、次に進みます。     

clip_image017

次にクエリのデザインで DimEmployee テーブルから名前と生年月日、雇用年月日を選択するクエリを指定します。

clip_image018

レポートの種類、テーブルのデザインを選択し、ウィザードを完了します。


clip_image019

clip_image022

clip_image021 

    
レポート名は ReportSample とし、完了します。

12. プレビューして実行できることを確認します。

clip_image023

 

========================================================
Reporting Services のレポートで、作成したカスタムアセンブリの参照設定を行う
========================================================

13. レポートにアセンブリを指定します。

レポートのプロパティをメニューから選びます。

clip_image024

14. 参照でアセンブリの追加をします。

clip_image025

先ほどコピーしたアセンブリ SampleAssembly.dll を選択します。 参照タブをクリックします。

clip_image026    

参照先例:C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\bin\

clip_image027

15. OKをクリックします。

clip_image028

 

========================================================
Reporting Services のレポートで、カスタムアセンブリを使用した式を指定する
========================================================

16. 式を代入します。

HireDate の値の指定欄に以下の式を入力します。
=SampleAssembly.Sample.Calculate(Fields!HireDate.Value)

Birth Date に以下の式を入力します。
=SampleAssembly.Sample.Calculate(Fields!BirthDate.Value)

また、HireDateを雇用期間、BirthDateを年齢 と変更します。

clip_image029
clip_image030

ビルドし、配置します。

image

それぞれの年数が計算されたデータが表示されます。

※ 2013 年 5 月 15 日現在の情報です。

--

SQL Server / Windows Azure SQL Database Support

Kayoko Gray

2013 年 5 月 SQL Server 最新モジュール

$
0
0

 

2013 年 5 月 28 日時点の SQL Server 最新モジュールです。

 

SQL Server 2000 は 2013 年 4 月 9 日に延長サポートが終了しました。長らくのご愛用ありがとうございました。

              
 

サービス
パック

更新プログラム

バージョン

リリース年月

SQL Server 2012

SP1

KB 2812412(CU3)

11.00.3349

2013/3

メインストリームサポート

SQL Server 2008 R2

SP2

KB2830140 (CU6)

10.50.4279

2013/4

メインストリームサポート

SQL Server 2008

SP3

KB 2834048 (CU11)

10.00.5840

2013/5

メインストリームサポート

SQL Server 2005

SP4

KB 2598903 (OD)

KB 2716427 Reporting Services (MS12-070)

9.00.5295

9.00.5324

2011/8

2012/10

延長サポート
(2016/4/12 終了)

 

RTM : Release To Manufacturing (製品出荷版)
SP : Service Pack (サービスパック)
CU : Cumulative Update (隔月リリースの累積更新プログラム)
OD : On-Demand (オンデマンドリリースの累積更新プログラム)
      
 

SQL Server の更新プログラムの詳細については、SQL Server の更新プログラムを参照して下さい。

メインストリームサポート、延長サポートについては、マイクロソフトサポートライフサイクルを参照して下さい。

SQL Server の手動アンインストール手順

$
0
0

 

皆さん、こんにちは。

SQL Server をアンインストールする場合、通常は、コントロールパネルから削除します。

SQL Server の既存のインスタンスのアンインストール (セットアップ)
http://technet.microsoft.com/ja-jp/library/ms143412.aspx

しかし、SQL Server のインストールを強制終了してしまったり、アンインストールが失敗したりして、通常の手段でアンインストールができなくなってしまった場合には、SQL Server を手動でアンインストールする必要に迫られることがあります。

そのような場合の手順をご案内いたします。

以下の例では SQL Server 2012 を対象としていますが、SQL Server 2005 以降であれば同じ手順でアンインストール可能です。
64bit と 32bit の環境ではパスなどが異なる場合がありますので適宜ご確認ください。

※注意事項※
以下の手順は弊社にて検証した手順ではございますが、必ずしもアンインストールが成功することを保証しているものではございません。状況によりましては、オペレーティング システムの再インストールが必要になることがあります。
手順の実施につきましては、自己の責任において行ってください。

 

1. 事前準備

以下の前提条件を満たしていることをご確認ください。

A. OS の再起動
B. リモートデスクトップ接続確認
C. セットアップに使用する OS(Windows) のログオンアカウント
D. サードパーティ社様製アプリケーション・サービスについて

A.  OS の再起動
----------------------------------------------------------------
アンインストール前に、OS 再起動を行います。

B. リモートデスクトップ接続確認
----------------------------------------------------------------  
ターミナルセッションはすべて切断されており、リモートデスクトップ接続が存在する場合は全てログアウトしていることを確認します。

リモートデスクトップ接続を使用してセットアップを実施することは可能です。
セットアップを実施するためにリモートデスクトップ接続を使用する際は、[スタート] -> [ファイル名を指定して実行] にて、
mstsc /admin (環境によっては mstsc /console) とタイプし、 OK後アクティブノードへ接続します。

C.  セットアップに使用する OS(Windows) のログオンアカウント
----------------------------------------------------------------
SQL Server セットアップを実施する際の OS(Windows) ログオンアカウントがローカルの Administrators グループに所属していることを確認します。

D.  サードパーティ社様製アプリケーション・サービスについて
----------------------------------------------------------------
フィルタドライバを使用するサードパーティ社様製 ウィルス対策ソフトや暗号化/セキュリティソフトのサービス・アプリケーションは一時的に停止してください。

 

2. MsiExec.exe /x によるコンポーネントアンインストール

レジストリ エディタを起動し、次のレジストリ キーを展開します。([スタート] -> [ファイル名を指定して実行] にて regedit とタイプし、OK)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

左側のウィンドウで、各 GUID (Globally Unique Identifier:グローバル一意識別子) をクリックします。
クリックした各 GUID について、右側のウィンドウで DisplayName 値のデータを確認し、"SQL" が含まれているものをみつけます。
存在するキーをすべてメモ帳等に控えてください。(右クリック –> [キー名のコピー] でクリップボードにコピーされます)

※注意事項※    
レジストリ エディタまたは別の方法を使用してレジストリを誤って変更すると、深刻な問題が発生することがあります。
最悪の場合、オペレーティング システムの再インストールが必要になることがあります。
マイクロソフトは、レジストリの変更により発生した問題に関しては、一切責任を負わないものとします。
レジストリの変更は、自己の責任において行ってください。

 

image

同様に以下のキーを展開し、DisplayName 値に"SQL" を含む GUID を控えます。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

 

コマンドプロンプトを管理者権限にて起動し、以下のコマンドを実行してコンポーネントのアンインストールを行います。

msiexec /x GUID

   (例) msiexec /x {202AAF1F-69AA-442A-B59F-6B54B1AD07C6}

image

 

依存関係に関するエラーが生じた場合は、エラー内容にしたがって削除する順序を変更します。

その後、レジストリの対象フォルダを最新の状態に更新し、上記のキーが存在しないことを確認します。

 

3. GAC の削除

次の内容のバッチ ファイルを使用し、アセンブリを削除します。
※改行がないように注意してください。

REM =======================
if exist "%windir%\assembly\GAC\*SQLServer*" del /s /q /f "%windir%\assembly\GAC\*SQLServer*"
if exist "%windir%\assembly\GAC_32\*SQLServer*" del /s /q /f "%windir%\assembly\GAC_32\*SQLServer*"
if exist "%windir%\assembly\GAC_64\*SQLServer*" del /s /q /f "%windir%\assembly\GAC_64\*SQLServer*"
if exist "%windir%\assembly\GAC_MSIL\*SQLServer*" del /s /q /f "%windir%\assembly\GAC_MSIL\*SQLServer*"
REM =======================

グローバル・アセンブリ・キャッシュ(GAC)は、マシン全体でグローバルに参照可能なアセンブリの配置場所です。
GAC は特殊なフォルダ構造なので、エクスプローラで「%windir%\assembly」フォルダを見てみると、アセンブリの名前を一覧表示するシェル拡張が起動されます。
コマンド・プロンプトでフォルダを参照すると、GAC の内部的なフォルダ構造を確認できます。

image

 

4. レジストリ削除

現時点で残っているレジストリを削除します。

以下のキーを展開し、”Microsoft SQL” または"MSSQL" を含むレジストリを確認します。

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft

  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft

image

 

コマンドプロンプトを管理者権限にて起動し、以下のコマンドを実行してレジストリを削除します。

reg delete “レジストリキー”

例) reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server 2012 Redist"

レジストリエディタで該当のキーを右クリック - "キー名のコピー" を選択すると、レジストリキーがクリップボードにコピーされます。

image

/f オプションを使用すると、プロンプトなしで強制的に削除されます。

reg delete "レジストリキー" /f

 

また以下のキーを展開し、ProductName 値に “SQL Server” を含むキーが存在しないことを確認します。

  HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products

image

ProductName 値に “SQL Server” を含むキーが存在している場合は、手順 2 から再度、確認してください。

 

5. フォルダ・ファイルの削除

次の内容のバッチ ファイルを使用し、ドライブから SQL Server 関連ファイルを削除します。

※ファイルが使用中の場合は OS を再起動してから再度実施します。

※改行がないように注意してください。(if exist が先頭になります)

REM =======================
if exist "%USERPROFILE%\Local Settings\Application Data\Microsoft\Microsoft SQL Server" rmdir /S /Q "%USERPROFILE%\Local Settings\Application Data\Microsoft\Microsoft SQL Server"
if exist "%USERPROFILE%\Application Data\Microsoft\Microsoft SQL Server" rmdir /S /Q "%USERPROFILE%\Application Data\Microsoft\Microsoft SQL Server"
if exist "%USERPROFILE%\All Users\Application Data\Microsoft\Microsoft SQL Server" rmdir /S /Q "%USERPROFILE%\All Users\Application Data\Microsoft\Microsoft SQL Server"
if exist "%ProgramFiles%\Microsoft SQL Server" rmdir /S /Q "%ProgramFiles%\Microsoft SQL Server"
if exist "%ProgramFiles(x86)%\Microsoft SQL Server" rmdir /S /Q "%ProgramFiles(x86)%\Microsoft SQL Server"
REM =======================

 

6. TEMP 内のリソース削除

TEMP フォルダ内のサブフォルダ・ファイルを削除します。

   %TEMP%
   %systemroot%\temp

実行例:
>cd %TEMP%
> del *.* /S /Q

※ファイルが使用中の警告が出力されたものは無視して問題ありません。

7. OS再起動

 

以上で終了です。

お疲れ様でした。

Kerberos Configuration Manager for SQL Server

$
0
0

 

神谷 雅紀
SQL Server Escalation Engineer

 

 

 

リンクサーバーなど複数のサーバー間で資格情報の受け渡しが必要となる処理を行おうとした場合、Kerberos を用いた認証が必須になります。しかし、Kerberos 認証を行うためには、いくつかの設定が必要です。それらの設定が正しく行われていない場合には、資格情報の受け渡しが行えず、正常に機能しません。

先日、Kerberos の設定に関わるトラブルシューティングを行うためのツールを公開しました。

ツールは、以下の URL よりダウンロードすることができます。

 

Microsoft® Kerberos Configuration Manager for SQL Server®

http://www.microsoft.com/en-us/download/details.aspx?id=39046

 

使い方は非常に簡単で、KerberosConfigMgr.exe を実行した後、Connect メニューで対象サーバーへ接続します。サーバー名やユーザー名を指定せずに接続すると、ローカルサーバーに接続します。設定の確認に必要な操作はこれだけです。

接続すると、以下のように、そのサーバー上の SQL Server インスタンスとサービスアカウントに関して、SPN の登録状態や委任 (Delegation) の設定状態が表示されます。

 

fix

 

del

 

表示されている内容を確認し、不足していたり、誤った設定が報告されている場合には、それを正します。

委任の設定については手動で行う必要がありますが、SPN に関しては、ツール実行者に権限があれば、ボタン一つで必要な SPN 設定を行うことができます。

 

fixall

 

 

 

 

排他ロックヒントを指定した行の列を読み取れる動作について

$
0
0


皆さん、こんにちは。 今回は、SQL Server で、排他ロックヒントを指定した行の列を読み取れる動作について紹介したいと思います。

 

排他ロックヒントを指定した行の列を読み取れるという動作の説明をするために、まずは以下のスクリプトでサンプルデータベースを作成します。

-----------------------------------------------------------------

CREATE DATABASE DB1;
GO

USE DB1
GO

CREATE TABLE tab1 (
c1 int,
c2 varchar(50),
c3 varchar(50),
CONSTRAINT PK_tab1_c1 PRIMARY KEY CLUSTERED
(
    c1 ASC
));

CREATE UNIQUE NONCLUSTERED INDEX IX_tab1_c2 ON tab1 (c2);
GO

INSERT INTO tab1
VALUES(1,'SQL','Data1'),(2,'Server','Data2'),(3,'Database','Data3'),(4,'SQL Database','Data4');
GO

-----------------------------------------------------------------

1) SQL Server Management Studio などから、新しいクエリを選択し、以下のクエリを実行します。

-----------------------------------------------------------------

BEGIN TRAN

SELECT c1 FROM tab1 WITH (xlock)
WHERE c1 = 1
-----------------------------------------------------------------

このクエリの実行プラン と ロック情報 (sp_lock) を確認すると、

### 実行プラン ###

SELECT [c1] FROM [tab1] WITH(xlock)  WHERE [c1]=@1
  |--Clustered Index Seek(OBJECT:([DB1].[dbo].[tab1].[PK_tab1_c1]), SEEK:([DB1].[dbo].[tab1].[c1]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)


### sp_lock 情報 ###

spid   dbid   ObjId       IndId  Type Resource                         Mode     Status
------ ------ ----------- ------ ---- -------------------------------- -------- ------
51     19     21575115    1      KEY  (8194443284a0)                   X        GRANT

クラスタ化インデックス PK_tab1_c1 のキー KEY  (8194443284a0)  に対して、排他ロック (X) が獲得され、保持されていることが確認できます。

 

2) 再度 新しいクエリを選択し、別セッションから テーブル tab1 と同じ行 (c1=1) の C2 に対して、以下のクエリを実行します。

-----------------------------------------------------------------

BEGIN TRAN

SELECT c2 FROM tab1 WITH (xlock)
WHERE c2 = 'SQL'
-----------------------------------------------------------------

1) で実行されたクエリで、クラスタ化インデックス PK_tab1_c1 のキー  KEY  (8194443284a0)  に対して、排他ロック (X) が獲得されている状況で、同じ行の c2 に対して、上記のクエリを実行した場合、ブロッキングが発生せず、SELECT 文の結果が返されます。
上記の動作が行われる理由を説明します。


まずは、1) と同じく、このクエリの実行プラン と ロック情報 (sp_lock) を確認してみましょう。


### 実行プラン ###

SELECT [c2] FROM [tab1] WITH(xlock)  WHERE [c2]=@1
  |--Index Seek(OBJECT:([DB1].[dbo].[tab1].[IX_tab1_c2]), SEEK:([DB1].[dbo].[tab1].[c2]=[@1]) ORDERED FORWARD)

### sp_lock 情報 ###

spid   dbid   ObjId       IndId  Type Resource                         Mode     Status
------ ------ ----------- ------ ---- -------------------------------- -------- ------
51     19     21575115    1     KEY  (8194443284a0)                   X        GRANT
56     19     21575115    2     KEY  (7a9801a11a80)                   X        GRANT


2) のクエリでは、非クラスタ化インデックス IX_tab1_c2  のキー KEY  (7a9801a11a80)  に対して、排他ロック (X) が獲得され、保持されていることが確認できます。
1) のクエリでは、クラスタ化インデックス PK_tab1_c1 のキー  KEY  (8194443284a0) にのみ排他ロック (X) が獲得され、2) のクエリでは、非クラスタ化インデックス IX_tab1_c2  のキー  KEY  (7a9801a11a80)  にのみ、排他ロック (X) が獲得されていることが確認できると思います。

1)、2) のクエリでは、排他ロック (X) を獲得するキーが異なっているため、ブロッキングが発生しません。
これは、2) のクエリでは、非クラスタ化インデックス IX_tab1_c2  に指定した列 “c2” のみを検索しており、非クラスタ化インデックスのリーフレベルに存在するデータのみで検索結果を取得することができたためとなります。

なお、以下のクエリのように、クラスタ化インデックス、非クラスタ化インデックスに含まれていない “c3” 列を SELECT 文に含めると、 非クラスタ化インデックスのみではすべての検索結果を取得することができず、クラスタ化インデックスに対して Nested Loops オペレーションによるデータの取得を行う必要が出てくるため、 クラスタ化インデックス PK_tab1_c1 のキー  KEY  (8194443284a0) に対するロックの獲得が必要となり、ブロッキングが発生します。


-----------------------------------------------------------------
BEGIN TRAN

SELECT c2,c3  FROM tab1 WITH (xlock)
WHERE c2 = 'SQL'

-----------------------------------------------------------------

### 実行プラン ###

SELECT [c2],[c3] FROM [tab1] WITH(xlock)  WHERE [c2]=@1
  |--Nested Loops(Inner Join, OUTER REFERENCES:([DB1].[dbo].[tab1].[c1]))
       |--Index Seek(OBJECT:([DB1].[dbo].[tab1].[IX_tab1_c2]), SEEK:([DB1].[dbo].[tab1].[c2]=[@1]) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([DB1].[dbo].[tab1].[PK_tab1_c1]), SEEK:([DB1].[dbo].[tab1].[c1]=[DB1].[dbo].[tab1].[c1]) LOOKUP ORDERED FORWARD)


今回 紹介しました排他ロックヒントを指定した行の列を読み取れるという動作は、ロックがロックリソースに対して獲得され、ロックを獲得しようとしたロックリソースに獲得済みのロックと互換性がなければブロックされるという、基本動作の中で発生しうる動作となります。
補足ですが、今回 紹介した条件のまま、SELECT文 を UPDATE 文に変更した場合、同じタイミングで 非クラスタ化インデックスとクラスタ化インデックスが更新されるため、今回 紹介しました 排他ロックヒントを指定したSELECT 文のように、何れかのインデックスにのみロックが獲得されるという動作は行われず、ブロッキングが発生します。


### 実行プラン ###

UPDATE [tab1] set [c2] = @1  WHERE [c2]=@2
  |--Clustered Index Update(OBJECT:([DB1].[dbo].[tab1].[PK_tab1_c1]), OBJECT:([DB1].[dbo].[tab1].[IX_tab1_c2]), SET:([DB1].[dbo].[tab1].[c2] = [Expr1003]))
       |--Compute Scalar(DEFINE:([Expr1010]=[Expr1010]))
            |--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(varchar(50),[@1],0), [Expr1010]=CASE WHEN CASE WHEN [DB1].[dbo].[tab1].[c2] = CONVERT_IMPLICIT(varchar(50),[@1],0) THEN (1) ELSE (0) END THEN (0) ELSE (1) END))
                 |--Top(TOP EXPRESSION:((1)))
                      |--Index Seek(OBJECT:([DB1].[dbo].[tab1].[IX_tab1_c2]), SEEK:([DB1].[dbo].[tab1].[c2]=[@2]) ORDERED FORWARD)


テーブル ヒント (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms187373(v=sql.105).aspx

行レベルのロックを取得するロック ヒント ROWLOCK、UPDLOCK、および XLOCK では、実際のデータ行ではなくインデックス キーに対してロックが実行される場合があります。たとえば、テーブルに非クラスター化インデックスがあり、ロック ヒントを使用する SELECT ステートメントがカバーするインデックスによって処理される場合、ベース テーブルのデータ行ではなく、カバーするインデックスのインデックス キーに対してロックが取得されます。
*抜粋

2013 年 6 月 SQL Server 最新モジュール

$
0
0

2013 年 6 月 11 日時点の SQL Server 最新モジュールです。

 

SQL Server 2000 は 2013 年 4 月 9 日に延長サポートが終了しました。長らくのご愛用ありがとうございました。

                
 

サービス
パック

更新プログラム

バージョン

リリース年月

SQL Server 2012

SP1

KB 2833645 (CU4)

11.00.3368

2013/6

メインストリームサポート

SQL Server 2008 R2

SP2

KB2830140 (CU6)

10.50.4279

2013/4

メインストリームサポート

SQL Server 2008

SP3

KB 2834048 (CU11)

10.00.5840

2013/5

メインストリームサポート

SQL Server 2005

SP4

KB 2598903 (OD)

KB 2716427 Reporting Services (MS12-070)

9.00.5295

9.00.5324

2011/8

2012/10

延長サポート
(2016/4/12 終了)

 

RTM : Release To Manufacturing (製品出荷版)
SP : Service Pack (サービスパック)
CU : Cumulative Update (隔月リリースの累積更新プログラム)
OD : On-Demand (オンデマンドリリースの累積更新プログラム)
      
 

SQL Server の更新プログラムの詳細については、SQL Server の更新プログラムを参照して下さい。

メインストリームサポート、延長サポートについては、マイクロソフトサポートライフサイクルを参照して下さい。


SQL Server における数値定数 2147483647 と 2147483648 の違い

$
0
0

 

神谷 雅紀
SQL Server Escalation Engineer

 

小数点記号 “.” なしの整数は、通常は int と解釈されますが、int のデータ範囲 (-2^31 (-2147483648) ~ 2^31-1 (2147483647)) を超える値は bigint ではなく numeric として解釈されます。

この違いは、通常あまり意識されることはないと思いますが、データ型不一致の問題や算術オーバーフローなどを発生させる可能性がありますので、cast や convert 関数、パラメーター化クエリのパラメーターとして明示的にデータ型を指定するなどの考慮が必要です。

例えば、以下の最初の式は「メッセージ 8115、レベル 16、状態 2、expression をデータ型 int に変換中に、算術オーバーフロー エラーが発生しました。」となりますが、二つ目は計算結果 2147483649 を返します。三つ目のように明示的にデータ型を指定すれば、2147483647+1 もエラーにはなりません。

 

-- エラー 8115 になる。
select 2147483647+1

-- 2147483649 が返される。     
select 2147483648+1

-- 2147483648 が返される。

select cast(2147483647 as bigint)+1

 

定数のデータ型は以下の方法で確認することができます。

 

select SQL_VARIANT_PROPERTY(2147483647,'BaseType') as 'Type'
go

Type
-----------------------------------------
int

 

select SQL_VARIANT_PROPERTY(2147483648,'BaseType') as 'Type'
go

Type
-----------------------------------------
numeric

 

※ numeric と decimal は等価です。

 

int、bigint、smallint、および tinyint (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms187745.aspx

NUMERIC/DECIMAL の演算結果の有効桁数と小数点以下桁数

$
0
0

 

神谷 雅紀
SQL Server Escalation Engineer

 

 

numeric/decimal データ型は、有効桁数 (精度) と小数点以下桁数 (スケール) が固定ではないため、演算を行う場合には考慮が必要です。

 

 

NUMERIC/DECIMAL の演算結果の精度とスケールの決定方法

 

numeric/decimal の演算を行った場合、その結果の精度とスケールは以下のようになります。

e1, e2 はそれぞれ以下のように定義されているとします。

 

e1 numeric(p1, s1)
e2 numeric(p2, s2)

 

演算

結果の精度

結果のスケール

e1 + e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 - e2max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
e1 * e2p1 + p2 + 1s1 + s2
e1 / e2p1 - s1 + s2 + max(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 UNION e2max(s1, s2) + max(p1-s1, p2-s2)max(s1, s2)
e1 % e2min(p1-s1, p2 -s2) + max( s1,s2 )max(s1, s2)

※ CASE, INTERSECT, EXCEPT も UNION と同じ方法です。

 

例えば、

e1 numeric(10,3)
e2 numeric(20,1)

である場合、e1 + e2 の結果の精度とスケールを上の表の計算式に従���て計算すると、

精度 = max(3, 1) + max(10-3, 20-1) + 1 = 3 + 19 + 1 = 23
スケール = max(3, 1) = 3

となるため、e1 + e2 の結果のデータ型は

numeric(23,3)

となります。

整数部 7 桁、小数部 3 桁の数値と整数部 19 桁、小数部 1 桁の数値を足した結果を格納するためには、整数部 20 桁と小数部 3 桁が必要であるため、numeric(23, 3) が計算結果のデータ型となるのは、理解しやすいと思います。

これは以下のような SQL_VARIANT_PROPERTY 関数を使った T-SQL バッチで確認することができます。

declare @e1 numeric(10,3)
declare @e2 numeric(20,1)
set @e1=1111111.111
set @e2=2222222222222222222.2
select
@e1+@e2 as R,
sql_variant_property(@e1+@e2, 'Precision') as Precision,
sql_variant_property(@e1+@e2, 'Scale') as Scale
go

R                        Precision  Scale
------------------------ ---------- --------
2222222222223333333.311  23         3

 

もし、この結果を変数に格納しようとしている場合には、その変数は numeric(23, 3) もしくはそれを超える精度とスケールの変数として定義されている必要があります。

 

 

これだけであればそれほど複雑ではありませんが、精度の計算結果が最大精度である 38 を超えるようになると若干複雑になります。

 

 

最大精度 38 を超える場合

 

精度が numeric/decimal の最大精度である 38 を超える場合、小数部よりも整数部が優先され、可能な限り整数部で切り捨てが発生しないようにスケールが調整されます。

例えば、

e1 numeric(38,3)
e2 numeric(38,1)

である場合、e1 + e2 の結果は、

精度 = max(3, 1) + max(38-3, 38-1) + 1 = 3 + 37 + 1 = 41
スケール = max(3, 1) = 3

となりますが、41 は最大精度 38 を超えているため、精度は最大精度と等しい 38 になります。一方、スケールは、整数部が可能な限り切り捨てられないようにするために調整されます。

精度の計算上の値が最大精度を超える場合については、スケールが何になるのかを以下のような T-SQL を用いて確認する必要があります。

-- 加算の例
declare @e1 numeric(38,3)
declare @e2 numeric(38,1)
set @e1=1111111.111
set @e2=2222222222222222222.2
select
@e1+@e2 as R,
sql_variant_property(@e1+@e2, 'Precision') as Precision,
sql_variant_property(@e1+@e2, 'Scale') as Scale
go

R                        Precision  Scale
------------------------ ---------- --------
2222222222223333333.3    38         1

 

 

関数を使う場合

SUM 関数を numeric/decimal データに対して使う場合の戻り値のデータ型は numeric(38, s) です。

そのため、スケールの異なる列に対して CASE や UNION を行う場合には、結果のスケールを考慮しておく必要があります。

以下の例を見てみます。

 

create table t1 (c1 numeric(10, 3))
create table t2 (c1 numeric(10, 5))
go
insert into t1 values (1111111.111)
insert into t2 values (11111.11111)
go

t1.c1 の SUM() の結果は t1.c1 が numeric(10, 3) なので numeric(38, 3) になります。

select SUM(c1) as A,
sql_variant_property(SUM(c1), 'Precision') as Precision,
sql_variant_property(SUM(c1), 'Scale') as Scale
from t1
go

A            Precision  Scale
------------ ---------- ------
1111111.111  38         3

 

t2.c1 の SUM() の結果は t2.c1 が numeric(10, 5) なので numeric(38, 5) になります。

select SUM(c1) as A,
sql_variant_property(SUM(c1), 'Precision') as Precision,
sql_variant_property(SUM(c1), 'Scale') as Scale
from t2
go

A            Precision  Scale
------------ ---------- ------
11111.11111  38         5

t1.c1 と t2.c1 の UNION は、numeric(38, 3) になります。その結果、t1.c2 の小数部は 3 桁となり、4 桁目以降は切り捨てられることになります。

select A,
sql_variant_property(A, 'Precision') as Precision,
sql_variant_property(A, 'Scale') as Scale
from
(select SUM(c1) as A from t1
  union
  select SUM(c1) as A from t2) T
go

A                  Precision    Scale
------------------ ------------ --------
11111.111          38           3
1111111.111        38           3

 

こういった切り捨てが発生しないように、もしくは、発生してもそれが問題とならないように、予め対策を行っておくことをお勧めします。(対策はシステム要件などにより異なると思いますので、ここでは特に言及しません。)

 

参考資料

 

有効桁数、小数点以下桁数、および長さ (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms190476.aspx

SUM (Transact-SQL)

http://msdn.microsoft.com/ja-jp/library/ms187810.aspx

 

Windows AzureのIaaS機能でSQL Serverを使ってみよう

$
0
0

Windows AzureのIaaS機能でSQL Serverを使ってみよう

この度、新しい仮想マシンおよび仮想ネットワーク機能を含むWindows AzureのIaaS機能が一般公開(日本語訳はこちら)されました。Windows Azure 仮想マシンではオンプレミスの SQL Server をそのまま利用することが出来ます。(注意:制限事項・ポイントがあります。このBlogで後述します。)そこで、簡単に簡易作成画面のリストから選択可能なSQL Serverが含むイメージを使って仮想マシンを作成し、外部からWindows Azure上に構成したSQL Server に接続する方法を紹介します。

このBlogでは以下の内容を説明します。

1. SQL Serverが含まれる仮想マシンの作成方法
2. 仮想マシンにリモートデスクトップ(RDP)接続する方法
3. 仮想マシンのSQL Serverに外部のコンピュータから接続する方法
4. 仮想マシンのモニタリング・サイズ変更
5. 仮想マシン上でSQL Serverを利用する際の制限事項やポイント

前提

Windows Azureアカウントをすでにお持ちで、Windows Azure管理ポータルにアクセスできることが作業の前提となります。

なお、まだWindows Azureアカウントをお持ちでなければ、無償トライアルにサインアップして、すぐにお試し頂けます。ぜひご活用ください

それでは、順番に説明します。

1.SQL Serverが含まれる仮想マシンの作成方法

Windows Azure 管理ポータルにアクセスし、「仮想マシン」をクリックし、左下に表示される「+新規」 のマークをクリックします。

clip_image002

表示された以下のメニューで「簡易作成」をクリックします。

clip_image004

DSN名を入力します。ここではSQLTESTJPを指定して作成しています。また、「イメージ」のドロップダウンリストボックスをクリックして表示される一覧から、「SQL Server 2012 SP1 Standard On Windows Server 2008 R2 SP1」を選択します。

clip_image006

ここではサイズは「S(1コア、1.75 GBメモリ)」を指定しています。(SQL Server Enterprise Editionを使用する場合、仮想マシンのサイズとしてL以上が推奨されます。SQL Server BI 配置では、XL の仮想マシン サイズが推奨されます。詳細は 5.仮想マシン上でSQL Serverを利用する際の制限事項やポイント をご覧ください。)

clip_image008

次にユーザー名、パスワードを指定します。ここではユーザー名に 「SQLTESTJP」 を指定しています。また、作成するデータセンターの地域を指定します。ここでは「東アジア」を指定しています。

clip_image010

すべての項目が設定できたら、設定内容を確認し、「仮想マシンの作成」をクリックし、仮想マシンを作成します。

clip_image012

仮想マシンの作成が開始され、状態欄に「開始中(プロビジョニング)」と表示されます。DNS名欄には SQLTESTJP.cloudapp.net が表示されています。こちらは後ほど使用するので、必要に応じてメモをとっておきます。

clip_image014

プロビジョニング中に次の画面が表示されます。仮想マシンを利用するための情報がまとめられています。

clip_image016

プロビジョニングが終了すると、状態欄に、「実行中」と表示され、使用する準備ができたことがわかります。

clip_image018

2.仮想マシンにリモートデスクトップ(RDP)接続する方法

それでは実際に接続してみましょう。作成した仮想マシン「SQLTESTJP」をクリックし、左下に表示される「接続」のアイコンをクリックします。

clip_image020

SQLTESTJP.rdpを開くか保存するように求めるポップアップが表示されるので、「Open」または「Save」をクリックします。

clip_image022

Remote Desktop Connectionのダイアログが表示されます。Remote Computerの名前が先ほどのDNS名になっていることを確認し、「Connect」をクリックします。

clip_image024

次に認証情報を求められます。仮想マシン作成時に設定した認証情報を入力し、「OK」をクリックします。

clip_image026

正しく認証が行われると、次の画面が表示されるので「YES」をクリックします。

clip_image028

仮想マシンのリモートデスクトップの画面が開きます。

clip_image030

スタートメニューから「SQL Server Management Studio 」を開きます。

clip_image032

Server Nameに「SQLTESTJP」(ローカル)が指定されていることを確認し、Connectをクリックします。

clip_image034

仮想マシン上にインストールされた SQL Server 2012 SP1 に接続することができました。

clip_image036

3.仮想マシンのSQL Serverに別のコンピュータから接続する方法

別のコンピュータから接続するには以下の設定が必要です。(今回のようにドメイン環境が構成されていない場合 ※)

・ 仮想マシン上のTCPエンドポイントの設定 ー1433ポートを追加する
・ SQL Server の認証モードを Windows認証モードから混合モード認証に変更する
・ 仮想マシン上のWindows FirewallにてIncomingのTCPポート 1433を許可する

※ Windows Azure の SQL Server 仮想マシンを、Windows Azure 仮想ネットワークを通じて、Windows Azure またはオンプレミスで運用しているドメイン環境に追加できます。ドメイン環境がない場合、SQL Server データベース エンジンで Windows 認証を使用することはできません。別のコンピューターからデータベースエンジンに接続するには、混合モード認証用に SQL Server を構成します。詳細は以下のサイトをご覧ください。
Windows Azure 仮想マシンにおける SQL Server の接続に関する考慮事項
http://msdn.microsoft.com/ja-jp/library/dn133152.aspx

まず、仮想マシン上のTCPエンドポイントの設定ー1433ポートを追加します。

Windows Azure ポータル画面から、「仮想マシン」 - 「sqltestjp」をクリックし、表示されるメニューから「エンドポイント」をクリックします。(既定でRemoteDesktop用のエンドポイントが設定されています。)

clip_image038

次に画面左下に表示される「エンドポイントの追加」ボタンをクリックします。

clip_image040

エンドポイントの追加が選択された状態で「次へ」ボタンをクリックします。

clip_image042

エンドポイントの名前を指定し(ここではSQLとします)、プロトコルはTCP、ポートは1433を指定し、「次へ」をクリックします。

clip_image044

操作の状況が表示され、エンドポイントが追加されます。

clip_image046

次に、仮想マシン上においてSQL Server の認証モードを Windows認証モードから混合モード認証に変更する設定を行います。先ほどのリモートデスクトップ画面上で実行中のSQL Server Management Studio から、サーバーを右クリックし、「Properties」をクリックします。左ペインのメニューから「Security」をクリックし、「SQL Server and Windows Authentication mode」を選択し、OKをクリックします。

clip_image048

SQL Server の再起動が必要であることを示すダイアログ ボックスが表示されるのでそちらも「OK」をクリックします。

SQL Serverを再起動します。

次に、SQL Server認証ログインを設定します。ここではSQL Server認証ログインとしてsa ログインを使用します。インストール中に 「Windows 認証モード」が選択された場合、sa ログインは無効となっています。sa ログインを有効にするには、SQL Server Management Studioのサーバーを展開し、「Security」- 「Logins」の順に展開、「sa」を右クリックして「Properties」を表示します。「Status」ページから、「Login」- 「Enabled」を選択し、「OK」をクリックします。

clip_image050

上記の操作の詳細は下記のサイトの「セキュリティ認証モードを変更するには」と「saログインを有効にするには」をご覧ください。

サーバーの認証モードの変更
http://msdn.microsoft.com/ja-jp/library/ms188670.aspx

最後に仮想マシン上のWindows FirewallにてIncomingのTCPポート 1433を許可する設定を行います。Windows Firewallから「New Inbound Rule Wizard」を実行します。「Port」を選択し、「Next」をクリックします。

clip_image052

「TCP」を選択し、「Specific Local ports」に1433を指定します。「Next」をクリックします。

clip_image054

���可するコネクションの種類、 ルールの名前(ここではSQLと指定)を設定して「Finish」をクリックします。

詳細は下記をご覧ください。

[INF] ファイアウォール経由での SQL Server との通信に必要な TCP ポートhttp://support.microsoft.com/kb/287932/ja

それでは、別のマシンにあるSQL Server Management Studio から接続をしてみましょう。

まずDNS名を再度Windows Azureポータル画面のダッシュボード - 概要の欄から確認します。今回 sqltestjp.cloudapp.net が設定されています。

clip_image056

SQL Server Management Studio からデータベースエンジンの接続を行います。上記のDNS名をサーバー名に指定し、sa でログインとパスワードを入力し、「接続」をクリックします。

clip_image058

sqltestjp.cloudapp.net データベースエンジンのツリーが表示され、接続できました。

clip_image060

4.仮想マシンのモニタリング・サイズ変更

Windows Azure ポータル画面から、現在以下の仮想マシンの監視項目(メトリック)をモニタリングできます。

clip_image062

また、仮想マシンのサイズは「構成」画面から変更可能です。

clip_image064

5.仮想マシン上でSQL Serverを利用する際の制限事項やポイント

・仮想マシン上に SQL Server を配置した場合の制限事項
現時点では、SQL Server 2012 の新機能である AlwaysOn の Availability Group リスナー (仮想名) をサポートしていません。この機能は将来的に対応する予定です。リスナーを利用するには、1 つまたは複数の Floating IP を必要としますが、現時点の Windows Azure ではサポートされていないことが理由です。

詳細は下記をご覧ください。
Windows Azure 自習書シリーズ - 仮想マシン (IaaS) 編

・パフォーマンスに関するベスト プラクティスについて

こちらも上記自習書をご覧ください。

IaaS上でサポートされるSQL Serverについて
64-bit バージョンのMicrosoft SQL Server 2008 以降となります。詳細は下記のサイトをご確認ください。
Microsoft server software support for Windows Azure Virtual Machines
ハードウェア仮想化環境で実行している Microsoft SQL Server 製品のサポート ポリシー
※ IaaS上でサポートされるSQL ServerはKB2721672の内容が優先されます。

Windows Azure 仮想マシン ギャラリーで使用可能な SQL Server イメージについて
下記をご覧ください。
Windows Azure 仮想マシンギャラリーで使用可能な SQL Server イメージ
なお、テンプレートのイメージギャラリーに現在存在していないイメージについてはVHDイメージをアップロードすることでそこからVMを作成可能です。方法は、下記自習書の「2.4 仮想マシンのアップロード」をご覧ください。
Windows Azure 自習書シリーズ - 仮想マシン (IaaS) 編

・オンプレミスのデータベースのバックアップファイルを利用して仮想マシン上にデータベースを復元する方法について
下記のサイトの「Windows Azure 仮想マシンにデータベース スキーマとデータ ファイルを移動する方法」にWindows Azure 仮想マシンにファイルを移動するときに使用できる一般的な転送方法がまとめられています。この転送方法を利用してオプレミスのデータベースのバックアップファイルを仮想マシン上に転送し、復元することが可能です。
Windows Azure 仮想マシン内の SQL Server への移行

Reporting Services, Analysis Services に関して
下記をご覧ください。
SQL Server 仮想マシン ギャラリー イメージにインストールされている BI 機能の一覧・一般的な推奨事項とベストプラクティス

※ 2013 年 4 月 28 日現在の情報です。仕様については変更される可能性があります。

--

SQL Server / Windows Azure SQL Database Support

Kayoko Gray

オンプレミスのSQL Server データベースのバックアップ先としてクラウドを活用しよう

$
0
0

このSQL Server 2012 SP1 CU2 または SQL Server 2008 R2 CU6から、新しい機能が追加され、オンプレミスのSQL Serverのデータベースのバックアップ先としてWindows AzureのBlobストレージを指定することができるようになりました。また逆にWindows AzureのBlobストレージにあるバックアップファイルからオンプレミスにデータベースをリストアすることも可能になりました。

この機能により、バックアップの取得先としてテープ等のデバイスが不要になったりと、コスト削減につながる可能性がでてきます。

イメージとしては以下のようになります。

clip_image004[6]

それでは実際に操作してみましょう。

まず、バックアップファイル格納先のストレージを作成しておきます。Windows Azure 管理ポータルにアクセスし、「ストレージ」をクリック後、左下に出てくる「新規」をクリックします。

clip_image006[4]

「ストレージ」-「簡易作成」をクリックします。

clip_image008[4]

「URL」欄に名称を指定、格納先のデータセンターの場所を一覧から選び、「ストレージアカウントの作成」をクリックします。

clip_image010[4]

作成の進行状況が表示されます。

clip_image012[4]

作成が完了すると、「オンライン」と表示されます。

clip_image014[4]

次にコンテナーを作ります。先ほど作成したストレージ名をクリックすると、下記の画面になります。「コンテナー」をクリックし、「アクセスキーの管理」をクリックします。

clip_image016[4]

「コンテナーを作成する」をクリックします。

clip_image018[4]

新しいコンテナーの名前を指定します。ここではsqlbackupと指定しています。アクセス方法を選びます。今回は「プライベート」を指定し、Windows Azureアカウントの認証に必要な情報を指定できるユーザーだけがアクセスできるように設定します。

clip_image020[4]

コンテナーが作成されます。URLをコピーしておきます。ここでは http://kayobkup.blob.core.windows.net/sqlbackupとなります。

clip_image022[6]

また、アクセスするのに必要なアクセスキー情報もここでコピーしておきます。「アクセスキーの管理」をクリックします。

clip_image024[6]

プライマリアクセスキー値をコピーします。

clip_image026[6]

次に、バックアップの取得元のオンプレミスのSQL ServerにSQL Server Management Studio で接続します。

clip_image029
 

今回は AdventureWorks2012 データベースのバックアップをBlobストレージに取得してみます。また、その後、取得したバックアップをもとにリストアも試してみましょう。

まず、Blobストレージにアクセスするための資格情報を作成します。これは、SQL Serverでは、Windows Azureのアカウント名とアクセスキー認証をSQL Server資格情報に格納する必要があるためです。

資格情報を作成するには下記のコマンドを実行します。

CREATE CREDENTIAL myCredential ---任意の名前を指定します。

WITH IDENTITY='kayobkup', ---ストレージ名を指定します。

SECRET='アクセスキーの管理からコピーしたプライマリアクセスキー値を指定します';

次にバックアップを取得します。下記のコマンドを実行します。下記のhttp://kayobkup.blob.core.windows.net/sqlbackupの部分には先ほど作成したコンテナーのURLを指定してください。また、バックアップファイル名は任意ですが、日付情報を指定しておくとよいでしょう。

BACKUP DATABASE AdventureWorks2012 TO

URL='http://kayobkup.blob.core.windows.net/sqlbackup/AdventureWorks2012_5_8_2013.bak'

WITH COMPRESSION, CREDENTIAL='myCredential', STATS=5;

実行状況がOutput欄に出力されます。

clip_image032[4]

コンテナーを見てみると、バックアップが取得され、取得日時とサイズが確認できます。

clip_image034[4]

それでは、データベースのリストアを試してみましょう。ここではAdventureWorks2012データベースを置き換えてリストアするマンドを実行します。

CREATE CREDENTIAL myCredential

WITH IDENTITY='kayobkup',

SECRET='アクセスキーの管理からコピーしたプライマリアクセスキー値を指定します';

RESTORE DATABASE AdventureWorks2012 FROM

URL='http://kayobkup.blob.core.windows.net/sqlbackup/AdventureWorks2012_5_8_2013.bak'

WITH CREDENTIAL='myCredential', STATS=5, REPLACE

clip_image038[6] 

リストアができました。

ここで、URLにはhttp://を指定していますが、https://を指定し通信を暗号化することもできます。(推奨)

上記のコマンドのオプションについての詳細はこちらをご覧ください。


参考
SQL Server 2012 SP1 CU2とSQL Server 2008 R2 CU6にて新しく追加された機能の詳細
Description of new features in Cumulative Update 2 for SQL Server 2012 SP1 and Cumulative Update 6 for SQL Server 2008 R2

Windows Azure BLOB ストレージ サービスを使用した SQL Server のバックアップと復元
http://msdn.microsoft.com/ja-jp/library/jj919148.aspx

※ 2013 年 5月 8 日現在の情報です。仕様については変更される可能性があります。

--

SQL Server / Windows Azure SQL Database Support

Kayoko Gray

DBCC SHRINKFILE 実行時のメッセージ

$
0
0

本間 崇
SQL Server Support Escalation Engineer

現象

トランザクションログファイルを圧縮するために、DBCC SHRINKFILE コマンドを実行した場合に、メッセージと共に圧縮が行えないことがあります。

例えば、以下のようなメッセージで圧縮が行えないような状況です。

DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。
ログ ファイル 2 (shrinktest_log) を圧縮できません。要求されたサイズ (448512 KB) が最後の論理ログ ファイルの開始位置よりも大きくなります。
DbId   FileId      CurrentSize MinimumSize UsedPages   EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
14     2           64000       64000       64000       64000

 

(1 行処理されました)

 

DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

問い合わせ自体は多くいただくものではありませんが、ここでパターンを整理しておこうと思います。

前提知識

このポストで説明する内容を理解するためには、以下の 2 つの技術的なポイントを抑えておく必要があります。

1. トランザクションログファイルは仮想ログファイルで構成されている
2. DBCC SHRINKFILE コマンドは、ファイルの末尾の空いている仮想ログファイルを解放する

まず、1.についてですが、SQL Server の Books Online 等でも説明している通り、SQL Server ではトランザクションログファイルを複数の仮想ログファイル(VLF)という箱に区切って管理しています。イメージとしては、以下のような感じでしょうか。1 つのファイルが 4 つの VLF に区切られている感じです。

image 

もう1つのポイントである、DBCC SRINKFILE コマンドの動作ですが、ファイルの末尾の空いている VLF を解放する、という動作になります。上記の色のついている部分が使用中で、色のついていない部分が空きとすると、ファイル末尾にある VLF4 だけが、空いている状況です。

この状態で、DBCC SHRINKFILE コマンドを実行すると、以下のように VLF4 だけが解放される形となります。VLF3 の空いている部分については解放されません。

image

メッセージについて

さて、それでは DBCC SHRINKFILE 実行時に見ることがあるメッセージについて確認しましょう。

おそらく、作業の際に目にするのは、以下の 3 つだと思います。

1. ログ ファイル 2 (xxxxxx) を圧縮できません。ファイルの末尾にある論理ログ ファイルが使用中です。
2. ログ ファイル 2 (xxxxxx) を圧縮できません。要求されたサイズ (448512 KB) が最後の論理ログ ファイルの開始位置よりも大きくなります。
3. ログ ファイル 2 (xxxxxx) を圧縮できません。論理ログ ファイルの総数を 2 未満にはできません。

まず、1 つ目ですが、これは以下のような状態です。ファイル末尾の VLF3 が現在使用中なので、圧縮できないという状態です。VLF1、VLF2 が空いているのでトランザクションログファイルの使用率としては低いですが、圧縮できない状態です。VLF3 が一杯になって、現在のログの位置が VLF1 に移動した後に、もう一度トランザクションログの切捨てが発生してVLF3が空けば、VLF3 が解放できるようになります。

image

2 つ目は、DBCC SHRINKFILE コマンドに、target_size を指定した場合に、発生するメッセージとなります。

わかり易くするため、VLF1 ~ VLF4 まで、それぞれ100MBで、トータル400MBのトランザクションログファイルと仮定します。この状態で、target_size に 300MB より大きい値を設定した場合、末尾の VLF4 の途中を指定したことになるため、解放すべき VLF がなくなります。VLF という単位で行っていることを理解していれば、メッセージの通りということがお分かりいただけると思います。

image

最後の3つ目は、本当に VLF が 2 つしかないので、圧縮できないパターンです。SQL Server では、最小の VLF の数を 2 と定めているため、それ以下には圧縮できません。そのために出力されるメッセージとなります。

image

いずれのパターンも VLF と DBCC SHRINKFILE コマンドの動作を理解いただければ、メッセージの通りの状態であり、致命的な状態ではないというのはご理解いただけるのではないかと思います。

参考

タイトル:トランザクション ログの圧縮
URL:http://msdn.microsoft.com/ja-jp/library/ms178037(v=sql.105).aspx

タイトル:DBCC SHRINKFILE (Transact-SQL)
URL:http://msdn.microsoft.com/ja-jp/library/ms189493(v=sql.105).aspx

Viewing all 293 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>