CentOS 7 に PostgreSQL 9.2 をインストール、設定のノート

スポンサードリンク

インストール

yum -y install postgresql-devel postgresql-server

特にリポジトリの追加等は行っておりません。

次のバージョンがインストールされました。

# psql --version
psql (PostgreSQL) 9.2.15
#

初期設定

CentOS 6 では、initdb は postgresql-setup ではなく、service postgresql initdb でした。

CentOS 7 となり、サービスの起動等以外にも変更となり、この点がとくに分かり辛く、調べるのに時間を使ってしまいました><。

# 初期化
postgresql-setup initdb
# 自動起動を有効
systemctl enable postgresql.service
# 起動
systemctl start postgresql.service

設定ファイル編集 1. パスワード認証へ変更

# バックアップ
cp -a /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
# パスワード認証へ変更
sed -i -i 's|local   all             all                                     peer|local   all             all                                     md5|' /var/lib/pgsql/data/pg_hba.conf
sed -i -i 's|host    all             all             127.0.0.1/32            ident|host    all             all             127.0.0.1/32            md5|' /var/lib/pgsql/data/pg_hba.conf
sed -i -i 's|host    all             all             ::1/128                 ident|host    all             all             ::1/128                 md5|' /var/lib/pgsql/data/pg_hba.conf

次のように変更されました♪

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

設定ファイル編集 2. パスワード暗号化 (設定変更せず)

password_encryption (boolean)
ENCRYPTEDもしくはUNENCRYPTEDの指定なしで、CREATE USER もしくはALTER USERにてパスワードが指定されている場合、このパラメータはパスワードを暗号化するか否かを決定します。 デフォルトはon(パスワードを暗号化)です。

デフォルトでオンのため、次の修正は行いませんでした。

# バックアップ
cp -a /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.org
# パスワード暗号化
sed -i -e 's/#password_encryption = on/password_encryption = on/' /var/lib/pgsql/data/postgresql.conf

設定ファイル編集 3. スーパーユーザに (postgres) にパスワード設定

ヒアドキュメントを使って、シェルから実行しました。

su - postgres <<EOT
psql -U postgres
ALTER USER postgres encrypted password 'vagrant';
\q
exit
EOT

確認は、次の SQL で行うことができました。

SELECT * FROM pg_shadow;

設定変更の反映

PostgreSQL を再起動して、変更した設定を反映させています。

# 再起動して設定反映
systemctl restart postgresql.service

おわりに

次の Vagrant のテンプレート作成のために、久しぶりに PostgreSQL のインストールを行いました。

調べる中で覚えておきたいこともございましたので、Github にコードを反映させる以外にノートいたしました。

以上です。

【PostgreSQL】ログイン時にパスワードも同時に渡して認証を通すコマンドの書き方

MySQL では接続コマンドと同時にパスワードを渡してログインすることが可能です。mysql -u root -ppassword という書き方ですわね。

PostgreSQL ではどうかしら?ヘルプを見てみましても、存在しません。調べてみたところ、簡単に書ける方法がございましたので、メモいたします。

接続コマンドと同時にパスワードを渡す psql の書き方

# mysql -u root -ppassword のように 1 行で PostgreSQL にログイン
PGPASSWORD=password psql -U postgres

# おまけ。ヒアドキュメントを使って、スーパーユーザ (postgres) にパスワード設定
su - postgres <<EOT
psql -U postgres
Alter USER postgres encrypted password 'vagrant';
\q
exit
EOT

# ヒアドキュメントを使って、DB 作成
PGPASSWORD=password psql -U postgres <<EOT
CREATE USER user1 WITH NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD 'password1';
CREATE DATABASE db1 WITH OWNER user1 ENCODING 'UTF8';
EOT

“【PostgreSQL】ログイン時にパスワードも同時に渡して認証を通すコマンドの書き方”の続きを読む


スポンサードリンク

【EC-CUBE】受注 CSV 出力で商品名、届け先都道府県をひとつのセルに全部入れる SQL♪

出力したいものの仕様はこうします♪

  • 「商品名」「規格1」「規格2」,「商品名」「規格1」「規格2」…、という形で 1 回で買った受注の商品をひとつのセルに出力させたい。
  • 北海道,東京都,沖縄県…、という形で 1 回で買った受注のお届け先都道府県をひとつのセルに出力させたい。
  • 商品は小計(dtb_order.subtotal)の前に、お届け先都道府県は配送情報 ID の次に出力させる。

