sql serverのデータ破損に備える

36
SQLServerの データ破損に備える! SQLWorld #30 サヴロウ

Upload: okumar-savurou

Post on 17-Jul-2015

470 views

Category:

Software


1 download

TRANSCRIPT

Page 1: SQL serverのデータ破損に備える

SQLServerのデータ破損に備える!

SQLWorld #30

サヴロウ

Page 2: SQL serverのデータ破損に備える

自己紹介

・医療系のパッケージシステムを

作っています。DBはSQLServerです。主にSQLWorldに出没しています。

twitter:savurou36FB:湯川正之

・オクマー(旧:フライパンズ)のベース&アレンジ・ライブ予定

6/20(土) 高槻アクトアモーレ

http://www.okumar.com

◆サヴロウ

Page 3: SQL serverのデータ破損に備える

SQLServerのデータ破損に備える

[対象外]

DBが完全の状態でのトランザクションLogの復旧

スナップショット、AlwaysOn可用性グループ、ミラーリング

データ破損の修復方法の一例と説明であり、この資料を基にして

復旧を試みて復旧できなかった場合や、さらにデータが壊れて

しまったなどが起こっても一切の責任を持ちません。

SQLServerを使っていると、突然やってくるデータ破損…

データ破損の復旧方法のキホンをお話します。

SQLServerの起動時の動きや内部構造の説明もあります。

ご注意

Page 4: SQL serverのデータ破損に備える

データ破損とは

ファイルシステム上でのファイル破損(CRCエラー)

・ファイルの復元・修復は不可能

・破損したページ以外は読める

・SQLServerのファイルに限らない

ファイルが論理的に破損している。

・ページのチェックサムが合わない

・修復できる場合がある

物理破損

論理破損

◆データページの破損

◆破損の種類

Master系の破損 データ系の破損

Page 5: SQL serverのデータ破損に備える

データ破損とは

ケース1:

ケース2:

ケース3:

物理破損 論理破損

◆3つのケースで復旧・回復方法を紹介

Master系の破損

データ系の破損 物理破損

論理破損データ系の破損

Page 6: SQL serverのデータ破損に備える

ケース1

まずエラーLogを見る

物理破損 論理破損

◆<現象>SQLServerが起動しない/サービスが止っている

Master系の破損

C:¥Program Files¥Microsoft SQL Server¥

MSSQL12.MSSQLSERVER¥MSSQL¥Log¥ERRORLOG

・インスタンスごとに7個履歴がある

※イベントビューアでもよいです

インスタンス名

SQLServerのバージョン

Page 7: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆エラーLogの例

Master系の破損

・・・

2015-04-13 09:06:19.33 サーバー SQL Server is starting at normal priority base (=7). →

2015-04-13 09:06:19.33 サーバー Detected 4 CPUs. This is an informational message; no →

2015-04-13 09:06:19.35 サーバー Using dynamic lock allocation. Initial allocation of →

2015-04-13 09:06:19.37 サーバー Node configuration: node 0: CPU mask: 0x0000000f →

2015-04-13 09:06:19.39 spid6s Starting up database 'master'.

2015-04-13 09:06:19.45 spid6s エラー: 9003、重大度: 20、状態: 1。

2015-04-13 09:06:19.45 spid6s The log scan number (259:80:2) passed to log scan in →

2015-04-13 09:06:19.65 spid6s Cannot recover the master database. SQL Server is unable →

・・・

The log scan number (259:80:2) passed to log scan in database 'master' is not valid. This error may indicate data corruption or that the log file (.ldf) does not match the data file (.mdf). If this error occurred during replication, re-create the publication. Otherwise, restore from backup if the problem results in a failure during startup.

Cannot recover the master database. SQL Server is unable to run. Restore master from a full backup, repair it, or rebuild it. For more information about how to rebuild the master database, see SQL Server Books Online.

Page 8: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆SQLServerのシステムデータベースの説明

Master系の破損

master ⇒ DB作成、ログインの追加

msdb ⇒ SQLServerエージェントのジョブの追加、

スケジュールの設定、バックアップ履歴など

model ⇒ CREATE DATABASEのテンプレート

tempdb ⇒ 勝手につくられる

resource ⇒ 内部用(見えません)

Page 9: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆システムデータベースのバックアップの方法①

Master系の破損

(1)SSMSからバックアップ(バックアップセットを上書き)

(2)コマンドからバックアップ

--バックアップ

backup database master to disk = 'C:¥DBBackup¥master.bak' with init

backup database model to disk = 'C:¥DBBackup¥model.bak' with init

backup database msdb to disk = 'C:¥DBBackup¥msdb.bak' with init

