情報採取No
1

概要対象ユーザ

前提条件--コマンド
下記の条件を満たしていること
・ Oracle DatabaseがPostgreSQLへのスキーマ移行が完了していること

確認 （確認コマンド等）-sqlplus -s で以下のSQLを実行

2

Oracleからのテーブル情報抽出

DBサーバ(Oracle Database)root

SPOOL OFFSET COLSEP ,SET HEAD OFF
SET ECHO OFFSET FEEDBACK OFF
SET PAGESIZE 0
SET LINESIZE 1000
SET TRIMSPOOL ON
SPOOL oracle_tables.csv
SELECT OWNER,TABLE_NAME FROM ALL_TABLES WHERE OWNER='INFOSCOOP' ;SPOOL OFF
sqlplus -s で以下のSQLを実行

3

Oracleからのカラム情報抽出

DBサーバ(Oracle Database)root

SPOOL OFFSET COLSEP ,SET HEAD OFF
SET ECHO OFFSET FEEDBACK OFF
SET PAGESIZE 0
SET LINESIZE 5000
SET TRIMSPOOL ON
SPOOL oracle_column.csv
SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM ALL_TAB_COLUMNS WHERE OWN\ER='INFOSCOOP' ;SPOOL OFF

sqlplus -s で以下のSQLを実行SPOOL OFFSET COLSEP ,SET HEAD OFF
SET ECHO OFFSET FEEDBACK OFF
SET PAGESIZE 0
SET LINESIZE 1000
SET TRIMSPOOL ON
SPOOL oracle_sequences.csv
SELECT SEQUENCE_OWNER,SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,CYCLE_FLAG FROM ALL_SEQU
ENCES WHERE SEQUENCE_OWNER='INFOSCOOP' ;SPOOL OFF4

Oracleからのシーケンスオブジ
ェクト情報出力

DBサーバ(Oracle Database)

root

5

Postgresからのテーブル情報抽
出

DBサーバ(PostgreSQL)

postgrescopy (SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE
TABLE' AND TABLE_SCHEMA NOT IN ('information_schema','pg_catalog')) to '/home/postgres/postgr
es_table.csv' with csv ;6

Postgresからのカラム情報抽出

DBサーバ(PostgreSQL)

postgrescopy (SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE,CHARACTER_OCTET_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,IS_NULLABLE,COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_S
CHEMA NOT IN ('in\formation_schema','pg_catalog')) to '/home/postgres/postgres_column.csv' with csv ;7

Postgresからの制約条件情報抽出

DBサーバ(PostgreSQL)

postgrescopy (SELECT TABLE_SCHEMA,TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.
TABLE_CONSTRAINTS WHERE TABLE_SCHEMA NOT IN ('information_schema','pg_catalog')) to '/home/postgres/postgres_constraint.csv' with csv ;8

Postgresからのシーケンスオブ
ジェクト情報出力

DBサーバ(PostgreSQL)

postgres9

テーブル情報格納用テーブル定義DBサーバ(PostgreSQL)

postgrescopy (SELECT SEQUENCE_SCHEMA,SEQUENCE_NAME,MINIMUM_VALUE,MAXIMUM_VALUE,INCREMENT,CYCLE_OPTIONFROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'public') to '/home/postgres/postgr
es_s\equence.csv' with csv ;$ psql -c "CREATE TABLE cmp_table_oracle (table_schema text,table_name text)" compdb$ psql -c "CREATE TABLE cmp_table_postgres (table_schema text,table_name text)" compdb

10 カラム情報格納用テーブル作成

DBサーバ(PostgreSQL)

postgres

11 シーケンスオブジェクト比較用
テーブル作成DBサーバ(PostgreSQL)

postgres

12 データロード

DBサーバ(PostgreSQL)

postgres

13 Oracle定義情報の作り変え

DBサーバ(PostgreSQL)

postgres$ psql -c "CREATE TABLE cmp_column_oracle_wk (table_schema text,table_name text,column_name text,data_type text,character_octet_length integer,numeric_precision text,numeric_scale text,is_nullable boolean,column_default text)" compdb$ psql -c "CREATE TABLE cmp_column_oracle (table_schema text,table_name text,column_name text
,data_type text,character_octet_length integer,numeric_precision integer,numeric_scale integer,is_nullable boolean,column_default text)" compdb$ psql -c "CREATE TABLE cmp_column_postgres (table_schema text,table_name text,column_name text,data_type text,character_octet_length integer,numeric_precision integer,numeric_scale integer,is_nullable boolean,column_default text)" compdb$ psql -c "CREATE TABLE cmp_sequence_oracle_wk (sequence_schema text,sequence_name
text,minimum_value
text,maximum_value
text,increment
text,cycle_optionboolean)" compdb$ psql -c "CREATE TABLE cmp_sequence_oracle (sequence_schema text,sequence_nametext,minimu
m_valuenumeric,maximum_value
numeric,increment
numeric,cycle_option
boolean)" compdb$ psql -c "CREATE TABLE cmp_sequence_postgres (sequence_schema text,sequence_name
text,mini
mum_value
numeric,maximum_value
numeric,increment
numeric,cycle_option
boolean)" compdb# psql -c "COPY cmp_table_oracle FROM '/usr/local/compdb/oracle_tables.csv' with csv" compdb# psql -c "COPY cmp_table_postgres FROM '/usr/local/compdb/postgres_table.csv' with csv" compdb# psql -c "COPY cmp_column_oracle_wk FROM '/usr/local/compdb/oracle_column.csv' with csv" compdb# psql -c "COPY cmp_table_postgres FROM '/usr/local/compdb/postgres_column.csv' with csv" compdb# psql -c "INSERT INTO cmp_column_oracle SELECT trim(both ' ' from table_schema),trim(both '' from table_name),trim(both ' ' from column_name),trim(both ' ' from data_type), character_octet_length, case when octet_length(trim(both ' ' from numeric_precision)) = 0 then 0 else (trim(both ' ' from numeric_precision))::integer end,case when octet_length(trim(both ' ' fromnumeric_scale)) = 0 then 0 else (trim(both ' ' from numeric_scale))::integer end,is_nullable,trim(both ' ' from column_default) from cmp_column_oracle_wk" compdb# psql -c "INSERT INTO cmp_sequence_oracle SELECT trim(both ' ' from sequence_schema),trim(both ' ' from sequence_name),(trim(both ' ' from minimum_value))::numeric,(trim(both ' ' from maximum_value))::numeric,(trim(both ' ' from increment))::numeric,cycle_option from cmp_sequen
ce_oracle_wk" compdb

