LoginSignup
2
1

Redmine Wiki 履歴を整理してDB軽量化

Last updated at Posted at 2023-02-14
  • Redmine の Wiki はバージョン管理されています。
  • 最新は DB wiki_contents テーブルに格納されていて、通常はこれを参照。
  • 旧バージョンは wiki_content_version テーブルにバージョン付きで移されて保存。
  • Wikiを更新していくと、旧バージョンはどんどん蓄積されていくことになります。

差分を持っているのではありません。

  • 旧バージョンから復元が可能だが、ほとんど使わないでしょう。
  • wiki_content_version は DB のかなりのスペースを占めているはずです。
  • バックアップ&リストアに無駄な時間・リソースを消費してしまいます。

履歴整理の手順

  1. Wiki ページ右上の「履歴」を押す
  2. 履歴ページが開く
  3. リストを一番下までダウン
  4. 右側の「削除」ボタンを押す
  5. よろしいですか → 「OK」を押す
  • 直近の2~3個を残して古いものは削除する

どの Wiki ページのバージョンがたくさんあるかの確認

Redmine DB で下記 SQL を実行

select page_id,count(page_id) from wiki_content_versions group by page_id order by count(page_id) DESC;

ページカウント(Wikiページのバージョンの数)が多いページの ID が上位に表示されます。
下記の例ではページID 2132 のWikiページの履歴(保存されたバージョン)が32個あります。(phpMyAdminで実施しています)

picture915-1.png

更に詳しく

どのプロジェクトのWikiなのかを調査するSQL の例

2024/1/15 SQLが間違っていたので修正しました

select 
			v.page_id as page_id,count(v.page_id) as count,wp.id,wiki_id,wp.title as wiki_title,
			w.project_id , p.name as project, p.identifier as proid, wc.text as text
	from 
			wiki_content_versions v,
			wiki_pages wp,
			wikis w,
			wiki_contents wc, 
			projects p
	where
			v.page_id = wp.id and
			wp.wiki_id = w.id and
			w.project_id = p.id and
			v.page_id = wc.page_id
			group by page_id,text order by count(page_id) DESC, project_id
			limit 100;

picture624-1.png

これで、Wikiページが属するプロジェクト、Wikiページのタイトルが判明しました。

この方法で、Wiki履歴が溜まっているページを調査。最新2~3の履歴以外を削除したところ。私の環境では Databaseの非圧縮バックアップのサイズが 1/3 になりました。

php のサンプル

  • 履歴の数でSORTして多いもの100個を、プロジェクト、Wikiタイトル、履歴の数、テキストを表示します。
<?php
if(!isset($_SESSION)){ session_start();}
$basedir = dirname(__FILE__) . '/..';
$webroot = $_SERVER['DOCUMENT_ROOT'];

 $db = new DB_ACCESS('redmine');
 $dbh = $db->connect();

 table_style();
 rm_WikiList_Header();

 $sql = "select 
			v.page_id as page_id,count(v.page_id) as count,wp.id,wiki_id,wp.title as wiki_title,
			w.project_id , p.name as project, p.identifier as proid, wc.text as text
	from 
			wiki_content_versions v,
			wiki_pages wp,
			wikis w,
			wiki_contents wc, 
			projects p
	where
			v.page_id = wp.id and
			wp.wiki_id = w.id and
			w.project_id = p.id and
			v.page_id = wc.page_id
			group by page_id,text order by count(page_id) DESC,
            project_id 
			limit 100";
				
   $stmt = $dbh ->prepare($sql);
   $stmt -> execute();

	while($table = $stmt -> fetch(PDO::FETCH_ASSOC)) {
			$table['text'] = substr($table['text'],3,100);
            $wikiRoot = 'http://url_address/redmine/projects/' . $table['proid'] . "/wiki/" . $table['wiki_title'] . "/history";
			rm_showWikiPageCountt($table,$wikiRoot);
    }
 $dbh = null;
//session_unset();
 end_table();
?>

$wikiRoot の URL は対象の Redmine の URL を指定してください。
表示を下記の様にすると Link をクリックすると直接対象 Wiki の履歴ページが開きます。

form.php
<?php
function  rm_WikiList_Header(){
?>
<table  class="table2" border="1" >
 <tr>
  <th width="20%" scope="col">プロジェクト</th>
  <th width="20%" scope="col">Wiki Title</th>
  <th width="8%" scope="col">履歴カウント</th> 
  <th width="52%" scope="col">テキスト</th> 
 </tr>

<?php
}

//
function rm_showWikiPageCount($table,$wikiRoot){
?>
 <tr>

      <td ><?php print($table['project']); ?> </td>
      <td bgcolor=snow><a href="<?php print($wikiRoot); ?> " target="_blank"><?php print($table['wiki_title']); ?> </td> 
	  <td  align="center"><?php print($table['count']); ?> </td>	  
      <td ><?php print($table['text']); ?> </td>

 </tr> 
<?php
}
?>

Wiki 構造

DB構造_Redmine-1.jpg

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1