HiRDB上のテーブルにBLOB型のカラムが存在していて、データ移行でPostgreSQLへ移行したい状況になったので、
備忘録的に書き留めておく。
流れは下記の通り。
- 【HiRDB】BLOB型のカラム"以外"についてINSERT文を作成
- 【HiRDB】対象テーブルのPrimaryキーとBLOB型カラムだけをSELECTし、バイナリファイルを出力させる
- 【HiRDB → PostgreSQL】出力したバイナリファイルをPostgreSQLがインストールされているDBサーバーまでもっていく
- 【PostgreSQL】移動させてきたバイナリファイルをUPDATE文により、既存レコードに適用させる
- 【PostgreSQL】UPDATE文の実行
###①【HiRDB】BLOB型のカラム"以外"についてINSERT文を作成
省略
尚、ここで作成したINSERT文はPostgreSQL側に適用した状態で、BLOB型カラム以外はデータが存在している状態にしておく。
###②【HiRDB】対象テーブルのPrimaryキーとBLOB型カラムだけをSELECTし、バイナリファイルを出力させる
HiRDB側でWRITEという関数を用いてBLOB型カラムをSELECTすると、ドキュメントDirにバイナリファイルを出力してくれるらしい。
これによって、HiRDBのコンソールに出力されるのは、
PrimaryKey | それに対応したバイナリファイル名
となる。
select [テーブルのPrimaryKey], WRITE([BLOB型のカラム名], '出力させたいDirのパス/ファイルの接頭辞(?)', 0) from テーブル名;
例)
・出力させたいDirのパス:/hirdb/doc
・ファイルの接頭辞:BLOBFILE
出力させたいDirのパス/ファイルの接頭辞(?)
⇒/hirdb/doc/BLOBFILE
※出力させた2つの情報はファイル出力させたほうが後々楽になるのだが、ファイル出力の方法を知らなかったためこの方法で。
###③【HiRDB → PostgreSQL】出力したバイナリファイルをPostgreSQLがインストールされているDBサーバーまでもっていく
バイナリファイルをどう移動させるかは環境によって異なるため、やり方は省略する。
今回はffftpで一旦ローカルにバイナリファイルを移動させて、ローカルのファイルをPostgreSQLのサーバーへ移動させるという二度手間Styleで移動させた。
※PostgreSQLサーバーへの移動先についてだが、PostgreSQLのドキュメントDir(?)の確認用SQLに記載しているSELECT文で確認できたファイルたちが存在しているフォルダに移動させる。
この作業を行わないと、下記の通りになって次のUPDATE文でコケる。
ERROR: ファイル"xxxxxxxxxxx"のstatに失敗しました: No such file or directory
xxxxxxxxxxxはファイル名
select pg_ls_dir('.');
###④【PostgreSQL】移動させてきたバイナリファイルをUPDATE文により、既存レコードに適用させる。
UPDATE [対象テーブル名] SET [bytea型カラム名] = pg_read_binary_file('移動させてきたバイナリファイル名') WHERE PrimaryKey名 = '②で出力させた対応するPrimaryKey';
このUPDATE文をExcelでCONCATENATE関数を使って作成した。
###⑤【PostgreSQL】UPDATE文の実行
以上。