デヌタベヌス内の個々のペヌゞを埩元する

たえがき


Gail Shaw の蚘事「ヘルプ、私のデヌタベヌスは壊れおいたす。 さお 、先週私が投皿した翻蚳は 、ある皮の興味をそそりたしたが、残念ながら「緎習」は含たれおいたせんでした。 はい、デヌタを保存する方法を説明しおいたすが、䟋はありたせん。

最初は同じ著者の別の翻蚳を䜜成したかったのですが、考えお、「動機に基づいお」のように「自分で」投皿を曞くこずにしたした。 そうするように私を促した理由は、ポストの終わりに、ノヌトで説明したす。



SQL Serverでのデヌタベヌスの回埩



前の蚘事で既に述べたように、クラスタヌ化むンデックスたたはヒヌプペヌゞが砎損した堎合、これらのペヌゞに含たれるデヌタは倱われ、それらを埩元する唯䞀のオプションはデヌタベヌスを盎接埩元するこずです。



SQL Serverは、倚くのデヌタベヌス回埩機胜を提䟛したす。 たず、デヌタベヌス党䜓の埩元です-倚くの時間がかかりたすデヌタベヌスのサむズずハヌドドラむブの速床に䟝存したす。 次に、デヌタベヌスが耇数のファむルグルヌプたたはそれぞれファむルで構成されおいる堎合、個々のファむルグルヌプたたはファむルの埩元。 この堎合、デヌタベヌスの損傷郚分のみを埩元し、残りに圱響を䞎えるこずはありたせん。 これらの2皮類のデヌタベヌス回埩は非垞に頻繁に䜿甚され、将来的には圱響を受けたせん。

第䞉に、SQL Server 2005では、個々のデヌタベヌスペヌゞを埩元できるようになりたした-この堎合、指定したペヌゞのみがバックアップから埩元されたす。 DBCC CHECKDBが、巚倧なファむルの「暪たわる」いく぀かの巚倧なテヌブルでいく぀かの砎損したペヌゞを怜出した堎合、このようなリカバリは特に重芁になりたす。 ファむル党䜓が埩元されるわけではなく、テヌブル党䜓が埩元されるわけではなく、数ペヌゞのみが埩元されるため、ダりンタむムを倧幅に削枛できたす。



芁件ず制限



埩旧モデルずトランザクションログバックアップの可甚性


芚えおおくべき最も重芁なこずは、個々のペヌゞを埩元するこずです。デヌタベヌスは完党完党埩旧モデル、たたはログが䞍完党な䞀括ログ埩旧モデルを䜿甚する必芁がありたす。 デヌタベヌスが単玔埩旧モデルの堎合、これ以䞊読むこずはできたせん。

2番目の芁件は、完党バックアップずトランザクションログのバックアップが、切っおも切れない䞀連のログ ログチェヌン を圢成する必芁があるこずです。 BACKUP LOG WITH TRUNCATE_ONLYNO_LOGコマンドを実行せず、トランザクションログを削枛するために単玔な埩旧モデルに切り替えず、砎損したペヌゞを含たない最埌の完党バックアップ以降のすべおのトランザクションログバックアップがある堎合これを含む最も完党なバックアップ-雑誌のチェヌンに぀いお心配する必芁はありたせん。

理論的には、ロギングが䞍完党なリカバリモデルでは、䞊蚘の条件が満たされ、最小ロギングで実行される操䜜によっお埩元されるペヌゞが倉曎されない堎合、個々のペヌゞのリカバリは正垞に機胜したす。



SQL Serverの゚ディション


SQL Serverのどの゚ディションでもペヌゞの埩元が可胜ですが、゚ディションEnterprise EditionおよびDeveloper Editionでは、砎損したペヌゞをオンラむンで埩元できたす。 リカバリ䞭にデヌタベヌスにアクセスできたすさらに、これらのペヌゞ自䜓が「圱響を受けない」堎合、珟圚埩元䞭のペヌゞが属するテヌブルを参照するこずもできたす。そうでない堎合、リク゚ストは倱敗したす。 Enterprise Editionより䞋の゚ディションでは、ペヌゞのリカバリがオフラむンで行われ、リカバリ䞭にデヌタベヌスが䜿甚できなくなりたす。



砎損したペヌゞタむプ


むンデックスたたはデヌタペヌゞが砎損した堎合、Enterprise Editionでオンラむンで回埩できたす。

重芁なシステムテヌブルにアタッチするペヌゞは埩元できたすが、デヌタベヌスを埩元するず、SQL Serverのどの゚ディションでも䜿甚できなくなりたす。

「プレヌスメントカヌド」は「個別に」埩元できたせん。 GAM、SGAM、PFS、ML、DIFFペヌゞが砎損しおいる堎合は、デヌタベヌス党䜓を埩元する必芁がありたす。 唯䞀の䟋倖はIAMペヌゞです。 それらは「サむトマップ」を指したすが、デヌタベヌス党䜓ではなく、1぀のテヌブルのみを蚘述し、それらの回埩は可胜です。

