すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:AnalyticDB for PostgreSQL V6.0とV7.0の間の非互換性をチェックする

最終更新日:Sep 24, 2024

AnalyticDB for PostgreSQL V7.0AnalyticDB for PostgreSQL V6.0は互いに完全に互換性がありません。 AnalyticDB for PostgreSQLインスタンスをV6.0からV7.0にアップグレードする前に、非互換性を処理する必要があります。 このトピックでは、Linuxデバイスを使用してAnalyticDB for PostgreSQL V6.0インスタンスに接続するときに、シェルスクリプトを実行して通常の非互換性をチェックする方法について説明します。

注意事項

サービスSQL文、カスタムストアドプロシージャ、カスタム関数、およびカスタムビューは、シェルスクリプトによってチェックされません。 ビジネス要件に基づいてインスタンスをAnalyticDB for PostgreSQL V7.0にアップグレードした後、これらのチェック項目を確認する必要があります。

サンプルシェルスクリプト

#!/bin/bash

#
# Copyright (c) 2023, Alibaba Group, Inc.
#
# Description:  check unsupported items before upgrade instance.
# Usage:        sh 6x_to_7x_check.sh <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>
# CheckList:
#          (1) Check the version of the AnalyticDB for PostgreSQL instance.
#          (2) Check for libraries that are not transferred.
#          (3) Check for unsupported field types for tables.
#          (4) Check for unsupported OSS external tables.
#          (5) Check for unsupported extensions.
#          (6) Check for unsupported stored procedures and functions.
# Notice: If one or more error messages are returned, you must modify the corresponding configurations. 
#

