https://redmine.tokyo/
https://redmine.tokyo/welcome/index/themes/redmine_tokyo_theme/favicon/favicon.ico?1665553863
2017-02-03T14:34:56Z
redmine.tokyo
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3366
2017-02-03T14:34:56Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3366/diff?detail_id=1852">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3367
2017-02-03T14:39:24Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3367/diff?detail_id=1853">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3368
2017-02-03T14:43:17Z
奈良 裕記
<ul></ul><a name="Redmineのチケット削除処理内容"></a>
<h3 >■Redmineのチケット削除処理内容<a href="#Redmineのチケット削除処理内容" class="wiki-anchor">¶</a></h3>
<p>ソースファイル/関連メソッド<br />destroyとdeleteで検索</p>
<p>app/helpers/issue_helper.rb<br />削除前の確認ダイアログ表示<br /> def issues_destroy_confirmation_message</p>
<p>app/views/issues/_action_menu.html.erb<br /><%= link_to l(:button_delete), issue_path(@issue), :data => {:confirm => issues_destroy_confirmation_message(@issue)}, :method => :delete, :class => 'icon icon-del' if @issue.deletable? %></p>
<p>app/views/context_menus/issues.html.erb<br /> <li><%= context_menu_link l(:button_delete), issues_path(:ids => @issue_ids, :back_url => @back),<br /> :method => :delete, :data => {:confirm => issues_destroy_confirmation_message(@issues)}, :class => 'icon-del', :disabled => @can[:delete] %></li></p>
<hr />
<p>app/controllers/issues_controller.rb</p>
<pre><code>親子関係、作業時間の処理<br /> def destroy<br /> @issues.each do |issue|<br /> begin<br /> issue.reload.destroy<br /> rescue ::ActiveRecord::RecordNotFound # raised by #reload if issue no longer exists
# nothing to do, issue was already deleted (eg. by a parent)<br /> end<br /> end</code></pre>
<hr />
<p>/app/models/issue.rb</p>
<pre><code>alias :base_reload :reload<br /> def reload(*args)<br /> @workflow_rule_by_attribute = nil<br /> @assignable_versions = nil<br /> @relations = nil<br /> @spent_hours = nil<br /> @total_spent_hours = nil<br /> @total_estimated_hours = nil<br /> base_reload(*args)<br /> end</code></pre>
<pre><code>after_destroy :update_parent_attributes<br /> 親チケットがある場合は進捗率を再計算</code></pre>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3369
2017-02-03T14:53:05Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3369/diff?detail_id=1854">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3370
2017-02-03T15:02:42Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3370/diff?detail_id=1855">差分</a>)</li><li><strong>ステータス</strong> を <i>新規</i> から <i>問合せ中</i> に変更</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3371
2017-02-03T16:02:17Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3371/diff?detail_id=1857">差分</a>)</li><li><strong>ステータス</strong> を <i>問合せ中</i> から <i>回答済</i> に変更</li><li><strong>対象バージョン</strong> を <i>設定変更対応</i> にセット</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=3372
2017-02-04T03:06:16Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/3372/diff?detail_id=1860">差分</a>)</li></ul><p>作業手順3が一番安全だな。。</p>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=5424
2018-06-12T21:00:19Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/5424/diff?detail_id=3300">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=5425
2018-06-12T21:08:13Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/5425/diff?detail_id=3301">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=5426
2018-06-12T21:10:41Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/5426/diff?detail_id=3302">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=7096
2019-10-05T10:31:38Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/7096/diff?detail_id=4590">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=7187
2019-10-13T18:04:04Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/7187/diff?detail_id=4675">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=7916
2020-05-16T17:47:32Z
奈良 裕記
<ul><li><strong>ファイル</strong> <a href="/attachments/535">redmine_dump_issueno.sh</a> <a class="icon-only icon-download" title="ダウンロード" href="/attachments/download/535/redmine_dump_issueno.sh">redmine_dump_issueno.sh</a> を追加</li></ul><a name="Redmineチケット誤削除時の復旧用SQL作成MysqlMariaDB対応"></a>
<h1 >■Redmineチケット誤削除時の復旧用SQL作成(Mysql/MariaDB対応)<a href="#Redmineチケット誤削除時の復旧用SQL作成MysqlMariaDB対応" class="wiki-anchor">¶</a></h1>
<a name="機能"></a>
<h2 >■機能<a href="#機能" class="wiki-anchor">¶</a></h2>
<p>Redmineでチケットを誤削除した時に、誤削除前の環境から削除したチケットのSQL情報を出力するシェルスクリプトです。<br />(誤削除前のDBバックアップが無いと役に立ちません)</p>
<a name="前提条件"></a>
<h2 >■前提条件<a href="#前提条件" class="wiki-anchor">¶</a></h2>
<p>下記を全て満たした場合に、自己責任で利用してください。<br />適用後に正常に動作しなくなっても対応できません。</p>
<a name="Linux環境にてmysqlmariadbでRedmineを運用していること動作環境にroot権限でアクセスできることDBに直接アクセスできること"></a>
<h3 >・Linux環境にて、mysql/mariadbでRedmineを運用していること。<br /> 動作環境にroot権限でアクセスできること。DBに直接アクセスできること。<a href="#Linux環境にてmysqlmariadbでRedmineを運用していること動作環境にroot権限でアクセスできることDBに直接アクセスできること" class="wiki-anchor">¶</a></h3>
<a name="チケット誤削除前のデータで正常に動作するバックアップ環境がありmysqldumpで直接アクセスできることdailyでsqlのdumpを出力しておく事を推奨"></a>
<h3 >・チケット誤削除前のデータで正常に動作するバックアップ環境があり、mysqldumpで直接アクセスできること。<br />(dailyでsqlのdumpを出力しておく事を推奨)<a href="#チケット誤削除前のデータで正常に動作するバックアップ環境がありmysqldumpで直接アクセスできることdailyでsqlのdumpを出力しておく事を推奨" class="wiki-anchor">¶</a></h3>
<a name="本スクリプトの出力をリストア先の環境に適用する前にリストア先環境でDBのフルバックアップを取得すること特に本番稼働環境の場合利用者へのアクセス更新停止連絡は必須"></a>
<h3 >・本スクリプトの出力をリストア先の環境に適用する前に、リストア先環境でDBのフルバックアップを取得すること。(特に本番稼働環境の場合、利用者へのアクセス/更新停止連絡は必須)<a href="#本スクリプトの出力をリストア先の環境に適用する前にリストア先環境でDBのフルバックアップを取得すること特に本番稼働環境の場合利用者へのアクセス更新停止連絡は必須" class="wiki-anchor">¶</a></h3>
<a name="SQLの基本的な処理内容が理解できていること"></a>
<h3 >・SQLの基本的な処理内容が理解できていること。<a href="#SQLの基本的な処理内容が理解できていること" class="wiki-anchor">¶</a></h3>
<a name="誤削除したチケットのIDが判っていること"></a>
<h3 >・誤削除したチケットのIDが判っていること。<a href="#誤削除したチケットのIDが判っていること" class="wiki-anchor">¶</a></h3>
<a name="作業手順"></a>
<h2 >■作業手順<a href="#作業手順" class="wiki-anchor">¶</a></h2>
<a name="誤削除環境と同等のバックアップ環境を立ち上げ誤削除前のDB内容を反映する"></a>
<h3 >・誤削除環境と同等のバックアップ環境を立ち上げ、誤削除前のDB内容を反映する。<a href="#誤削除環境と同等のバックアップ環境を立ち上げ誤削除前のDB内容を反映する" class="wiki-anchor">¶</a></h3>
<p> (稼働環境と同等のRedmineの環境に、誤削除前のRedmineのDBダンプ内容を取り込んで起動させる)</p>
<p> 実際には起動しなくとも良いが、内容確認のために、Redmine上で誤削除前のデータを参照出来る事を推奨</p>
<a name="スクリプトのコピーと実行権限設定"></a>
<h3 >スクリプトのコピーと実行権限設定<a href="#スクリプトのコピーと実行権限設定" class="wiki-anchor">¶</a></h3>
<p>バックアップ環境のワーク用フォルダに、本スクリプトをコピーする。</p>
<p>redmine_dump_issueno.sh</p>
<p>chmod +x で、実行権限を付ける。</p>
<p>作業用アカウントが、本フォルダ上に書き込める事が必要。</p>
<a name="スクリプトファイルのDBアクセス権限設定"></a>
<h3 >スクリプトファイルのDBアクセス権限設定<a href="#スクリプトファイルのDBアクセス権限設定" class="wiki-anchor">¶</a></h3>
<p>コピーしてきたスクリプトファイルを編集し、先頭の下記3つの行を実際の動作環境に合わせる。</p>
<pre>
database=redmine
username=redmine
password=pass-word1
</pre>
<p>実際の動作環境の設定値は、下記ファイルに記載されている。この内容を転記する。<br />但し、転記先のpasswordには、ダブルクオーテーションを含まないこと。</p>
<p>Redmineインストールパスの下、config/database.yml<br />(例: /var/lib/redmine/config/database.yml )</p>
<p>productionセクションの<br />database=redmine<br />username=redmine<br />password=pass-word1</p>
<a name="スクリプト実行しリストア用SQLファイルを作成する"></a>
<h3 >スクリプト実行し、リストア用SQLファイルを作成する<a href="#スクリプト実行しリストア用SQLファイルを作成する" class="wiki-anchor">¶</a></h3>
<p>誤削除したチケット番号を引数にしてスクリプトを実行する。<br />(以下は 1004 番のチケットを誤削除した場合)</p>
<pre><code>./redmine_dump_issueno.sh 1004</code></pre>
<p>当該チケットに関連するSQLのINSERT文のファイルが生成される。(INSERT_チケット番号.sql)</p>
<p>念のため、このSQLファイルの内容を確認する。<br />SQLのINSERT文が並んでいる筈。</p>
<p>指定した番号のチケット情報が存在した場合は、<br />そのINSERT_チケット番号.sqlのファイルとして生成し、ファイル名を表示する。<br />また、チケットに紐付けられた添付ファイル情報も表示される。</p>
<p>指定した番号のチケット情報が存在しなかった場合には、<br />その旨表示する。</p>
<a name="チケット復活対象RedmineのDBフルバックアップを作成する"></a>
<h3 >チケット復活対象RedmineのDBフルバックアップを作成する。<a href="#チケット復活対象RedmineのDBフルバックアップを作成する" class="wiki-anchor">¶</a></h3>
<p>誤動作時に復旧可能とするため、</p>
<p>mysqldump -u <span>username</span> -p%password% <span>database</span> > backup_redmine_日付日時.sql<br />sqlファイルが正常に生成されていることを確認する。<br />(バックアップが正常に生成できていない場合は、絶対に以下の作業を実施してはならない)</p>
<a name="本番環境のRedmine上に作成したSQLファイルを転送する"></a>
<h3 >本番環境のRedmine上に、作成したSQLファイルを転送する。<a href="#本番環境のRedmine上に作成したSQLファイルを転送する" class="wiki-anchor">¶</a></h3>
<p>作成したSQLファイルを、SCPなどで復活対象のRedmineに転送する。</p>
<a name="本番環境のRedmine上で転送したSQLファイルを実行するDBのバックアップを必ず作成する"></a>
<h3 >本番環境のRedmine上で、転送したSQLファイルを実行する。DBのバックアップを必ず作成する。<a href="#本番環境のRedmine上で転送したSQLファイルを実行するDBのバックアップを必ず作成する" class="wiki-anchor">¶</a></h3>
<p>mysql -u <span>username</span> -p%password% %database < 誤削除したチケット番号.sql</p>
<a name="チケット親子関係の修復"></a>
<h3 >チケット親子関係の修復<a href="#チケット親子関係の修復" class="wiki-anchor">¶</a></h3>
<p>チケットの親子関係を利用している場合は、階層構造を再構築する必要がある。<br />Redmineのインストールフォルダに移動し下記実行する。</p>
<p>RAILS_ENV=production rails runner 'Issue.rebuild_tree!'</p>
<p>systemctl restart httpd</p>
<a name="添付ファイルを戻す"></a>
<h3 >添付ファイルを戻す。<a href="#添付ファイルを戻す" class="wiki-anchor">¶</a></h3>
<p>チケットに紐付けられた添付ファイルが無かった場合は作業無し<br />添付ファイルが存在する場合は、バックアップサーバからコピーする。</p>
<p>Redmine3.4以降の場合、削除したチケットの添付ファイルが残っている場合がある。(正常動作)<br />この場合は、残っていた添付ファイルをそのまま利用して構わない。</p>
<p>/* Redmine3.4で追加された、ファイル単位の重複排除機能が原因と思われる。<br /> <a class="external" href="https://www.redmine.org/issues/25215">https://www.redmine.org/issues/25215</a><br />*/</p>
<p>attachmentsテーブル</p>
<p>2020/05/16なら、<br />2005/16時分..ファイル名となる。</p>
<pre>
MariaDB [redmine]> select disk_filename from attachments where container_id=61295;
+-----------------------------------------------+
| disk_filename |
+-----------------------------------------------+
| 200127231549_clipboard-202001272315-xfzke.png |
+-----------------------------------------------+
1 row in set (0.000 sec)
# ls -al /var/lib/redmine/files/2020/01
-rw-r--r-- 1 apache apache 70663 Jan 27 23:15 200127231549_clipboard-202001272315-xfzke.png
</pre>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=8044
2020-06-21T06:00:32Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/8044/diff?detail_id=5335">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=8045
2020-06-21T06:15:45Z
奈良 裕記
<ul><li><strong>題名</strong> を <i>誤削除したチケットを復活したい</i> から <i>誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)</i> に変更</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=8053
2020-06-22T10:42:59Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/8053/diff?detail_id=5341">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=8787
2021-04-25T18:23:25Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/8787/diff?detail_id=5980">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=9472
2021-11-07T07:01:48Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/9472/diff?detail_id=6573">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=9620
2022-02-19T11:57:11Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/9620/diff?detail_id=6695">差分</a>)</li></ul>
Unofficial Redmine Cooking - QA #297: 誤削除したチケットを復活したい(バックアップからのチケット復旧用スクリプト有)
https://redmine.tokyo/issues/297?journal_id=9965
2022-10-07T13:22:12Z
奈良 裕記
<ul><li><strong>説明</strong> を更新 (<a title="差分を表示" href="/journals/9965/diff?detail_id=6998">差分</a>)</li></ul>