削除してしまったチケットを復活させる。
スポンサーリンク
先日、チケットの編集中にボタンのアイコンを見間違えて、うっかり削除ボタンを押してしまった。
DB を覗いてみたら、見事に物理削除されてしまっている。。
けれども、以下のログファイルに今までの書き込みログが残っていたので、それを頼りにチケットを作り直した。
今回の復旧作業にあたって厄介だったのは、削除したチケットには親も子もいたということ。
親チケットは無事だったが、2枚あった子チケットは共に削除されてしまった。
結論から言うと、以下のような手順で復旧した。
- ログファイルを頼りに削除してしまったチケット(M)を作成し直す。
- 作り直したチケット(M)の子チケット(C)も作り直す。⇒M と C の親子関係ができる。
- phpMyAdmin で DB にアクセスし、redmine データベースの中にある issues テーブルを開く。
- 親チケット(P)と自チケット(M)、子チケット(C)に該当するレコードの以下のカラムの値を修正する。⇒P と M と C の親子孫関係ができる。
- parent_id
- root_id
- lft
- rgt
各カラムの値はこんな感じ。*2
id | parent_id | root_id | lft | rgt | |||
---|---|---|---|---|---|---|---|
親チケット(P) | 9 | (null) | 9 | 1 | 54 | ||
チケット(M) | 73 | 9 | 9 | 48 | 53 | ||
子チケット(C1) | 74 | 73 | 9 | 49 | 50 | ||
子チケット(C2) | 75 | 73 | 9 | 51 | 52 |
カラムの意味はこんな感じ。
- id:ID。チケット毎に一意な値。今回は修正対象外。
- parent_id:親チケットのID。
- root_id:親子関係の最上位に位置するチケットのID。
- lft, rgt:関係を式で説明すると以下のようになる。親が子を、子が孫を囲むようなイメージ。
- P の lft(1) < M の lft(48) < C1 の lft(49) < C1 の rgt(50) < C2 の lft(51) < C2 の rgt(52) < M の rgt(53) < P の rgt(54)
修正を間違えると、以下のようなエラーが出たりする。
- "activerecord, errors, models, issue, attributes, parent_issue_id, not_a_valid_parent"