if [[ $# -lt 4 ]]; then
    echo "Usage: $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[@]}

unsupport7x_ext="('adbpg_desensitization', 'adbpg_hardware_bench', 'address_standardizer', 'address_standardizer_data_us', 'auto_partition', 'automerge_status', 'diskquota', 'fastann', 'hyjal_pb_formatter', 'madlib', 'morton_code', 'multi_master', 'multicorn', 'open_analytic', 'oss_ext', 'pljava', 'plpython2u', 'plpythonu', 'querycache', 'redis_fdw')"
unsupport7x_type="('abstime', 'reltime', 'tinterval', 'unknown')"

# Check the version of the AnalyticDB for PostgreSQL instance.
check_version()
{
  echo ''
  echo $db_ver
  echo ''
  echo '********** check base version...'
  base_time=`date -d "2023-01-31" +%s`
  db_verdate=${db_ver##*compiled on}
  seconds=`date -d "$db_verdate" +%s`
  if [[ $seconds -lt $base_time ]]; then
    echo 'ERROR: please upgrade minor version...'
  else
    echo 'pass......'
  fi
}

# Check for libraries that are not transferred.
check_libraries()
{
  echo ''
  echo '********** check untransferred libraries...'
  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 "ERROR: please drop unsupported libraries manually..."
  else
    echo 'pass......'
  fi
}


# Check for unsupported field types for tables.
check_table_ftype()
{
  echo ''
  echo '********** check unsupported table field types...'
  count=0
  if [[ $db_ver == *9.4*6.* ]]; 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 c.relnamespace <> 11 and t.typname in $unsupport7x_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 c.relnamespace <> 11 and t.typname in $unsupport7x_type order by schema,table_name;"
        psql -d ${db_names[$i]} -c "$sql"
      fi
    done
  fi
  if [[ $count -gt 0 ]]; then
    echo 'ERROR: please alter table field types manually...'
  else
    echo 'pass......'
  fi
}

# Check for unsupported OSS external tables.
check_oss_ext()
{
  echo ''
  echo '********** check oss external table...'
  count=0
  if [[ $db_ver == *9.4*6.* ]]; then
    for ((i=0; i<$db_len; ++i)); do
      count1=`psql -d ${db_names[$i]} -c "copy (select count(*) from pg_class c join pg_exttable e on c.oid = e.reloid where c.relstorage = 'x' and  e.urilocation[1] like '%oss://%') to stdout"`
      count=$((count + count1))
      if [[ $count1 -gt 0 ]]; then
        psql -d ${db_names[$i]} -c "select '${db_names[$i]}' dbname, c.relname from pg_class c join pg_exttable e on c.oid = e.reloid where c.relstorage = 'x' and  e.urilocation[1] like '%oss://%';"
      fi
    done
  fi
  if [[ $count -gt 0 ]]; then
    echo 'WARN: please drop oss external table manually...'
    echo 'HINT: oss external table is unsupported, please change to oss foreign table'
  else
    echo 'pass......'
  fi
}

# Check for unsupported extensions.
check_extensions()
{
  echo ''
  echo '********** check unsupported extensions...'
  count=0
  if [[ $db_ver == *9.4*6.* ]]; 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 $unsupport7x_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 $unsupport7x_ext;"
      fi
    done
  fi
  if [[ $count -gt 0 ]]; then
    echo 'WARN: please drop useless extensions manually...'
    echo 'HINT: 1. please change plpythonu to plpython3u(include related functions) 2. oss_ext is unsupported, please change to oss_fdw'
    echo 'REF DROP EXTENSION SQL: drop extension <name> '
  else
    echo 'pass......'
  fi
}



check_version
check_libraries
check_table_ftype
check_oss_ext
check_extensions

次の表に、上記のスクリプトのパラメーターを示します。

パラメーター

説明

<PGHOST>

AnalyticDB for PostgreSQL V6.0インスタンスのエンドポイント。

<PGPORT>

AnalyticDB for PostgreSQL V6.0インスタンスのポート番号。

<PGUSER>

AnalyticDB for PostgreSQL V6.0インスタンスのデータベースアカウント。

<PGPASSWORD>

データベースアカウントのパスワードを設定します。

手順

  1. 次のコマンドを実行して、LinuxデバイスにPostgreSQLクライアントをインストールします。

    sudo yum install postgresql
  2. LinuxデバイスのパブリックIPアドレスを表示します。 LinuxデバイスのパブリックIPアドレスを、AnalyticDB for PostgreSQLコンソールAnalyticDB for PostgreSQL V6.0インスタンスのIPアドレスホワイトリストに追加します。 IPアドレスホワイトリストの設定方法の詳細については、「IPアドレスホワイトリストの設定」をご参照ください。

  3. Linuxデバイスを使用して、目的のAnalyticDB for PostgreSQL V6.0インスタンスに接続します。

    psql -h <PGHOST> -p <PGPORT> -U <PGUSER>
  4. シェルスクリプトを6x_to_7x.shなどのスクリプトファイルとして保存します。 この例では、次のコマンドを実行して、互換性チェック用の6x_to_7x_check.shスクリプトファイルを実行します。

    sh 6x_to_7x_check.sh <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>
  5. 返されたエラーメッセージに基づいて、AnalyticDB for PostgreSQL V6.0インスタンスの互換性のない設定を変更します。 設定を変更したら、スクリプトを再度実行して、チェック項目がAnalyticDB for PostgreSQL V7.0と互換性があるかどうかを確認します。

サンプルチェック結果

「ERROR」のない「pass」メッセージは、チェック項目がAnalyticDB for PostgreSQL V7.0と互換性があることを示します。 次のコードは、すべてのチェック項目がAnalyticDB for PostgreSQL V7.0と互換性があることを示しています。

********** check base version...
pass......

********** check untransferred libraries...
pass......

********** check unsupported table field types...
pass......

********** check oss external table...
pass......

********** check unsupported extensions...
pass......

結果に1つ以上のエラーメッセージが含まれる場合は、互換性のない構成を変更する必要があります。 次のコードは、すべてのチェック項目がAnalyticDB for PostgreSQL V7.0と互換性がないことを示しています。

PostgreSQL 9.4.26 (Greenplum Database 6.6.0 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 9.2.1 20200522 (Alibaba 9.2.1-3 2.17), 64-bit compiled on Dec 15 2023 16:44:16

********** check base version...
ERROR: please upgrade minor version...

********** check untransferred libraries...
 name | language 
----------+----------
 select_1 | plpgsql
(1 row)

WARN: please transfer libraries manually...

********** check unsupported table field types...
 dbname | schema | table_name | field_name | field_type 
--------+--------+------------+------------+------------
 adbpg | public | test2 | name | unknown
(1 row)

ERROR: please alter table field types manually...

********** check oss external table...

 dbname | relname 
--------+----------
 testdb | testoss
 testdb | testoss2
 testdb | testoss3
(3 rows)

WARN: please drop oss external table manually...
HINT: oss external table is unsupported, please change to oss foreign table

********** check unsupported extensions...
 dbname | extname | extversion 
--------+---------+------------
 adbpg | fastann | 1.0
(1 row)

WARN: please drop useless extensions manually...
REF DROP EXTENSION SQL: drop extension <name> 

エラーメッセージ

変更方法

エラー: マイナーバージョンをアップグレードしてください...

AnalyticDB for PostgreSQL V6.0インスタンスのマイナーエンジンバージョンをアップグレードします。 詳細については、「インスタンスのマイナーバージョンの更新」をご参照ください。

警告: ライブラリを手動で転送してください...

AnalyticDB for PostgreSQL V6.0インスタンスで使用されているライブラリをV7.0インスタンスに移行します。

エラー: テーブルのフィールドタイプを手動で変更してください...

AnalyticDB for PostgreSQL V6.0インスタンスの互換性のないフィールドタイプを変更します。

警告: oss外部テーブルを手動でドロップしてください...

AnalyticDB for PostgreSQL V6.0インスタンスで使用されているOSS外部テーブルを、AnalyticDB for PostgreSQL V7.0でサポートされているOSS外部テーブルに変換します。

警告: 無駄な拡張機能を手動で削除してください...

ビジネス要件に基づいて、AnalyticDB for PostgreSQL V6.0インスタンスの互換性のない拡張機能を処理します。

  • 互換性のない拡張機能をAnalyticDB for PostgreSQL V7.0インスタンスで使用する必要がある場合は、互換性のない拡張機能に関連するテーブルまたはストアドプロシージャを変更することを推奨します。

  • 互換性のない拡張機能がAnalyticDB for PostgreSQL V7.0インスタンスで使用されていない場合は、拡張機能を削除することを推奨します。