アーカイブ

‘データベース’ カテゴリーのアーカイブ

SQL Server 2000 の ハードウェア障害の際の予備機への復旧手順

2009 年 6 月 10 日 Comments off

前提条件

本番機でオンラインバックアップを取得しており、そのバックアップファイルがある
本番機の *.ldf を取得できる
予備機に SQL Server2000 がインストールされており、サービスパック、HotFixが本番機と同様に適用されている
*.ldfのPATHは C:\SQL_DATA
*.mdfのPATHは F:\SQL_DATA
オンライン・フルバックアップがC:\SQL_BK\FULL にある
オンライン・トランザクションログバックアップがC:\SQL_BK\TRAN にある

工程1 クラッシュした本番機から、トランザクションログファイル(*.ldf)の取得

クラッシュした本番機のHDDを他サーバに接続する等して、本番機の*.ldfファイルを取得する。

※本番機の*.ldf ファイルの有無で、リカバリポイントが決まる。

*.ldfが有る -> 障害発生時点までリカバリ可能。

*.ldfが無い -> 障害発生時点までのリカバリ不可、巻き戻りが発生する。

工程2 オンラインバックアップファイルの確認

オンラインバックアップファイルが存在する事、およびファイルシステム上の更新日時を確認する
userdb1.BAK
userdb2.BAK
userdb3.BAK
master_full.BAK
model.BAK▲
msdb.BAK▲

▲印はシステムデータベースに付き、復旧出来なくても影響が軽微(ジョブが消えてしまう程度)なので無くても構わない

トランザクションログのオンラインバックアップファイルが存在する事、およびファイルシステム上の更新日時を確認する
userdb1_transaction.BAK
userdb2_transaction.BAK
userdb3_transaction.BAK

工程3 既存のデータベースファイルの移動

MSSQLSERVERサービスを停止し、データベースファイル達を、任意のディレクトリに移動する。

mkdir "C:\SQL_DATA\old"
mkdir F:\SQL_DATA\old
move C:\SQL_DATA\*.ldf "C:\SQL_DATA\old"
move F:\SQL_DATA\*.mdf F:\SQL_DATA\old

工程4 masterの再構築

シングルユーザモードで起動する
"C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.exe" -m -c
masterを再構築する
restore database master from disk= 'C:\SQL_BK\FULL\master_full.BAK'
go

工程5 クラッシュ時点までのトランザクションログのバックアップを取得する

本番機の最新の*.ldfを、本番機と同一パス(C:\SQL_DATA\)にコピー※する

※リストアに失敗したらデータが消えてしまうので、必ず移動ではなくコピーにする

予備機のMSSQLSERVERサービスを起動する
Enterprize Managerにて’sa’ユーザで接続し、各データベースの灰色のアイコン(未確認)があるか確認する
最新トランザクションログをバックアップ

※2回やっちゃ駄目。やったら工程4からやりなおし

backup log [userdb1] to disk='C:\SQL_BK\TRAN\userdb1_last_tran.bak' with no_truncate
go
backup log [userdb2] to disk='C:\SQL_BK\TRAN\userdb2_last_tran.bak' with no_truncate
go
backup log [userdb3] to disk='C:\SQL_BK\TRAN\userdb3_last_tran.bak' with no_truncate
go

工程6 システムデータベース(modelとmsdb)のりストア

restore database [model] from disk='C:\SQL_BK\FULL\model.BAK' with file = 1, recovery, replace
go
restore database [msdb] from disk='C:\SQL_BK\FULL\msdb.BAK' with file = 1, recovery, replace
go

工程7 フルバックアップをリストア

restore database [userdb1] from disk='C:\SQL_BK\FULL\userdb1.BAK' with file = 1, norecovery, replace
go
restore database [userdb2] from disk='C:\SQL_BK\FULL\userdb2.BAK' with file = 1, norecovery, replace
go
restore database [userdb3] from disk='C:\SQL_BK\FULL\userdb3.BAK' with file = 1, norecovery, replace
go

工程8 トランザクションログの復旧

前回のフルバックアップ取得時点から、1度でもトランザクションログバックアップを行っていた場合に必要
declare @i int
set @i = 1
while @i <= 3
begin
restore log [userdb1] from disk='C:\SQL_BK\TRAN\userdb1_transaction.BAK'
with file = @i, norecovery, replace
restore log [userdb2] from disk='C:\SQL_BK\TRAN\userdb2_transaction.BAK'
with file = @i, norecovery, replace
restore log [userdb3] from disk='C:\SQL_BK\TRAN\userdb3_transaction.BAK'
with file = @i, norecovery, replace
set @i = @i + 1
end

以下のようなエラーが表示されても無視する
デバイス 'C:\SQL_BK\TRAN\userdb1_transaction.BAK' にファイル ID 7 が見つかりません。
サーバー : メッセージ 3013、レベル 16、状態 1、行 21
RESTORE LOG が異常終了しました。

工程9 最後のトランザクション(工程5で取得)を復旧

restore log [userdb1] from disk='C:\SQL_BK\TRAN\userdb1_last_tran.bak' with norecovery
restore log [userdb2] from disk='C:\SQL_BK\TRAN\userdb2_last_tran.bak' with norecovery
restore log [userdb3] from disk='C:\SQL_BK\TRAN\userdb3_last_tran.bak' with norecovery, stopat='2009-06-10 10:00:00'
go