SQL ポイント

  • || 演算子で前後のカラムを文字列結合する。
    文字列関数と演算子
  • NULL を含む文字列を結合すると全体が NULL となる。これを防止するために COALESCE 関数を使用する。COALESCE(column, ”) とすれば column が NULL ならば空文字 ” で、空白で、置き換えられる。
    条件式

“【EC-CUBE】受注 CSV 出力で商品名、届け先都道府県をひとつのセルに全部入れる SQL♪”の続きを読む

【EC-CUBE 2.12】受注の各商品も出力して CSV ダウンロードを実現する方法♪

受注の各商品も CSV 出力する SQL 文

受注の CSV 出力には、商品名は出力されません。

なぜなら、EC-CUBE の受注 CSV ダウンロードは 1 受注を1 行に出力する仕様でございますもの。

もし、1 回の買物で、複数種類の商品を買った場合、これらの商品をどうやって CSV に出力すればよいかしら?商品すべてを 1 つのセルに書きだすようにすればよいかしら?

できそうですわね!では、それぞれの商品の値段、購入した個数も知りたくなったらどうかしら?ひとつのセルに押し込めるかしら?ムギュウムギュウ♪

素直にはできませんわね><。大変難しいですの!

考え方はいろいろございますけれども、1 行 に 1 商品で出力します。そして、各行にその受注の合計金額など他の情報も掲載します。そのような方法も採れますわ、悪く無いと思いますの。

複雑さが増してしまいますけれども、CSV でしたら エクセルを念頭においていると存じます。まだ現実的な範囲内ではないかしら?

そのようなわけで、これを実現する SQL 文を書いてみましたわ♪

“【EC-CUBE 2.12】受注の各商品も出力して CSV ダウンロードを実現する方法♪”の続きを読む

【EC-CUBE 2.12】受注管理のCSV出力をコンテンツ管理>CSV出力項目設定>高度な設定で実現します!

コンテンツ管理>CSV出力項目設定>高度な設定に設定する SQL 文

実際にフォームに入力するときは、1 行目の SELECT は入力しません。また、最後の 1 文の ; も入力しません。

SELECT
        dtb_order.order_id,
        dtb_order.customer_id,
        dtb_order.message,
        dtb_order.order_name01,
        dtb_order.order_name02,
        dtb_order.order_kana01,
        dtb_order.order_kana02,
        dtb_order.order_email,
        dtb_order.order_tel01,
        dtb_order.order_tel02,
        dtb_order.order_tel03,
        dtb_order.order_fax01,
        dtb_order.order_fax02,
        dtb_order.order_fax03,
        dtb_order.order_zip01,
        dtb_order.order_zip02,
        (SELECT mtb_pref.name FROM mtb_pref WHERE mtb_pref.id = dtb_order.order_pref),
        dtb_order.order_addr01,
        dtb_order.order_addr02,
        dtb_order.order_sex,
        dtb_order.order_birth,
        dtb_order.order_job,
        dtb_order.subtotal,
        dtb_order.discount,
        dtb_order.deliv_fee,
        dtb_order.charge,
        dtb_order.use_point,
        dtb_order.add_point,
        dtb_order.tax,
        dtb_order.total,
        dtb_order.payment_total,
        dtb_order.deliv_id,
        dtb_order.payment_method,
        dtb_order.note,
        dtb_order.status,
        dtb_order.create_date,
        dtb_order.update_date,
        dtb_order.commit_date,
        dtb_order.device_type_id,
        (SELECT count(*) FROM dtb_shipping WHERE dtb_shipping.order_id = dtb_order.order_id),
        (SELECT ARRAY_TO_STRING(ARRAY(SELECT dtb_shipping.shipping_id FROM dtb_shipping WHERE dtb_shipping.order_id = dtb_order.order_id), ','))
FROM
        dtb_order
WHERE 
        del_flg = 0
;

“【EC-CUBE 2.12】受注管理のCSV出力をコンテンツ管理>CSV出力項目設定>高度な設定で実現します!”の続きを読む

phpPgAdmin を yum を使ったときと同じようにインストールするためのポイント♪

ソースからインストールするときでも yum でインストールしたときと同様の構成にするためのポイント

  • ソースファイルは /usr/share/phpPgAdmin に置く。
  • Apache の設定ファイルは /etc/httpd/conf.d/phpPgAdmin.conf とする。
  • もちろん phpPgAdmin の設定ファイル /usr/share/phpPgAdmin/conf/config.inc.php も適当に修正する。

以上の2点です。

Apache 設定ファイルの内容

“phpPgAdmin を yum を使ったときと同じようにインストールするためのポイント♪”の続きを読む

PostgreSQL のデータベースを別サーバへコピーする方法メモ♪

