00_infoScoop移行手順書(Ora2Pg)
No

概要

対象ユーザ

1

前提条件

--

2

Perl及び関連モジュールインス
トール

Oracle Databaseサーバ

root

3

環境変数設定Oracle Databaseサーバ

root

4

5

DBD::Oracleインストール

Ora2Pgインストール

Oracle Databaseサーバ

Oracle Databaseサーバ

root

root

コマンド
本手順は下記を前提として記載しています。
1. Oracle Databaseサーバ上でinfoScoopが動作していること
2. PostgreSQLサーバにPostgreSQL 9.4が導入されていること

確認 （確認コマンド等）-# yum install perl perl-CPAN perl-DBI perl-Time-HiResperl-DBI perl-Time-HiRes# yum list installed perl perl-CPAN perl-DBI perl-Time-HiResperl-DBI perl-Time-HiRes[省略]
インストール済みパッケージ
perl.x86_64
4:5.10.1-136.el6_6.1@updates
perl-CPAN.x86_64
1.9402-136.el6_6.1@updates
perl-DBI.x86_64
1.609-4.el6@baseperl-Time-HiRes.x86_64
4:1.9721-136.el6_6.1@updates# export ORACLE_HOME=[Oracleインストール時に指定したパス]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib# echo ${ORACLE_HOME}/u01/app/oracle/product/11.2.0/xe# echo ${LD_LIBRARY_PATH}:/u01/app/oracle/product/11.2.0/xe/lib# perl -MCPAN -e shellcpan> get DBD::Oracle
cpan> quit
# cd ~/.cpan/build/DBD-Oracle*# perl Makefile.PL# make# make install-

Ora2Pgは下記URLよりダウンロードして下さい。
http://sourceforge.net/projects/ora2pg/files/?source=navbar# ora2pg -v
Ora2Pg v13.0

備考# cd /usr/local/src# tar jxf ora2pg-13.0.tar.bz2# cd ora2pg-13.0# perl Makefile.PL# make && make install# vi /etc/ora2pg/ora2pg.conf

6789

Ora2Pg設定ファイルの修正

Oracleへの接続確認

移行テーブル確認

型変換対応の確認

Oracle Databaseサーバ

Oracle Databaseサーバ

Oracle Databaseサーバ

Oracle Databaseサーバ

root[下記を修正]ORACLE_HOMEORACLE_DSN
ORACLE_USER
ORACLE_PWD
SCHEMA/u01/app/oracle/product/11.2.0/xe
dbi:Oracle:host=localhost;sid=XE[ユーザ名][パスワード][スキーマ名]# ora2pg -c ora2pg.conf -t SHOW_VERSION# ora2pg -c ora2pg.conf -t SHOW_VERSION
Oracle Database 11g Release 11.2.0.1.0## ora2pg -c ora2pg.conf -n SCOTT -t SHOW_TABLE[1] TABLE DATABASECHANGELOG (1 rows)[2] TABLE DATABASECHANGELOGLOCK (1 rows)[3] TABLE IS_ACCESSLOGS (1 rows)[4] TABLE IS_ACCOUNTS (1 rows)[5] TABLE IS_ADMINROLES (1 rows)[6] TABLE IS_AUTHCREDENTIALS (1 rows)[省略]

スキーマ一覧を確認する場合は以下コマンドを実行。
# ora2pg -c ora2pg.conf -t SHOW_SCHEMASCHEMA APEX_030200
SCHEMA APPQOSSYSSCHEMA ORDDATASCHEMA OWBSYSSCHEMA SCOTTrootora2pg -c /etc/ora2pg/ora2pg.conf -t SHOW_TABLEroot# ora2pg -c /etc/ora2pg/ora2pg.conf -t SHOW_COLUMN# ora2pg -c ora2pg.conf -n SCOTT -t SHOW_COLUMN[1] TABLE DATABASECHANGELOG (1 rows)
ID : VARCHAR2(63) => varchar(63)
AUTHOR : VARCHAR2(63) => varchar(63)FILENAME : VARCHAR2(200) => varchar(200)DATEEXECUTED : TIMESTAMP(6)(11) => timestamp
ORDEREXECUTED : NUMBER(22) => bigint
EXECTYPE : VARCHAR2(10) => varchar(10)MD5SUM : VARCHAR2(35) => varchar(35)DESCRIPTION : VARCHAR2(255) => varchar(255)
COMMENTS : VARCHAR2(255) => varchar(255)
TAG : VARCHAR2(255) => varchar(255)
LIQUIBASE : VARCHAR2(20) => varchar(20) NUMBER(22) => bigint[省略]# ora2pg -c /etc/ora2pg/ora2pg.conf -t TABLE -o /backup/postgres/postgres_schema.sql[=>] 2/44 tables (4.5%) scanning table DATABASECHANGELOG[=>[=>] 3/44 tables (6.8%) scanning table IS_ACCESSLOGS# head -n 10 /backup/postgres/postgres_schema.sql--] Generated by Ora2Pg, the Oracle database Schema converter, version 13.0-- Copyright 2000-2014 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=localhost;sid=XE