工程10 データベースを有効化

restore database [userdb1] with recovery
restore database [userdb2] with recovery
restore database [userdb3] with recovery
go

工程11 復旧後処理

SQL認証のGIDを確認する

use [userdb1]

go

select m.sid as master_sid ,a.sid as account_sid ,m.name as master_name ,a.name as accouunt_name

from master.dbo.sysusers as m

right outer join sysusers as a on a.name = m.name

where m.sid is not null

GO

本番機のNT認証を削除する

exec sp_revokelogin ‘本番機\Administrator’

GO

各データベース認証を削除する

use [userdb1]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [userdb2]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [userdb3]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [master]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [model]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [msdb]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

予備機のNT認証を登録する
カテゴリー: sqlserver, データベース タグ:

3値論理

2009 年 6 月 9 日 Comments off

NULLを許容したくないデータベース屋のわたしが、NULLを気にしないSEやプログラマに3値論理を説明しなければいけないときに使うポインタ。

ここまで纏まっているサイトは他にないと思う。

ミックのページ

http://www.geocities.jp/mickindex/database/db_3vl.html :3値論理 ―― 神のいない論理]

http://www.geocities.jp/mickindex/database/db_getout_null.html :NULL撲滅委員会]

CODDの論文は読んだことないけど、いつか読破したいナァ。

カテゴリー: knowledge, データベース タグ:

ACID、BASE、CAP定理

2009 年 5 月 27 日 Comments off

CAP定理

システムのCAP (分散耐性と可用性と一貫性) のうち、同時には2つまでしか満たすことはできない、という (Prof. Eric Brewer (UC Berkeley)の) 主張。

  • Consistency (一貫性(整合性))
  • Availability (可用性)
  • Partition Tolerance(分散耐性)

※ITにおけるConsistencyの略は整合性の方が一般的の様だけど、個人的には一貫性の方が意味を良く表していて良い思います。

 


BASEトランザクション

CAP定理に対して、「Eventual Consistency(結果的な一貫性(整合性)) を満たせば、Availability(可用性)とPartition Tolerance(分散耐性)も満たせるよ」という新たな主張とそれを踏まえたトランザクションのACID属性を見直していこうという概念の基本。

個人的には「DNS」や「Active Directory」をイメージすれば理解が早まりました。

  • Basically Available (楽観ロックやキューなどで可用性を高めましょう)
  • Soft-State (分散したノード間のデータ同期を終つことを許容しましょう)
  • Eventual Consistency (一時的に一貫性(整合性)が崩れても最後に帳尻があえば善としましょう (結果一貫性/結果整合性))

 


従来のACID -> 新しいACID

GoogleのGregor Hohpe氏は、クラウドにおいてACIDは次のような意味になると言った

  • Atomic(原子性) -> Associative(結合の)
  • Consistent(一貫性(整合性)) -> Commutative(相互の)
  • Isolated(独立性) -> Idempotent(べき等の)
  • Durable(永続性) -> Distributed(分散の)

 


RDBマンセー、Coddラブなワタシとしては、にわかに受け入れがたい概念だけど、スケールするウェブシステム作りには必要になっていくと思う。そろそろパラダイムシフトが必要かもしれない。

参考サイト

{Fight the Future => じゅくのblog}-クラウドでの新しいACID、そしてBASEトランザクションとCAP定理

ScalabilityとAvailability 早稲田大学 丸山不二夫

BrewersCapTheorem – ブリュワーの CAP 定理

CAPとBASEとEventually Consistent

カテゴリー: knowledge, クラウド, データベース タグ:

MDBファイルサイズを最適化する

2009 年 5 月 18 日 Comments off

参考サイト

http://www.relief.jp/itnote/archives/000130.php

データベースの最適化を実施すれば、ファイルサイズが小さくなる。

※Access 2003

[ツール]-[データベースユーティリティ]-[データベースの最適化/修復]をクリック

※Access 2000/2002

[ツール]-[データベースユーティリティ]-[最適化/修復]をクリック

※Access 97

メニュー[ツール]-[データベースユーティリティ]-[最適化]をクリック

Access 2000以降は、終了時に自動で最適化が行われるように設定できる。

[ツール]-[オプション]ダイアログ-[全般]タブ-[閉じる時に最適化する]チェックをオンにする

カテゴリー: データベース タグ:

SQL Server 2000で、2つあるldfを1つにする

2009 年 5 月 17 日 Comments off

SQL Server 2000で、2つあるldfを1つにする

use [database_name]

go

checkpoint

exec sp_dboption ‘table_name’, ‘trunc. log on chkpt.’, ‘TRUE’

dbcc shrinkfile( ‘table_name_log_d’ , emptyfile )

alter database [table_name] remove file ‘table_name_log_d’

go

アーキテクチャ徹底解説Microsoft SQL Server 2000 (マイクロソフト公式解説書)
カレン デレーニ
日経BPソフトプレス
売り上げランキング: 328654
カテゴリー: sqlserver, データベース タグ: