Pivotal Knowledge Base

フォローする

孤立した一時的なスキーマへの対処

環境

製品 バージョン
Pivotal Greenplum(GPDB) 全てのバージョン

目的

各データベースセッションにおいて、当該セッションでのみ使用する一時的なテーブルを操作するために、一時的なスキーマを生成・使用することがあり得る。多くの場合、これらのスキーマはセッション終了時に破棄される。しかしながら時々、セッションのプロセスがクラッシュしたり、その他想定外の理由によるセッション終了により、セッション終了後もこれらの一時的なスキーマが残ってしまうことがある。

トランザクション管理(トランザクション ID の周回を防ぐためのトランザクションの age 値のトラッキング)が関わる場合やカタログの確認が行われる場合を除き、多くの場合、これらの一時的なスキーマの残存によって何らかの問題が発生することはない。前者のトランザクション管理が関わる場合、それらの(オブジェクトを伴う)一時的なスキーマはセッション固有であり、VACUUM コマンドで対処することはできない。後者のカタログ確認の場合、それらは gpcheckcat ログファイルに多くのノイズを発生させて、その他の重大なカタログ不整合を見逃してしまう可能性がある。

上述の理由で、これらの '孤立した' 一時的なスキーマの破棄が推奨され、特に gpcheckcat コマンドを用いたカタログ確認を行う前には必要である。もちろん、gpcheckcat ユーティリティーは一時的なスキーマが残存している状況を検知・指摘するが、ツール実行前にそれらの孤立した一時的なスキーマを取り除いた方が、状況が分かりやすく、迅速に完了する。それらの孤立した一時的なスキーマを容易に認識するために、データベースには admin モード(非ユーザーセッション)でログオンすることが推奨される。

解決策

コマンド:

以下のコマンドは、マスターとセグメントインスタンス上の孤立した一時的なスキーマを除去するためのスクリプトを生成する。当該コマンドは、実行中のセッションを考慮にいれるので、通常のワークロードと並行して実行可能である。

手順 1: 孤立した一時的なスキーマを識別し、それらを削除するスクリプトを生成  

cat /dev/null > execute_drop_on_all.sh | psql -d template1 -Atc "select datname from pg_database where datname != 'template0'" | while read a; do echo "Checking database ${a}"; psql -Atc "select 'drop schema if exists ' || nspname || ' cascade;' from (select nspname from pg_namespace where nspname like 'pg_temp%' union select nspname from gp_dist_random('pg_namespace') where nspname like 'pg_temp%' except select 'pg_temp_' || sess_id::varchar from pg_stat_activity) as foo" ${a} > drop_temp_schema_$a.ddl ; echo "psql -f drop_temp_schema_$a.ddl -d ${a}" >> execute_drop_on_all.sh ; done

上述のスクリプトは、カレントディレクトリに各データベースに対して、.sql ファイルを生成する。当該ファイルには、孤立した一時的なスキーマを削除するコマンドが含まれる。

全ての生成されたスクリプトを実行する前に、それらの内容を確認されたい。

手順 2: 孤立したスキーマを削除するために、手順 1 で生成されたスクリプトを実行

chmod +x execute_drop_on_all.sh
nohup ./execute_drop_on_all.sh | tee execute_drop_on_all.op 2>&1

上述のスクリプトは、手順 1 で生成された ddl ファイルを実行するコマンドを含んでいる。

手順 2 を実行した後、データベースには孤立したスキーマはなくなっているはずである。これは、手順 1 を再実行し、生成された .sql ファイルを精査することで検証可能である。 

コメント

Powered by Zendesk