ページ 1

備考

テーブル名の比較
No12

概要

対象

ユーザ

前提条件

-

-

テーブル定義の有無の比較

テーブル定義情報テーブル（cmp_table_oracle、cmp_tab postgres
le_postgres）

コマンド
下記の条件を満たしていること
・ Oracle DatabaseがPostgreSQLへのスキーマ移行が完了していること
・ スキーマ移行作業におけるエラーは解消し、アプリケーション実行時のエラーによるスキーマ修正は行われていないこと

確認 （確認コマンド等）-$ psql compdb
psql (9.4.1)
Type "help" for help.

case列がすべて'OK'、もしくはテーブルの追加や移行しない方針のテーブルが'NG'であれば正常に移行が完了している。

compdb=# select t1.table_name as oracle,t2.table_name as postgres,compdb-# case when t1.table_name is null then 'NG'
compdb-#when t2.table_name is null then 'NG'
compdb-#else 'OK'
compdb-# end
compdb-# from cmp_table_oracle t1 full outer join cmp_table_postgres t2
compdb-#on (t1.table_name = upper(t2.table_name))
Compdb-# order by 1 ;oracle|postgres| case----------------------+----------------------+-----IS_ACCESSLOGS| is_accesslogs| OK
IS_ACCOUNTS| is_accounts| OK
IS_ADMINROLES| is_adminroles| OK
IS_AUTHCREDENTIALS| is_authcredentials| OK
IS_CACHES| is_caches| OK
IS_FORBIDDENURLS| is_forbiddenurls| OK
IS_GADGETS| is_gadgets| OK
IS_GADGET_ICONS| is_gadget_icons| OK
IS_HOLIDAYS| is_holidays| OK
IS_I18N| is_i18n| OK:
IS_PROXYCONFS| is_proxyconfs| OK
IS_RSSCACHES| is_rsscaches| OK
IS_SEARCHENGINES| is_searchengines| OK
IS_SESSIONS| is_sessions| OK
IS_SYSTEMMESSAGES| is_systemmessages| OK
IS_TABLAYOUTS| is_tablayouts| OK
IS_TABS| is_tabs| OK
IS_USERPREFS| is_userprefs| OK
IS_WIDGETCONFS| is_widgetconfs| OK
IS_WIDGETS| is_widgets| OK(37 rows)

ページ 2

備考

カラムの比較No1

2

概要

対象

ユーザ

前提条件

-

-

カラムの移行および変更後属性の カラム定義情報テーブル（cmp_column_oraclee、cmp_c postgres
確認olumn_postgres ）コマンド
下記の条件を満たしていること
・ Oracle DatabaseがPostgreSQLへのスキーマ移行が完了していること
・ スキーマ移行作業におけるエラーは解消し、アプリケーション実行時のエラーによるスキーマ修正は行われていないこと
・ テーブル定義の移行確認が完了していること$ psql compdb
psql (9.4.1)
Type "help" for help.

確認 （確認コマンド等）-

備考

全ての列情報が移行され、正しい属性に変換されているとcase列が'OK'となる。

SQL文はInfoscoopが使用する属性に限定した確認を行っており、全ての属性を網羅する確認用クエリにはなっていない。

