ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示
ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示

2013年7月17日水曜日

PostgreSQL8.2サービスは起動して停止しました。…

現象:
「ローカルコンピューター上のPostgreSQL Database Server 8.2サービスは起動して停止しました。サービスの中には、ほかのサービスやプログラムで使用されていない場合は自動的に停止するものがあります。」

Try "postgres --help" for more information.



――――――――――
修正案 (1) "C:\Program" ファイルを削除

ある日突然、PostgreSQL 8.2 が起動しなくなったのであれば疑わしいです…

なにかの拍子で Program というファイルが C:\ に作成される事案があるようです。
このファイルがあると PostgreSQL 8.2 が起動直後に終了する、という問題がありました。

このファイルを削除すると、サービスが起動できるようになりました。

――――――――――
修正案 (2) pg_hba.conf で IPv6 の localhost を許可

セットアップ直後から pgsql-8.2 サービスが起動しないのであれば、疑わしいです。

localhost が IPv6 の localhost → ::1 として解決されてしまい、 接続拒否になっている可能性です。

pg_hba.conf にて、::1/128 を許可しましょう。

---
# IPv6 local connections:
host all all ::1/128 md5
---

――――――――――
修正案 (3) -w オプションを削除

-wを消すとうまくいく事例が有るようです。

レジストリエディタを起動。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\pgsql-8.2

ImagePathについて、

"C:\Program Files (x86)\PostgreSQL\8.2\bin\pg_ctl.exe" runservice -w -N "pgsql-8.2" -D "C:\Program Files (x86)\PostgreSQL\8.2\data\"

から

"C:\Program Files (x86)\PostgreSQL\8.2\bin\pg_ctl.exe" runservice -N "pgsql-8.2" -D "C:\Program Files (x86)\PostgreSQL\8.2\data\"

2012年11月14日水曜日

ERROR [HYC00] UTF-8 conversion isn't implemented before 7.1

PostgreSQL 7.0.4 (Linux)から、 PostgreSQL 8.2.22 (Windows)に、移行する依頼を受けています。 pg_dumpを使うと、文字化けが起こります。 Npgsqlを使うと、Connection.Openで、固まります。 Odbcを使うと、"ERROR [HYC00] UTF-8 conversion isn't implemented before 7.1"が発生します。 対策を探しています。

2012年8月30日木曜日

Malformed permissions property: 'langid' 対策

(臨時修正版:https://drive.google.com/open?id=1C6mmykeZD4LCpTzvEp272PDgOwrE_c0B

Windows 8又はWindows Server 2012に、PostgreSQL 8.2 の導入を試みると、失敗するようです。

次の様なエラーメッセージが表示されます。

Malformed permissions property: 'langid'

原因を特定致しました。

未初期化の変数に対する読み取りアクセスが原因のようです。(これは、PostgreSQL側に問題が有ります。Windows側の問題では有りません。)

修正ファイル編:

mstファイル置き場へのリンクを設置致します。使用方法につきましては、各人にて調査され、対処してください。自己責任でお願いいたします:
https://sites.google.com/site/kaihatsublog/pginstca

分析編:

次にコードを示します。(pgFoundary/pginstaller/pginst/ca/pginstca.cファイル中、RunInitdbから抜粋しています)

 serverdir = strchr(langid,';');
 if (!datadir)
 {
  SendErrorMessage(hInstall,L"Malformed permissions property: 'langid'.");
  return ERROR_INSTALL_FAILURE;
 }

serverdirに書き込んでいるのに、datadirを読み取っています。

Windows 8以前では、未使用のスタックが汚れていた(?)ため、発現しなかったようですが、
Windows 8以遠では、未使用のスタックを0で掃除する(?)ようになったため、発現するようです。

この問題は8.2以降で修正されていますが、8.2系列には補修が適用されていないようです。

Orca及びOllyDbg v2.01 (beta 2)の力を借り、解析しました所、次の様になっています。


そこでパッチを当てました。pginstca 3758 EC F0

Stirlingでパッチを適用し、Orcaで書き戻した所、セットアップが成功するようになりました。

2011年12月8日木曜日

VACUUM FULL on PostgreSQL 8.2

PostgreSQL 8.2系で、大多数のラージオブジェクトを廃棄しました。容器も小さくするにはVACUUM FULLを掛ける必要が有りました。

主にサムネイルの保存に使っています。20万個有ったものを削除し、1000個程が残っただけでした。

しかし、テーブルの容器が5.5GB程まで膨れ上がっていて、通常のVACUUMでは小さくなりません。これも小さくしたいと思いました。

インデックスが入っているのでloidを指定する検索は速いようです。しかし、SELECT COUNTによる数え上げには時間が掛かります。400秒程。通常のVACUUM掛けても検索時間はまったく変わりません。

次のようにSQL文を発行した所、容器が小さくなりました!

REINDEX TABLE pg_largeobject;
VACUUM FULL pg_largeobject;

クエリーは、2272953 ミリ秒で結果なしでうまく帰りました。 ※約38分

掃除前:
2011/12/08  09:57     1,073,741,824 2613
2011/12/07  17:45     1,073,741,824 2613.1
2011/12/08  10:02     1,073,741,824 2613.2
2011/12/08  10:02     1,073,741,824 2613.3
2011/12/08  09:57     1,073,741,824 2613.4
2011/12/08  09:49       225,402,880 2613.5
               6 個のファイル       5,594,112,000 バイト


掃除後:
2011/12/08  10:17           638,976 2613
2011/12/08  10:17                 0 2613.1
2011/12/08  10:17                 0 2613.2
2011/12/08  10:17                 0 2613.3
2011/12/08  10:17                 0 2613.4
2011/12/08  10:17                 0 2613.5
               6 個のファイル             638,976 バイト


容器が小さくなり、大幅に使用量が削減されました。

2011年9月6日火曜日

loを作成し、書き込む方法

PostgreSQLで、ラージオブジェクトを作成し、書き込む方法。

SELECT lo_creat(0);
結果: 17242

SELECT lo_open(17242, 393216);
結果: 0

SELECT lowrite(0, E'\x31\x32\x33'::bytea);
結果: 3

SELECT lo_close(0);
結果: 0

注意点:同じトランザクション内で実行いたします。そうでなければ、lo_openで開いたハンドルがlowriteに渡る頃には閉じていて、使えないようになります。こちらに注意書きが有りました。