【PostgreSQL】prepared transaction(s) using the database.エラーでDBが削除できない時の解決策

drop databaseをしたところ、下記のような「database “dbtest” is being accessed by other users」という警告がでてデータベースの削除が行なえませんでした。

$ /usr/local/pgsql/bin/dropdb dbtest
dropdb: database removal failed: ERROR:  database "dbtest" is being accessed by other users
DETAIL:  There are 1 prepared transaction(s) using the database.

しかし何度確認しても一切セッションがおらず、またPostgreSQLやOSを再起動したり接続元をlocalhostに制限しても変わらずエラーが出てDropdbが出来ないという謎事象にぶち当たりました。

原因:二相コミットのトランザクションが残り続けていた

あーもうこれデータベースクラスタの再作成が必要かな‥ という域にまで悩みましたが、確認を進めたところ原因は二相コミットのトランザクションが残り続けていたから、ということが判明。

まずは現在の二相コミットのトランザクションを確認。

select * from pg_prepared_xacts

すると下記のようにしっかりと残っていやがる。。。。

transaction gid prepared owner database
1674597 hogehogehoge 2017/6/1 10:13 postgres dbtest

そこで二相コミットを利用しているDB(dbtest)にログインして下記SQLを実行して二相コミットのロールバックを実施。

ROLLBACK PREPARED 'hogehogehoge';

無事に解決しました!!!!

これで Drop database でデータベースを削除できることまで確認できました。よかった。

おまけ

ちなみに二相コミットのロールバック時に書きのようなエラーが出た場合は。

ERROR:  prepared transaction belongs to another database

ログインしているDBが二相コミットを使っているDBじゃない場合は上記のエラーが出ます。二相コミットを利用しているDB(dbtest)にログインしてからロールバックSQLを実行してください。

コメントを残す

メールアドレスが公開されることはありません。