2016年09月24日

3時間格闘した挙句-PostgreSQL MDB2とIPv6のおはなし-

PHPにはMDB2というpearのパッケージがあります。
様々なデータベースへアクセスを可能にするものです。
昨日まではAWSで動いていました。
だからローカルで試しても動くだろうと思って、ローカルマシンにMDB2とMDB2_Driver_pgsqlを入れたのです。
ところがどっこい、動かない。
PHP Fatal error: Call to undefined function: MDB2_Driver_pgsql::raiseError(). in /usr/share/pear/MDB2.php on line 1936
というメッセージがhttpdのログに出てきただけで反応が無い。
おかしいのでググってみても解決方法が見つからない。
これはAWSがPostgreSQL9.4だったからきっとPostgreSQLのバージョンを上げれば直るかもしれない。
と思いPostgreSQLのバージョンを9.5に引き上げてみました。
しかし動かない。
そこで、
$pear list
コマンドでAWSとローカルのパッケージのバージョンを比較してみたところ、
AWSではMDB2もMDB2_Driver_pgsqlもbeta版を使っていました。
そこで、ローカルマシンもbeta版を入れてもう一度実行したところ、
_doConnect: [Error message: unable to establish a connection] [Native message: ]
とWebブラウザに表示されたっきり変化なし。
きっとこれはPHPのバージョンが古いせいだと考えた私は次にPHPを5から7へバージョンアップさせてみることに。
しかし症状は変わらない。
仕方がないのでMDBを諦め、PDOを使ってみると、今度は
Ident authentication failed for user "postgres"
とWebブラウザ上に出てしまった。
不思議に思い、psqlに-Wオプションをつけて実行したところ
postgres のパスワードを打ち込んでも同じエラーが出ることに気づいた。
そうこうしているうちに日は暮れて、悩んだ挙句わかったこと。
IPv6が悪さをしていることがわかった。
pg_hba.confのIPv6の設定がコメントアウトされてしかもMETHODが
Identになっていた。
そこで、このコメントを外して、IPv6でも認証するようにして
METHODもIdent→trustに変更、
PostgreSQLサーバを再起動させたところ、psqlでもPDOでも目的の動作を確認できた。
そこで、MDB2を使ってみたところ、意図した動作が確認できた。
結論:IPv6を忘れちゃいけないよ。
posted by evakichi at 00:15| Comment(0) | 技術

2016年06月13日

備忘録-postgres port変更編-

postgresはポートを変えるのにもSELinuxの変更が必要になるそうだ、

参考:
http://syo.cocolog-nifty.com/freely/2012/05/postgresql-and.html

まず、postgres のポートがSELinuxで何番か調べる。
#semanage port -l|grep postgres
postgresql_port_t tcp 5432, 9898

ということで、変更
#semanage port -a -t postgresql_port_t -p tcp 5433

実行、確認。
# systemctl start postgresql.service
# systemctl status postgresql.service
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
Active: active (running) since 月 2016-06-13 09:44:53 JST; 11s ago
Process: 14728 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
Process: 14721 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 14730 (postgres)
CGroup: /system.slice/postgresql.service
tq14730 /usr/bin/postgres -D /mnt/raid1/psql/data -p 5433
tq14731 postgres: logger process
tq14733 postgres: checkpointer process
tq14734 postgres: writer process
tq14735 postgres: wal writer process
tq14736 postgres: autovacuum launcher process
mq14737 postgres: stats collector process

めでたく動いた。
posted by evakichi at 09:53| Comment(0) | 技術

2016年06月08日

備忘録ーpostgreSQLー

PostgreSQLで他のディレクトリにデータベースを作った場合。
通常サーバーを動かすとpostgresql.conf が読み取り許可されていない。

そこで考えられるのは、SELinuxの設定である。

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-PostgreSQL-Configuration_Examples.html

を参考に、
今回は/mnt/raid1/psql/data上にデータベースを作ったから

#semanage fcontext -a -t postgresql_db_t "/mnt/raid1/psql/data(/.*)?"
#restorecon -R -v /mnt/raid1/psql/data

これを行う。そのためにはsemanageが必要なので、
#yum install policycoreutils-python
を行う。

必要に応じてこの前に、
#yum install setools
も必要かも。

で、
#systemctl start postgresql.service
をすればめでたく立ち上がる。
おしまい。
posted by evakichi at 14:37| Comment(0) | 技術