[pgsql-jp: 25432] pg_dumpのデータ欠落について (Was: 7.2への移行について)

早瀬 康裕 hayase @ hcn.zaq.ne.jp
2002年 3月 27日 (水) 14:03:42 JST


自己フォローです。


> 既存のDBの中に文字化けしたデータがあるようです。16列のtableのdumpを行なっ
> たのですが、3列目で文字化けを起こし、4列目より後が欠落してしまっています。
> このとき、pg_dumpは何もエラーメッセージを出力せず、終了ステータスも0です。

このデータ欠落についてもう少し説明します。

例えば、5列のテーブルのテキスト形式でのdumpは、

1-a 1-b 1-c 1-d 1-f
2-a 2-b 2-c 2-d 2-f
3-a 3-b 3-c 3-d 3-f
(tabをspaceで代用しました)

となるはずですが、例えば2-cで文字化けが起こると、

1-a 1-b 1-c 1-d 1-f
2-a 2-b 2-c
3-a 3-b 3-c 3-d 3-f

となり、restore(copy table from) 出来ないファイルとなってしまいます。


何故このようなファイルが出来てしまうのか、postgresql-7.2のソースを
追ってみたのですが、行き詰まっています。

まず、pg_dumpは、COPY table TO STDOUT クエリを使ってデータ出力していること
を確認し、postmasterのソース backend/commands/copy.c を読んでみましたが、
文字化けでデータが欠けるような処理は見当たりませんでした。

そこで、「copy table to 'file'」と、「copy table to stdout」をそれぞれ実行
してみましたところ、「to stdout」はpg_dumpと同様に文字化け・データ欠落があ
りました。「to 'file'」では、文字化けはありますが、データ欠けはありませんで
した。
# 「to 'file'」のファイルを7.2にcopy table from 'file'したところ、文字コー
# ドについてのエラーメッセージは出力されるものの、copy自体は成功しました。
# 今回の問題自体は、これで回避出来そうです。

「to 'file'」と「to stdout」の差を調べてみましたが、postmaster側
(backend/commands/copy.c backend/libpq/pqcomm.c)には、stdoutとfileでの処理
に大きな違いは見つけられませんでした。
# CopySendData()が違いを吸収しており、どちらの場合も同じデータが出力される
# と思われました

libpq に原因があるのかとも思ったのですが、こちらにも原因を見付けることは出
来ませんでした。
# PQgetline() と pqReadData() の辺りかと思ったのですが…


ここで行き詰まってしまいました。


dumpファイルがrestore出来ないのは、かなり困ると思うですが、皆さんどうして
いるのでしょうか。当方は file system level backup しているので、バックアッ
プの問題は無いのですが…。




---
早瀬 康裕
大阪大学基礎工学部情報科学科数理科学コース




pgsql-jp メーリングリストの案内