カテゴリー : PostgreSQL

psql したら Library not loaded: libreadline エラーが出たので brew upgrade postgresql した

ひさしぶりに PostgreSQL を使おうと思い psql コマンドを実行したら Library not loaded: libreadline エラーが出たので brew upgrade postgresql して解決したというお話です。

psql コマンド実行で Library not loaded: libreadline エラー

$ psql
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.2.dylib
  Referenced from: /usr/local/bin/psql
  Reason: image not found
[1]    61053 trace trap  psql

brew upgrade postgresql で PostgreSQL のバージョンアップ

brew update
brew upgrade postgresql
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
mv /usr/local/var/postgres /usr/local/var/postgres9.3.1
initdb /usr/local/var/postgres
pg_upgrade \
  -b /usr/local/Cellar/postgresql/9.3.1/bin \
  -B /usr/local/Cellar/postgresql/9.6.1/bin \
  -d /usr/local/var/postgres9.3.1 \
  -D /usr/local/var/postgres
cp /usr/local/Cellar/postgresql/9.6.1/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

たまに PostgreSQL を使うぞってときに version アップデートからハマりたくはないですよね。

参考情報

[PostgreSQL] postmaster.opts は自動生成されるファイルなので編集しても無駄

PostgreSQL7.0 で、postmasterの起動時に -i オプションを追加する変更をするために、postmaster.opts を修正していたのですが、postgres を再起動すると編集前の状態に戻っていました。

どうやら、自動生成されるファイルなので編集しても無駄みたいでした。

下記、同じことやってた方の記事から一部抜粋。

TCPアクセスを許可する。 postmasterの起動時に -i オプションがつくようにすべき。

/etc/rc.d/init.d/postgresql を動作させると、いつのまにか /var/lib/pgsql/data/postmaster.opts が存在していた。 これに -i をつけるべし。

駄目だ。postgresqlを再起動するたびに postmaster.optsは 新しく生成されている。したがって、これを作る元のファイルを 変更する必要がある。 /etc/rc.d/init.d/postgresql の中を見ると、bourne shell script が /etc/sysconfig/pgsql/postgresql を実行して、PGOPTSを 参照している。したkがって、/etc/sysconfig/pgsql/postgresqlの中で と記述すればいいようだ。→その通りだった。確認した。

[引用元]:PostgreSQL

なので、起動スクリプト /etc/rc.d/init.d/postgresql を修正すれば良いみたいです。

[PostgreSQL] ERROR: language “plpgsql” does not exist

PostgreSQL で CREATE FUNCTION したら下記のようなエラーが発生しました。

ERROR:  language "plpgsql" does not exist
HINT:  You need to use "createlang" to load the language into the database.

plpgsql を後から追加するときは、コマンドラインから createlang コマンドでDB名を指定して実行すれば良いみたいです。

$ createlang -d database_name plpgsql

以上です。

【参考】

PostgreSQL で plpgsql がないときは | dTblog | デザインとプログラムの境界をさまようブログ はてなブックマーク - PostgreSQL で plpgsql がないときは | dTblog | デザインとプログラムの境界をさまようブログ

[PostgreSQL] ERROR: must be owner of extension plpgsql

PostgreSQL 8.0.4 から 9.1.5 にDBの移行作業で、pg_dump したデータをインポートしたら下記のようなエラーが発生しました。

CREATE EXTENSION
ERROR:  must be owner of extension plpgsql
 
WARNING:  no privileges could be revoked for "public"
WARNING:  no privileges were granted for "public"

DB を操作しているユーザに「スーパーユーザ」の権限を追加することで解決しました。

■ スーパーユーザ権限を追加する

postgres=# \du
                                         ロール一覧
 ロール名 |                                 属性                                 | メンバー 
----------+----------------------------------------------------------------------+----------
 newuser   | DBを作成できる                                                       | {}
 postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {}
 
postgres=# ALTER USER newuser CREATEUSER ;
ALTER ROLE
 
postgres=# \du
                                         ロール一覧
 ロール名 |                                 属性                                 | メンバー 
----------+----------------------------------------------------------------------+----------
 newuser   | スーパーユーザ, DBを作成できる                                       | {}
 postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {}

以上です。

【参考】

トリガーやファンクションのリストアが失敗していた。 – マンドクセェメモ はてなブックマーク - トリガーやファンクションのリストアが失敗していた。 - マンドクセェメモ

CREATE EXTENSION はてなブックマーク - CREATE EXTENSION

[PostgreSQL] ERROR: missing FROM-clause entry for table

PostgreSQL にて、下記のようなエラーが発生した場合の対応方法をメモ。

エラーメッセージ missing FROM-clause entry for table

ERROR: missing FROM-clause entry for table

バージョン 8.1 以降の 8 系は、SET add_missing_from TO true; で対応できるみたいです。

バージョン8.1への移行

add_missing_fromのデフォルトがfalseになりました(Neil)

FROM参照を持たない問い合わせでテーブルが使用された場合、デフォルトでエラーとなるようになりました。 まだ過去の動作を使用することができますが、そのためにはこのパラメータを’true’にしなければなりません。

ダンプに暗黙的なFROM構文を使用して作成したビューやルールがある場合、既存のダンプファイルをロードするために、add_missing_fromを真に設定しなければならないかもしれません。 これに悩まされるのは一回だけのはずです。 PostgreSQL 8.1は、こうしたビューやルールを標準の明示的なFROM構文に変換するためです。 したがって、今後のダンプではこの問題は起こりません。

ss=> SELECT WORK.* FROM WORK w;  -- 一見正しそうなこのSQLもエラーになる
ERROR:  missing FROM-clause entry FOR TABLE "work"
oss=> SET add_missing_from TO TRUE; -- デフォルト値がfalse
SET
oss=> CREATE VIEW work_v AS SELECT w.* FROM WORK w ;
CREATE VIEW
oss=> \d work_v        VIEWとして読み込ませると定義は自動的に訂正される
    VIEW "public.work_v"
 COLUMN |  TYPE  | Modifiers
--------+--------+-----------
 id     | BIGINT |
 VALUE  | text   |
 stat   | text   |
VIEW definition:
 SELECT w.id, w.value, w.stat
   FROM "work" w;

■ add_missing_from(boolean)
オンの場合、問い合わせによって参照されるテーブルは、既に存在していなければFROM句に追加されます。この振る舞いはSQL標準に準拠しておらず、多くのユーザは(そのエイリアスを参照しなければならないテーブル参照をする場合など)誤りを隠蔽するため、嫌がります。デフォルトはoffです。この変数は、この振る舞いがデフォルトで認められている8.1以前のPostgreSQLリリースとの互換性を有効にします。

この変数が有効になっているとしても、問い合わせによって参照される個々の明示的FROMエントリに対し、警告メッセージが放出されることに注意してください。問い合わせのFROM句に対する問い合わせで参照される全てのテーブルを追加すること(もしくはDELETEの場合のそのUSING句)に依る、この振る舞いに信頼を置かないアプリケーションの更新に、ユーザは消極的になります。

バージョン 9.0 からは add_missing_from が廃止されたみたいなので、SQLクエリを書き換えるしかないようでした。

バージョン 9.0 への移行 / 互換性のない変更点
サーバ設定の非互換

■ 設定 add_missing_from が廃止されました。
これはかなり以前からデフォルトで off となっていました。 (Tom Lane)

以上です。