AnalyticDB for PostgreSQL V6.0 では、V4.3 と互換性のない構成が導入されています。アップグレードを実行する前に、V4.3 インスタンスに対して互換性確認スクリプトを実行し、互換性のない項目を特定・修正してください。本トピックでは Linux 環境を前提としています。Windows 環境をご利用の場合には、スクリプト内の SQL ステートメントを直接参照してください。
このスクリプトは、お客様のビジネス用 SQL ステートメント、カスタムストアドプロシージャ、関数、ビューには対応していません。これらの項目については、アップグレード後に V6.0 インスタンス上で個別に検証してください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
AnalyticDB for PostgreSQL V4.3 インスタンスへネットワーク接続可能な Linux デバイス
V4.3 インスタンスの接続エンドポイント、ポート、ユーザー名、パスワード
AnalyticDB for PostgreSQL コンソール へのアクセス権限
確認スクリプト
このスクリプトは、以下の 7 つの互換性確認項目を順次チェックします。
AnalyticDB for PostgreSQL インスタンスのバージョン
V4.3 から転送されないライブラリ
テーブルのサポートされていない分散キーのデータ型
テーブルのサポートされていないフィールドのデータ型
サポートされていない拡張
サポートされていないストアドプロシージャおよび関数
サポートされていないビュー
#!/bin/bash
#
# Copyright (c) 2020, Alibaba Group, Inc.
#
# 説明:
# インスタンスのアップグレード前に、互換性のない項目をチェックします。
# 使用方法: sh 4x_to_6x_check.sh <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>
# 確認項目:
# 1) AnalyticDB for PostgreSQL インスタンスのバージョンを確認します。
# 2) 転送されないライブラリを確認します。
# 3) テーブルのサポートされていない分散キーを確認します。
# 4) テーブルのサポートされていないフィールドのデータ型を確認します。
# 5) サポートされていない拡張を確認します。
# 6) サポートされていないストアドプロシージャおよび関数を確認します。
# 7) サポートされていないビューを確認します。
# 注意: エラーメッセージが 1 件以上出力された場合、該当する構成を修正する必要があります。
#
if [[ $# -lt 4 ]]; then
echo "使用方法:
$0 <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>"
exit 1
fi
export PGHOST=$1
export PGPORT=$2
export PGUSER=$3
export PGPASSWORD=$4
db_ver=`psql -d postgres -c "copy (select version()) to stdout"`
db_names=`psql -d postgres -c "copy (select sodddatname from gp_toolkit.gp_size_of_database) to stdout"`
db_names=(${db_names})
db_len=${#db_names[@]}
unsupport6x_ext="('feature_extractor','varbitx')"
unsupport6x_disted_type="('money','tinterval')"
unsupport6x_type="('unknown')"
# AnalyticDB for PostgreSQL インスタンスのバージョンを確認します。
check_version()
{
echo ''
echo $db_ver
echo ''
echo '********** 基盤バージョンの確認...'
base_time=`date -d "2020-08-31" +%s`
db_verdate=${db_ver##*compiled on}
seconds=`date -d "$db_verdate" +%s`
if [[ $seconds -lt $base_time ]]; then
echo 'ERROR: マイナーバージョンをアップグレードしてください...'
else
echo 'pass......'
fi
}
# 転送されないライブラリを確認します。
check_libraries()
{
echo ''
echo '********** 転送されないライブラリの確認...'
count=`psql -d postgres -c "copy (select count(1) from pg_catalog.pg_library) to stdout"`
if [[ $count -gt 0 ]]; then
psql -d postgres -c "select name,lanname language from pg_catalog.pg_library;"
echo "WARN: ライブラリを手動で転送してください..."
else
echo 'pass......'
fi
}
# テーブルのサポートされていない分散キーを確認します。
check_table_did()
{
echo ''
echo '********** テーブルのサポートされていない分散キーのデータ型の確認...'
count=0
if [[ $db_ver == *8.2*4.3* ]]; then
for ((i=0; i<$db_len; ++i)); do
sql="select count(1) from pg_catalog.pg_class c,pg_catalog.pg_attribute a,pg_catalog.pg_type t,pg_catalog.gp_distribution_policy p where
a.atttypid=t.oid and a.attrelid=c.oid and p.localoid=c.oid and a.attnum=any(p.attrnums) and a.attnum>0 and t.typname in $unsupport6x_disted_type"
count1=`psql -d ${db_names[$i]} -c "copy ($sql) to stdout"`
count=$((count + count1))
if [[ $count1 -gt 0 ]]; then
sql="select '${db_names[$i]}' dbname,n.nspname schema,c.relname table_name,a.attname distributed_field,t.typname field_type from
pg_catalog.pg_namespace n,pg_catalog.pg_class c,pg_catalog.pg_attribute a,pg_catalog.pg_type t,pg_catalog.gp_distribution_policy p
where a.atttypid=t.oid and n.oid=c.relnamespace and a.attrelid=c.oid and p.localoid=c.oid and a.attnum=any(p.attrnums) and a.attnum>0 and t.typname in $unsupport6x_disted_type order by schema,table_name;"
psql -d ${db_names[$i]} -c "$sql"
fi
done
fi
if [[ $count -gt 0 ]]; then
echo 'ERROR: テーブルの分散キーのデータ型を手動で変更してください...'
else
echo 'pass......' fi
}
# テーブルのサポートされていないフィールドのデータ型を確認します。
check_table_ftype()
{
echo ''
echo '********** テーブルのサポートされていないフィールドのデータ型の確認...'
count=0
if [[ $db_ver == *8.2*4.3* ]]; then
for ((i=0; i<$db_len; ++i)); do
sql="select count(1) from pg_catalog.pg_class c,pg_catalog.pg_attribute a,pg_catalog.pg_type t where
a.atttypid=t.oid and a.attrelid=c.oid and a.attnum>0 and t.typname in $unsupport6x_type"
count1=`psql -d ${db_names[$i]} -c "copy ($sql) to stdout"`
count=$((count + count1))
if [[ $count1 -gt 0 ]]; then
sql="select '${db_names[$i]}' dbname,n.nspname schema,c.relname table_name,a.attname field_name,t.typname field_type from
pg_catalog.pg_namespace n,pg_catalog.pg_class c,pg_catalog.pg_attribute a,pg_catalog.pg_type t
where a.atttypid=t.oid and n.oid=c.relnamespace and a.attrelid=c.oid and a.attnum>0 and t.typname in $unsupport6x_type order by schema,table_name;"
psql -d ${db_names[$i]} -c "$sql"
fi
done
fi
if [[ $count -gt 0 ]]; then
echo 'ERROR: テーブルのフィールドのデータ型を手動で変更してください...'
else
echo 'pass......'
fi
}
# サポートされていない拡張を確認します。
check_extensions()
{
echo ''
echo '********** サポートされていない拡張の確認...' count=0
if [[ $db_ver == *8.2*4.3* ]]; then
for ((i=0; i<$db_len; ++i)); do
count1=`psql -d ${db_names[$i]} -c "copy (select count(1) from pg_catalog.pg_extension where extname in $unsupport6x_ext) to stdout"`
count=$((count + count1))
if [[ $count1 -gt 0 ]]; then
psql -d ${db_names[$i]} -c "select '${db_names[$i]}' dbname,extname,extversion from pg_catalog.pg_extension where extname in $unsupport6x_ext;"
fi
done
fi
if [[ $count -gt 0 ]]; then
echo 'WARN: 不要な拡張を手動で削除してください...'
echo 'REF DROP EXTENSION SQL: drop extension <name> '
else
echo 'pass......'
fi
}
# サポートされていないストアドプロシージャおよび関数を確認します。
check_procs()
{
echo ''
echo '********** サポートされていないストアドプロシージャおよび関数の確認...'
count=0
clause="lower(p.prosrc) like '%pg_stat_activity%'
and ( lower(p.prosrc) like '%.procpid%' or lower(p.prosrc) like '%.current_query%' or lower(p.prosrc) like '%.waiting%' )
and n.nspname not in ('gp_toolkit','information_schema')"
if [[ $db_ver == *8.2*4.3* ]]; then
for ((i=0; i<$db_len; ++i)); do
count1=`psql -d ${db_names[$i]} -c "copy (select count(1) from pg_catalog.pg_proc p join pg_catalog.pg_namespace n on p.pronamespace = n.oid where $clause) to stdout"`
count=$((count + count1))
if [[ $count1 -gt 0 ]]; then
psql -d ${db_names[$i]} -c "select '${db_names[$i]}' dbname,n.nspname schemaname,p.proname from pg_catalog.pg_proc p join pg_catalog.pg_namespace n on p.pronamespace = n.oid where $clause;"
fi
done
fi
if [[ $count -gt 0 ]]; then
echo 'WARN: 転送後に、ストアドプロシージャおよび関数を手動で削除または修正してください...'
else
echo 'pass......'
fi
}
# サポートされていないビューを確認します。
check_views()
{
echo ''
echo '********** サポートされていないビューの確認...'
count=0
clause="lower(definition) like '%pg_stat_activity%'
and ( lower(definition) like '%.procpid%' or lower(definition) like '%.current_query%' or lower(definition) like '%.waiting%' )
and schemaname not in ('gp_toolkit','information_schema')"
if [[ $db_ver == *8.2*4.3* ]]; then
for ((i=0; i<$db_len; ++i)); do
count1=`psql -d ${db_names[$i]} -c "copy (select count(1) from pg_catalog.pg_views where $clause) to stdout"`
count=$((count + count1))
if [[ $count1 -gt 0 ]]; then
psql -d ${db_names[$i]} -c "select '${db_names[$i]}' schemaname,viewname from pg_catalog.pg_views where $clause;"
fi
done
fi
if [[ $count -gt 0 ]]; then
echo 'WARN: 不要なビューを手動で削除してください...'
else
echo 'pass......'
fi
}
check_version
check_libraries
check_table_did
check_table_ftype
check_extensions
check_procs
check_viewsパラメーター
| パラメーター | 説明 |
|---|---|
<PGHOST> | AnalyticDB for PostgreSQL V4.3 インスタンスのエンドポイント |
<PGPORT> | AnalyticDB for PostgreSQL V4.3 インスタンスのポート |
<PGUSER> | AnalyticDB for PostgreSQL V4.3 インスタンスのユーザー名 |
<PGPASSWORD> | ユーザーのパスワード |
互換性確認の実行
Linux デバイスに PostgreSQL クライアントをインストールします。
sudo yum install postgresqlLinux デバイスのパブリック IP アドレスを取得します。その IP アドレスを AnalyticDB for PostgreSQL コンソール で V4.3 インスタンスの IP アドレスホワイトリストに追加してください。詳細については、「AnalyticDB for PostgreSQL インスタンスの IP アドレスホワイトリストの設定」をご参照ください。
Linux デバイスから V4.3 インスタンスへの接続が可能であることを確認します。
psql -h <PGHOST> -p <PGPORT> -U <PGUSER>シェルスクリプトを
4x_to_6x_check.shとして保存し、実行します。sh 4x_to_6x_check.sh <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>出力結果を確認します。
ERRORまたはWARNメッセージが表示された場合は、以下の参考表に基づいて報告された項目を修正した後、再度スクリプトを実行して、すべての確認項目が正常に完了することを確認してください。
出力例
すべての確認項目が正常に完了した場合
7 つの確認項目すべてが V6.0 と互換性を持つ場合、出力は以下のようになります。
********** 基盤バージョンの確認...
pass......
********** 転送されないライブラリの確認...
pass......
********** テーブルのサポートされていない分散キーのデータ型の確認...
pass......
********** テーブルのサポートされていないフィールドのデータ型の確認...
pass......
********** サポートされていない拡張の確認...
pass......
********** サポートされていないストアドプロシージャおよび関数の確認...
pass......
********** サポートされていないビューの確認...
pass......互換性のない項目が検出された場合
問題が検出された場合、出力には影響を受けるオブジェクトの詳細と、ERROR または WARN メッセージが含まれます。次の例では、すべての確認項目でエラーが発生しています。
PostgreSQL 8.2.15 (Greenplum Database 4.3.99.00 build dev) compiled on May 2 2020 09:35:15
********** 基盤バージョンの確認...
ERROR: マイナーバージョンをアップグレードしてください...
********** 転送されないライブラリの確認...
name | language
----------+----------
select_1 | plpgsql
(1 row)
WARN: ライブラリを手動で転送してください...
********** テーブルのサポートされていない分散キーのデータ型の確認...
dbname | schema | table_name | distributed_field | field_type
--------+--------+------------+-------------------+------------
adbpg | public | test1 | id | money
(1 row)
ERROR: テーブルの分散キーのデータ型を手動で変更してください...
********** テーブルのサポートされていないフィールドのデータ型の確認...
dbname | schema | table_name | field_name | field_type
--------+--------+------------+------------+------------
adbpg | public | test2 | name | unknown
(1 row)
ERROR: テーブルのフィールドのデータ型を手動で変更してください...
********** サポートされていない拡張の確認...
dbname | extname | extversion
--------+---------+------------
adbpg | varbitx | 1.0
(1 row)
WARN: 不要な拡張を手動で削除してください...
REF DROP EXTENSION SQL: drop extension <name>エラーおよび警告メッセージの参考情報
| メッセージ | 操作 |
|---|---|
ERROR: マイナーバージョンをアップグレードしてください... | V4.3 インスタンスのマイナーカーネルバージョンを AnalyticDB for PostgreSQL コンソール でアップグレードしてください。詳細については、「AnalyticDB for PostgreSQL インスタンスのマイナーカーネルバージョンの更新」をご参照ください。 |
WARN: ライブラリを手動で転送してください... | V4.3 インスタンスから V6.0 インスタンスへライブラリを手動で移行してください。 |
ERROR: テーブルの分散キーのデータ型を手動で変更してください... | 出力結果に示された分散キーのデータ型を変更してください。サポートされていないデータ型は money および tinterval です。 |
ERROR: テーブルのフィールドのデータ型を手動で変更してください... | 出力結果に示されたフィールドのデータ型を変更してください。サポートされていないデータ型は unknown です。 |
WARN: 不要な拡張を手動で削除してください... | 各リストされた拡張について、V6.0 での使用に合わせて設定を更新するか、DROP EXTENSION <name> を使用して削除してください。サポートされていない拡張は feature_extractor および varbitx です。 |
WARN: 転送後に、ストアドプロシージャおよび関数を手動で削除または修正してください... | インスタンスの転送後に、出力結果に示されたストアドプロシージャおよび関数を削除または修正してください。 |
WARN: 不要なビューを手動で削除してください... | アップグレード前に、出力結果に示されたビューを削除してください。 |
次のステップ
すべての確認項目が正常に完了した後、AnalyticDB for PostgreSQL インスタンスを V4.3 から V6.0 へアップグレードできます。