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

* Redmine の Wiki はバージョン管理されています。
* 最新は DB wiki_contents テーブルに格納されていて、通常はこれを参照。
* 旧バージョンは wiki_content_version テーブルにバージョン付きで移されて保存。
* Wikiを更新していくと、旧バージョンはどんどん蓄積されていくことになります。
:::note warn
差分を持っているのではありません。
:::
* 旧バージョンから復元が可能だが、ほとんど使わないでしょう。
* wiki_content_version は DB のかなりのスペースを占めているはずです。
* バックアップ＆リストアに無駄な時間・リソースを消費してしまいます。

# 履歴整理の手順

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

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

Redmine DB で下記 SQL を実行

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/dc9d097a-f656-46c8-e4e1-a6b08a0834c6.png)

# 更に詳しく

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

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

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/217cd75c-067b-c53d-c059-482e4f45a1d6.png)

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

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

# php のサンプル

* 履歴の数でSORTして多いもの100個を、プロジェクト、Wikiタイトル、履歴の数、テキストを表示します。

```php
<?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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/3294367f-7695-91ec-6ff3-30fcb6a2ead0.jpeg)