QA@IT

Oracle11g 1800個以上のテーブルのCSVエクスポート

8528 PV

すみません。Oracleの1800個以上のテーブルとテーブルデータをPostgreSQL9.2にバッチでリストアしたのですが、
リストアが正しくいったかを検証するために、OracleとPostgresの各テーブルの各項目の値が正しいかをチェックすることになっています。

1テーブルあたり数十万件というテーブルも20個以上存在するので、バッチにすると比較に何日かかるかわかりません。
そこでOracle側もPostgres側もA5MKツール(http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/)

で全テーブルデータを一括でCSVエクスポートし、あとでDFツールで比較を試みようと考えました。

Postgresは一括エクスポートできたのですが、Oracle側は、テーブルの所有者はSYSTEMユーザのものだけど、表領域がSYSTEM領域じゃない表領域にテーブルを作っていたようで、A5MKツールのリストに出てきません。

大量のテーブルとデータの比較するのにいい方法があれば教えていただきたいです。

以上、よろしくお願いいたします。

このやり方もソートが狂っていたら成り立たないのですが、ツールを作るしかないのでしょうか。。。

スピード重視でやりたいです。

  • 表領域というかスキーマの事だと思いますが、そのスキーマの所有ユーザではログインできないんですか?通常スキーマ名とユーザー名は一致すると思うので、テーブルのフルネームが ABCD.TABLE1 であれば ABCDというユーザーでログインできませんか?という事です。 -
  • SYSTEM.TABLE1というテーブル名なので、systemアカウントでログインしてます。テーブル1個単位ならできるのですが、systemユーザのテーブルまとめてだと、A5MKツールの一括エクスポートリストにでてきません。Default表領域がSYSTEMじゃないからのようです -

回答

A5:SQL Mk-2作者の松原です。

すみません。テーブルが列挙されないのは、SYSTEMとSYSにあるテーブルはすべてシステム
テーブルとして一部機能ではテーブル一覧として表示しない仕様です。

また、危惧されておられる通りたとえエクスポートしたとしても、ソート順が一致しない可
能性が高いので、うまくいかないかもしれません。

そこで代替案ですが、SQLエディタ上で、

select * from テーブル名1 order by 1,2,3,4,5;
select * from テーブル名2 order by 1,2,3,4,5;
select * from テーブル名3 order by 1,2,3,4,5;
select * from テーブル名4 order by 1,2,3,4,5;

のようなSQLを用意してください。Oracle側で以下のSQLを実行することで簡単に用意できるか
もしれません。

select 'select * from ' || OWNER || '.' || TABLE_NAME || ' order by 1,2,3,4,5;' from ALL_TABLES where OWNER='SYSTEM';

order by の1,2,3,4,5は本当なら個々のテーブルごとに主キーなどを個別に指定できればよい
のですが、そうでなければ、1個目のカラムからn個目(この例の場合5個)のカラムまでで
ソートできるようにこのように指定します。テーブル定義に応じてここの数は増減してくださ
い。

SQLの実行位置を「先頭から全て」に指定し、緑の右向き三角と赤文字のCSVを組み合わせたボ
タンで実行します。この機能はスクリプトの結果セットを特定のフォルダに連番でCSV保存す
る機能です。このSQL実行をOracle、PostgreSQLの両方で行います。
(PostgreSQL側でスキーマが異なる場合は一括置換するなどしてください)

これで、DFなどで比較できると思います。ファイル名からテーブル名は分かりにくくなります
が、フォルダ単位で比較する分には問題ないのではないかと思います。

あと、この方法でできるとしても結構時間がかかるのではないかと思います。DBMSに付属する
専用ツール並みに高速な汎用出力ツール等あればよいのですが…多分難しいのではないかなあ
と思います。

あと、A5:SQL Mk-2からOracleに接続するときは、直接接続よりも、OCI経由接続を使ったほう
がおそらく速いと思います。

ご参考になれば幸いです。

編集 履歴 (0)
  • Mk-2作者の方からご回答いただき驚きとともに嬉しく存じます。結局SQLDeveloperで一括Export後ソートが狂ったCSVは手で修正かデータ量が多いものはSQLでソート指定後でしなおしで1つずつ対応することになりました。今回の作業で手間がかかる分はやむをえなかったです。もう少し件数が少ないケースでやれそうなときは、おっしゃるやり方で対応したいと思います。 -
  • 丁寧なご解説ありがとうございました。 -
  • あと、PostgresのCSVエクスポートはMk-2ツールを使わせていただき、大変重宝しております。この場で多数のDBに対応したツールの提供に感謝いたします。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。