Page 10: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆システムデータベースのリストアの方法①

Master系の破損

--リストア(master以外)

restore database model from disk = 'C:¥DBBackup¥model.bak' with replace,recovery

restore database msdb from disk = 'C:¥DBBackup¥msdb.bak' with replace,recovery

Page 11: SQL serverのデータ破損に備える

①構成マネージャを起動しSQLServerを止める

②起動時のパラメーターに-mを追加しSQLServerを起動

(シングルユーザーモードで起動)

③sqlcmdでリストアコマンドを実行

④起動時のパラメータを削除

ケース1 物理破損 論理破損

◆システムデータベースのリストアの方法①

Master系の破損

restore database master from disk = 'C:¥DBBackup¥master.bak' with replace,recovery

Page 12: SQL serverのデータ破損に備える

--バックアップ

①SQLServerを止める

②master.mdf , masterlog.ldf

model.mdf , modellog.ldf

MSDBData.mdf , MSDBLog.ldfをコピーしておく

③SQLServerを起動

--リストア

①SQLServerを止める

②各mdf,ldfのファイルを上書きする

③SQLServerを起動する

ケース1 物理破損 論理破損

◆バックアップ/リストアの方法②

Master系の破損

Page 13: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆バックアップがなかったら

Master系の破損

バックアップがなかったら同一構成の別マシンから持ってこれる

※マシン名、格納場所が違っても大丈夫

master ⇒ 同じ構成(DB、ログイン)のマシンから持ってこれる

msdb ⇒ SQLServerエージェントのジョブの追加、

スケジュールの設定、バックアップ履歴などが

飛んでもいいなら、違うマシンから持ってこれる

model ⇒ create databaseのテンプレなので、

違うマシンから持ってこれる

tempdb ⇒ 勝手につくられる

Page 14: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆それでも無理ならシステムデータベースの再構築

Master系の破損

①管理者権限でコマンドプロンプトを起動

②setup.exeのあるフォルダに移動し下記コマンドを実行

Setup /ACTION=REBUILDDATABASE

/INSTANCENAME=MSSQLSERVER

/SQLSYSADMINACCOUNTS="NT AUTHORITY¥SYSTEM"

/SAPWD=*****

→→

システムデータベースの再構築

https://msdn.microsoft.com/ja-jp/library/dd207003.aspx

Page 15: SQL serverのデータ破損に備える

ケース1 物理破損 論理破損

◆それでも無理ならシステムデータベースの再構築

Master系の破損

・初期化になるのでDBの構成は飛びます。

→システムデータベースのバックアップは重要です!

・それでもダメならインスタンスをアンインストール&

再インストールです・・・

Page 16: SQL serverのデータ破損に備える

ケース2 論理破損

◆<現象>特定のデータを検索、集計するとアプリケーション

がエラーになる

・テスト用にデータページを破損させる

データ系の破損

--ページを調べるSQL

select * from person.Person

CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%)

--破損させる

ALTER DATABASE AdventureWorks SET SINGLE_USER

DBCC WRITEPAGE ('AdventureWorks',

1, 1472, 1, 1, 0x00, 1)

ALTER DATABASE AdventureWorks SET MULTI_USER

Page 17: SQL serverのデータ破損に備える

ケース2 論理破損

◆selectしたときのエラー内容(例)

データ系の破損

メッセージ 824、レベル 24、状態 2、行 16

SQL Server で、一貫性に基づいた論理 I/O エラーが検出されました: 正しくないチェックサム (必要なチェックサム: 0x7f81232f、実際のチェックサム: 0x7f01232f)。このエラーは、ファイル 'C:¥Program Files¥Microsoft SQL Server¥MSSQL12.MSSQLSERVER¥MSSQL¥DATA¥AdventureWorks.mdf' のオフセット 0x00000000b80000 にあるデータベース ID が 9 のページ (1:1472) の 読み取り 中に発生しました。SQL Server エラー ログまたはシステム イベント ログ内の別の

メッセージで詳細情報が報告されることもあります。このエラー状態は深刻で、データベースの整合性を損なう可能性があるので、すぐに解決する必要があります。完全なデータベース一貫性確認(DBCC CHECKDB) を実行してください。このエラーには多くの要因があります。詳細については、SQL Server オンライン ブックを参照してください。

Page 18: SQL serverのデータ破損に備える

ケース2 論理破損

◆イベントビューアとsuspect_pagesの確認

データ系の破損

・データページの読み取りを試みたときにエラーを検出すると、

ページは "問題あり" と見なされ、イベントビューアと

