目次
- 1 Windows10 PC間で Redmine のプロジェクトとチケットを引っ越す方法
- 2 作業条件
- 3 作業の基本的な考え方
- 4 Redmine が利用している mySQL のユーザー名とパスワードの確認
- 5 Redmine 用データベースの SQL ファイル localhost.sql へのエクスポート
- 6 Cygwin を使った Redmine のテーブル削除用 SQL ファイル drop.sql の作成
- 7 Redmine のサービス停止
- 8 SQL ファイル drop.sql localhost.sql の Redmine 用データベースへのインポート
- 9 Redmine のサービス再開
- 10 Redmine へのログイン プロジェクトとチケットの移行確認
- 11 まとめ
Windows10 PC間で Redmine のプロジェクトとチケットを引っ越す方法
この記事では Redmine(注1) が内部で使用しているMySQL Database(注2) の phpMyAdmin(注3) 内のエクスポート機能、インポート機能、Cygwin(注4)内の 各種コマンドを利用して、新旧の Windows 10 搭載 PC間で Bitnami Redmine 上に構築されたプロジェクトとチケットを引っ越す方法を紹介します。
この記事が読者の方に少しでもお役に立てれば幸いです。
(注1) Redmineはオープンソースのプロジェクト管理ソフトの一つで、複数のメンバ間での共同プロジェクトにおける進捗管理や情報共有が可能なシステムです。基本的な操作や管理はWebブラウザを通じて行なうことができます。また Bitnami 社から無料で Bitnami Redmine という実行環境が無償公開されており入手も容易です。本記事中の全ての Redmine という表現は Bitnami Redmine を指します。
(注2) Redmine はプロジェクト、チケットといったオブジェクトを ‘MySQL Database‘ で管理しています。 Redmine Stack Manager Tool という管理用アプリの Manage Server タグを開くと Redmine が ‘MySQL Database‘、 ‘Apache Web Server‘、 ‘Thin_redmine‘、 ‘Thin_redmine2‘ という4つのサーバ機能から構成されていることが確認できます。
(注3) phpMyAdmin は Redmine Stack Manager Tool から起動可能な MySQL Databese 専用の Web型の管理アプリケーションです。 Redmine Stack Manager Tool の ‘Open phpMyAdmin‘ ボタンをクリックすると
以下の画面が現れ、ここから phpMyAdmin にログインして mySQL Database を直接操作できます。
(注4) Cygwin は Windows環境下で UNIX/Linux 風のコマンド、環境を利用可能とするためにWindows 上にUNIX互換OSをエミュレートするためのライブラリ「cygwin1.dll」や Windows 環境下でコンパイルされたツール群を配置することで bash、sed、grep、awkといった通常 UNIX/Linux で利用可能な便利なツールを Windows 環境下の下記ターミナル画面からも利用可能にしています。
Cygwin のインストール方法、基本的なコマンド、そして標準入出力・リダイレクション・パイプといった UNIX/Linux 環境下でコマンドをより便利に使うための重要な考え方については以下のような素晴らしい記事が公開されていますので必要に応じてこれらの記事を参照頂ください。
作業条件
ここで紹介するWindows10PC間で Redmine のプロジェクトとチケットを引っ越す方法は以下の作業条件で実施しています。
特に Redmine が内部で利用している mySQL Database 内のテーブル差分による移行の失敗を避けるため 新PCにインストールする Redmine のバーションは旧PCと同じにしています。
新Windows10PC | 旧Windows10PC | |
---|---|---|
OS | Windows 10 Pro | Windows 10 Pro |
Redmine | Bitnami Redmine 4.1.2 をインストール済 | Bitnami Redmine 4.1.2 をインストール済 |
Cygwin | 条件なし | CPUのビット数(32ビット/64ビット )に応じたCygwinがインストール済 |
ネットワーク | 新旧PCが同一ネットワークに収容され相互にファイル転送可能 |
Bitnami Redmine のインストール方法については必要に応じて
を参照下さい。
作業の基本的な考え方
ここまでご紹介してきたように Redmine はプロジェクトとチケットの管理を mySQL Database で行っていますが、何度かエクスポート、インポートの試行を行う中で引っ越しに当たっての前提条件をデータベース的観点で整理すると以下のようになっています。
新Windows10PC内 mySQL Database |
旧Windows10PC内 |
|
Redmine 用データベース定義 | 作成済 | 作成済 |
Redmine 用各種テーブル(プロジェクト、チケット等)定義 | 作成済 | 作成済 |
Redmine 用各種テーブル(プロジェクト、チケット等)への実レコード挿入状態 | 未挿入 | 挿入済 |
つまり新旧Windows10PC内の Redmine を構成する mySQL Database 間で Redmine 用各種テーブル(プロジェクト、チケット等)への実レコードの引っ越しを実施するためには以下の3つのオプションがあり1番目、2番目、3番目と手間が増えていきます。
- 新Windows10PC内の mySQL Database において Redmine 用データベース定義配下の、各種テーブル(プロジェクト、チケット等)定義をそのままに、旧Windows10PCでエクスポートしたSQLファイルをそのまま新Windows10PCでインポートする
- 新Windows10PC内の mySQL Database から Redmine 用データベース定義配下の、各種テーブル(プロジェクト、チケット等)定義を全て削除し、旧Windows10PCでエクスポートしたSQLファイルをそのまま新Windows10PCでインポートする
- 新Windows10PC内の mySQL Database から Redmine 用データベース定義、各種テーブル(プロジェクト、チケット等)定義を全て削除し、旧Windows10PCでエクスポートしたSQLファイルをそのまま新Windows10PCでインポートする
ただ1番目のオプションは新Windows10PCで SQLのインポートの際に非常に多くのエラーが表示され、うまく引っ越しができなかったのでこの記事では2番目のオプションによる手順をご紹介します。
本手順により旧PCから新PCへ Redmine を構成する mySQL Database 間で Redmine 用各種テーブル(プロジェクト、チケット等)への実レコードの引っ越しを実施すると新PC内の Redmine 用 mySQL Database 内のデータは全て消失しますのでこの引っ越しは新PC内でRedmineの運用開始前に実施することをお勧めします。 またこの記事はデータベースの引っ越しの完全な動作保証するものではありませんので、作業は自己責任で実施をお願いします。 |
具体的には
項番 | 作業PC | 作業内容 | |
---|---|---|---|
旧PC | 新PC | ||
1 | 〇 | 〇 |
Redmine が利用している mySQLのユーザー名とパスワードの確認 |
2 | 〇 |
Redmine用データベースのSQLファイル localhost.sql へのエクスポート |
|
3 | 〇 |
Cygwin を使った Redmine のテーブル削除用SQLファイル drop.sql の作成 |
|
4 | 〇 | Redmine のサービス停止 | |
5 | 〇 |
SQL ファイル drop.sql localhost.sql の Redmine 用データベースへのインポート |
|
6 | 〇 |
Redmine のサービス再開 |
|
7 | 〇 |
Redmine へのログイン、プロジェクト、チケットの移行確認 |
Redmine が利用している mySQL のユーザー名とパスワードの確認
まず最初に Redmine が内部で mySQL との接続に使用しているアカウント名、パスワードを確認します。 Bitnami RedmineRedmine の バージョン 4.1.2をインストールした場合、例えば以下のファイル内にこれらが記述されています。
C:(Bitnami Redmine のインストールフォルダ)\Bitnami\redmine-4.1.2-1\apps\redmine\htdocs\config\database.yml
このファイルの先頭部分の数行は例えば
production: |
となっていますので、ここから Redmine が mySQL サーバにアクセスする際の username 、 password を確認します。
この password 部分は Bitnami Redmine のインストールの際に自動生成されており、一般に対象PC毎に異なっているようなので、個々のPCごとに確認が必要です。
Redmine 用データベースの SQL ファイル localhost.sql へのエクスポート
まず旧PCで mySQL の phpMyAdmin アプリヘ項番1で調べたアカウント名、パスワードでログインします。
すると画面の左側にこの mySQL Database が管理しているデータベースの一覧が現れます。この中の ‘bitnami_redmine‘ が Redmine 用に定義されたデータメース名です。
ここでこの ‘bitnami_redmine‘ の左側の ‘+‘ をクリックして展開すると
のように ‘bitnami_redmine‘ 配下に定義された ‘ar_internal_metadata‘ から始まる全56種類のテーブル定義が表示されます(各テーブルの具体的な役割、テーブル構成等については調査していません)。
そしてこの状態で、メニュー画面にある ‘エクスポート’ をクリックするとこの ’bitnami_redmine‘
続いてフォーマットが’SQL‘であることを確認し画面右下の’実行‘ボタンをクリックすると
%USERPROFILE%\Downloads
配下に ‘localhost.sql‘ というファイルが保存されます。%USERPROFILE% については必要に応じて
を参照して下さい。
Cygwin を使った Redmine のテーブル削除用 SQL ファイル drop.sql の作成
SQL ファイル localhost.sql を Cygwin 環境へコピー
Redmine のテーブル削除用SQLファイルの作成を目的としてまず ‘localhost.sql‘ を旧PC内にインストール済の Cygwin環境ヘコピーします。具体的には
C:(Cygwinインストールフォルダ名)\cygwin64\home\(アカウント名)
例えば
C:\cygwin64\home\devel
にファイルをコピーします。
SQL ファイル localhost.sql の内容確認
とCygwinのホームディレクトリでこのファイルを以下のように参照可能です。
$ head -50 localhost.sql
-- phpMyAdmin SQL Dump
-- version 5.1.0
-- https://www.phpmyadmin.net/
--
-- ホスト: localhost:3306
-- 生成日時: 2022-03-16 21:59:00
-- サーバのバージョン: 5.7.33
-- PHP のバージョン: 7.4.16
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- データベース: `bitnami_redmine`
--
CREATE DATABASE IF NOT EXISTS `bitnami_redmine` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `bitnami_redmine`;
-- --------------------------------------------------------
--
-- テーブルの構造 `ar_internal_metadata`
--
CREATE TABLE `ar_internal_metadata` (
`key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`value` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- テーブルのデータのダンプ `ar_internal_metadata`
--
INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES
('environment', 'production', '2021-03-28 13:35:41', '2021-03-28 13:35:41');
-- --------------------------------------------------------
--
-- テーブルの構造 `attachments`
--
$ wc localhost.sql
3597 28739 412677 localhost.sql
ここで1行目の ‘head -50 localhost.sql’ というコマンドは UNIX/linux のコマンドで localhost.sql の先頭の50行を表示するコマンドです。
また53行目の ‘wc localhost.sql’ により この ‘localhost.sql’ が 3597行もあり、手動で編集するのはなかなか大変なファイルであることもわかります。
また、この 内容からこのファイル中の例えば33行から38行までの CREATE TABLE `ar_internal_metadata` (
~
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
で’ar_internal_metadata‘テーブルを生成(定義)し、
44行から45行までの INSERT INTO `ar_internal_metadata` (
~
);
でその ‘ar_internal_metadata‘ テーブル にレコードを挿入する構造になっていることが見て取れます。
ここから ‘localhost.sql‘ から ‘CREATE‘、’TABLE‘ という2つのキーワードを含む行を抽出すればこの ‘bitnami_redmine‘ データベース内に定義されたテーブル名の抽出が可能であることが予想できます。
$ cat localhost.sql | grep TABLE | grep CREATE
CREATE TABLE `ar_internal_metadata` (
CREATE TABLE `attachments` (
CREATE TABLE `auth_sources` (
CREATE TABLE `boards` (
CREATE TABLE `changes` (
CREATE TABLE `changesets` (
CREATE TABLE `changesets_issues` (
CREATE TABLE `changeset_parents` (
CREATE TABLE `comments` (
CREATE TABLE `custom_fields` (
CREATE TABLE `custom_fields_projects` (
CREATE TABLE `custom_fields_roles` (
CREATE TABLE `custom_fields_trackers` (
CREATE TABLE `custom_field_enumerations` (
CREATE TABLE `custom_values` (
CREATE TABLE `documents` (
CREATE TABLE `email_addresses` (
CREATE TABLE `enabled_modules` (
CREATE TABLE `enumerations` (
CREATE TABLE `groups_users` (
CREATE TABLE `imports` (
CREATE TABLE `import_items` (
CREATE TABLE `issues` (
CREATE TABLE `issue_categories` (
CREATE TABLE `issue_relations` (
CREATE TABLE `issue_statuses` (
CREATE TABLE `journals` (
CREATE TABLE `journal_details` (
CREATE TABLE `members` (
CREATE TABLE `member_roles` (
CREATE TABLE `messages` (
CREATE TABLE `news` (
CREATE TABLE `open_id_authentication_associations` (
CREATE TABLE `open_id_authentication_nonces` (
CREATE TABLE `projects` (
CREATE TABLE `projects_trackers` (
CREATE TABLE `queries` (
CREATE TABLE `queries_roles` (
CREATE TABLE `repositories` (
CREATE TABLE `roles` (
CREATE TABLE `roles_managed_roles` (
CREATE TABLE `schema_migrations` (
CREATE TABLE `settings` (
CREATE TABLE `time_entries` (
CREATE TABLE `tokens` (
CREATE TABLE `trackers` (
CREATE TABLE `users` (
CREATE TABLE `user_preferences` (
CREATE TABLE `versions` (
CREATE TABLE `watchers` (
CREATE TABLE `wikis` (
CREATE TABLE `wiki_contents` (
CREATE TABLE `wiki_content_versions` (
CREATE TABLE `wiki_pages` (
CREATE TABLE `wiki_redirects` (
CREATE TABLE `workflows` (
$ cat localhost.sql | grep TABLE | grep CREATE | wc
56 224 1722
この1行目の ‘cat localhost.sql | grep TABLE | grep CREATE
‘ はこれを実現するためのコマンドで
- ‘cat localhost.sql‘ は localhost.sql を標準出力(=画面)に出力するコマンド
- ‘|‘ は前のコマンドの結果(=標準入力)を次のコマンドの入力とするオペレータ(UNIX/Linuxの世界ではパイプと呼ばれます)
- ‘grep TABLE’ は パイプからの入力のうち’TABLE’という文字列を含む行のみを出力するコマンド
- 同様に ‘grep CREATE‘ も パイプからの入力のうち’CREATE’という文字列を含む行のみを出力するコマンド
であり、これらを組み合わせて使用しています。
また59行目の ‘cat localhost.sql | grep TABLE | grep CREATE | wc‘ は1行目のコマンド出力結果をさらにパイプ ‘|‘ でつなぎ
- ‘wc‘ は行数等を求めるコマンド
でこの行数(=つまりこの ‘bitnami_redmine‘ データベース内に定義されたテーブル数)が56個あることが分かります。
Redmine のテーブル削除用 SQL ファイル drop.sql の作成
続いてRedmineのテーブル削除用SQLファイル drop.sql を作成しましょう。
まず SQL の文法では、テーブルの削除は
DROP TABLE `テーブル名` ;
で行います。
ただこれまでに見たように ‘bitnami_redmine‘ データベース内に定義されたテーブル数は56個もあるのでスクリプティング言語/ツール awk を使ってこれを行います。具体的には以下のように行います。
$ cat localhost.sql | grep TABLE | grep CREATE | awk '{ printf("DROP TABLE %s ;\n",$3) }' >drop.sql
$ cat drop.sql
DROP TABLE `ar_internal_metadata` ;
DROP TABLE `attachments` ;
DROP TABLE `auth_sources` ;
DROP TABLE `boards` ;
DROP TABLE `changes` ;
DROP TABLE `changesets` ;
DROP TABLE `changesets_issues` ;
DROP TABLE `changeset_parents` ;
DROP TABLE `comments` ;
DROP TABLE `custom_fields` ;
DROP TABLE `custom_fields_projects` ;
DROP TABLE `custom_fields_roles` ;
DROP TABLE `custom_fields_trackers` ;
DROP TABLE `custom_field_enumerations` ;
DROP TABLE `custom_values` ;
DROP TABLE `documents` ;
DROP TABLE `email_addresses` ;
DROP TABLE `enabled_modules` ;
DROP TABLE `enumerations` ;
DROP TABLE `groups_users` ;
DROP TABLE `imports` ;
DROP TABLE `import_items` ;
DROP TABLE `issues` ;
DROP TABLE `issue_categories` ;
DROP TABLE `issue_relations` ;
DROP TABLE `issue_statuses` ;
DROP TABLE `journals` ;
DROP TABLE `journal_details` ;
DROP TABLE `members` ;
DROP TABLE `member_roles` ;
DROP TABLE `messages` ;
DROP TABLE `news` ;
DROP TABLE `open_id_authentication_associations` ;
DROP TABLE `open_id_authentication_nonces` ;
DROP TABLE `projects` ;
DROP TABLE `projects_trackers` ;
DROP TABLE `queries` ;
DROP TABLE `queries_roles` ;
DROP TABLE `repositories` ;
DROP TABLE `roles` ;
DROP TABLE `roles_managed_roles` ;
DROP TABLE `schema_migrations` ;
DROP TABLE `settings` ;
DROP TABLE `time_entries` ;
DROP TABLE `tokens` ;
DROP TABLE `trackers` ;
DROP TABLE `users` ;
DROP TABLE `user_preferences` ;
DROP TABLE `versions` ;
DROP TABLE `watchers` ;
DROP TABLE `wikis` ;
DROP TABLE `wiki_contents` ;
DROP TABLE `wiki_content_versions` ;
DROP TABLE `wiki_pages` ;
DROP TABLE `wiki_redirects` ;
DROP TABLE `workflows` ;
この1行目の cat localhost.sql | grep TABLE | grep CREATE | awk ‘{ printf(“DROP TABLE %s ;\n“,$3) }’ >drop.sql というコマンドでは先ほどまでのコマンドの出力をパイプでつないで、新たに
- awk ‘{ printf(“DROP TABLE %s ;\n“,$3) }’ というコマンドで標準入力からの入力に対し、行をスペースで区分したときの3番目のフィールド(例えば入力行が “CREATE TABLE `ar_internal_metadata` (” の場合は1番目が”CREATE”、2番目が”TABLE”、3番目が”`ar_internal_metadata`”、4番目が”(“と数えるので3番目の `ar_internal_metadata`) 元に printf 関数の表示フォーマット%s(つまり文字列表示する)を使って “DROP TABLE `ar_internal_metadata` ;\n” という文字列を出力する(“\n”は改行コード)
- その結果をさらに”>”オペレータを使ってファイルに出力する
ということを行っています。
その結果、3行目の cat drop.sql コマンドの結果として4行目から59行目に表示されたSQLファイル drop.sql が作成できたことが確認できました。
SQL ファイル drop.sql localhost.sql の新PCへの転送
ここまでの作業で旧PC内に
- Redmineの mySQL から 削除用のクエリの入った drop.sql
- 旧PCの Redmineの mySQL からエクスポートした localhost.sql
の2つのSQLファイルができていますので、これを新PCの所定のフォルダ(本記事では %USERPROFILE%\Downloads)に転送します。
Redmine のサービス停止
2つのSQLファイルの新PC側の Redhat にインポートするためには、まず新PC内で実行中の全ての Redmine 関連サービスを Redmine Stack Manager の Manage Service 画面下の ‘Stop All’ ボタンをクリックして停止します。
SQL ファイル drop.sql localhost.sql の Redmine 用データベースへのインポート
続いて新PCので mySQL の phpMyAdmin アプリヘ先ほど調べた新PC用アカウント名、パスワードでログインします。
続いて phpMyAdmin 上部のメニューで ‘インポート’をクリックし
‘現在のサーバへのインポート‘ 画面で画面中段の ‘ファイルを選択‘ ボタンをクリックし
Windows の標準ファイル選択ダイアログから drop.sql を選択すると
画面が遷移し、選択したファイル名が画面上に表示されるので、間違いがないことを確認して画面右下の ‘実行‘ボタンを押します。
続いてこのインポート操作を同様に localhost.sql に対しても実施しSQLのインポート作業は終了です。
Redmine のサービス再開
最後に新PC側で 全ての Redmine関連サービスを Redmine Stack Manager の Manage Service 画面下の ‘Start All‘ ボタンをクリックして実行再開します。
Redmine へのログイン プロジェクトとチケットの移行確認
最後に新PCで Redmine ヘ旧PCで登録したユーザー名、パスワードでログインし、以下のように表示されるプロジェクト、チケットが旧PCでのそれと同じであることを確認できたらこの引っ越し作業は完了です。
まとめ
本記事では Redmine が内部で使用しているMySQL Database の phpMyAdmin 内のエクスポート機能、インポート機能、Cygwin内の 各種コマンドを利用して、新旧の Windows 10 搭載 PC間で Bitnami Redmine 上に構築されたプロジェクトとチケットを引っ越す方法を紹介しました。
この記事が読者の方に少しでもお役に立てれば幸いです。