PostgreSQL 8.0 リリース 114
ストーリー by Oliver
BEGIN-UPGRADE 部門より
BEGIN-UPGRADE 部門より
L.star 曰く、 "オープンソースのデータベースとして有名なPostgreSQLの新しいバージョン、8.0がついにリリースされた。7.4から1年2ヶ月、ベータテストから4ヶ月半という長い開発期間の後とあって、さすがにたくさんの新機能が盛り込まれている。
- Windows 2000/XP用サーバーの公式サポート
- ただし、他のプラットフォームより枯れていない点に注意。なお、Windowsインストーラー形式のバイナリはpginstallerにて配布されている
- Savepoint
- トランザクションの一部をロールバックすることが可能に。
- Point In Time Recovery
- 差分バックアップやロールフォワードといったデータ保護機能が強化された。
- Tablespace
- ディスク上の配置を固定ディレクトリでなく移動可能にする。これによりI/Oの分散も期待できる
- パフォーマンス改善
- 特にバッファアルゴリズムが刷新されたこと、バックグラウンドのディスク書き込みプロセス、VACUUM時のキャッシュ利用の改善など。
- その他多数
- ログの扱いの改良、CSVの入出力、カラムの型の変更がALTER TABLEで可能になったこと、インデックスの改善、統計情報更新のanalyzeコマンドのサンプリング手法が一新、など
特に今回組み込まれた機能は商用DBにあってPostgreSQLになかったものも多く、よりPostgreSQLが広範囲にわたって使われる一歩になるのではないだろうか。ダウンロードはftpサイトの他にBitTorrentからも可能である。"
SQLそのもの (スコア:3, すばらしい洞察)
要はデータベース設計とそれをSQLに落とし込むところを熱く語った本がほしいのだが良書が見つからぬ・・・
ちなみに拙者は情報工学系・計算機工学系ではないので「そんなの大学の専門課程で常識だろ」とか言われても困る
Re:SQLそのもの (スコア:3, 参考になる)
SQLはそれなりに書けるが、これが最良の方法なのか? と疑問を持ち始めている方には良い本だと思います。
Re:SQLそのもの (スコア:1)
問題ないとして、データベース設計(データモデリング)の本は、
それと比べてはるかに少ないのが現状。
現場で良き師に出会って体で覚えるしかないかも。
正規化とかの基本的な理屈を説明する読みやすい本が増えたから、
そういう意味ではかなり環境は良くなったけど。
Re:SQLそのもの (スコア:3, 参考になる)
分かり易い例や関連業務用語の解説もあるので、為になります。
#DB Magazine [shoeisha.com]連載当時から愛読しています。
Re:SQLそのもの (スコア:2, 参考になる)
平易な説明とすっきりしたレイアウトだったと記憶しています。
これからリレーショナルデータベースを学ぼうという人が買っても
損しないと思います。
業務別データベース設計のためのデータモデリング入門 [selab.co.jp]
も私のおすすめです。
第2部でデータモデリングを実際にどのように行うかを見ることが
できます。簡単なデータベース設計を経験したあとで読むと、威力
倍増だと思います。データベースは初めてという人が読むと、
第2部は訳がわからなくて投げ出すかもしれません (^^;;
Re:SQLそのもの (スコア:1)
>それと比べてはるかに少ないのが現状。
萌々なデータベース本の登場が待たれますか?<No/Disable>
李 露星
PL/pgSQL で Exception の実装 (スコア:2, 興味深い)
35.7.5. Trapping Errors [postgresql.org]
マクロの基本は検索置換(by y.mikome)
Re:PL/pgSQL で Exception の実装 (スコア:2, 参考になる)
地味にこれがうれしい
個人的には (スコア:2, 興味深い)
あとインデックスを含んだpg_restoreの高速化とか…無理か。
#面倒なので、OSごとHDDのミラーリング+イメージで対応してます。
Re:個人的には (スコア:3, 興味深い)
Oracle でも一つの DB をずっと使ってると行移行とかハイウォーターマークの問題とかいろいろあるわけで、データファイルの定期的なメンテナンスはいずれにせよ必須なのではないかしら。
インデックスを含むテーブルへの高速 import 手段は確かに欲しい!
8はまだ見てませんけど 7.4.6 までは大量投入時は drop index してからやる、というのが常識化しているくらい遅いですからね。drop index→copy→create index ならば常識的な時間で処理できるんだから、内部でそれと同じことをやればいいだけだと思うんだけど…。
Re:個人的には (スコア:2, 興味深い)
追記型の宿命のVACUUMに関しては、普段はコンカレントVACUUMで誤魔化しておき、定期的にフルVACUUMするしかないんでしょうねぇ。フルVACUUM中でもテーブルロックがかかるだけで参照はできるわけですから、運用次第でカバーできなくもないわけですし。
あと、Oracle Developer DaysでのOracleとPostgreSQLとの比較 [atmarkit.co.jp]でPostgreSQLの問題点がいろいろ指摘されましたが、8.0になってTablespaceの導入によるI/Oの分散とパフォーマンスの改善が可能になり、SavepointとPoint In Time Recoveryによりバックアップ・リカバリも大分改善されましたから、今度このような講演をする際は材料探しに苦労しそうです:-)
Re:個人的には (スコア:1)
# 接続が単数だけからしかこないとは限らないのが頭の痛いところ
人間が判断するから・・・だと、若干面倒だとは思いますが、別にcreate->dropでもいいですよね。
Re:個人的には (スコア:1)
確かにおっしゃる通り。
でも実は、PostgreSQL は DDL もトランザクションに含めることが出来ちゃったりするので「drop index→copy→create index」を1つのトランザクションとして実装すれば、(最初の drop の時点でロックがかかり) 大丈夫だったりします(笑。これはほとんど裏技だなぁ。
Re:個人的には (スコア:1)
もう一つ上げておきましょう。DROP->COPY->CREATEとした場合としない場合、どっちが早いかはCOPYの量に依存しますが、当然そのシーケンスの中で、ロックを取る前にインデックス再作成した方が早いかどうかを知ることはできません。極論、レコードを1つも挿入しないのに事実上のREINDEX相当を行うというばかげた事態になります。
ちなみに、pg_dumpもpg_restoreも、今のバージョンは全てのデータが投入されるまでindexを作成する処理は行いませんから、同等の処理は成されているはずなんですが・・・
Re:個人的には (スコア:2, 参考になる)
> いいえ、それでも元々データが1件以上入っていた場合破綻します。
そうでしょうか?ちょっとテストしてみました。
=> \d test_table
Table "public.test_table"
Column | Type | Modifiers
ーーーーーーーーーーーーーーーー
id | integer |
Indexes:
"test_table_id_key" unique, btree (id)
// unique 制約だとちと面倒なので単なる unique index として用意。
=> select * from test_table;
id
----
1
(1 row)
=> begin;
BEGIN
=> drop index test_table_id_key;
DROP INDEX
// ここで他の接続から同じように begin、drop index しても
// lock されているため待たされる。ちなみに select も待た
// される<ダメじゃん!(笑。
=> \copy test_table from test_table.dump
\.
=> select * from test_table;
id
----
1
1
(2 rows)
// わざと unique 制約違反なデータを copy
=> create unique index test_table_id_key on test_table(id);
ERROR: could not create unique index
DETAIL: Table contains duplicated values.
=> commit;
COMMIT
// あれ?「WARNING: there is no transaction in progress」
// が出ないけど…
=> select * from test_table;
id
----
1
(1 row)
=> \d test_table
Table "public.test_table"
Column | Type | Modifiers
ーーーーーーーーーーーーーーーー
id | integer |
Indexes:
"test_table_id_key" unique, btree (id)
// ちゃんとロールバックされてる。
なんとなく僕にはちゃんと動いているように思えるんですが (まぁ select も lock してしまっているのは置いておくとして)、どのような場合に破綻してしまうのか教えていただけますか?
> DROP->COPY->CREATEとした場合としない場合、どっちが早いかはCOPYの量に依存します
それはそうですね。ごく単純に上記処理を行ってしまうといろいろもったいないことが起きてしまうことは分かります。本当にシステムに組み込む場合はもう少し凝ったことをしてあげた方が良いでしょう。
例えば、僕は上記の「drop→copy→create」が単一の import 用コマンドで行われていることを想定していますが、それならば drop 前に copy されるデータのサイズ等を知ることも可能なはずですから、それによって処理を分けるとか、
あるいはさらに、DB 自体を工夫して「index 更新なしの copy」と「新規追加された部分のみ index 追加」を行えるようにするといったことを想像していました。
> ちなみに、pg_dumpもpg_restoreも、今のバージョンは全てのデータが投入されるまでindexを作成する処理は行いませんから、同等の処理は成されているはずなんですが・・・
フルダンプ、フルリストア時はさすがに考慮されているのですね。そこは未検証でした。どうもありがとうございます。
僕の元々の書き込みは「インデックスを含むテーブルへの高速 import 手段は確かに欲しい!」ということでしたので、主に copy from が使われるような局面での高速化についての話でした。
Re:個人的には (スコア:1)
ただしその実装アーキテクチャが異なる、というところがこの場合の肝で、追記型の PostgreSQL 以外はほとんどの場合専用のロールバック領域 (UNDO セグメントと言ったりいろいろ) を持つのではないでしょうか。少なくとも Oracle と MySQL(InnoDB) はそうです。それらの DB では VACUUM がいらない代わりに、その専用領域の管理が必要となります。最近でこそ Oracle も自動 UNDO 管理が出来るようになりましたが、昔はちょっと大きな更新を走らせるとしょっちゅう「ロールバックセグメントがあふれた!」とか「スナップショットが古すぎます、って何だ?」というようなことが巻き起こったものです (遠い目)。
というわけで、VACUUM は面倒だけど、そのおかげで MVCC も実現されてるしよけいなロールバック領域について悩まなくてすむしまぁいいのかな、という話でした。
ガベージコレクション (スコア:1, 参考になる)
PostgreSQLのVACUUMを自動でやっている感じでしょうか?
2. Garbage Collection [ibexpert.info]
日本語版 (スコア:1, 参考になる)
個人的には英語版でも利用できるのですが、DBを教えていて、
日本語インストーラとかWindows版がないと、拒否反応を示し
ている連中が多いので、ぜひ日本語版もほしい。
そういった意味では、Win対応が増えると潜在的なユーザも
増えるのかな?
Re:日本語版 (スコア:1, すばらしい洞察)
>日本語インストーラとかWindows版がないと、拒否反応を示し
>ている連中が多いので、
そーゆー連中は、なんだかんだ別のところで躓くと思いますけどね。
Re:日本語版 (スコア:3, 興味深い)
そして、その一般のプログラマ/エンジニアがシステムを構築する場合が多いので、日本向けには日本語化が必須です。
もうすこし実務経験を積んで、現実を見た方が良いよ。
Re:日本語版 (スコア:3, すばらしい洞察)
そんな奴はプログラマでもエンジニアでもなくただの作業員だと思う
Re:日本語版 (スコア:2, 興味深い)
もし Oracle が「日本語マニュアル廃止」なんて言い出したら
少なくないプロジェクトで DB2 にでも移行しちゃうんでは。
だって業務系プログラマ・SE で英語読める/読もうとする人は
ほんとに少ないもん。それどころか、日本語マニュアルすら
読めない/読もうとしない人が山のようにいる。
ため息がでるけど、これが現実。やれやれ。
Re:日本語版 (スコア:1)
私のつきあいのあるSI企業のエンジニアは、少なくともエラーメッセージやマニュアルくらいはなんとか読む人ばかりですよ。
会話はできない人が多いですが。
英語だと駄目な現場があることは理解できるし、裾野を広げるためのローカライズはよいことだと思いますが、同時に「英語だからダメ」という現場を改善していく努力もすべきではないですか?
Re:日本語版 (スコア:1)
多重化 (スコア:1)
あとはクラスタリングができると、応用範囲が広がるよなぁ。個人的にはPostgeSQLは馴れ初めだったので、ぜひPostgres主体に戻ってみたい。まずはあれこれ評価から始めよう。
あー、実験で入れて、うまく動かなくて外したpgclusterをどうにかしなくちゃー(汗
Windows対応で、業務系アプリでも使いやすいかな (スコア:1)
安定するまではもうちょっと時間がかかりそうですが・・・。
やっぱり業務系のアプリだとWindowsが主流ですし、ORACLEやDBやMS-SQLサーバーの代わりに使えるDBになってくれることを期待してます!
中小企業向けアプリケーション向けで、PostgreSQLをアプライアンスサーバーとして、提供するなんてのもどっかやらないですかね。
--
Re:Windowsのデータベース選択肢 (スコア:1)
提案するのは、技術者側ですから、まずOracleが候補に上がる可能性が高いでしょう。
決める立場のひとは、リスクをとる選択は避けたいので、どれを選んでもそれほど変わらないのであれば、リスクの低いものになります。となると、稼動実績が豊富なほうがリスクが低いです。
扱える技術者もおおいので、頼んでいる部下なり、開発会社なりが、いなくなったり、使い物にならなかったとしても、取替えがききやすいですし。
WebではPostgreSQLは、稼動実績も、技術者もそれなりにいると思うので、採用されるケースも多いのかなと。
今後、業務系でも技術者が増えて、稼動実績の数がそろえば、それなりにつかわれていくんでしょうけど・・・
その最初が難しいかも。
--
Re:Windowsのデータベース選択肢 (スコア:1)
PostgreSQLのサポートつきならPowerGres [sra.co.jp]ですかね。
coLinux使ってます (スコア:3, 参考になる)
屍体メモ [windy.cx]
Re:coLinux使ってます (スコア:1)
サーバになってますが (スコア:4, 参考になる)
ノートパソコンでは Windows XP Home + coLinux で Web アプリの開発のテストやってます。電車の中でも作業できるし。
coLinux からみえるブロックデバイスは NTFS の中にイメージファイルとしておくこともできるし、生パーティションを透過的に見せることもできますが、後者のほうが僕は好きです。空きパーティションに Debian GNU/Linux sarge を GRUB を使って普通のデュアルブートとしてインストールして、一通り環境設定した後、今度は Windows を起動してその中から coLinux を起動してます。coLinux のルートファイルシステムとして Debian のブロックデバイスを指定しておけば、まんまとだまされて(?)Debian が起動します。coLinux では X サーバは動きませんので、コンソールアプリオンリーですが。でも Windows 側で cygwin/X なんか動かしておけば X アプリも使えますけどね。 Tgif とか GNUPLOT 使ってます。
個人的には C# がすきなので Visual Studio .NET 2003 で作ったソースとバイナリを samba 経由で coLinux な Debian と共有して、mono でバイナリがそのままで動くことを確認したりしてます。
もし使うならスナップショットの一番新しいものを使うほうがいいとおもいます。あと2ちゃんねるの Linux 板のスレッドも参考になるかと。
屍体メモ [windy.cx]
Re:サーバになってますが (スコア:1, 参考になる)
だいぶ前のスナップショットから coFS が使えるようになって、samba 無しでホストのファイルシステムマウントできるようになってますよ。coLinuxはネットワークの遅さが泣きどころなので、かなり嬉しい機能です。
あと、coLinux だと、生パーティション使うと遅くないですか?イメージファイルと比べると体感的にけっこう違うんですけど。VMWareとかだと生のほうが確実に速いんですけど。
生パーティション遅いかなぁ (スコア:1)
coFSはいろんな掲示板を見てると不安定そうなんで、敬遠してます。coFBもCVSのコードだったら動くのか。coLinuxのビルドって面倒じゃありません?とりあえず coFB は Tgif 使いの自分にはうれしい機能なので、ビルドに挑戦してみます。
屍体メモ [windy.cx]
Re:サーバになってますが (スコア:1)
今のこの書き込みもcoLinuxでw3mです(^^;
>空きパーティションに Debian GNU/Linux sarge を GRUB を使って普通のデュアルブートとしてインストールして、
>一通り環境設定した後、今度は Windows を起動してその中から coLinux を起動してます。
あ。そういうことできるんですか。
ディスク名とかデバイスとか色々食い違ったりしないのかな?と心配になったんですが
大丈夫なものなんでしょうか...
cofs期待っす。
ただ、とりあえずはアクセスできればいいんで、
aptitude install smbfs
smbmount //windows1/g7 ~/g7 -o username=g7,passwd=xxxx,codepage=cp932,iocharset=euc-jp
なんてなことしてます。
そういや日本語ファイル名が出ないなあ。smbmountするたびに
smbfs: failed to load nls 'euc-jp'
とかってメッセージがコンソールに出てます。どうすんだべこれ?
http://www.geocities.jp/error_storm/ で公開されてる
"smbfs デフォルト言語がEUC-JP なカーネル"ってものの意味を
よー理解してない昨今です。とにかく入れればいい、ってことなんだろか?
...入れてみました。ん?何も変わらないぞ?エラーメッセージは出なくなったがファイル名は化け化けのまま...
あ。
http://www.geocities.jp/boota_chan/pc/pc-contents00.htm
http://snap.shot.cx/972491930/index_html
smbmountじゃなくmountを使え、ですか。
...ん。あ。旨くいった。わーい。
>cygwin/X
2chでも、また日経なLinux雑誌(^^;でも、紹介されてたけど、
X-Deep/32 X Server っていう(もと商用で今無料な)X鯖が有るようですね。
(日本語も含めて)きちんと動くのかなあ。動くといいなあ。
cygwin/X(やwierdX)はイマイチ感が強いんで、なんともかんとも...
#cygwin/Xといえば、KNOPPIXに入って(?)いるcoLinux/cygx.zipって
#X鯖として必要最低限なもの(だよね)がわずか3MBに収まってるんで、いいなぁと思うんだけど、
#CD imageの中じゃなく単体で世間に転がってるのは見た事ないですね。
#転がるとまずいのかなあ?普通のFREE softなのじゃないの?
Re:出たての対応プラットフォームに期待してはいけま (スコア:1)
世の中ではWindowsで動かしているDBサーバーのほうが大半でしょう。
Windowsサーバーで動く、業務アプリ用のDBはかなり多いですよ。(ORACLEがほとんどでしょうが・・・)
--
Re:これでようやく (スコア:1)
ODBC つかって MS Access で管理しているんです。
人名で使われる漢字で不幸な目にあいました。
PHP で SJIS ->EUC して PostgeSQL7.3 で EUC -> SJIS すると
元に戻らないのが原因。
8.0 はどうなっているのかなぁ。。。。。
マクロの基本は検索置換(by y.mikome)
Re:これでようやく (スコア:3, 参考になる)
eucJP-openは一部、1文字を3バイトで表現する場合もあり(WindowsでのEUC-JPは高々1文字につき2バイト)、eucJP-openのままでMSIE等のアプリケーションに送ると、多くの場合は対応できず文字化けを起こします。
参考: OSF 日本ベンダ協議会 (OSF/JVC) 推奨 日本語 EUC ・シフト JIS 間コード変換仕様 [opengroup.or.jp]
Re:これでようやく (スコア:1)
--input-charset=XXX が使えなかったGCC<=3.3.xまでの話ですかね。
3.4系は比較的最近使われ始めた感じだと思いますけどねえ。
> shift-jis の 2 バイト目が 0x5c の文字が使われると思いもよらない動作になる
とはいえ、これはGCCのバグとは言えない気がします。
日本語での書籍が多いと思います (スコア:2, 興味深い)
PostgreSQL本体の機能強化も大切ですが、クライアントから利用するたるODBCドライバのPostgreSQLのバージョンアップでの機能強化への対応がどうなっているのか興味あります。
一般企業で業務に利用するデータベースを自前で構築するとき、クライアントにAccessを利用できることが前提になると思いますので・・。
実は今年度、サーバにPostgreSQLとLinux、クライアントにAccessを使うことを前提に計画した部門システムがあったのですが、入札にかけたらサーバがwindows ServerとSQL Serverになってしまいました。それほどクリティカルなスケーラビリティや稼働率を求めるシステムではないので、できればオープンソースにチャレンジしてほしかったのですが・・。
今回、Windowsにネィティブに対応したことで、業務利用の敷居が一段と低くなったと思います。
開発要件を見極めながらという前提条件がつきますが、自治体では地域の企業の技術力を育てるためにも、オープンソースの利用を考えるべきではないかと思います。限られた予算をライセンス料に使うより、技術者の人件費に振り向けたほうが技術の蓄積にもなるし、地域経済の活性化にもつながると思います。
Re:日本語での書籍が多いと思います (スコア:1)
このあたり「鶏と卵」ですね。
Re:日本語での書籍が多いと思います (スコア:1, 興味深い)
「UNIX系管理者(or 開発者)の方が高給取り」って話は全然耳にしたことが無いでつ・・・
CAL+SQLServerの価格(数年毎に数百万~?)が、Linux+オープンソース系DBのUNIX管理者に流れているのが本当なら、もっと幸せになってる気がする。
(どう考えても、Windows系管理者と同レベルの給料じゃないのかなぁ・・・)
ついでに言うと、本当に実力が要求されるのはWindows系サーバやネットワークの管理者だと思う。体力含む。
お金はどこに消えた!
Re:日本語での書籍が多いと思います (スコア:1)
Bill and Melinda Gates Foundation [gatesfoundation.org]経由途上国行き。
#まぁ、新幹線とか作ってるよりマシな気もしてきた。
Re:MySQLとの比較 (スコア:1, 参考になる)
使い物にならないので捨てました。
せっかくのサブクエリーもこれではね。
という人は割とおおいと思われ
Re:MySQLとの比較 (スコア:2, すばらしい洞察)
Re:MySQLとの比較 (スコア:3, 参考になる)
PostgreSQL はあまり好きではありません。
Oracle は嫌いです。
自分の中での使いわけは、以下の感じ。
MySQL:
更新処理が多い場合。
Rollback が少ない場合。
PostgresSQL:
参照が多く、更新のタイミングが少ない場合。
# VACUUM ANALYZE が動的にできる最近は違うのかな ?
Oracle:
お金持ちのユーザの場合、というのは冗談で商用のサポートが必要な場合。
PostgreSQL があまり好きではないのは
MySQL の LAST_INSERT_ID() の変りになる関数が見つからなかったり、
VACUUM コマンドを知らない人が作った環境で DB の接続が timeout になると
呼び出されて VACUUM ANALYZE だけしたりとか、あったからかな。
でも pg_dump,pg_dumpall で取得したデータから
pg_restore による復旧などでトラブった事が無い点は好きです。
Re:MySQLとの比較 (スコア:1)
個人的には、MySQL は SQL の書き方にいろいろ制約がありすぎて、あれにどっぷりはまってしまうと変な癖がいろいろつきそうで嫌でした。Oracle、PostgreSQL は同程度に「まとも」と感じます。
// Oracle から PostgreSQL に来た人は、
// たいてい最初に「dual 表はどこだ?」と聞きます。
// そして from 無し select にたまげる、と(笑。
Re:MySQLとの比較 (スコア:2, 参考になる)
メインフレーム上ではそこそこ実績あるみたいですが。
RDBMS であることにこだわらなければ、耐障害性に優れたデータベースはメインフレーム上には他にも結構ありますよ。
ところで(耐障害性という言葉の定義にもよるのですが)読み出しの頻度の方が書き込みよりも圧倒的に多いのであれば、レプリケートした MySQL サーバをロードバランサの後ろに山ほど並べるという手法があります。生半可な構成の Oracle よりも耐障害性は高いです。扱いやすいし。
実際にこういう構成でサービスしているサイトもありますよ。
Re:MySQLとの比較 (スコア:1)
Veritasの各製品と組み合わせてHAクラスタだのオンラインバックアップだのと考えると、Oracleがいいのは確かですからね。その代わりお金が湯水のように飛んで行きますけど:-)
Re:MySQLとの比較 (スコア:1)
CREATE SEQUENCE pgsql_seq;
INSERT INTO pgsql_memo VALUES(nextval('pgsql_seq'), '2005-01-20');
INSERT INTO pgsql_picture VALUES(currval('pgsql_seq'), '/home/tyuu/20050120_01.jpg');
#mysql
INSERT INTO mysql_memo('day') VALUES('2005-01-20');
INSERT INTO mysql_picture VALUES(LAST_INSERT_ID(), '/home/tyuu/20050120_02.jpg');
PostgreSQL の場合 day の項目に間違えて '平成17年01月20日' とか
入れてしまっても 1 シーケンス消費しません ?
# ロールバックとか、色々抜いてますけどね
# ん?さすがに和暦 error でしたよね?
# PostgreSQL だから、対応していても不思議ではないが ...
この辺り嫌いです。
# 貧乏性...
Re:ところで・・ (スコア:1)