msdb..suspect_pagesテーブルに情報が保存されます。

・イベントビューア(アプリケーションログ)のイベントID

論理エラー イベントID=824

物理エラー イベントID=823

Page 19: SQL serverのデータ破損に備える

ケース2 論理破損

◆suspect_pagesの確認

データ系の破損

--suspect_pagesの確認

select * from msdb..suspect_pages

・event_type列を見て状態を判断1 オペレーティング システムの CRC エラーによって発生した 823 エラー、

または、不適切なチェックサムまたは破損ページ (不適切なページ ID) 以外の 824 エラー

2 不適切なチェックサム

3 正しくないページ

4 復元済み (ページは不適切と見なされた後で復元されました)

5 修復済み (DBCC、AlwaysOn、またはミラーリングで修復されたページ)

7 DBCC による割り当て解除

Page 20: SQL serverのデータ破損に備える

ケース2 論理破損

◆修復を試みる①

データ系の破損

--まずはdbcc checkdb

dbcc checkdb('[データベース名]')

--REPAIR_REBUILD

--データ損失の可能性がない修復を実行します。

ALTER DATABASE AdventureWorks SET SINGLE_USER

dbcc checkdb('AdventureWorks',REPAIR_REBUILD)

ALTER DATABASE AdventureWorks SET MULTI_USER

-->これでは今回は修復は無理・・・

Page 21: SQL serverのデータ破損に備える

ケース2 論理破損

◆修復を試みる②

データ系の破損

--REPAIR_ALLOW_DATA_LOSS

--報告されたすべてのエラーの修復を試みます。

--修復を実行すると、データが失われることがあります。

ALTER DATABASE AdventureWorks SET SINGLE_USER

dbcc checkdb('AdventureWorks',REPAIR_ALLOW_DATA_LOSS)

ALTER DATABASE AdventureWorks SET MULTI_USER

-->修復されたがデータはページごとなくなった。

-->が、DBの一貫性は保たれるようになった

・バックアップがあればPage単位での復元もできる

→DBの復旧モデルが"単純"の場合は不可

https://msdn.microsoft.com/ja-p/library/ms175168.aspx

Page 22: SQL serverのデータ破損に備える

ケース2 論理破損

◆論理破損の特徴/注意点

データ系の破損

・破損があったとしても、正常にバックアップが取れる。

→破損領域にアクセスするまで気づかない

・インデックスページが破損している場合、全件操作ではエラーにならないが、Indexにヒットするとselectに失敗するケースがある

・suspect_pageはmsdbデータベースにあるので、バックアップして調査する際は忘れないようにする

Page 23: SQL serverのデータ破損に備える

ケース3

◆<現象>バックアップを取得しようとすると、エラーになる。

データ系の破損

・バックアップで失敗したときのメッセージ例

物理破損

メッセージ 3203、レベル 16、状態 1、行 1

"D:¥**********¥HogeHoge_Data.mdf" で読み取れませんでした: 1117(I/O デバイス エラーが発生したため、要求を実行できませんでした。)

メッセージ 3013、レベル 16、状態 1、行 1

BACKUP DATABASE が異常終了しています。

・データベースを止めて対象のmdf,ldfファイルをコピーする

⇒だいたい無理です。CRCエラーが出る。⇒ 物理破損

Page 24: SQL serverのデータ破損に備える

ケース3

◆イベントビューアとsuspect_pages

データ系の破損

・イベントビューアに記載される(エラーIDは823)

・suspect_pagesにも記載される

⇒event_typeカラムは1

物理破損

◆物理破損の場合データベースはどうなるか

Winの場合、NTFSのクラスタサイズ=デフォルト4KB

DBファイルの中のどこかの4KBのユニットが破損している。

⇒運が悪ければ複数ユニット破損

⇒破損した部分以外は読める

⇒SQLServerはページ単位(8KB)で読み込むので、

CRCエラーが出たらだいたいは、どこか

1ページ(以上)が死んでいると思ったらよい。

Page 25: SQL serverのデータ破損に備える

ケース3

◆とりあえずすること

データ系の破損

・エラーの例

物理破損

--まずはdbcc checkdb

dbcc checkdb('[データベース名]')

ラッチ型 SH のページ (1:234755) を読み取ってラッチする

ことができません。1117(I/O デバイス エラーが発生したため、

要求を実行できませんでした。) が失敗しました。

・複数ページ破損している場合はここでわかります

Page 26: SQL serverのデータ破損に備える

ケース3

◆REPAIR_ALLOW_DATA_LOSSをかける?

データ系の破損

・バックアップが取れていない状態でこれはちょっと

怖いかな・・・

・ファイルの物理破損なので、修復自体がうまくいかない

可能性もあるし・・・

→CRCエラーで私はやったことはありません。

物理破損

--REPAIR_ALLOW_DATA_LOSS

ALTER DATABASE AdventureWorks SET SINGLE_USER

dbcc checkdb('AdventureWorks',REPAIR_ALLOW_DATA_LOSS)

ALTER DATABASE AdventureWorks SET MULTI_USER

Page 27: SQL serverのデータ破損に備える

ケース3

◆どこが壊れているか特定&修復①

データ系の破損

・まずどのページが破損しているか

①データページ ⇒ だいたいココです。

②インデックスページ ⇒ インデックスの再構築で直るか。

③ページ以外(ページヘッダー,GAM,SGAM,IAM,PFS・・・)

⇒ ここが壊れたらやばいかも。遭遇したことはないです。

物理破損

Page 28: SQL serverのデータ破損に備える

ケース3

◆どこが壊れているか特定&修復②

データ系の破損

・FileIDとPageIDを元にどのテーブルが破損しているか特定

物理破損

use [データベース名]

SELECT sysobjects.name as 'テーブル名',*

FROM sys.dm_db_database_page_allocations(

DB_ID([データベース名]), NULL, NULL, NULL,

'DETAILED') dpa

INNER JOIN

sys.sysobjects on sysobjects.id = object_id

WHERE allocated_page_file_id = @FileID

AND allocated_page_page_id = @PageID

Page 29: SQL serverのデータ破損に備える

ケース3

◆どこが壊れているか特定&修復③

データ系の破損

・どの行か

物理破損

SELECT * FROM [テーブル名]

CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%)

where file_id = @FileID and page_id <> @PageID

⇒としたいところですが、上記はエラーになります。

sys.fn_PhysLocCracker(%%physloc%%)はtableの行が

selectできないとエラーになるので・・・

Page 30: SQL serverのデータ破損に備える

ケース3

◆どこが壊れているか特定&修復④

データ系の破損

・select * from [テーブル名]をやりましょう

⇒どこかで落ちます

⇒select * from where [キー]

where条件にはPKEYのキーを指定します。

どんどんしぼっていって、

select * from [壊れているテーブル] where キー <=50

select * from [壊れているテーブル] where キー >=55

のようなSelectできるSQLを作る

※キーが51から54までのデータが死んでいるということ。

⇒さらに51から54のレコードでもBLOBカラムを除くともう少し絞れるかもしれません。ページが違うため

物理破損

Page 31: SQL serverのデータ破損に備える

ケース3

◆復旧

データ系の破損

・別データベースを作ってそちらへコピーする

※破損テーブルは、作成したSQLを使ってselect~insert

※やり方は3つほど紹介

(その1)データベースコピーウィザード

⇒[注意]テーブルは作ってくれるが、インデックスは

作ってくれへん

(その2)全く同じテーブル構造のデータベースの空を

用意しておいて、select~insertする

⇒事前に用意しておくことで復旧が容易になる。

物理破損

Page 32: SQL serverのデータ破損に備える

ケース3

◆復旧

データ系の破損

(その3) select * into [newテーブル名] from [元テーブル名]

⇒sp_msforeachtableストアドと組み合わせれば楽かな

⇒[注意]こちらもテーブルは作ってくれるが、

インデックスは作ってくれへん

物理破損

Page 33: SQL serverのデータ破損に備える

ケース3

◆復旧

データ系の破損

(その3) select * into [newテーブル名] from [元テーブル名]

⇒sp_msforeachtableストアドと組み合わせれば楽かな

⇒[注意]こちらもテーブルは作ってくれるが、

インデックスは作ってくれへん

物理破損

めっちゃ大変です!

Page 34: SQL serverのデータ破損に備える

ケース3

◆物理破損の特徴/注意点

データ系の破損

・バックアップが取れない。

・SQLServerを止めてもファイルの移動/コピーができない。

・読めるところだけコピーする。もしくは少し前の状態にリストアする

物理破損

Page 35: SQL serverのデータ破損に備える

最後に

◆データ修復の基本は[知識と備え]です。

・master,msdb,modelのバックアップは定期的に取得

・データベースの空を用意しておくといざというときの復旧がスムーズ

・最低この資料のことを知っておくと、なんとか動くというこころに持っていける。

・障害発生時は電話や回りがやんややんやうるさいです。焦らずに落ち着いて作業しましょう。

・データ破損があっても、直前のバックアップがあればそれを戻せばいい

Page 36: SQL serverのデータ破損に備える

◆ご清聴ありがとうございました