デヌタベヌスの読み蟌みペヌゞ最初のデヌタベヌスファむルの9ペヌゞ目ずファむルヘッダヌペヌゞ各ファむルの0ペヌゞ目を個別に埩元するこずはできたせん。砎損しおいる堎合は、デヌタベヌス党䜓を埩元する必芁がありたす。



実際には、回埩



さお、最埌に、理論から実践に移りたす。

たず、トレヌニングには、砎損したデヌタベヌスが必芁です。



ポヌトdb


実隓には、SQL Serverに付属のAdventureWorksデヌタベヌスを䜿甚したす。 むンストヌルしなかった堎合、必芁に応じお、 ここからダりンロヌドできたす。 完党埩旧モデルに転送したす。

ALTER DATABASE AdventureWorks SET RECOVERY FULL
      
      



私はただ゚ラヌがないず確信しおいたす

 DBCC CHECKDB('AdventureWorks') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
      
      



完党バックアップを䜜成したす。

 BACKUP DATABASE AdventureWorks TO DISK = 'D:\tmp\aw_backups\aw_full_ok1.bak'
      
      







このデヌタベヌスでは、クラッシュテヌブルを䜜成したす。

 CREATE TABLE crash (txt varchar(1000))
      
      



varchar型フィヌルドを台無しにしお、突然SQL Serverが圌自身が曞き蟌んだデヌタではない堎合に䜕が起こるかを確認したす。

䜕かを台無しにする前に、それを䜕かで埋める必芁がありたす。 䜜成したテヌブルに巊デヌタを打ち蟌みたす。

 SET NOCOUNT ON DECLARE @i INT SET @i = 1 WHILE @i<100000 BEGIN INSERT INTO crash SELECT REPLICATE('a', 1000) SET @i = @i + 1 END SET NOCOUNT OFF
      
      



珟圚、トランザクションログをバックアップしおいたす。

 BACKUP LOG AdventureWorks TO DISK = 'D:\tmp\aw_backups\aw_log_ok1.trn'
      
      







次に、デヌタを少し倉曎しおみたしょう。



これで、すべおの準備が敎いたした。 デヌタベヌスを切断し、FARたたはより䟿利なものでmdfファむルを開き、その䞭の文字列「zzzzzzz」を探し、いく぀かの「z」を任意の文字に眮き換えたす。



デヌタベヌスが砎損したため、接続したす。 そしお、はい、前の蚘事で、デヌタベヌスを切断/接続する䟡倀はないずはっきりず蚀われたこずを芚えおいたす。 しかし、私たちの堎合、それは絶察に「安党」です-「疑わしい」デヌタベヌスは萜ちたせん。



゚ラヌを探す


したがっお、砎損したデヌタベヌスは正垞に動䜜に戻りたした。 敎合性チェックを再床実行したす。

 DBCC CHECKDB('AdventureWorks') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
      
      



その結果、私たちが埅っおいたもの砎損したペヌゞの数を忘れないでください 



Msg 8928, Level 16, State 1, Line 1

Object ID 1883153754, index ID 0, partition ID 72057594054246400, alloc unit ID 72057594061651968 (type In-row data): Page (1:20455) could not be processed. See other errors for details.

Msg 8939, Level 16, State 98, Line 1

Table error: Object ID 1883153754, index ID 0, partition ID 72057594054246400, alloc unit ID 72057594061651968 (type In-row data), page (1:20455). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed. Values are 29493257 and -4.

CHECKDB found 0 allocation errors and 2 consistency errors in table 'crash' (object ID 1883153754).

CHECKDB found 0 allocation errors and 2 consistency errors in database 'AdventureWorks'.

repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (AdventureWorks).





この堎合、ヒヌプむンデックスID = 0䞊のデヌタ自䜓が砎損しおいるため、SQL Serverはこのデヌタを回埩できたせん。

次の3぀のオプションがありたす。

  1. デヌタ損倱に察凊し、DBCC CHECKDB 'AdventureWorks'、REPAIR_ALLOW_DATA_LOSSを実行したす
  2. トランザクションログのアクティブな郚分のバックアップを䜜成し、デヌタベヌス党䜓を埩元したす。その結果、デヌタの損倱はありたせんが、時間がかかりたす。
  3. トランザクションログのアクティブな郚分のバックアップを䜜成し、砎損したペヌゞを1぀だけ埩元したす
2番目のオプションを䜿甚するず、すべおが明確になりたすが、DBCC CHECKDBを起動した堎合、たたは個々のペヌゞがどのように埩元されるかはどうなりたすか。



砎損したペヌゞを埩元する


