質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

7678閲覧

【緊急】SQLSERVER2008R2の復元方法

namiki_syou

総合スコア7

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/05/02 12:41

【緊急】
SQLSERVER2008R2環境で間違えてUPDATEを実行してしまい、テーブルのキーがすべて更新されてしまいました。
SSMSでクエリを実行し、既にコミットも完了しております。

DBのバックアップはとっておらず、復旧モデルは「完全」のDBになっております。

UPDATEを実行してしまったのが、3時間ほど前なのでそこまで戻せればよいなと考えております。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

トランザクション ログが残っていれば復元は可能です。

以下参考。
SQL Server データベースを特定の時点に復元する方法 (完全復旧モデル)
特定の時点まで復元する方法 (SQL Server Management Studio)

追記

ちょっと心配になって追記。
傷を深くしないように、バックアップは必ず取ってから行ってください。

追記2

トランザクションログの情報のみを使用し、内容を解析して元情報を洗い出す。
※但しトランザクションログの構成を理解した上で行うことが前提なので、敷居は高いと思います。

トランザクションログのバックアップからログレコードの内容を確認
SQL Server トランザクション ログのアーキテクチャと管理ガイド

投稿2018/05/02 12:47

編集2018/05/03 01:31
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namiki_syou

2018/05/02 13:12

回答ありがとうございます。 現状はトランザクションログのバックアップ等もとっておらず、mdfファイルとlog_ldfファイルがあるままとなっております。 参考となっているURLを見て再度検討したいと思います。 ありがとうございました。
sazi

2018/05/02 13:17

「トランザクションログのバックアップ」ではなく「トランザクションログ」です。 現時点でfullバックアップ(トランザクションログ含む)の取得をお奨めします。 他の方の紹介されているツールも結局はトランザクションログを利用していると思われます。
namiki_syou

2018/05/02 13:18

ありがとうございます。1人で焦ってしまい涙ながらに色々調べを進めています。 バックアップの重要性が身にしみました。 ちなみにトランザクションログファイルというのは間違えたUPDATEをした後にとった場合でも それ以前に戻すことは可能なのでしょうか
sazi

2018/05/02 13:20

手間は掛かりますが、fullバックアップのデータを別環境に構築して復元し、そのデータ利用して本環境へ適用するなどの方法も考えられますので。
sazi

2018/05/02 13:22

トランザクションログはどのような変更を行ったかの情報が記録されるので、updateに限らず変更前の状態に戻すことが可能です。
namiki_syou

2018/05/02 13:22

取り敢えず現状のバックアップを取っていなくてもあるポイントまでの復元が可能と知ってほっとしました。 手間はかけてもよいのでFULLバックアップをローカル環境へ展開してみるやり方についても調べてみようと思います、。
sazi

2018/05/02 13:28

トランザクションログは無限に蓄積されるわけではないので、準備に時間が掛かって、いざやろうとしたらその時点のログは破棄されていることもあり得ます。 夜間中に大量のバッチが実行されたり、日中に大量の利用が発生して、ログが押し出されて残っていないという事も考えられます。 なので、早急にfullバックアップ(くれぐれもトランザクションログ付きで)を取得された方が良いと思います。
namiki_syou

2018/05/02 13:35

なるほど、なるほど。。。 ログが消えてしまう前にバックアップを取得いたしました。 データベース右クリック=>タスク=>バックアップ=>データベースのバックアップ画面が開かれます。 バックアップの種類を完全にしてバックアップをCドライブ内に作成しました。(.bak形式) トランザクションログつきというのはこのままでよいのでしょうか? それとも上記の肯定とは別でバックアップの種類をトランザクションログとして同じ.bakファイルにうわが区感じでよいのでしょうか。
namiki_syou

2018/05/02 14:11

1.完全バックアップを作成(.bak) 2.トランザクションログバックアップを作成(1と同じ.bak) 3.そのバックアップファイルをローカル環境へ復元(復元可能な最新の状態) 4.再度復元を実行(特定の日時と時刻) !!!エラー発生!!! 復元に失敗しました。ロールフォワードできる状態のファイルがないので、ログまたは差分バックアップは復元できません。と表示されます。
namiki_syou

2018/05/02 15:14

遅い時間まで回答本当にありがとう御座います。 復旧状態がどれにせよ上で書いたエラーが発生してしまい復元が失敗してしまいます。 一度整理させていただくと 1.バックアップを一切とっていなかったDBで間違えてUPDATEを実行してしまいコミットまで実行済み(5/2 19時頃) 2.DBの完全バックアップを作成(トランザクションログのバックアップも同時に作成(.bak形式)) 3.ローカルPCに2の.bakファイルを復元(1の間違えてUPDATEした状態のテーブルが存在します。) 4..bakファイルからある特定のポイント(時間指定したい)までDBの復元させようとして、エラーが発生。 というような状況になっております。 間違えて流してしまったUPDATE文で更新されたデータは1000行近くありますが、更新してしまったのは1つのカラムのみなので、ログから解析なんてことも出来るかな...?と思ったのですがフリーソフトを入れてやってみましたがログを取得できず断念... やはり特定の日時までログファイルから戻せればよいのですが... 木になっていることは今までバックアップをとっていないのに過去の状態に戻せるのかが心配になってきています。。。
namiki_syou

2018/05/02 20:07

未だに復元出来ずじまいです。。。
tekka

2018/05/02 21:24

どうしてもダメなら1000人のお客様にゴメンナサイのメール送るとか、政治的に問題の解決を図るのも手ですよ。上司と相談してください。
namiki_syou

2018/05/02 22:09

お返事ありがとうございます。 既にお客様には謝罪のメールを入れました... たった一回のクエリがここまで問題になってしまうなんて... 今後気をつけたいと思います。 問題は未だに解決していませんので、知恵を貸していただける方がいれば幸いです。
namiki_syou

2018/05/02 23:09

やっぱり障害発生後に取得したバックアップから前の状態に戻せないっぽいですね・・・ 色々調べてみても直近の完全バックアップに対して、ログを反映させていくような使い方が多く解説されております。
sazi

2018/05/03 01:13

お疲れさまです。 復元は、「起点となるバックアップ+起点以降のトランザクション」なので、 「前回のバックアップ+今回のトランザクションログ」になります。 トランザクションのみでリバースして復元というのはできないので、一度もバックアップを取っていない場合は無理ですが。。。
namiki_syou

2018/05/03 01:40

おはようございます。返信ありがとうございます。 やはり起点となるバックアップが存在しないとトランザクションログがあっても復元は不可能ということですね。。。 無理やりにでも直せるのかなとLSNを無理やり上書きを行って過去分のトランザクションログの反映が出来るのかなーと思いましたが、かなり複雑で難航しております。。。。 復元という形ではなく別の方法でもいいので、何かヒントをいただけたらと思います。
guest

0

特定の時点にデータを戻すための有償ツールも、いくつかあるようです。
(おそらく内部的にはsaziさんの回答にあるような方法でデータを戻していると思われます)
試用もできるっぽいです(私は試していませんが)。

https://www.apexsql.com/sql_tools_log.aspx
http://www.vivouac.co.jp/sarasa/index.html

投稿2018/05/02 13:05

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namiki_syou

2018/05/02 13:11

ツールがあるということでその辺もいくつか調べてみようと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問