データベースを同じサーバの PostgreSQL へコピーするコマンド

-- データベースをコピー。db1(user1、password1) から db2(user2、password2)に
-- pg_dump -U user1 -W db1 | psql -U user2 -W db2 とすると
-- 「ERROR:  ロール"user1"のメンバでなければなりません」や
-- 「WARNING:  "public"の権限を取り上げられませんでした」の
-- メッセージが出るため、スーパーユーザーで実行することで回避
pg_dump -U postgres -W db1 | psql -U postgres -W db2

データベースを別のサーバの PostgreSQL へコピーするコマンド

データベースのコピーのコマンドの前に、次の内容のパスワードファイルを作成しておく必要があります。

  • コピー元サーバで、pg_dump を実行するユーザのホームディレクトリに .pgpass ファイルを作成する
  • コピー先サーバで、psql を実行するユーザのホームディレクトリに .pgpass ファイルを作成する
# hostname:port:database:username:password
localhost:5432:*:postgres:postgrespassword

実際の別サーバへのコピーは次のコマンドで行います。

-- 別サーバに PostgreSQL データベースをコピー。db1(user1、password1) から hostname サーバ(ユーザ名 hostuser)の db2(user2、password2)に
-- ただし、事前にパスワードファイルの設定が必要
pg_dump -U postgres db1 | ssh hostuser@hostname psql -U postgres db2

“PostgreSQL のデータベースを別サーバへコピーする方法メモ♪”の続きを読む

PostgreSQL のデータベースをコピーする方法メモ♪

PostgreSQL データベースをコピー

-- データベースをコピー。db1(user1、password1) から db2(user2、password2)に。
pg_dump -U postgres -W db1 | psql -U postgres -W db2
  • psql のプロンプトや postgres ユーザでのコマンドではなく、シェルで実行する。
  • コピー先のデータベースは予め作っておくこと。
  • PostgreSQL のユーザは postgres を使用する。
  • パイプ(|)前後の2回分、パスワードの入力が求められる。

指定するユーザについてポイント

“PostgreSQL のデータベースをコピーする方法メモ♪”の続きを読む

【PostgreSQL】文字コードがテンプレートの ENCODING と異なるデータベースを作成するときは、TEMPLATE template0 を追加したらエラー回避できました♪

文字コードがテンプレートの ENCODING と異なるデータベースを作成するためにTEMPLATE template0 を追加する SQL の例

CREATE DATABASE testdb WITH OWNER testuser ENCODING 'UTF8' TEMPLATE template0;

よく使う SQL は、DB、ユーザ、ユーザにパスワードを設定する SQL でございまして、次はその例ですの♪

-- ユーザの作成(スーパーユーザ無効、DB作成無効、ユーザ作成無効、パスワード設定)。データベースの作成
-- デフォルト ENCODING と異なる文字コードでDB作成する場合は、TEMPLATE template0 を追加
CREATE USER testuser WITH NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD 'testpassword';
CREATE DATABASE testdb WITH OWNER testuser ENCODING 'UTF8';

PostgreSQL  8.4で新しいデータベースを作成しようとしましたら、次のようなエラーとなってできませんでした><。

メッセージはうろ覚えですので間違っているかもしれませんが、大体次のようなメッセージでした。

“【PostgreSQL】文字コードがテンプレートの ENCODING と異なるデータベースを作成するときは、TEMPLATE template0 を追加したらエラー回避できました♪”の続きを読む

VirtualBox で LAMP + PostgreSQL + APC + XDebug + PHPUnit の開発環境構築手順♪

前提

  • CentOS 5.9 インストール済み
  • CUI で SSH 接続可能
  • CentOS に IP アドレス割り振り済み

つまり、VPS 契約した直後のような状態です。

インストールして最低限の設定をするパッケージ

  • Apache
  • PHP
    • APC
    • XDebug
    • PHPUnit
  • MySQL
  • PostgreSQL

LAMP + PostgreSQL → LAMPP!と思っていのですけれども、別の構成ですでにこのような名前がありました><。ぜんぶまとめて強引に略称にすれば、、、LAMPPPAX (らんぷぷぱっくす)でしょうか♪

それはともかく、開発環境ですので SQL サーバーとして MySQL に加え、PostgreSQL をインストールします。

はじめるまえに

わたくしは今回の手順を行う前に時刻同期やメモリ節約として次のことを行なっています。

それでは、はじめます。

1.Apache、MySQL、PHP、PostgreSQL、APC、XDebug、PHPUnit インストール

“VirtualBox で LAMP + PostgreSQL + APC + XDebug + PHPUnit の開発環境構築手順♪”の続きを読む