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

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

最終更新日:Sep 24, 2024

AnalyticDB for PostgreSQL V6.0には、V4.3と互換性のない設定があります。 AnalyticDB for PostgreSQLインスタンスをV4.3からV6.0にアップグレードするには、互換性のない設定を前処理する必要があります。 このトピックでは、シェルスクリプトを実行してAnalyticDB for PostgreSQL V4.3とV6.0の間の非互換性をチェックする方法について説明します。 この例では、Linuxオペレーティングシステムが使用されています。 Windowsを使用する場合は、スクリプト内のSQL文を参照できます。

注意事項

チェック項目には、ビジネスまたはカスタムのストアドプロシージャ、関数、またはビューのSQL文は含まれません。 AnalyticDB for PostgreSQL V6.0インスタンスで除外された項目を確認できます。

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

#!/bin/bash

#
# Copyright (c) 2020, Alibaba Group, Inc.
#
# Description:
check unsupported items before upgrade instance.
# Usage:  sh 4x_to_6x_check.sh <PGHOST> <PGPORT> <PGUSER> <PGPASSWORD>
# CheckList:
#          1) Check the version of the AnalyticDB for PostgreSQL instance.
#          2) Check the libraries that are not transferred.
#          3) Check the unsupported distribution keys for tables.
#          4) Check the unsupported field types for tables.
#          5) Check the unsupported extensions.
#          6) Check the unsupported stored procedures and functions.
#          7) Check the unsupported views.
# 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[@]}

unsupport6x_ext="('feature_extractor','varbitx')"
unsupport6x_disted_type="('money','tinterval')"
unsupport6x_type="('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 "2020-08-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 the 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 "WARN: please transfer libraries manually..."
else
    echo 'pass......'
fi
}

# Check the unsupported distribution keys for tables.
check_table_did()
{
  echo ''
  echo '********** check unsupported table distributedId types...'
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: please alter table distributedId types manually...'
else
    echo 'pass......'  fi
}

# Check the unsupported field types for tables.
check_table_ftype()
{
  echo ''
  echo '********** check unsupported table field types...' 
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: please alter table field types manually...'

else
    echo 'pass......'
    fi
}

# Check the unsupported extensions.
check_extensions()
{
  echo ''
  echo '********** check unsupported extensions...' 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: please drop useless extensions manually...'
    echo 'REF DROP EXTENSION SQL: drop extension <name> '
  else
    echo 'pass......'
fi
}

# Check the unsupported stored procedures and functions.
check_procs()
{
  echo ''
  echo '********** check unsupported procs...'
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: please drop/repair proc/function manually after transferred...'
else
    echo 'pass......'
fi
}

# Check the unsupported views.
check_views()
{
  echo ''
  echo '********** check unsupported views...'
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: please drop useless views manually...'

else
    echo 'pass......'
fi
}

check_version
check_libraries
check_table_did
check_table_ftype
check_extensions
check_procs
check_views

表 1. パラメーター

パラメーター

説明

<PGHOST>

AnalyticDB for PostgreSQL V4.3インスタンスへの接続に使用されるエンドポイント。

<PGPORT>

AnalyticDB for PostgreSQL V4.3インスタンスへの接続に使用されるポート番号。

<PGUSER>

AnalyticDB for PostgreSQL V4.3インスタンスへの接続に使用されるユーザー名。

<PGPASSWORD>

ユーザーのパスワード。

手順

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

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

  3. Linuxデバイスを使用してAnalyticDB for PostgreSQL V4.3インスタンスに接続します。

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

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

サンプルチェック結果

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

    • ********** check base version...
      pass......
      
      ********** check untransferred libraries...
      pass......
      
      ********** check unsupported table distributedId types...
      pass......
      
      ********** check unsupported table field types...
      pass......
      
      ********** check unsupported extensions...
      pass......
  • 結果に1つ以上のエラーメッセージが含まれる場合は、互換性のない構成を変更する必要があります。 次のコードは、すべてのチェック項目がAnalyticDB for PostgreSQL V6.0と互換性がないことを示しています。

    • 
      PostgreSQL 8.2.15 (Greenplum Database 4.3.99.00 build dev) compiled on May 2 2020 09:35:15
      
      ********** 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 distributedId types... 
      dbname | schema | table_name | distributed_field | field_type 
      --------+--------+------------+-------------------+------------
       adbpg  | public | test1      | id                | money
      (1 row)
      
      ERROR: please alter table distributedId types 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 unsupported extensions...
      
      dbname | extname | extversion 
      --------+---------+------------
       adbpg  | varbitx | 1.0
      (1 row)
      
      WARN: please drop useless extensions manually...
       REF DROP EXTENSION SQL: drop extension <name>

      エラーメッセージ

      変更方法

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

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

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

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

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

      AnalyticDB for PostgreSQL V4.3インスタンスの互換性のない配布キーを変更します。

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

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

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

      互換性のない拡張機能に関連するテーブルまたはストアドプロシージャを使用する必要がある場合は、拡張機能の設定を変更します。 互換性のない拡張機能がAnalyticDB for PostgreSQL V6.0で使用されていない場合は、拡張機能を削除します。