|
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 個だけにした場合は、アタッチ操作時に、新規のログファイルを作成してくれます。
またデタッチ操作によって得られたデータファイルだけをバックアップコピーしておけば、データベースのバックアップにもなります。
ぜひこの機能を覚えておきましょう。
|