"where 1 = 1 "
って便利なんですよね。
たとえば
このところトラックバックスパムがガンガン来るので、cronで一時間毎にdeleteするように仕掛けているのですが.....
delete from mt_tbping
where 1 = 1
or tbping_title like '%casino%'
or tbping_title like '%poker%'
or .......
っていうふうにしておくと、コメントアウトが簡単でしょ?
たとえば、「もうcasinoってトラックバックスパムは来ないからいらないわ」っていう時は
delete from mt_tbping
where 1 = 1
--or tbping_title like '%casino%'
or tbping_title like '%poker%'
or ......
ってやっちゃえばいいワケよっ!!おほほほほほ
....なぁんて修正したら
これまでのトラックバックがぜ~んぶ消えちゃったじゃぁないですぁか~っ!!
よぉく考えてみれば(考えてみなくても?)
delete from mt_tbping
where 1 = 1
or tbping_title like '%poker%'
orなんですよっ!OR~っ!!
1=1 or
なんて書いちゃったら、そりゃもう.....以下略(; ;)
仕事では、テストに続くテストで何度も何度も検証してからのリリースなのですが、
その反動か?
自分の環境は思うが侭に本番環境で実行していたのではかなく消えてしまいました。
データベースのバックアップを取ったのが9/16だったので、9/16以前にいただいたトラックバックは復活できましたが、それ以降にいただいたトラックバックが復活できません。
ごめんなさい。本当にごめんなさいm(_ _)m。
これに懲りずにまたトラバしていただけるとうれしいです。
今朝、ブレーカーが落ちたことをエントリーしようとMT管理画面へログインしようとしたら...
"bad driver..."
(あぁしまった!アセっていてキャプチャしておくのを忘れた!)
というメッセージが出ていました。
コメントの投稿やサーチも出来なかったと思います。
ごめんなさい。
なにがなんだかわからなくて....
「もしかして、侵入された?」
と、思わずsecureファイルを確認してしまいました。
それからアセってpostgresユーザに入ろうとしたら、パスワードを忘れている自分(泣)。
#いったんrootになってから入りました。
少しだけ落ちついて、今度は「データの中身」がしかるべきところに存在することを確認。
ほっ。
結局、「postgreSQLが落ちていた」というのが原因でした。
なぜ落ちたのかは不明です。
とりあえず立ち上げました。
いま、動いているでしょう??
また落ちたら、ごめんなさい。
サイドバーの最近のトラックバックを変更しました。
ちっとも暫定版です。
(はてなアンテナも暫定版のまま、突っ走っているけれど。)
最近トラバされた順に、最大5件のエントリーについて表示するようにしました。
本当はテンプレートだけで実現したかったのだけれど....
プラグインを入れるくらいなら自分でやりたい。
そこで、「私にもできる...」といったら、JSP@Tomcat5.5です。
下記クエリをJSPで実行したものをLynxで読み込んでサイドバーに取り込んでいます。
(1)最近トラックバックされたエントリーをトラックバック日付の降順にmax5件検索するクエリ
select trackback_title
,trackback_id
,trackback_url
from mt_trackback tb
,mt_tbping tbping
where trackback_id = tbping_tb_id
and tbping_created_on =
(
select max(tbping_created_on)
from mt_tbping in_tbping
where in_tbping.tbping_tb_id = tbping.tbping_tb_id
)
order by tbping_created_on desc
limit 5;
(2)それぞれのエントリに対するトラックバックを求めるクエリ
select tbping_title
,tbping_blog_name
,tbping_source_url
,to_char(tbping_created_on,'yyyy/mm/dd') as tbping_created_on
from mt_tbping
where tbping_tb_id = (1)で求めたtracback_id
order by tbping_created_on desc
JSPのソース
いま、pinappleさんからBBSで教えていただいたテンプレートを使って、左側のサイドバーに「最近のトラックバック」を表示しています。これはエントリーの最新順に、トラックバックされたものが表示されているのです。
とても便利になりました!>どうもありがとう!pinappleさん
ここでひとつ問題が...
ずいぶん前のエントリーに、最近トラックバックしていただいんたんです。
それが表示されないんです...涙。
そこで、エントリー付き最近のTrackbackの表示にいつものTomcat5.5(またかよっ)でチャレンジです。
#Tomcat上で動かした結果をSSIで取得するのだ。(←邪道)
とはいっても、サイドバーを表示するたびに毎回動的にjspが実行されてしまうので負荷がかかるし、やってみて納得するだけかもしれません。
「もしかして、Tomcat5.5にWebキャッシュみたいな機能ありましたっけ?あったらいいなぁ~」
「いやまて、もしWebキャッシュできたとしても、Databaseの中身がアップデートされてたら駄目じゃん..」
なんて、余計なこと考えたりもして。
話を元にもどして...
前提条件...MovableType3.01DにPostgreSQLを使っています。
参照するテーブルのチェック
(1)mt_trackback...あらかじめトラックバックを許可している
エントリー毎にレコードが作成される(らしい)。
Column | Type | Modifiers
-----------------------+-----------------------------+-----------
trackback_id | integer | not null
trackback_blog_id | integer | not null
trackback_title | character varying(255) |
trackback_description | text |
trackback_rss_file | character varying(255) |
trackback_url | character varying(255) |
trackback_entry_id | integer | not null
trackback_category_id | integer | not null
trackback_passphrase | character varying(30) |
trackback_is_disabled | smallint |
trackback_created_on | timestamp without time zone | not null
trackback_modified_on | timestamp without time zone | not null
trackback_created_by | integer |
trackback_modified_by | integer |
(2)mt_tbping...トラックバックされたときに作られる(らしい)。
Column | Type | Modifiers
--------------------+-----------------------------+-----------
tbping_id | integer | not null
tbping_blog_id | integer | not null
tbping_tb_id | integer | not null
tbping_title | character varying(255) |
tbping_excerpt | text |
tbping_source_url | character varying(255) |
tbping_ip | character varying(15) | not null
tbping_blog_name | character varying(255) |
tbping_created_on | timestamp without time zone | not null
tbping_modified_on | timestamp without time zone | not null
tbping_created_by | integer |
tbping_modified_by | integer |
(3)現在のmt_tbpingの中身
tbping_id | tbping_tb_id | tbping_title
-----------+--------------+-----------------------------------------------------
10 | 31 | なぜ日記 (のようなもの) を公開するのか
3 | 2 | コメントができないの・・・
4 | 5 | プレビュー画面の不具合修正
6 | 5 | MT3.0コメントプレビューのバグ?
7 | 8 | 文字コードの悪夢
8 | 10 | 今日のアタッカーさん
13 | 6 | MySQLの設定ではお世話になりました。
14 | 36 | フィッシング詐欺にご注意下さい
15 | 83 | New BMW 1シリーズ、国内正式発表10月9日より発売開始!
16 | 83 | BMW1シリーズ試乗
17 | 63 | カスタム・タグを作ろうとしてハマる
19 | 91 | 明日は洗車するぞ~
20 | 83 | ■トートバッグもらえず、、、
21 | 84 | もしかして: 女子高生
26 | 93 | デビューフェアのDMについていたCD、見ました。
27 | 99 | 素敵な彼と彼の音楽
「ほぅ~そうか、もしかして...
mt_trackback.trackback_idと、mt_tbping.tbping_tb_idとが結合できて、
mt_torackback.trackback_entry_idが、mt_entry.entry_idとが結合できるのかな?」
っと予測。
ためしに、上記(3)の一行目のmt_tbping.tbping_tb_id=31から、下記のクエリを実行。
(mt_entryからentry_titleを取ってきました。)
=> select entry_title from mt_entry
-> ,mt_trackback
-> where trackback_id = 31
-> and trackback_entry_id = entry_id;
entry_title
---------------------------------
なぜ、Web上で日記を書くのか??
「エントリータイトルがまったくおんなじっ!!」
『大あたり』だったけれど.....
もしかして...正規化されてない?
entry_titleとtbping_titleの違いってナンですか? 最近、たまに自分のサイト内をおさらいしたいことも出てきました。
そんな時、エントリー一覧は、カテゴリ別に表示されたほうがよいのです。
少し前に作ったTomcat版のエントリー一覧ですが(サイドバーにリンクをつけました...まだ試験運用版なので、正式ではないのです)、カテゴリの表示順に特に決まりがなかったので気になっていました。
今さっき、やっと、やっと....修正しました。
この並び順のソートの仕方って、最近のコメントのorder順のときにそっくりです。
ひとつだけ、さらに厄介になっているのは、
mt_entry(エントリーの中身の入っているテーブル)
と
mt_category(カテゴリの内容が入っているテーブル)
のほかに、
エントリーとカテゴリをつなげるための
mt_placemnetというテーブルが存在することです。
mt_entryとmt_categoryは直接結合できないんです。
どうも、entry_category_idにはNULLが登録されているようです。
ひとつのエントリーに複数のカテゴリを指定するために、mt_placementが追加されたのでしょうか?
そしてentry_category_idは不要になってしまったのでしょうか?
(なぜ、使われなくなった列を残してあるのかな?)
っというのは、置いておいて....
エントリーとカテゴリを結合させるためには、
entry_id と mt_placementのplacement_entry_id → category_id と mt_placementのplacement_category_id
を結合する必要があります。
それでもって、ひとつのカテゴリに属するエントリーのうち、登録日付が新しいものが含まれるカテゴリを優先して表示しなければならないんです。
っというワケで、↓のようなクエリに落ち着きました。(カテゴリをエントリ登録日時の降順で求めるクエリ)
select category_label
,category_id
from mt_category
,mt_entry
,mt_placement main_placement
where 1 = 1
and entry_id = placement_entry_id
and placement_category_id = category_id
and entry_created_on =
(
select max(entry_created_on)
from mt_entry
,mt_placement sub_placement
where 1 = 1
and entry_id = sub_placement.placement_entry_id
and sub_placement.placement_category_id
= main_placement.placement_category_id
)
order by entry_created_on desc
※「entry_created_onがもしまったく同じ値のエントリーが複数存在したら...」と懸念したけれども、ありえないのでよしとします。上記クエリを入れ込んで検索したのが、現在のTomcat版エントリー一覧です。
リンク先がJSPでエントリー内容を表示しているものになっていますが、blog内の静的なアーカイブへリンクしようかなとも思ってしまいます。
jsp全体のソースはこちらにあります。(加工なしのそのまんまです。)
カテゴリを選択したら、そのカテゴリに属するエントリーの中身じゃなくて、まずはエントリーの一覧が出るようにもしたいな。
しつこいです、私...笑。
前回から続きます
distinct ですが、MySQL(3.23.58)だと、並び替えをしないと判明。
(試してみました。『出てきた順』のようです。内部的にソートせずにマージしているのでしょうか?)
PostgreSQL(7.3.4)はdistinctした列でソート(並び替え)が行われます。(だから今回の不具合が出ました。)
ちなみにOracleもPostgreSQLと同じです。
今回の問題、
mt_commentと、mt_entryの結合にあると思うのです。
ER図にしてみました。

