参考
基本的にここの記事の通りです。
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含めて全体をリスタートするとかしたほうが良さげ。