gist

ラベル SQL Server 2000 の投稿を表示しています。 すべての投稿を表示
ラベル SQL Server 2000 の投稿を表示しています。 すべての投稿を表示

2008年8月28日木曜日

データベース内のすべてテーブルの行数を出力するプロシージャ

DECLARE @table_name varchar(128), @row_count int, @query nvarchar(255)

DECLARE tables_cursor CURSOR FOR
SELECT
name
FROM
sysobjects
WHERE
type = 'U'
ORDER BY
name

IF object_id('tempdb..#TablesRowCount', 'U') IS NOT NULL
DROP TABLE tempdb..#TablesRowCount

CREATE TABLE #TablesRowCount( TableName varchar (128), Rows int )

OPEN tables_cursor;
FETCH NEXT FROM tables_cursor INTO @table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @query = N'SELECT @row_count = COUNT(*) FROM ' + @table_name
EXEC sp_executesql @query, N'@row_count int OUTPUT', @row_count OUTPUT
INSERT INTO #TablesRowCount VALUES (@table_name, @row_count)
FETCH NEXT FROM tables_cursor INTO @table_name
END

SELECT * FROM #TablesRowCount

CLOSE tables_cursor
DEALLOCATE tables_cursor

2008年6月21日土曜日

インデックスの整合性エラーを修復する手順

問題のあるデータベースに対して DDBC CHECKDB を実行します。
実行結果にインデックスの整合性エラーが出力された場合、以下のコマンドでインデックスのエラーを修復できます。

DDBC CHECKDB(dbname, 'repair_rebuild')

2008年6月20日金曜日

障害後のMDFファイルとLDFファイルだけで復旧させる方法

トランザクションログがない状態で、障害発生後のMDFファイルとLDFファイルで復旧させる方法を説明します。この方法で復旧できない場合は、直近のバックアップファイルでの復旧となります。

1. 復旧準備

(1) 該当のデータベース物理ファイル(mdf、ldf)を、別のディレクトリに移動
(2) Enterprise Manager から、問題のデータベースと同じ名前、同じデータファイル名、同じログファイル名を作成します。
(3) SQL Server を停止
(4) 手順(1)にて移動させたデータベース物理ファイル(mdf、ldf)を、手順(2)で作成した新規のデータファイル、ログファイルに上書きコピー
(5) SQL Server を起動

※この時点ではまだデータベースにはアクセスできない

2. DBCC DBRECOVER
2-1 未確認モード解除

use master
go
sp_configure 'allow updates',1
go

reconfigure with override
go

-- 未確認モード解除
update master..sysdatabases set status = 16 where name = 'データベース名'
go


2-2 DBCC DBRECOVER
DBCC DBRECOVER ('データベース名', IGNOREERRORS)

※この時点で「未確認」のままであれば、緊急モードで DDBC REBUILD_LOG を実施。

2-3 DBCC CheckDB

DBCC CHECKDB ('データベース名')

2008年6月19日木曜日

復旧モデルがシンプルの場合の障害対策の限界

SQL Server 2000では、データベースを作成すると復旧モデルはシンプルが初期値になります。
復旧モデルがシンプルの場合、障害対策には限界があります。


障害発生時、現場のSQL Serverに対して以下のコマンドでトランザクションログを救出します。

BACKUP LOG database_name TO DISK='filepath'
WITH NO_TRUNCATE

しかし、このコマンドは、復旧モデルがフル、または一括ログに設定されている場合に限り、有効です。
復旧モデルがシンプルの場合、直近のフルバックアップで復旧するしかありません。


MDFファイル破損、トランザクションログなしで、障害後のLDFファイルからデータを復旧したい

2008年6月13日金曜日

エラーが発生したらロールバックする

BEGIN TRANSACTION MyTransaction
INSERT INTO Patient VALUES ('テスト患者', '2004/1/5')
SELECT @ins_error = @@ERROR

IF @ins_error = 0
BEGIN
COMMIT TRANSACTION MyTransaction
END
ELSE
BEGIN
PRINT 'エラーが発生したのでロールバックします'
ROLLBACK TRANSACTION MyTransaction
END

SQL Server 2005では構造化例外が使用可能なようです。
まだまだ現役のSQL Server 2000の全機能のうち、僕の会社では2%も使っていないと思われます。Excel以下のひどい扱いです。せめてトランザクションが使えるようになってほしいです。何だか言っていることが悲しいです。