概要: SQLデータベースのアクセス不能の問題は、データベースユーザーが直面する一般的な問題です。したがって、この問題に取り組むブログでは、SQLServerが論理整合性ベースのI/Oエラーを検出したことについて説明します。このエラーの背後にある理由と、この問題に取り組む方法を知るための最善の方法について説明します。アクセスできないSQLデータベースにアクセスして回復するには、ユーザーはSQLServerデータベースの回復ツールを利用できます。
データベースの論理整合性ベースのI/Oエラーの背後にある理由:
- 突然のシステムシャットダウン/クラッシュまたは制約付きシャットダウン
- SQL管理者がSQLデータのクエリまたは変更を試みます
SQL Serverデータベースで論理整合性ベースのエラーが発生した時点で、最初のステップはエラーを検出することです。
付随する戦略は、エラーの検出に役立ちます:
- ベストプラクティスアナライザー(BPA)ツールの使用– BPAツールは、基本的な整合性エラーの特定に役立ちます。このツールはSQLバリアントに対して明示的です。つまり、BPA2008はSQL2008などでアクセスできます。
- イベントログフレームワークレベル、ドライバーまたはディスク関連のエラーでWindowsシステムを確認します
- chkdsk orderを実行して、ファイルフレームワークの妥当性を確認します
- フレームワークまたはディスクのハードウェアプロデューサーによって提案された診断を実行します
- SQL Server 2008の場合、I/OエラーをアナウンスしたデータベースのドライブでユーティリティSQLIOSimを実行します。
- ハードウェアの販売者またはデバイスの製造元に連絡して、ハードウェアの前提条件がSQLサーバーのI/Oの必要性を確認していることを確認してください。
論理整合性ベースのI/Oエラーを検出したSQLServerに手動で取り組む方法
テクニック1–ハードウェアとアプリケーションネットワークを確認する
データベースの不規則性エラーは、データベースとSQLアプリケーションの間に適切なネットワークを構築することで修正できます。
テクニック2–SQLバックアップからの復元
最も達成可能な解決策は、SQLデータベースの再利用にバックアップを利用することです。バックアップから復元する前に、次のことを確認してください。
- 継続的な完全バックアップがあります
- バックアップは、基本的なデータ損失から戦略的な距離を維持するために、破損する前にのみ更新され、それほど古くはありません。
- ページレベルの破損の問題はページレベルの復元を利用して解決できるため、破損はページレベルで発生します。
ステップ1: 付随する順序を使用して、完全バックアップからSQLデータベースを復元します
トランザクションログをバックアップする
バックアップログPageLevelRestoresTO
Plate =‘g:PageLevelRestores_LOG1.bak’
INIT付き
GO
ステップ2: 復元の変更を実行して、進行状況をオンラインで反映します。
ログの末尾をバックアップします…
バックアップログPageLevelRestoresTO
Circle =‘g:PageLevelRestores_LOG_TAIL.bak’
INIT付き
GO
注:破損が単一のページにバインドされている場合、完全なSQLServerデータベースを復元する理由はありません。損なわれているそのページのアクセス可能なバックアップからデータベースを復元できます。付随する注文を実行すると、単独のページのバックアップを復元するのに役立ちます:
アクセス可能なすべてのログバックアップを適切なリクエストで復元します
復元ログPageLevelRestoresFROM
Circle =‘g:PageLevelRestores_LOG1.bak’
回復なし
GO
最後に、テールログのバックアップを復元します
復元ログPageLevelRestoresFROM
Circle =‘g:PageLevelRestores_LOG_TAIL.bak’
回復なし
GO
最後に、復元シーケンスを完了します
データベースの復元PageLevelRestoreswithRECOVERY
GO
データベースのバックアップによってSQLデータベースが復元されたら、クエリDBCC CHECKDBを再度実行して、SQLデータベースの論理整合性ベースのI/Oエラーなしで選択宣言が優先されることを確認します。この注文はさらに、このテーブルにデータの損失がないことを監視します。
SQLデータベースバックアップの制限:
- アクセス可能なバックアップが古くなったときにSQLデータベースのバックアップから復元することを期待するのは馬鹿げています。
- 論理整合性ベースのI/OエラーがSQLサーバーデータベース全体に広がる可能性が低い場合、その時点ではこの戦略は正当ではありません。
- 欠陥のあるページが非クラスター化インデックスに存在する状況では、SQLデータベースのインデックスを削除して再作成することでSQLデータベースを修正できます。
テクニック3:破損したSQLデータベースをREPAIR_ALLOW_DATA_LOSSで修復する
REPAIR_ALLOW_DATA_LOSSは、分析されたエラーの基本固定レベルです。
注:REPAIR_ALLOW_DATA_LOSSを使用する前に、以下を実行してください:
SQL Serverデータベースのバックアップを取り、別の名前で保存します
SQLデータベースをシングルユーザーモードに設定する
付属のコマンドを使用して、すべてのテーブルのレコード数を取得します
@COUNTINTを宣言する
@SQL VARCHAR(2000)を宣言する
TABLE #T_Info(ID INT IDENTITY(1,1)、T_Name VARCHAR(200)、D_Count INT)を作成します
TINFO_CURCURSORを宣言する
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE =’BASE TABLE’
OPEN TINFO_CUR
NEXT FROM TINFO_CUR INTO @T_Name
WHILE @@ FETCH_STATUS =0
開始
SET @ SQL =’INSERT INTO #T_Info(T_Name、D_Count)SELECT”’ [email protected]_Name +”’、COUNT(*)FROM‘[email protected]_Name+”
EXECUTE(@SQL)
NEXT FROM TINFO_CUR INTO @T_Name
終了
TINFO_CURを閉じる
DEALLOCATE TINFO_CUR
SELECT * FROM #T_Info ORDER BY T_NAME
付随する進歩は、SQLデータベースを修正し、一貫性のある整合性ベースのI/Oエラーを解決するのに役立ちます。
次のコマンドを実行します:
DBCC CHECKDB(DB_NAME、REPAIR_ALLOW_DATA_LOSS)
SQLデータベースが修正されたら、「テーブルレコード数」の手順を再ハッシュし、古いレコード数と比較します。
最初のテーブルレコード数と最後のテーブルレコード数を区別してはなりません。
制約 :
REPAIR_ALLOW_DATA_LOSSは、データベースの論理整合性ベースのIOエラーを修正する可能性がありますが、接続で基本データの損失が発生する可能性があるデータ損失の重大な問題があります。
選択的ソリューション
上記の手法が機能しない場合は、その時点で、SysToolsSQLファイル修復ツールを確認してください。 このツールは、破損したMDFおよびNDFファイルを修正し、すべてのデータベースオブジェクトを復元します。さらに、このツールは、テーブル、トリガー、インデックス、キー、ルール、削除されたファイル、ストアドプロシージャなどのすべてのデータベースオブジェクトを回復するのに役立ちます。この製品は紛れもない修復ソリューションを提供し、すべてのSQLデータベースバージョンをサポートしているため、緊急時に非常に役立ちます。
結論
また読む: SQLデータベースが破損しているかどうかを確認する方法
この投稿では、SQLServerが論理整合性ベースのI/ Oエラーを検出した理由と、この問題を解決するための手法について説明しました。
エラーを考慮して、適切な手法を見つけようとしました。ハードウェアまたはフレームワークがエラーの責任を負う可能性が低い場合は、ハードウェア関連の問題を特定するように規定されており、DBCC CHECKDBが整合性エラーを報告した場合は、その時点で、更新されたバックアップを利用してSQLデータベースを復元しようとします。
ハードウェアとバックアップで問題が修正されない場合は、その時点でREPAIR_ALLOW_DATA_LOSSを使用してデータベースの修正を試みてください。これは、CHECKDBからすべてのエラーを特定するための基本的な修正の程度ですが、実際にエラーが修正されることを意味するものではありません。また、データが失われる可能性があります。