まず、最近のコメントを持っているエントリーを検索しなければなりません。
最近のコメントを取るためには、MT_COMMENTの中の、COMMENT_CREATED_ONで判断します。
エントリ(MT_ENTRY)と、コメント(MT_COMMENT)は、ENTRY_IDとCOMMENT_ENTRY_IDで結合されます。
エントリと結合するコメントのうち、いちばん最新のものを持ってきて、それをCOMMENT_CREATE_ONの降順でOrderするんです。
それで↓のようなクエリをかけたらいいのでは?っと思っていたのです。
select
entry_id
,entry_title
,comment_author
,to_char(comment_created_on,'yyyy/mm/dd')
from mt_entry
,mt_comment cm1
where entry_id = comment_entry_id
and comment_created_on =
(
select max(comment_created_on)
from mt_comment cm2
where cm2.comment_entry_id = cm1.comment_entry_id
)
order by comment_created_on desc
limit 5
(結果)
id | entry_title | author | comment_create
----+---------------------------------+--------+----------------
36 | PostgreSQLへ...その4?? | (o) | 2004/08/13
35 | PostgreSQLへ....その3 | megu | 2004/08/13
26 | なぜ、Web上で日記を書くのか?? | megu | 2004/08/10
23 | 管理画面のアクセス制限 | megu | 2004/08/10
25 | Audi newA6見てきました | megu | 2004/08/04
(5 rows)
相関副問い合わせを使っています。
副問い合わせ内では親問い合わせで取得したエントリIDのデータ中
いちばんcomment_created_onの値が大きいものを取り出します。
#しかしながら、私の力ではこれをどーやってMTに載せればよいのかわかりません。
#こういった問い合わせは無理があるのかも。
それで、教えていただいた、mizさんのパッチですが、
ありがたく更新させていただきました...m(_ _)m。
↓はmizさんのパッチをあてさせていただいた後のSQLです。
select entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by
from
(
select
entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by,
max (comment_created_on)
as entry_comment_created_on
from
mt_entry,
mt_comment
where (comment_blog_id = ?)
and (comment_visible = ?)
and entry_id = comment_entry_id
and (entry_blog_id = ?)
and (entry_status = ?)
group by entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by) t
order by entry_comment_created_on desc
limit 5
相関副問い合わせのかわりに、
From句の中にさらにSELECT命令、
その中でグルーピングして、各々のエントリーの中でcomment_created_onのいちばん大きいものを取り出しています。
コメント日付のいちばん新しい行を取ってくるViewを作成したのと同様だと思います。
(この場合、検索条件が内側のSELECT(=view)に含まれているので懸念される検索速度の低下には繋がらないと思いますが、メインカーソルで条件を絞り込んだ上で、その結果に対して副問い合わせを行ったほうがよい場合もあります。)
きっと、MTに実装するには、これがいちばん良い方法なんだと思います。
ソースと照らし合わせみると
「ほぅ~、こうやって書くのね」
と、思うのですが
じゃっ、いざ自分が考えていたクエリを実行させるにはどうすればいい?
#ちょっと時間をかけて考えたいとは思うけれど。
なんだかとってもわかりずらいソースプログラム。
もともと、MTのテーブルはフクザツな関係は持っていないと思うのです。
唯一、ちょっと難しい検索を使っているのがこの部分(最近のコメント)だったのではないでしょうか?
ではなぜMySQLではSQLの組み立て部分が異なってくるのか?
できれば同じ問い合わせを使うほうがいいに決まっているのに....なぁんて思ってしまうのですが...。
バージョンによるのかもしれませんが、私のMySQL(3.23.58)では、相関副問い合わせをかけようとすると、エラーとなります。From句にSELECT命令を書いても駄目です。
副問い合わせも駄目でした。
5.0のマニュアルでは出来るようなこと書いてあるのですが...
おそらく、普及しているであろうバージョンのMySQLにあわせると、副問い合わせを使うわけにはいかないのでしょう。
あまり悩んでいても本来の目的からかなり脱線してしまっているので、
このくらいにしておいたほうがいいのかも??
無事移行も完了して、やれやれ....っと思っていたのに。
ふとみたメイン画面、
「なんだかおかしい....」
『最近のコメント』に表示されている内容が古い順のようです。
もしかしたら、auto_increment@mySQLからsequence@PostgreSQLへ移行したのでそのせいかしら??
と思って、チェックしてみたけれど両者相違なし。
comment_idとcomment_created_on(コメントされた日時)はすべて一致していました。
あとはMain Indexテンプレート中の「最近のコメント」部分、
<MTEntries recently_commented_on="5" sort_order="ascend">
の"ascend"の部分を"descend"にしてみたりしたけれど、駄目でした。
仕方ない、何が原因かわからないので、とりあえずは仲介したBerkeleyDBで見てみました。
結果はOKです。
きちんと表示されました。
っというコトは、問題があるのはPostgreSQLの環境のみということになります。
もしかしたら、テーブルを結合して、ORDERを取るけれど、その時になにか間違えている??
=======
コメントをいただいた通り、この件は認知されているようで、パッチを配布してくださっている方もいらっしゃるようです。
ただ、アプリケーションエンジニアな私としては、SQLを理解しないと気がすまない。
MovableTypeのソースはちんぷんかんぷんですが、とりあえず、途中のsqlを吐かせるようにして、中身をチェックしてみました。
recently_commentを作成するためのSQLは2つ。
エントリーを求めるであろうメインカーソルと、エントリーからそれに属するコメントを求めるサブカーソルのふたつです。
#一気に求めたほうがクエリ的には速いはずなのですが、SQLの組み立て自体が標準化のようになっていて、個々のクエリに対して最適化されていないようです。
そのうちのひとつ、エントリーを求めるクエリに問題があることがわかりました。
MovableTypeが生成したクエリは下記のとおりです。
(みやすくするために、改行を入れています。長くてごめんなさい。)
select distinct
entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by
from
(
select
entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by,
comment_created_on
from mt_entry,
mt_comment
where 1 = 1
and entry_id = comment_entry_id
order by comment_created_on desc
) t
limit 5
Fromの中にさらにSELECTがあって、そのSELECT中にORDER句がありますが、
これは意味をなしません。
あってもなくても同じです。
問題なのは、distinctだと思います。
distinctを指定すると、結果が重複する場合1行だけ返してくれるのですが、この機能を実装するために、内部でこの列の並び順でorderされているはずです。
distinctしたがために、結果はentry_id順に取得されることになります。
そう考えると、今のメイン画面の結果にぴったりなのです。
いろいろ試してみたいのですが、今は時間を取れなくて残念~くやし~
続きはまた今度。
お互い異なるRDBMS、どうしたらよいのでしょう?
『Create命令とInsert命令があればなんとかなるさ!』
っと思っていた私の甘い考えは打ちのめされました(笑)。
mysqldumpで吐き出されたSQLを、PostgreSQL上で実行すると、エラーの連続でした。
見てみると、長さの指定されたint型やauto_increment機能など。
MySQL独自の機能を使っている部分が問題なのです。
仮に手作業で変換したとしても、その変換後の姿がMovableTypeがPostgreSQLで実装している方法とは異なるかもしれません。
う~ん、コマッタ。
そこで、ogawaさんが提供してくださっている、
mt-sql2db.cgi: mt-db2sql.cgiの逆変換CGIを使ってみることにしました。
前回、BerkeleyDBからMySQLへのお引越しのときには、MT3.0にもれなくついてきた、mt_db2sql.cgiというスクリプトを使いましたが、これと逆のことをしてくれます。
そこで、
MySQL ──(mt_sql2db.cgi)─→ BerkeleyDB ──(mt_db2sql.cgi)─→ PostgreSQL
という変換ができるのではないかな?
っと考えました。
んで、これ、成功しちゃいました!!
実は、今このエントリーのコンテンツはPostgreSQLに納まっています。
データベースの中身の文字コードはUTF-8。
でも、psql上で
=> \encoding euc_jp
とタイプすれば、表示はEUC_JPで行われます。
さっそく日本語を検索してみました。
=> select entry_title from mt_entry
-> where entry_id = 25;
entry_title
------------------------
Audi newA6見てきました
(1 row)
感激っ。
あれこれ迷ってきた文字コードのことについて、これでやっと終止符が打てます。
心なしか、再構築もちょっぴり速くなった気がするのです。
いろいろな情報をくださった方、素敵なスクリプトを提供してくださった方、とても感謝しています。
(追記)
その後、スキーマを見つけてしまいました(汗)。
MTをインストールしたディレクトリの直下にschemasというディレクトリがありますが、
この中に、mysql.dump postgres.dump sqlite.dumpと、それぞれのスキーマがありました。
postgres.dump
こちらを利用して移行することも可能です。(最初はそのつもりでいたので)
でも、スクリプトを使ったコンバートのほうが断然楽かと思います。
PostgreSQLが起動できたので、MTのコンテンツ用に、データベースの作成とデータベースユーザーの作成(※注)を行います。
postgresユーザー下で行いました。
いったんPostgreSQLへログインしてからCREATE DATABASEコマンドをタイプしてもいいのですが、createdbというシェルが用意されています。CREATE USERコマンドに対しては、createuserといシェルがあります。
(1)データベースの作成
$ createdb データベース名
CREATE DATABASE
※問題となっている文字コードですが、ここでも-Eというオプションで指定できます。
今回は、initbでデータ領域を作成した際に、UNICODE(utf-8)を指定しているので、
そのままデフォルト(utf-8)で行きます。
※この場合、このデータベースのOwnerは「現在のユーザ名」となるので、
postgresになります。(createdbの中身は、デフォルトユーザ(postgres)で
template1データベースに接続し、 CREATE DATABASEコマンドを実行するので。)
(2)データベースユーザーの作成
$ createuser ユーザー名
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER
上のように聞いてきましたので、
データベースの作成はできるけれど、
ユーザーの作成はできない....っというふうに答えておきました。
#これらはオプションで指定することもできます。
(3)mt.cfgの準備
ObjectDriver DBI::postgres
Database データベース名
DBUser データベースユーザー名
DBPort 5432 ←PostgreSQLのデフォルトのPort番号です。
なぜか、mt.cfgに
DBHost localhost
の記述があると繋がりませんでした。
もちろん、localhostからの接続なのですが...。
はずしたらすんなり....
なぜでしょう?不明です...まっ、いっか....
(2004.08.18 追記)
DBHost localhost の件、わかりました。
このサーバのPostgreSQLですが、UNIX ドメインソケット経由のアクセスとなっています。
(なぜなら、これがデフォルトだから..)
これがいちばん安全な方法だからだと思います。ローカルマシンにログインしていないと
接続を受付けないのです。
UNIXドメインソケット経由のアクセスの場合は、mt.cfgにてDBHOSTの記述をするとTCP/IP
経由の接続を試みるようでエラーになります。
TCP/IP経由で別マシンから直接PostgreSQLへの接続を許可する場合は、
/usr/local/pgsql/data/postgresql.confのtcpi_socketの部分を下記のように修正する
必要があります。
tcpip_socket = true ← #tcpip_socket = falseとなっているところのコメントをはずしてtrueに直す
こちらのサイトの『PostgreSQLのセキュリティ』が参考になりました。
ありがとうございました。
これで準備はおしまい。
あとは、中身の用意です:-)。
これが難儀....
昨日までは、
「MySQLが吐き出したスキーマをPostgreSQLに読ませちゃおう!」作戦
を考えていたのですが、これがどーも使えないようなのです。
Create Tableのパラメタひとつにしても、かなり違うのだなぁ~~
単純なのしかないと思っていたら、MySQL独自の機能など使っていたりして。
...続く...
(※注)
この「データベースユーザー」、クセ者です。
すっかり忘れていた私は騙されました(笑)。
PostgreSQL上のデータベースユーザーは、システムのログインユーザーとシンクロするのです。
psql起動時に、パラメタとしてユーザーを指定しないと、システム上のユーザーがデフォルトでデータベースユーザーと認識されてしまいます。
psql [option...] [dbname [username]]
です。データベース名の後にデータベースユーザーを指定します。
私はログインユーザーとデータベースユーザー名が同じとしても、
psql入力時には必ずユーザーを指定するように心がけています。
いろいろあった文字コード、PostgreSQLだったらクリアできそうな感じ。
※PostgreSQL 7.4.3 文書..20.2. 文字セットサポート参照
Slackware時代に愛用していたRDBMSだし、
「いいんじゃないかな??」
っと突然思い、入れることにしました。
インストール、設定は↓を参考に
http://www.postgresql.jp/document/pg743doc/html/admin.html
以下箇条書きのメモになります。
(1)ダウンロード
# wget ftp://ftp.postgresql.org/pub/v7.4.3/postgresql-7.4.3.tar.gz
(2)展開
# tar xvfz postgresql-7.4.3.tar.gz
(3)make
# cd postgresql-7.4.3
# ./configure --with-perl --with-java --enable-nls='ja'
--with-perl....PL/Perl サーバサイド言語を選択してみました。
(PL/SQLのPerl版?なんだろう?)
--with-java....JDBC経由でのアクセスは必須なので。
--enable-nls='ja'....メッセージの表示を日本語で。
※--enable-muntibyte というパラメタ、7.4.3ではマルチバイト処理が
含まれているので不要になったそうです。
# gmake
※注意です。GNU makeを使います。
時間がかかると書いてありますが、本当にかかりました(汗)。約15分。
上記説明サイトには「5 分から 30 分くらいかかります。」のでまぁまぁの成績かしら?(笑)
# gmake install
(4)ユーザーの作成
# useradd postgres
(5)所有権の変更
# chown postgres.postgres -R /usr/local/pgsql
/usr/local/pgsqlの所有者がrootになっているので、上で作成したpotgresユーザーに変更します。
(6)posgresユーザーの環境変数設定
.bash_profileに追加しました。
export PATH="$PATH":/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
$ source .bash_profile で反映させます。
(7)データ領域の作成
$ initdb -E UNICODE
※オプション -D を使う代わりに環境変数 PGDATA を使っています。
上記(6)の設定より、/usr/local/pgsql/dataになります。
データベースに格納する文字コードはUNICODE(utf-8)で、
クライアントからアクセスするときの文字コードはEUCと指定して行うことに決めましたっ!
Success. You can now start the database server using:
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
or
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
成功!:-)
(8)データベースを起動
$ postmaster -D /usr/local/pgsql/data >/usr/local/pgsql/logfile 2>&1 &
(9)データベースをシャットダウン
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
(10)システム起動時にPostgreSQLが起動するように設定
/etc/inittabに、下記行を追加
pg:2345:respawn:/bin/su - postgres -c
"/usr/local/pgsql/bin/postmaster -D/usr/local/pgsql/data >>
/usr/local/pgsql/logfile 2>&1 </dev/null"
(メモ)
Java(JDBC)パッケージ群が必要な場合(--with-javaを指定する場合)
ant(jakarta.apache.org参照..Java環境におけるMakeツール)が必要です。
インストール手順 解凍して環境変数を整えるだけです。
# wget http://sunsite.tus.ac.jp/pub/apache/ant/binaries/apache-ant-1.6.2-bin.tar.gz
# tar xvfz apache-ant-1.6.2-bin.tar.gz
$ANT_HOMEを解凍後のapache-ant-1.6.2ディレクトリに設定。
$ANT_HOME/binにPATHを通す
私は、postgresユーザーにJavaは必要ないので(いいのかな?)
普段Jakartaプロジェクトツール(TomcatなどJavaアプリ)を利用しているユーザでログインしてから、rootにsuしてconfigureしました。
今日はインストールまで。
これから、mysqldumpで吐き出したSQL文をPostgreSQLに読み込ませて、
MTの設定をPostgreSQLへ変更する予定です。
さてどーなるか....
投稿者 megu : 12:55
