PostgreSQLのエラー「Error message from server: ERROR: invalid memory alloc request size 4294967293」の原因と解決方法
PostgreSQLでpg_dumpをしようとすると、以下のようなエラーが起きることがある。
pg_dump: dumpClasses(): SQL command failed
pg_dump: Error message from server: ERROR: invalid memory alloc request size 4294967293
pg_dump: The command was: FETCH 100 FROM _pg_dump_cursor
このエラーが起きた時に「invalid memory alloc request size 4294967293」というメッセージを見て「PostgreSQLの共有メモリなどメモリ関連の設定がおかしいのかなぁ?メモリが不足しているということ?PostgreSQLが使えるメモリの割り当てを増やせばいいのかなぁ」などと思ってメモリの設定値を色々変えてみたりしたのだが、全く効果がなかった。
そこで、検索サイトで「invalid memory alloc request size 4294967293」で検索すると、以下の記事が見つかった。
BUG #2534: ERROR: invalid memory alloc request size 4294967293
http://archives.postgresql.org/pgsql-bugs/2006-07/msg00072.php
《略》
While executing pg_dump command, I am getting the following errors. Plz
help me to solve the problem.
pg_dump -O magellan >
magellan_154_db_postgres_10july2006_1149amist.sql
pg_dump: ERROR: invalid memory alloc request size 4294967293
pg_dump: SQL command to dump the contents of table "ctblankcall" failed:
PQendcopy() failed.
《略》
おー、まさに同じようなエラー。
しかし、この質問にはレスが付いていないので、これだと原因は分からない。
結局、このエラーが起きる根本的な原因は分からなかったのだが、とにかくpg_dumpしたかったので、以下の方法で無理やり解決した。
(1)pg_dumpに失敗するデータベースが持つ各テーブルを個別にpg_dumpし、pg_dumpに失敗するテーブルを特定する。
(2)pg_dumpに失敗するテーブルが特定できたら、さらに「select * from テーブル名 where 絞込条件」で検索に失敗するレコードを特定する。
(3)検索に失敗するレコードを特定できたら、さらに「select カラム名1 from テーブル名 where 絞込条件」のように検索に失敗するカラムを特定する。
※「select カラム名1 from テーブル名 where 絞込条件」で検索に成功したら「カラム名1」は問題なし、同じwhere句で「select カラム名2 from テーブル名」とした時に検索に失敗したら、「カラム名2」に問題あり、と特定できる。
(4)問題が生じているカラムを適当な値でupdateする。
全ての不適切なカラムの値を適切な値でupdateすることでpg_dumpできるようになる。
※(3)〜(4)あたりは、以前書いた以下の記事とほぼ同じ。
《参考》
PostgreSQLのエラー「timestamp out of range」と「FETCH 100 FROM _pg_dump_cursor」の原因と解消方法について
この記事の時は、ある1つのテーブルの1つのカラムに不適切な値が入ってしまったことがほぼ確実で、PostgreSQLデータベースに値を渡すPHPプログラム側のバグの可能性が高い、と推測できた。そのため、PHPプログラムのバグ記述も修正したので今後再発する可能性は低いと思って安心している。
一方、掲題の件のエラーは、調査の結果、複数のテーブルで不適切なカラムが数箇所見つかったことにより、プログラムの不具合の可能性はゼロではないにしろ、考えにくいと思った。その他に考えられそうな原因は、Linuxのsyslogにハードディスクのエラーが出ていたので、ひょっとしたら、PostgreSQLデータベースを構成するファイルの一部が欠損してしまったのかなぁ、というPostgreSQLとは直接は関係のない世界での原因。推測の域を出ないが、ハードディスクエラーが出ている時点で全部それが原因に思えてきたので、これ以上の調査は無駄に思えたのでやめた(もう検索サイトではあらかた調べつくして他に考えられうる原因がなかったこともあるが・・・)。今度、同じエラーが出た時にハードディスクエラーが出ていなければ、その時はその時で調査・・・。