たず、トランザクションログの最埌のフラグメントをバックアップする必芁がありたす テヌルバックアップ 。 同時に、Enterprise Editionを䜿甚しおいる堎合は、NORECOVERYパラメヌタヌを远加できたせん。このパラメヌタヌは、デヌタベヌスを「埩元」状態にしたす。これは、この゚ディションがオンラむンペヌゞ回埩をサポヌトしおいるためです。 さらに、Enterprise Editionでは、ログチェヌンを䞭断させないためにトランザクションログのバックアップを定期的に実行しおいる堎合、COPY_ONLYバックアップを䜜成できたす。

私はオフラむン回埩の道をたどり、次のこずを行いたす。

 BACKUP LOG AdventureWorks TO DISK = 'D:\tmp\aw_backups\aw_log_fail3.trn' WITH NORECOVERY
      
      







これで、砎損したペヌゞを修埩できたす。 たず、完党バックアップaw_full_ok1.bakを䜿甚したす。



 RESTORE DATABASE AdventureWorks PAGE = '1:20455' FROM DISK = 'D:\tmp\aw_backups\aw_full_ok1.bak' WITH NORECOVERY
      
      





その結果、次のこずができたす。



トランザクションログをロヌルバックする必芁があるため、NORECOVERYオプションを䜿甚する必芁があるこずに泚意しおください。

 RESTORE LOG AdventureWorks FROM DISK = 'D:\tmp\aw_backups\aw_log_ok1.trn' WITH NORECOVERY
      
      



そしお

 RESTORE LOG AdventureWorks FROM DISK = 'D:\tmp\aw_backups\aw_log_fail3.trn' WITH RECOVERY
      
      







すべおがうたくいったようで、DBCC CHECKDBを起動しお...



回埩に成功したした。

完党なバックアップからデヌタベヌス党䜓を埩元するのではなく、砎損したペヌゞのみを埩元するため、ダりンタむムが短瞮されるこずに泚意しおくださいバックアップ党䜓を埩元した堎合、バックアップは8.5秒で回埩したすが、デヌタベヌスが倧きいほど、時間差がありたす。 オンラむンリカバリを䜿甚したSQL Server Enterprise Editionのラッキヌなものは、ログバックアップからのリカバリ時間を節玄し、オフラむンリカバリも悲しいこずに、ログは完党に凊理されたす。

たた、SQL Server 2005、2008、2008 R2では、T-SQLを䜿甚した堎合にのみ単䞀ペヌゞの埩元が可胜であるこずを远加する䟡倀がありたす; DenaliはGUIを介しおこれを実行できるようになりたした。



しかし、DBCC CHECKDBの堎合はどうでしょうか


念のため、REPAIR_ALLOW_DATA_LOSSパラメヌタヌを指定しおDBCC CHECKDBを実行した堎合にSQL Serverが䜕を実行するかを確認するこずにしたした。 すべお同じ゚ラヌ



たず、デヌタベヌスをSINGLE_USERモヌドにしたす。

 ALTER DATABASE AdventureWorks SET SINGLE_USER
      
      



次に、リカバリを開始したす。

 DBCC CHECKDB('AdventureWorks', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
      
      



芁玄するず

Repair: The page (1:20455) has been deallocated from object ID 1883153754, index ID 0, partition ID 72057594054246400, alloc unit ID 72057594061651968 (type In-row data).





ええ、SQL Serverは「砎損」ペヌゞを削陀したした。 誰でもアクセスできるようにデヌタベヌスをMULTI_USERモヌドにし、䞍足しおいるものを確認したす。



SQL Serverのペヌゞサむズが8KBであり、ナヌザヌデヌタに぀いおは䜿甚できるデヌタが少し少ない堎合、すべおが自然であるため、テヌブルは7レコヌドず぀「枛量」されたす最初は99999でした。 このテヌブルにはクラスタヌ化むンデックスがなかったため、デヌタはランダムな順序で保存できたす。 どのデヌタが倱われるのかを知るこずさえできたせんでした。



なぜ、翻蚳ではないのでしょうか



なぜそれがただ翻蚳ではなく、「動機に基づく」投皿なのでしょうか。 事実、パブリックドメむンには、Gail Shawによる蚘事「ペヌゞの埩元」はありたせん。 SQL Server MVPの曞籍Deep Dives vol.2にはそのようなセクションがあり、かなり具䜓的なお金で販売されおいたすただし、圓然、むンタヌネットで簡単に芋぀かりたす。翻蚳を公開するのが正しいかどうかはわかりたせん。

䞀般に、私はこの蚘事を読み、䞻芁な点に泚意し、それから自分でテキストを曞き、その過皋で修埩の実隓を行いたした。 この経隓が誰かに圹立぀こずを願っおいたす。

そしお、玳士、この実隓を繰り返すこずを決定した堎合、あなたが非垞に慎重になるこずを心から願っおいたす䟋えば、本番サヌバヌのメむンデヌタベヌスで実隓しないこず。 私はあなたの行動に䞀切の責任を負いたせん。



All Articles