トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション



ビギナーボードリーダー:堀川 明

毎月第2、第4木曜日はボードリーダーからのレポートを掲載いたします。
 
   

2004年4月8日
『トランザクションログファイルが 1 個のデータベースが受ける特別な恩恵について( 2 )』

2004 年 3 月 11 日のビギナーボードリーダーレポートで、『トランザクションログファイルが 1 個のデータベースが受ける特別な恩恵について』お話しました。
もう少し具体的な事例で説明して欲しい、というご要望がありましたので、スクリプトを掲載致します。

-----------------------------
( 1 )データベースを新しく作成します
-----------------------------

CREATE DATABASE TEST
 ON PRIMARY   --プライマリグループのデータファイルの定義
  (
   NAME = TEST_DAT ,        -- 論理ファイル名
   FILENAME  = 'D:\WORK\TEST.MDF',     -- 物理ファイル名
   SIZE   = 1MB ,         -- 初期サイズ
   FILEGROWTH = 10% ,         -- 自動拡張単位
   MAXSIZE = UNLIMITED         -- ファイル最大サイズ(無制限)
  )
,
FILEGROUP GROUP2 --第 2 グループのデータファイルの定義
  (
   NAME = TEST_DT2 ,        -- 論理ファイル名
   FILENAME = 'D:\WORK\TEST.NDF',      -- 物理ファイル名
   SIZE = 1MB ,          -- 初期サイズ
   FILEGROWTH = 10% ,        -- 自動拡張単位
   MAXSIZE = UNLIMITED        -- ファイル最大サイズ(無制限)
  )
LOG ON         -- トランザクションログファイル
  (
   NAME = TEST_LOG ,         -- 論理ファイル名
   FILENAME = 'D:\WORK\TEST.LDF',       -- 物理ファイル名
   SIZE = 1MB ,          -- 初期サイズ
   FILEGROWTH = 10% ,         -- 自動拡張単位
   MAXSIZE = UNLIMITED        -- ファイル最大サイズ
  )

トランザクションログファイルは、1 個だけにします。

--------------------------------------
( 2 )データベースの中にテーブルを作成します
--------------------------------------
USE TEST
GO
   Create Table Test0(
       ID int Identity(1,1) Primary key ,
       DT char(500)
   ) On GROUP2

   Create Table Test1( ID int Identity(1,1) Primary key , DT char(500) ) On GROUP2
   Create Table Test2( ID int Identity(1,1) Primary key , DT char(500) ) On GROUP2
   Create Table Test3( ID int Identity(1,1) Primary key , DT char(500) ) On GROUP2
   Create Table Test4( ID int Identity(1,1) Primary key , DT char(500) ) On GROUP2
GO

ファイルグループ GROUP2 の中に、ユーザ定義のテーブルを 5 個作成します。

--------------------------------------
( 3 )インデックスも作成します
--------------------------------------
USE TEST
GO
   Create Index Test0_IDX ON Test0( DT ) On GROUP2
   Create Index Test1_IDX ON Test1( DT ) On GROUP2
   Create Index Test2_IDX ON Test2( DT ) On GROUP2
   Create Index Test3_IDX ON Test3( DT ) On GROUP2
   Create Index Test4_IDX ON Test4( DT ) On GROUP2
GO

インデックスも、ファイルグループ GROUP2 の中に作成します。

--------------------------------------
( 4 )レコードの挿入と削除
--------------------------------------
Set NOCOUNT ON
  Use TEST
GO
   Declare @i int , @max_recno int
   Declare @j int , @max_count int
   Declare @str varchar(256)

   Select @j = 1
   Select @max_count = 20
   while( @j <= @max_count )
     Begin
       Select @str = 'Now = ' + Cast(@j as varchar(2))
       RAISERROR(@str,0,1) with nowait
       Select @i   = 1
       Select @max_recno = 1000
       While( @i <= @max_recno )
          Begin
             Insert into Test0(DT) Values( CAST(@i As Char(500)) )
             Select @i = @i + 1
          End

       --Copy Record
       Insert Into Test1(DT) Select DT From Test0
       Insert Into Test2(DT) Select DT From Test1
       Insert Into Test3(DT) Select DT From Test2
       Insert Into Test4(DT) Select DT From Test3

       Select @j = @j + 1
--Delete Record
       If( (@j%2) = 1 )
        Begin
           Delete from Test0
           Delete from Test1
           Delete from Test2
           Delete from Test3
           Delete from Test4
        End
   End
Go

レコードを挿入し、削除を繰り返します。
このスクリプトに特別な目的はありませんが、トランザクションログファイルが大きくなったことに注意して下さい。

--------------------------------------
( 5 )デタッチの実行
--------------------------------------
exec sp_detach_db ‘TEST’
データベースをサーバーから切り離します。

--------------------------------------
( 6 )トランザクションログファイルの名前を変更します
--------------------------------------
TEST.LDF のファイルを、削除したり、名前を変更したりして下さい。
トランザクションログファイルを破壊します。


--------------------------------------
( 7 )アタッチの実行
--------------------------------------

exec sp_attach_db 'test' , 'D:\WORK\TEST.MDF' , 'D:\WORK\TEST.NDF'

データファイルだけによるアタッチを実行します。

アタッチの実行のときに、

『デバイス アクティブ化エラー。物理ファイル名 'D:\WORK\TEST.LDF' は正しくありません。
新しいログ ファイル 'D:\WORK\test_log.LDF' が作成されました。』

というメッセージが表示されます。
これはトランザクションログファイルが見つからなかったので新しいトランザクションログファイルを作成したという意味です。

アタッチ後に作成されたトランザクションログファイルの大きさが、どうなりましたか? 小さいサイズになっていると思います。

この事例からもわかるように、データベースを構成するトランザクションログファイルを 1 個だけにした場合は、アタッチ操作時に、新規のログファイルを作成してくれます。
またデタッチ操作によって得られたデータファイルだけをバックアップコピーしておけば、データベースのバックアップにもなります。
ぜひこの機能を覚えておきましょう。

 

ボードリーダーレポート トップページへ

 

 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.