高速データロード機能の利用中に、サーバがダウンするなどのシステム障害が発生すると、本機能により準備されたトランザクションがインダウト状態になることがあります。このとき、トランザクションで占有した資源がロックされ、他のトランザクションから当該資源へのアクセスがブロックされて利用不可になります。
このような場合は、インダウト状態になっているトランザクションを確認し、インダウトトランザクションを解決します。
インダウトトランザクションの確認
インダウトトランザクションの確認方法について説明します。
pgx_loaderスキーマのpgx_loader_stateテーブルの参照
pgx_loaderスキーマのpgx_loader_stateテーブルを参照して、インダウトトランザクションのグローバルトランザクション識別子(gid列)を取得します。state列が“rollback”の行がインダウトトランザクションに関する情報です。
例
データベースロール“myrole”でテーブル“tbl”に関連するインダウトトランザクションのグローバルトランザクション識別子を取得する例を示します。この例では、グローバルトランザクション識別子“pgx_loader:9589”および“pgx_loader:9590”がインダウトトランザクションとなります。
postgres=# SELECT gid, state FROM pgx_loader.pgx_loader_state WHERE postgres-# role_oid IN (SELECT oid FROM pg_roles WHERE rolname = 'myrole') AND postgres-# relation_oid IN (SELECT relid FROM pg_stat_all_tables WHERE postgres-# relname = 'tbl'); gid | state -----------------+------------- pgx_loader:9590 | rollback pgx_loader:9591 | commit pgx_loader:9589 | rollback (3 rows)
pg_prepared_xactsシステムビューの参照
pg_prepared_xactsシステムビューを参照して、上記で取得したインダウトトランザクションの有無を再確認します。
例
グローバルトランザクション識別子“pgx_loader:9589”および“pgx_loader:9590”をもつインダウトトランザクションの有無を再確認する例を示します。
postgres=# SELECT gid FROM pg_prepared_xacts WHERE gid IN ('pgx_loader:9589','pgx_loader:9590'); gid ------------------ pgx_loader:9590 pgx_loader:9589 (2 rows)
参照
pgx_loader_stateテーブルの詳細は、“E.1 pgx_loader_state”を参照してください。
インダウトトランザクションの解決
インダウトトランザクションの解決には、pgx_loaderコマンドのrecoveryモードを使用します。
pgx_loaderコマンドのrecoveryモードを使用した後に、“インダウトトランザクションの確認”を実行して、インダウトトランザクションが解決されたことを確認してください。
例
テーブル“tbl”に関連するインダウトトランザクションを解決する例を示します。
$ pgx_loader recovery -t tbl
ポイント
pgx_loaderコマンドのrecoveryモードは、高速データロード機能が準備したトランザクションだけを解決します。本機能以外の、分散トランザクションを利用したアプリケーションが準備したトランザクションは“13.13 分散トランザクションの異常時の対処”に従って解決してください。