root[========================>] 44/44 tables (100.0%) end of table export.
10 Ora2Pgによるスキーマ抽出Oracle Databaseサーバ

SET client_encoding TO 'UTF8';

root\set ON_ERROR_STOP ON
CREATE TABLE is_oauth_consumers (# ora2pg -c /etc/ora2pg/ora2pg.conf -t SEQUENCE -o /backup/postgres/postgres_sequence.sql[========================>] 12/12 sequences (100.0%) end of output.

# ora2pg -c /etc/ora2pg/ora2pg.conf -t SEQUENCE -o /backup/postgres/postgres_sequence.sql[========================>] 12/12 sequences (100.0%) end of output.
[root@oracle ~]# head -n 10 /backup/postgres/postgres_sequence.sql-- Generated by Ora2Pg, the Oracle database Schema converter, version 13.0-- Copyright 2000-2014 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=localhost;sid=XE
SET client_encoding TO 'UTF8';

11 Ora2Pgによるシーケンス抽出

Oracle Databaseサーバ

root\set ON_ERROR_STOP ON
CREATE SEQUENCE is_accesslogs_id_seq INCREMENT 1 MINVALUE 1 NO MAXVALUE START 2 CACHE 20;
CREATE SEQUENCE is_adminroles_id_seq INCREMENT 1 MINVALUE 1 NO MAXVALUE START 11 CACHE 20;

12 移行対象テーブルの件数確認

Oracle Databaseサーバ# ora2pg -c /etc/ora2pg/ora2pg.conf -t SHOW_TABLE# ora2pg -c ora2pg.conf -n SCOTT -t SHOW_TABLE[1] TABLE DATABASECHANGELOG (1 rows)[2] TABLE DATABASECHANGELOGLOCK (1 rows)[3] TABLE IS_ACCESSLOGS (1 rows)[4] TABLE IS_ACCOUNTS (1 rows)[5] TABLE IS_ADMINROLES (1 rows)[6] TABLE IS_AUTHCREDENTIALS (1 rows)[7] TABLE IS_CACHES (1 rows)[省略]# ora2pg -c /etc/ora2pg/ora2pg.conf -t COPY -o /backup/postgres/postgres_data.sql# head -n 10 /backup/postgres/postgres_data.sql-- Generated by Ora2Pg, the Oracle database Schema converter, version 13.0-- Copyright 2000-2014 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=localhost;sid=XE

root

[=>
[=>
[===>
[===>
[省略]
13 Ora2Pgによるデータ抽出

Oracle Databaseサーバ]]]]

2/44 tables (4.5%) scanning table DATABASECHANGELOG
3/44 tables (6.8%) scanning table IS_ACCESSLOGS
6/44 tables (13.6%) scanning table IS_AUTHCREDENTIA
7/44 tables (15.9%) scanning table IS_CACHESSET client_encoding TO 'UTF8';\set ON_ERROR_STOP ON

root

BEGIN;# scp /backup/postgres/* [PostgreSQLサーバIPアドレス]:/home/postgres
14 SQLファイルの転送

Oracle Databaseサーバ

-root

ページ 1

00_infoScoop移行手順書(Ora2Pg)

スキーマファイル変換スクリプ
15 トの配置

PostgreSQLサーバ

postgres$ vi /tmp/converter_schema.sh[下記を追加]#!/bin/bash#usage: ./converter_schema.sh [ファイル名] [変換対象,変換後] ...
argv=("$@")# ファイル削除
rm -f $1.copy# ファイルコピー
cp $1 $1.copy
for i in `seq 2 $#`doarr=( `echo ${argv[$i-1]} | tr -s ',' ' '`)echo "${arr[0]} -> ${arr[1]}"# テーブルの定義置換
sed -i -e "s/\t${arr[0]} /\t\"${arr[1]}\" /g" $1.copy > /dev/null# インデックスの定義置換(単一カラムインデックス)
sed -i -e "s/(${arr[0]});/(\"${arr[1]}\");/g" $1.copy > /dev/null# インデックスの定義置換(複合カラムインデックス)
sed -i -e "s/(${arr[0]},/(\"${arr[1]}\",/g" $1.copy > /dev/nullsed -i -e "s/,${arr[0]},/,\"${arr[1]}\",/g" $1.copy > /dev/nullsed -i -e "s/,${arr[0]})/,\"${arr[1]}\")/g" $1.copy > /dev/nulldoneecho "変換終了"$ ls -l /tmp/converter_schema.sh-rwxr-xr-x 1 postgres postgres 838 4月

7 18:00 2015 /tmp/converter_schema.sh$ chmod 755 /tmp/converter_schema.sh$ cd /tmp/$ ./converter_schema.sh /home/postgres/postgres_schema.sql uid,UID date,DATE to,TO from,FROM
option,OPTION order,ORDER disableddynamicpanel,DISABLEDDYNAMICPANEL column,COLUMN timestamp,TIMESTAMP$ ls -l /home/postgres/postgres_schema.sql.copy-rw-r--r-- 1 postgres postgres 13647 4月 7 18:34 2015 /home/postgres/postgres_schema.sql.copy

Uid -> UID
date -> DATEto -> TOfrom -> FROM
option -> OPTION
Order -> ORDER
disableddynamicpanel -> DISABLEDDYNAMICPANEL
column -> COLUMN
timestamp -> TIMESTAMP
変換終了

16 スキーマファイルの変換

PostgreSQLサーバ

postgres※本スクリプトの実行は文字列を置換を行うため注意して実行てください。
スクリプトでは下記の処理を実施しています。
1. テーブル内のカラムとして利用されているPostgreSQLの予約語をダブルクォーテーション（"）で囲い大文字に変換・date・to・from・option・order・column・timestamp
2. 他のデータベースの予約語として利用されているため単語はinfoScoop(hibernate)が大文字でSQLを発行するため、ダブルクォーテーション（"）で囲い大文字に変換・uid・disableddynamicpanel$ vi /tmp/converter_date.sh

データファイル変換スクリプト
17 の配置

PostgreSQLサーバ

postgres$ ls -l /tmp/converter_data.sh-rwxr-xr-x 1 oracle oracle 446 4月

7 18:38 2015 /tmp/converter_data.sh#!/bin/bash#usage: ./converter_date.sh [ファイル名] [変換対象,変換後] ...
argv=("$@")
cp $1 $1.copy
for i in `seq 2 $#`doarr=( `echo ${argv[$i-1]} | tr -s ',' ' '`)echo "${arr[0]} -> ${arr[1]}"sed -i -e "s/(${arr[0]},/(\"${arr[1]}\",/g" $1.copy > /dev/nullsed -i -e "s/,${arr[0]},/,\"${arr[1]}\",/g" $1.copy > /dev/nullsed -i -e "s/,${arr[0]})/,\"${arr[1]}\")/g" $1.copy > /dev/nulldoneecho "変換終了"$ chmod 755 /tmp/converter_data.sh# cd /tmp/$ ls -l /home/postgres/postgres_data.sql.copy# ./converter_data.sh /home/postgres/postgres_data.sql uid,UID date,DATE to,TO from,FROM option,OPTION -rw-r--r-- 1 postgres postgres 1174674 4月 7 18:41 2015 /home/postgres/postgres_data.sql.copy
order,ORDER disableddynamicpanel,DISABLEDDYNAMICPANEL column,COLUMN timestamp,TIMESTAMP

18 データファイルの変換

PostgreSQLサーバ

postgresuid -> UID
date -> DATE
to -> TO
from -> FROM
option -> OPTION
order -> ORDER
disableddynamicpanel -> DISABLEDDYNAMICPANEL
column -> COLUMN
timestamp -> TIMESTAMP
変換終了※ スキーマ変換スクリプトと同様の置換を実施します。データを書き換える可能性がないか確認し、実行して下さい。

19 データベースの作成

PostgreSQLサーバ$ psql -c "create database iscoop with encoding 'UTF8'"
CREATE DATABASE$ psql -l$ vi /home/postgres/postgres_schema.sql.copy-postgres

List of databases
Name| Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+---------+-------+----------------------iscoop| postgres | UTF8
| C| C|[省略][修正前]
CREATE INDEX is_keywords_date ON is_keywords ("TIMESTAMP");
CREATE INDEX is_logs_date ON is_logs ("TIMESTAMP");↓[修正後]
CREATE INDEX is_keywords_date ON is_keywords ("DATE");CREATE INDEX is_logs_date ON is_logs ("DATE");※Ora2Pgの変換ミスの修正

20 スキーマファイルの修正

PostgreSQLサーバ

postgres[修正前]
CREATE INDEX is_systemmessages ON is_systemmessages (isread);↓[修正後]
CREATE INDEX is_systemmessages_idx ON is_systemmessages (isread);※テーブル名とインデックス名が重複しているため修正[修正前]
CREATE TABLE databasechangeloglock (id bigint NOT NULL,
locked smallint NOT NULL,↓[修正後]
CREATE TABLE databasechangeloglock (id bigint NOT NULL,
locked boolean NOT NULL,※Ora2PgがOracleのNUMBER(1)をsmallintに変換していたが、TRUE,FALSEを格納するデータ型として、利用されているためbooleanに修正する。
$ cd /home/postgres/$ cp postgres_schema.sql.copy postgres_schema_constraint.sql$ vi postgres_schema.sql.copy

本手順を実施しない場合、データファイル投入時に下記のエラーが発生します。
psql:/home/postgres/postgres_data.sql.copy:4171: ERROR: insert or update ontable "is_userprefs" violates foreign key constraint "sys_c007575"[下記の行を削除]
ALTER TABLE is_oauth_tokens ADD CONSTRAINT sys_c007707 FOREIGN KEY (fk_oauth_id) REFERENCES
is_oauth_consumers(id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE;
21 データファイル投入時の制約違反回避

PostgreSQLサーバ

postgres$ vi postgres_schema_constraint.sql[上記以前の行を削除]

ページ 2

00_infoScoop移行手順書(Ora2Pg)

22 スキーマファイルの投入

23 シーケンスファイルの投入

24 データファイルの投入

PostgreSQLサーバ

PostgreSQLサーバ

PostgreSQLサーバ

postgrespostgrespostgres25 制約ファイルの投入

PostgreSQLサーバ

postgres

26 JDKインストール

PostgreSQLサーバ

root

27 antのインストール

PostgreSQLサーバ

root

28 Tomcatインストール

PostgreSQLサーバ

root

29 PostgreSQL JDBC Driver準備

30 liquibaseのエラー対処

PostgreSQLサーバ

PostgreSQLサーバ

root

postgres$ psql -f /home/postgres/postgres_schema.sql.copy iscoop
SET
CREATE TABLE
ALTER TABLE[省略]
CREATE TABLE
ALTER TABLE
CREATE TABLE$ psql iscoop[省略]
iscoop=# \d$ psql -f /home/postgres/postgres_sequence.sql iscoop
SET
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE
CREATE SEQUENCE$ psql iscoop[省略]=# \ds$ psql -f /home/postgres/postgres_data.sql.copy iscoop[省略]
COPY 0COPY 3COPY 1COPY 0COPY 14COPY 12COPY 15
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCECOMMIT$ psql iscoop[省略]=# SELECT count(*) FROM is_accounts;
count------11(1 row)

$ psql -f /home/postgres/postgres_schema_constraint.sql iscoop
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE-# yum install java-1.7.0-openjdk.x86_64# readlink $(readlink $(which java))/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java# export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/# which java
/usr/bin/java# cd /usr/local/src# wget http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.0-bin.zip# unzip apache-ant-1.8.0-bin.zip# export ANT_HOME=/usr/local/src/apache-ant-1.8.0# echo ${ANT_HOME}/usr/local/src/apache-ant-1.8.0# yum install tomcat6*# export CATALINA_HOME=/usr/share/tomcat6/# service tomcat6 status
tomcat6 is stopped

PostgreSQL JDBC Driver ページ(https://jdbc.postgresql.org/download.html) で「Postgresql Driver,Version 9.4-1201」をダウンロード。ダウンロードしたドライバを下記のディレクトリに配置。
・/usr/share/tomcat6/lib/# ls -l /usr/share/tomcat6/lib/postgresql-9.4-1201.jdbc41.jar-rw-r--r-- 1 root root 648487 4月 7 19:54 2015 /usr/share/tomcat6/lib/postgresql-9.4-1201.jdbc41.jar

infoScoop起動時にliquibaseによりdatabasechangelogテーブルのmd5sumカラムがチェックされます。上記チェックはOracle DatabaseからPostgreSQLにデータを移行した場合、エラーとなるため下記を実施します。
$ psql iscoop=# update databasechangelog set md5sum =null;-

List of relations
Schema |Name| Type | Owner--------+--------------------------------+-------+---------public | databasechangelog| table | postgres
public | databasechangeloglock| table | postgres
public | is_accesslogs| table | postgres
public | is_accounts| table | postgres
public | is_adminroles| table | postgres[省略]

List of relations
Schema |Name| Type | Owner--------+-----------------------------+----------+---------public | is_accesslogs_id_seq| sequence | postgres
public | is_adminroles_id_seq| sequence | postgres
public | is_authcredentials_id_seq | sequence | postgres
public | is_forbiddenurls_id_seq| sequence | postgres
public | is_gadgets_id_seq| sequence | postgres
public | is_i18nlocales_id_seq| sequence | postgres
public | is_keywords_id_seq| sequence | postgres
public | is_logs_id_seq| sequence | postgres
public | is_messages_id_seq| sequence | postgres
public | is_oauth_gadget_urls_id_seq | sequence | postgres
public | is_portaladmins_id_seq| sequence | postgres
public | is_widgets_id_seq| sequence | postgres(12 rows) ; sequence ; postgres (12 rows)

本手順完了後に、下記の試験を実施して下さい。
・テーブル定義移行確認試験
・データ移行確認試験[ OK ]

参考URL.ChangeSet Check Sums
http://www.liquibase.org/documentation/changeset.html

インストールガイド - CentOS編(https://github.com/infoScoop/infoscoopdocuments/blob/master/ja/installation-guide/installation-guide-for-centos.md) を参考にしてインストールを実施。MySQLの手順なので、PostgreSQLに読み替える箇所を以下に示す。
■5 MySQL Connectorの準備
PostgreSQLのJDBCドライバの格納箇所を確認し、${CATALINA_HOME}/libにコピーする。
■6 infoScoop OpenSource用のリポジトリデータベースを作成する
・実施しない31 infoScoopのインストール

PostgreSQLサーバ

root■7 Apache TomcatにJNDIデータソースを定義する
以下のように、PostgreSQLでの接続情報に修正します。
<?xml version='1.0' encoding='utf-8'?><Context path="infoscoop"><Resource name="jdbc/infoscoop" auth="Container"
type="javax.sql.DataSource"
username="postgres"password="hogehoge"
driverClassName="org.postgresql.Driver"url="jdbc:postgresql://localhost:5432/iscoop?stringtype=unspecified"validationQuery="select 1" /></Context>■9 Apache TomcatにinfoScoop OpenSourceをデプロイする
この手順の前に「Webアプリケーションモジュールのカスタマイズ」(https://github.com/infoScoop/infoscoopdocuments/blob/master/ja/installation-guide/customizing-web-application-module.md)の「2 データベース設定を変更する」を実施します。以下の通りです。
dataSource.jndiName=jdbc/iscoop
dataSource.schema=publicdataSource.dialect=org.hibernate.dialect.PostgreSQLDialect

ページ 3