Redmineの誤って削除したチケットをバックアップから復活させた話

参考

基本的にここの記事の通りです。

http://daily-postit.blogspot.jp/2012/12/blog-post.html

前提

DBもファイルもバックアップを残してあること。

手順

ステップは2つ

  • データの復旧
  • ファイルの復旧

データの復旧

復旧するデータのあるテーブル

issues
journals
journal_details
watchers
attachments
issue_relations
custom_values

追記:custom_values が抜けてた。以下のSQLは追記済。

SQL的にはこんな感じ。

select * from issues where id = 4987;
select * from journals where journalized_id = 4987;
select jd.* from journal_details jd INNER JOIN journals j ON journal_id = j.id where journalized_id = 4987;
select * from watchers where watchable_id = 4987;
select * from attachments where container_id=4987;
select * from issue_relations where issue_from_id=4987 OR issue_to_id=4987;
select * from custom_values where customized_id=4987;

実行したコマンド

こんな感じ。シェルスクリプトにすれば再利用できるんじゃないかな!再利用する場面に遭遇したくないけど!!

Export

mkdir /tmp/201309
cd /tmp/201309
mysql -u root -D redmine_20130911_temp -e'select * from issues where id = 4987;' > issues.tsv
mysql -u root -D redmine_20130911_temp -e'select * from journals where journalized_id = 4987;' > journals.tsv
mysql -u root -D redmine_20130911_temp -e'select jd.* from journal_details jd INNER JOIN journals j ON journal_id = j.id where journalized_id = 4987;' > journal_details.tsv
mysql -u root -D redmine_20130911_temp -e'select * from watchers where watchable_id = 4987;' > watchers.tsv
mysql -u root -D redmine_20130911_temp -e'select * from attachments where container_id=4987;' > attachments.tsv
mysql -u root -D redmine_20130911_temp -e'select * from issue_relations where issue_from_id=4987 OR issue_to_id=4987;' > issue_relations.tsv
mysql -u root -D redmine_20130911_temp -e'select * from custom_values where customized_id=4987;' > custom_values.tsv

Import

/tmp/201309/のファイルからINFILEしているのは、mysqlユーザーからファイルにアクセスできる必要があるため。

mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/issues.tsv' INTO TABLE issues IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/journals.tsv' INTO TABLE journals IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/journal_details.tsv' INTO TABLE journal_details IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/watchers.tsv' INTO TABLE watchers IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/attachments.tsv' INTO TABLE attachments IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/issue_relations.tsv' INTO TABLE issue_relations IGNORE 1 LINES;"
mysql -u root -D redmine_db -e"LOAD DATA INFILE '/tmp/201309/custom_values.tsv' INTO TABLE custom_values IGNORE 1 LINES;"

ファイルの復旧

ファイル名を調べる。

mysql> select disk_directory, disk_filename from attachments where container_id=4987;
+----------------+----------------------------------------------------+
| disk_directory | disk_filename                                      |
+----------------+----------------------------------------------------+
| 2013/08        | 130805171804_01_init.sql                           |
| 2013/08        | 130805203239_d8d397a2800db492580e9f034275dab1.xls  |
| 2013/08        | 130806142525_fc0be408d4ccbf8d79b9617874e85a6e.xlsx |
| 2013/08        | 130809181036_02_create_view.sql                    |
| 2013/08        | 130820112759_mail.sql                              |
| 2013/09        | 130903194816_fc0be408d4ccbf8d79b9617874e85a6e.xlsx |
+----------------+----------------------------------------------------+

あとはバックアップしておいたファイルから、filesディレクトリにコピーすればOK.

sudo cp -p opt/redmine/files/2013/08/130805171804_01_init.sql /opt/redmine/files/2013/08/
sudo cp -p opt/redmine/files/2013/08/130805203239_d8d397a2800db492580e9f034275dab1.xls /opt/redmine/files/2013/08/
sudo cp -p opt/redmine/files/2013/08/130806142525_fc0be408d4ccbf8d79b9617874e85a6e.xlsx /opt/redmine/files/2013/08/
sudo cp -p opt/redmine/files/2013/08/130809181036_02_create_view.sql /opt/redmine/files/2013/08/
sudo cp -p opt/redmine/files/2013/08/130820112759_mail.sql /opt/redmine/files/2013/08/
sudo cp -p opt/redmine/files/2013/08/130903194816_fc0be408d4ccbf8d79b9617874e85a6e.xlsx /opt/redmine/files/2013/08/

復旧後のトラブル

なにが原因か不明だけど、復旧作業の翌日にチケットを新規発行したら、チケットのidが昨日まで5000くらいだったのが、いきないり13000とかに!

思い出した!issuesにLOAD DATA INFILEのクエリー投げるときに、間違えて違うtsvを食わせちゃったんだ。自分が原因でよかった。

issuesテーブルみたら、idが飛び飛びになって、なんか変なデータが20行くらい増えてる。 手動でいらないレコード消してissuesテーブルのauto_increment直して解決させたけど、イリーガルなことしたらDB含めて全体をリスタートするとかしたほうが良さげ。