compdb=# select t1.table_name as oracle_tbl,t1.column_name as oracle_col,compdb-#t2.table_name as postgres_tbl,t2.column_name as postgres_col,compdb-# case when t1.column_name is null then 'NG'
compdb-#when t2.column_name is null then 'NG'
compdb-#when (t1.data_type = 'VARCHAR2' and t2.data_type = 'character varying' andcompdb(#t1.character_octet_length = t2.character_octet_length) then 'OK'
compdb-#when (t1.data_type = 'CLOB' and t2.data_type = 'text')
then 'OK'
compdb-#when (t1.data_type = 'BLOB' and t2.data_type = 'bytea')then 'OK'
compdb-#when (t1.data_type = 'TIMESTAMP(6)' andcompdb(#t2.data_type = 'timestamp without time zone')then 'OK'
compdb-#when (t1.data_type = 'NUMBER' andcompdb(#t1.numeric_scale = 0 and t1.numeric_precision < 5 andcompdb(#t2.data_type = 'smallint')
then 'OK'
compdb-#when (t1.data_type = 'NUMBER' andcompdb(#t1.numeric_scale = 0 and t1.numeric_precision < 10 andcompdb(#t2.data_type = 'integer')then 'OK'
compdb-#when (t1.data_type = 'NUMBER' andcompdb(#t1.numeric_scale = 0 and t1.numeric_precision > 9 andcompdb(#t2.data_type = 'bigint')
then 'OK'
compdb-#when (t1.data_type = 'NUMBER' andcompdb(#
t1.character_octet_length = 22 andcompdb(#t1.numeric_scale = 0 and t1.numeric_precision = 0 andcompdb(#t2.data_type = 'bigint')
then 'OK'
compdb-#else 'NG'
compdb-# end
compdb-# from cmp_column_oracle t1 full outer join cmp_column_postgres t2
compdb-#on (t1.table_name = upper(t2.table_name) andcompdb(#t1.column_name = upper(t2.column_name))
Compdb-# order by 1,2 ;oracle_tbl|
oracle_col|postgres_tbl|
postgres_col| case----------------------+----------------------+----------------------+----------------------+-----IS_ACCESSLOGS| DATE| is_accesslogs| date| OK
IS_ACCESSLOGS| ID| is_accesslogs| id| OK
IS_ACCESSLOGS| UID| is_accesslogs
| uid
| OK:
IS_WIDGETS| TYPE| is_widgets| type| OK
IS_WIDGETS| UID| is_widgets
| uid
| OK
IS_WIDGETS| WIDGETID| is_widgets| widgetid| OK(186 rows)

ページ 3

シーケンシャルオブジェクトの比較
No
1

2

概要

対象

ユーザ

前提条件

--

シーケンシャルオブジェクト移行前後の比較

シーケンシャルオブジェクト
定義情報テーブル（cmp_sequence_oracle,cmp_sequence_postgres）

コマンド
確認 （確認コマンド等）
下記の条件を満たしていること
・ Oracle DatabaseがPostgreSQLへのスキーマ移行が完了していること
・ スキーマ移行作業におけるエラーは解消し、アプリケーション実行時のエラーによるスキーマ修正は行われていないこと
・ テーブル定義の移行確認が完了していること$ psql compdb
全てのシーケンシャルオブジェクトが正しく移行され、case列が'OK'であることを確認する。
psql (9.4.1)
Type "help" for help.
Compdb=# SELECT t1.sequence_name,t2.sequence_name,compdb-# case when t1.sequence_name is null then 'NG'
compdb-#when t2.sequence_name is null then 'NG'
compdb-#when (t1.minimum_value <> t2.minimum_value) then 'NG'
compdb-#when (t1.maximum_value <> t2.maximum_value and t1.maximum_value <> 1.0000E+28 andt2.maximum_value <> 9223372036854775807) then 'NG'
compdb-#when (t1.cycle_option <> t2.cycle_option) then 'NG'
compdb-#else 'OK'
compdb-# end
compdb-# from cmp_sequence_oracle t1 full outer join cmp_sequence_postgres t2
compdb-#on (t1.sequence_name = upper(t2.sequence_name))
compdb-# order by 1,2 ;sequence_name|sequence_name| case-----------------------------+-----------------------------+-----IS_ACCESSLOGS_ID_SEQ| is_accesslogs_id_seq| OK
IS_ADMINROLES_ID_SEQ| is_adminroles_id_seq| OK
IS_AUTHCREDENTIALS_ID_SEQ | is_authcredentials_id_seq | OK
IS_FORBIDDENURLS_ID_SEQ| is_forbiddenurls_id_seq| OK
IS_GADGETS_ID_SEQ| is_gadgets_id_seq| OK
IS_I18NLOCALES_ID_SEQ| is_i18nlocales_id_seq| OK
IS_KEYWORDS_ID_SEQ| is_keywords_id_seq| OK
IS_LOGS_ID_SEQ| is_logs_id_seq| OK
IS_MESSAGES_ID_SEQ| is_messages_id_seq| OK
IS_OAUTH_GADGET_URLS_ID_SEQ | is_oauth_gadget_urls_id_seq | OK
IS_PORTALADMINS_ID_SEQ| is_portaladmins_id_seq| OK
IS_WIDGETS_ID_SEQ| is_widgets_id_seq| OK(12 rows)

ページ 4

備考

最大値の規定値（maximum_value）はOracleとPostgreSQLで異なる。