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
gist
2008年8月28日木曜日
2008年6月21日土曜日
インデックスの整合性エラーを修復する手順
問題のあるデータベースに対して DDBC CHECKDB を実行します。
実行結果にインデックスの整合性エラーが出力された場合、以下のコマンドでインデックスのエラーを修復できます。
DDBC CHECKDB(dbname, 'repair_rebuild')
実行結果にインデックスの整合性エラーが出力された場合、以下のコマンドでインデックスのエラーを修復できます。
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 ('データベース名')
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ファイルからデータを復旧したい
復旧モデルがシンプルの場合、障害対策には限界があります。
障害発生時、現場の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以下のひどい扱いです。せめてトランザクションが使えるようになってほしいです。何だか言っていることが悲しいです。
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以下のひどい扱いです。せめてトランザクションが使えるようになってほしいです。何だか言っていることが悲しいです。
登録:
コメント (Atom)