• Oracle-单个PDB迁移升级到19c


    目录

    1 迁移方式:

    2 迁移流程:

    3 迁移前环境检查

            3.1 版本检查

            3.2 字节序与以及字符集检查

            3.3 归档模式检查

            3.4 补丁检查

            3.5 数据库组件

            3.6 本地undo检查

            3.7 目标端备库检查

            3.8 目标端资源检查

            3.9 下载pre-upgrade工具

    4 upgrade检查

            4.1 源端创建upgrade日志目录

            4.2 源端上传pre-upgrade工具

            4.3 源端使用pre-upgrade工具进行检查

            4.4 源端检查pre-upgrade工具输出日志

            4.5 源端PDB执行更新前的修复脚本preupgrade_fixups.sql

            4.6 检查修复脚本执行完成的日志

            4.7 将pre-upgrade工具的输出文件拷贝到目标主机

    5 relocate前期准备

            5.1 配置TNS

            5.2 创建同步用户

            5.3 创建DBLINK

            5.4 配置service到目标数据库

    6 relocate拷贝数据

            6.1 relocate配置说明

            6.2 创建relocate并进行数据同步

            6.3 监控relocate的数据同步进度

            6.4 relocate恢复日志

    7 refresh刷新增量数据

            7.1 查看刷新配置

            7.2 手动执行refresh,确认是否正常

            7.3 启动到只读验证数据(可选)

            7.4 恢复同步(可选)

    8 正式数据迁移(应用不可访问)

            8.1 通知应用停机

            8.2 目标端刷新增量数据

            8.3 源端关闭pdb testdb

            8.4 目标端刷新最后一次增量数据

            8.5 目标端以升级模式打开pdb testdb

            8.6 查看目标库pdb状态

    9 目标端pdb testdb版本更新到19c(应用不可访问)

            9.1 更新版本到19c

            9.2 启动到open状态

            9.3 检查组件状态为upgrade

            9.4 进行重编译

            9.5 检查组件状态为VALID

            9.6 执行更新后的修复脚本postupgrade_fixups.sql

            9.7 更新timezone

            9.8 更新版本到19c

            9.9 更新版本到19c

    10 迁移升级完成之后(可选)

            10.1 源端删除服务

            10.2 源端删除pdb

            10.3 目标端删除dblink

            10.4 目标端DG同步新的PDB

    11 回退方案

            11.1 relocate命令或者refresh命令执行失败

            11.2 正式迁移升级过程失败或者应用验证不通过


    前言:

    本文章主要描述如何将单个12.2版本的PDB数据库以较少的停机时间,安全的迁移升级到19c版本数据库的实施操作步骤以及相关回退步骤。

    PS:文章篇幅较长,需要花费一定时间阅读。

    1 迁移方式:

    采用relocate+refresh pdb方式通过dblink从12.2源端在线热克隆pdb到目标端,并且通过refresh pdb从源端定时投递redo到目标端pdb进行增量恢复,从而减少应用正式迁移的停机时间。

    再将pdb迁移到目标端19c之后,使用catupgrd.sql脚本方式将pdb升级到19c。

    2 迁移流程:

    • 迁移前环境准备:解决迁移的前提条件

    • 迁移配置(应用可以访问):

            通过dblink从12.2源端在线热克隆pdb数据文件到目标端

            通过refresh pdb从源端定时投递redo到目标端pdb进行增量恢复

    • 正式迁移(应用不可访问)

            停应用,关闭源端pdb,数据不再写入

            通过refresh pdb从源端刷新最后一次redo到目标端pdb进行增量恢复

            启动源端pdb进行upgrade,升级为19c

    3 迁移前环境检查

            3.1 版本检查

    1. ---源端和目标端版本需要12.2以上,目标版本建议在19c以上
    2. select * from v$version;
    3. $ORACLE_HOME/OPatch/opatch lspatches

            3.2 字节序与以及字符集检查

    1. ---源端和目标端需要要相同的endian type以及字符集
    2. set linesize 400
    3. set pagesize 400
    4. select a.platform_id,a.platform_name,a.endian_format
    5. from v$transportable_platform a,v$database b
    6. where a.platform_id=b.platform_id;
    7. col parameter for a40
    8. col value for a50
    9. select * from v$nls_parameters;

            3.3 归档模式检查

    1. ---源端必须启动归档模式
    2. archive log list

            3.4 补丁检查

    • relocation相关问题补丁

    1. 源端和目标端对应版本建议应用相关补丁解决潜在的relocation bug问题
    2. Patch 29469563 – Fixes an issue where PDB hot clones fail with ORA-15001, included in 19.9 and later
    3. Patch 26001677 – Implements REFRESH MODE for PDB relocate, included in 19.8 and later
    • refresh相关问题补丁

    1. 源端和目标端对应版本建议应用相关补丁解决潜在的refresh bug问题
    2. Patch 28374604 – Deletes partial redo logs created during refresh operations, available 19.1 and later
    • preupgrade相关问题补丁

    Patch 32242034 – Corrects screen output of Oracle Preupgrade Information tool for instructions on running fixup scripts, available in Build 10 of the preupgrade.jar file from How to Download and Run Oracle’s Database Pre-Upgrade Utility Document 884522.1
    • TDE相关问题补丁

    1. 使用 Transparent Data Encryption (TDE),建议应用以下补丁解决潜在的bug问题Patch 29175638 - Adds support for INCLUDING SHARED KEY clause to avoid ORA-46659 errors.
    2. Patch 32220709 - Ensures shared PDB master keys display in v$encryption_keys, included in 19.14 and later.

            3.5 数据库组件

    1. ---确保源端和目标端数据库软件具备相同的组件
    2. set linesize 400
    3. set pagesize 400
    4. Col Comp_name Format a60
    5. Col Status Format a12
    6. Select Comp_name, status, Version
    7. From Dba_Registry
    8. Order by Comp_name;

            3.6 本地undo检查

    1. ---源端和目标端CDB,PDB都要设置本地undo
    2. col property_name for a50
    3. col property_value for a50
    4. set linesize 400
    5. set pagesize 400
    6. select property_name,property_value
    7. from database_properties
    8. where property_name='LOCAL_UNDO_ENABLED'

            3.7 目标端备库检查

            使用standby=none的选项,目标端的数据库的备库不会自动同步新的pdb,需要在升级迁移之后,手动进行同步

            3.8 目标端资源检查

    • 空间检查

    1. ---当前asm磁盘或者本地数据目录可以容纳迁移PDB的数据量
    2. asmcmd lsdg
    3. df -h
    • 进程数检查

    1. ---确认目标端的进程数可以容纳源端pdb的进程数
    2. ---确认源端pdb的使用进程数
    3. select a.inst_id,b.name,count(*)
    4. from gv$session a,v$pdbs b
    5. where a.con_id=b.con_id
    6. group by a.inst_id,b.name;
    7. ---查看目标端cdb的剩余进程数
    8. select INITIAL_ALLOCATION-MAX_UTILIZATION
    9. from gv$resource_limit
    10. where resource_name like '%process%'
    • 内存资源检查

    1. ---确认目标端的SGA,PGA内存可以容纳源端pdb的SGA,PGA内存使用
    2. ---查询源端pdb与目标端cdb的内存资源使用情况
    3. col begin_time for a30
    4. col end_time for a30
    5. col pdb_name for a10
    6. SELECT r.snap_id,
    7. r.con_id,
    8. p.pdb_name,
    9. r.begin_time,
    10. r.end_time,
    11. r.sga_bytes/1024/1024,
    12. r.pga_bytes/1024/1024,
    13. r.buffer_cache_bytes/1024/1024,
    14. r.shared_pool_bytes/1024/1024
    15. FROM dba_hist_rsrc_pdb_metric r,
    16. cdb_pdbs p
    17. WHERE r.con_id = p.con_id
    18. ORDER BY r.begin_time;
    19. ---查看目标端cdb的内存资源配置
    20. show parameter sga_target
    21. show parameter pga_
    • cpu资源检查

    1. ---确认目标端的cpu使用可以容纳源端pdb的高峰dbtime
    2. ---查询源端与目标端的服务器CPU资源使用情况
    3. top
    4. ---查询源端与目标端dbtime使用情况
    5. set linesize 200 ;
    6. set pagesize 20000 ;
    7. col DATE_TIME for a45 ;
    8. col STAT_NAME for a10 ;
    9. WITH sysstat AS (
    10. SELECT
    11. ss.instance_number id,
    12. sn.begin_interval_time begin_interval_time,
    13. sn.end_interval_time end_interval_time,
    14. ss.stat_name stat_name,
    15. ss. VALUE e_value,
    16. lag (ss. VALUE, 1) over (ORDER BY ss.snap_id) b_value
    17. FROM
    18. DBA_HIST_SYS_TIME_MODEL ss,
    19. dba_hist_snapshot sn
    20. WHERE
    21. trunc (sn.begin_interval_time) >= sysdate - 14
    22. AND ss.snap_id = sn.snap_id
    23. AND ss.dbid = sn.dbid
    24. AND ss.instance_number = sn.instance_number
    25. AND ss.dbid = (SELECT dbid FROM v$database)
    26. AND ss.instance_number = (SELECT instance_number FROM v$instance)
    27. AND ss.stat_name = 'DB time'
    28. )
    29. SELECT
    30. id,
    31. to_char (
    32. BEGIN_INTERVAL_TIME,
    33. 'yyyy-mm-dd hh24:mi'
    34. ) || to_char (
    35. END_INTERVAL_TIME,
    36. ' hh24:mi'
    37. ) date_time,
    38. stat_name,
    39. round(
    40. (e_value - nvl(b_value, 0))/60/1000/1000 ,
    41. 2
    42. ) dbtime_value
    43. FROM
    44. sysstat
    45. WHERE
    46. (e_value - nvl(b_value, 0)) > 0
    47. AND nvl (b_value, 0) > 0;

            3.9 下载pre-upgrade工具

    从官网下载最新的pre-upgrade工具See How to Download and Run Oracle’s Database Pre-Upgrade Utility Document 884522.1

    4 upgrade检查

            4.1 源端创建upgrade日志目录

    mkdir /tmp/preupgrade_log

            4.2 源端上传pre-upgrade工具

    1. ---将下载的pre-upgrade上传到源端服务器
    2. mkdir /tmp/preupgrade
    3. cd /tmp/preupgrade
    4. unzip /tmp/preupgrade_19_cbuild_13_lf\ .zip
    5. ---输出内容
    6. Archive: /tmp/preupgrade_19_cbuild_13_lf .zip
    7. inflating: preupgrade_package.sql
    8. inflating: preupgrade_driver.sql
    9. inflating: dbms_registry_extended.sql
    10. inflating: parameters.properties
    11. inflating: preupgrade_messages.properties
    12. inflating: components.properties
    13. inflating: preupgrade.jar

            4.3 源端使用pre-upgrade工具进行检查

    1. ---检查命令
    2. #<Source Version Oracle Home>/jdk/bin/java –jar preupgrade.jar dir <directory location for the output logs of the tool> -c <pdbname>
    3. su – oracle
    4. $ORACLE_HOME/jdk/bin/java -jar /tmp/preupgrade/preupgrade.jar dir /tmp/upgrade dir /tmp/preupgrade_log -c TESTDB
    5. ###############################脚本输出样例
    6. ==================
    7. PREUPGRADE SUMMARY
    8. ==================
    9. /tmp/preupgrade_log/preupgrade.log
    10. /tmp/preupgrade_log/preupgrade_fixups.sql
    11. /tmp/preupgrade_log/postupgrade_fixups.sql
    12. Execute fixup scripts across the entire CDB:
    13. Before upgrade:
    14. 1. Execute preupgrade fixups with the below command
    15. $ORACLE_HOME/perl/bin/perl -I$ORACLE_HOME/perl/lib -I$ORACLE_HOME/rdbms/admin $ORACLE_HOME/rdbms/admin/catcon.pl -l /tmp/preupgrade_log/ -b preup_testdb -c 'TESTDB' /tmp/preupgrade_log/preupgrade_fixups.sql
    16. 2. Review logs under /tmp/preupgrade_log/
    17. After the upgrade:
    18. 1. Execute postupgrade fixups with the below command
    19. $ORACLE_HOME/perl/bin/perl -I$ORACLE_HOME/perl/lib -I$ORACLE_HOME/rdbms/admin $ORACLE_HOME/rdbms/admin/catcon.pl -l /tmp/preupgrade_log/ -b postup_testdb -c 'TESTDB' /tmp/preupgrade_log/postupgrade_fixups.sql
    20. 2. Review logs under /tmp/preupgrade_log/
    21. Preupgrade complete: 2022-11-05T16:08:17

            4.4 源端检查pre-upgrade工具输出日志

    检查日志:/tmp/preupgrade_log/preupgrade.log

            4.5 源端PDB执行更新前的修复脚本preupgrade_fixups.sql

    1. ---执行pre-upgrade检查工具里面输出的命令即可
    2. #$ORACLE_HOME/perl/bin/perl -I$ORACLE_HOME/perl/lib -I$ORACLE_HOME/rdbms/admin $ORACLE_HOME/rdbms/admin/catcon.pl -l <directory location for the output logs of the tool> -b preup_<CDB unique name> -c '' <directory location for the output logs of the tool>/preupgrade_fixups.sql
    3. ---执行以下命令
    4. $ORACLE_HOME/perl/bin/perl -I$ORACLE_HOME/perl/lib -I$ORACLE_HOME/rdbms/admin $ORACLE_HOME/rdbms/admin/catcon.pl -l /tmp/preupgrade_log/ -b preup_testdb -c 'TESTDB' /tmp/preupgrade_log/preupgrade_fixups.sql

            4.6 检查修复脚本执行完成的日志

    more  /tmp/preupgrade_log//preup_testdb0.log

            4.7 将pre-upgrade工具的输出文件拷贝到目标主机

    1. ---因为目标端upgrade之后,需要执行post_upgrade脚本,所以把产生的日志脚本拷贝到目标主机
    2. scp -rp /tmp/preupgrade_log/ oracle@168.168.xx.xxx:/tmp

    5 relocate前期准备

            5.1 配置TNS

    1. ---在源端和目标端的tnsnames.ora都配置
    2. #注意服务名用的是cdb的服务名
    3. #RAC IP用的是scan ip
    4. dest_testdb =
    5. (DESCRIPTION =
    6. (ADDRESS = (PROTOCOL = TCP)(HOST = 162.168.xx.xxx)(PORT = 1532))
    7. (CONNECT_DATA =
    8. (SERVER = DEDICATED)
    9. (SERVICE_NAME = testdb)
    10. )
    11. )
    12. source_testdb =
    13. (DESCRIPTION =
    14. (ADDRESS = (PROTOCOL = TCP)(HOST = 162.168.xx.xxx)(PORT = 1521))
    15. (CONNECT_DATA =
    16. (SERVER = DEDICATED)
    17. (SERVICE_NAME = testdb)
    18. )
    19. )

            5.2 创建同步用户

    1. ---在源端cdb$root创建同步用户,用于后面pdb的迁移
    2. create user c##repuser identified by "REPuser";
    3. grant create session, resource to c##repuser container=all;
    4. grant create pluggable database to c##repuser container=all;
    5. grant sysoper to c##repuser container=all;
    6. alter user c##repuser set container_data=all container=current;
    7. grant select on cdb_pdbs to c##repuser;
    1. ---在目标端的CDB里面创建DBLINK,
    2. create database link source_dblink connect to c##repuser identified by "REPuser" using 'source_testdb';
    3. ---验证DBLINK是否正常
    4. select count(*) from dual@source_dblink;
    5. COUNT(*)
    6. ----------
    7. 1

            5.4 配置service到目标数据库

    1. ---查询pdb服务名
    2. alter session set container=esdb;
    3. select name from dba_services where upper(name) <> 'TESTDB' and upper(name) not like 'SYS.%';
    4. ---pdb配置情况
    5. srvctl config service –d testdb -pdb testdb -service testdb_srv
    6. ---在目标库里面添加pdb
    7. srvctl add service –d testdb -pdb testdb -service testdb_srv

    6 relocate拷贝数据

            6.1 relocate配置说明

    1. 1 此阶段将数据文件从源复制到目标,完成relocate的时间取决于PDB的大小和并行进程的数量。
    2. 注意,PDB在此期间保持打开和可访问状态。
    3. 2 多个PDB relocate可以在不同的会话中并发运行。如果选择并发运行多个PDB relocate,对于RAC环境,可以在多个实例上平衡会话。
    4. 3 relocate命令会一直执行将数据文件从源CDB复制到目标CDB,数据文件拷贝使用来自目标CDB的并行查询(PQ)slave自动并行执行。拷贝将遵循正常的优先级分配给PQ slaves,不可能调整PQ slaves的访问优先级。
    5. 注意,PARALLEL子句可以用于RELOCATE命令,只能用于限制文件复制操作的并行进程数量。并且不能超过目标CDB中增PARALLEL_MAX_SERVERS的设置大小。
    6. 4 强烈建议使用REFRESH MODE子句。这允许PDB的目标副本定期自动刷新(从源CDB投递redo并应用到relocate PDB的数据文件),直到准备好完成最后的迁移为止。REFRESH模式可以显著缩短在目标数据库打开relocate PDB时所需的应用程序停机时间。建议将REFRESH MODE值设置为30分钟,以平衡资源利用率(传送和应用redo)和停机时间(PDB打开时所需应用的redo)。
    7. 5 透明数据加密(TDE)密钥的处理。通过在relocate命令上指定目标CDB密钥存储库密码,PDB的密钥将从源CDB密钥存储库传输到目标CDB密钥存储库,作为迁移过程的一部分。即使对于AUTOLOGIN密钥存储库,也需要提供密钥存储库密码。对于不使用TDE的环境,不要指定KEYSTORE IDENTIFIED BY " include SHARED KEY "子句。

            6.2 创建relocate并进行数据同步

    1. 1 命令将导致属于源CDB上的PDB的文件被复制到目标CDB,使用任何可用的PQ slaves来执行复制。复制的过程类似于RMAN SECTIONSIZE处理,因为多个PQ slaves可以操作一个文件,命令将决定分段的大小。在所有文件拷贝完成之前,该命令不会返回控制。在relocate过程中,应用程序和最终用户活动仍然可以访问源PDB
    2. 2 要限制命令使用的PQ slave的数量,可以在命令末尾添加PARALLEL < PQ slave count>子句。任何大于目标CDB中设置的PARALLEL_MAX_SERVERS初始化参数的的值都将被忽略,该命令将默认返回PARALLEL_MAX_SERVERS。
    3. 3 当PDB打开时会触发必须处理的错误时,例如PDB在打开时升级PDB,则不允许使用AVAILABILITY MAX子句。由于这个限制,在relocate过程中不建议保存PDB (ALTER PLUGGABLE DATABASE SAVE state INSTANCES=ALL)的状态。
    4. 4 指定REFRESH MODE EVERY NN MINUTES允许后台进程定期(每NN分钟)检索源CDB生成的redo,并将源PDB的redo应用到目标PDB的文件副本上。当阶段1和阶段2之间有很大的时间间隔时,使用REFRESH MODE可以显著减少完成阶段2所需的时间。
    5. 5Data Guard环境中,使用standbys =NONE子句延迟PDB的恢复。目前无法在PDB relocate操作期间自动维护备用数据库,因此需要在relocate完成之后再对备库手动进行PDB恢复。
    6. 6 目标端设置db_create_file_dest路径,relocate的文件通过omf进行存放,即使源端和目标端的路径不一致,也可以通过omf在目标端设置, 没启用的话,克隆时需要指定fille_name_convert参数Alter system set db_create_file_dest='+DATADG';
    1. ---创建relocate命令
    2. #create pluggable database <pdbname> from <pdbname>@<link name> relocate keystore identified by "" including shared key refresh mode every 30 minutes standbys=none parallel "x";
    3. #在目标端创建relocate pdb,使用8个并行进程,增量备份每30分钟执行一次
    4. #拷贝文件可能时长较长,写成脚本放后台执行
    5. cat exec_relocate_TESTDB.sh
    6. ##############################脚本内容
    7. export ORACLE_SID=db1
    8. sqlplus / as sysdba <<EOF
    9. set timing on
    10. create pluggable database TESTDB from TESTDB@source_dblink refresh mode every 30 minutes standbys=none parallel 8 ;
    11. exit;
    12. EOF
    13. #############################
    14. #############################放后台执行
    15. nohup sh exec_relocate_TESTDB.sh > exec_relocate_TESTDB.log &
    16. 注意:数据文件复制完成之后,命令才会执行返回

            6.3 监控relocate的数据同步进度

    1. ---查看relocate的进度
    2. set linesize 400
    3. set pagesize 400
    4. col opname for a30
    5. col message for a50
    6. select inst_id,opname, sofar, totalwork, time_remaining, message from gv$session_longops where time_remaining > 0 order by inst_id;

            6.4 relocate恢复日志

    可以通过数据库的alert日志查看数据恢复的情况

    7 refresh刷新增量数据

            7.1 查看刷新配置

    1. ---查看刷新配置,自动刷新是每30分钟一次
    2. set linesize 400
    3. set pagesize 400
    4. col pdb_name for a20
    5. col refresh_mode for a20
    6. col refresh_interval for 99999
    7. select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;

            7.2 手动执行refresh,确认是否正常

    1. ---目标端手动执行刷新
    2. alter session set container=TESTDB;
    3. alter pluggable database TESTDB refresh;
    4. ##############################后台日志media recovery输出样例
    5. 2022-11-07T17:44:56.360197+08:00
    6. TESTDB(5):alter pluggable database TESTDB refresh
    7. 2022-11-07T17:45:01.277544+08:00
    8. Applying media recovery for pdb-4099 from SCN 2448766 to SCN 2452802
    9. Remote log information: count-4
    10. thr-1, seq-4, logfile-+ARCH/TESTDB/ARCHIVELOG/2022_11_06/thread_1_seq_4.264.1120066983, los-2422261, nxs-2451552
    11. thr-2, seq-4, logfile-+ARCH/TESTDB/ARCHIVELOG/2022_11_06/thread_2_seq_4.263.1120066971, los-2410992, nxs-2451505
    12. thr-2, seq-5, logfile-+ARCH/TESTDB/partial_archivelog/2022_11_06/thread_2_seq_5.265.1120067099, los-2451505, nxs-18446744073709551615

            7.3 启动到只读验证数据(可选)

    1. ---启动有报错,暂时忽略
    2. SQL> alter pluggable database TESTDB open read only;
    3. alter pluggable database TESTDB open read only
    4. *
    5. ERROR at line 1:
    6. ORA-00604: error occurred at recursive SQL level 1
    7. ORA-00904: "PQ_TIMEOUT_ACTION": invalid identifier
    8. SQL> show pdbs;
    9. CON_ID CON_NAME OPEN MODE RESTRICTED
    10. ---------- ------------------------------ ---------- ----------
    11. 2 PDB$SEED READ ONLY NO
    12. 3 PDB READ WRITE NO
    13. 4 TESTDB READ ONLY YES

            7.4 恢复同步(可选)

    1. ---启动到mount,恢复同步刷新
    2. SQL> alter pluggable database close;
    3. Pluggable database altered.
    4. SQL> alter pluggable database TESTDB refresh;
    5. Pluggable database altered.

    8 正式数据迁移(应用不可访问)

            8.1 通知应用停机

    1. 通知应用停机
    2. ---关闭testdb的服务
    3. srvctl stop service –d testdb -pdb testdb -service testdb_srv

            8.2 目标端刷新增量数据

    1. ---目标端刷新 PDB检索自上次刷新以来在源 CDB 生成的redo,并将其应用于目标端PDB。
    2. alter session set container=TESTDB;
    3. alter pluggable database TESTDB refresh;

            8.3 源端关闭pdb testdb

    1. ---关闭前可以手动插入一条测试数据进行验证
    2. create table test20221106(insert_date date);
    3. insert into test20221106 select sysdate from dual;
    4. alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    5. select * from test20221106;
    6. #关闭源CDB中的PDB,数据库完全无法写入,数据保持静止
    7. alter pluggable database TESTDB close immediate instances=all;
    8. #确认两个节点的pdb已经mount,没有写入
    9. show pdbs
    10. SQL> show pdbs;
    11. CON_ID CON_NAME OPEN MODE RESTRICTED
    12. ---------- ------------------------------ ---------- ----------
    13. 2 PDB$SEED READ ONLY NO
    14. 3 PDB1 READ WRITE NO
    15. 4 TESTDB MOUNTED

            8.4 目标端刷新最后一次增量数据

    1. ---目标端端刷新PDB检索在源CDB生成的最后一个redo,以应用于目标端PDB,确保源端和目标端的数据相同,这是从阶段 2 开始到源 PDB 关闭期间生成的redo。
    2. alter session set container=TESTDB;
    3. alter pluggable database TESTDB refresh;

            8.5 目标端以升级模式打开pdb testdb

    1. ---目标端refresh pdb关闭刷新模式
    2. alter pluggable database TESTDB REFRESH mode none;
    3. ---在目标端节点一以升级模式打开 PDB
    4. alter pluggable database TESTDB open upgrade;
    5. 注意:此命令将需要一些时间才能执行,具体取决于必须从源 CDB 检索和应用的重做量,以及源和目标CDB之间网络中任何延迟的影响。
    6. 注意:在完成 PDB 升级之前,只能在 RAC 环境的一个实例中打开 PDB

            8.6 查看目标库pdb状态

    1. ---查看pdb testdb是否为migrate
    2. SQL> show pdbs;
    3. CON_ID CON_NAME OPEN MODE RESTRICTED
    4. ---------- ------------------------------ ---------- ----------
    5. 4 TESTDB MIGRATE YES
    6. ---查看pdb目前的违规设置,主要是pdb的版本12.2 跟CDB版本19不一致
    7. set linesize 400
    8. col time for a40
    9. col name for a10
    10. col cause for a30
    11. col message for a50
    12. col action for a40
    13. select * from pdb_plug_in_violations where name ='TESTDB' and status <> 'RESOLVED';
    14. TIME NAME CAUSE TYPE ERROR_NUMBER LINE MESSAGE STATUS ACTION CON_ID
    15. ------------------------------ ------------------------------ ------------------------------ --------- ------------ ---------- -------------------------------------------------- --------- ------------------------------ ----------
    16. 05-NOV-22 06.42.14.632730 PM TESTDB VSN not match ERROR 0 1 PDB's version does not match CDB's version: PDB's PENDING Either upgrade the PDB or relo 4
    17. version 12.2.0.1.0. CDB's version 19.0.0.0.0. ad the components in the PDB.

    9 目标端pdb testdb版本更新到19c(应用不可访问)

            9.1 更新版本到19c

    1. ---目标端节点一操作即可
    2. su - oracle
    3. ---创建日志目录
    4. mkdir $ORACLE_BASE/cfgtoollogs/upgrade_TESTDB
    5. ---对TESTDB进行更新
    6. #$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catctl.pl -d $ORACLE_HOME/rdbms/admin -c '' -l $ORACLE_BASE/cfgtoollogs/<your_log_directory> catupgrd.sql
    7. 注意:运行升级所需的时间因 PDB 中包含的数据库产品组件和PDB 字典中的 PL/SQL 包数量所决定。
    8. ---更新可能时长较长,写成脚本放后台执行
    9. cat exec_upgrade_TESTDB.sh
    10. #############################脚本内容
    11. #!/bin/bash
    12. $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catctl.pl -d $ORACLE_HOME/rdbms/admin -c 'TESTDB' -l $ORACLE_BASE/cfgtoollogs/upgrade_TESTDB catupgrd.sql
    13. #############################
    14. #############################放后台执行
    15. nohup sh exec_upgrade_TESTDB.sh > exec_upgrade_TESTDB.log &
    16. ---更新输出日志
    17. Grand Total Time: 4847s
    18. LOG FILES: (/u01/app/oracle/cfgtoollogs/upgrade_TESTDB/catupgrd*.log)
    19. Grand Total Upgrade Time: [0d:1h:20m:47s]
    20. Oracle Database Release 19 Post-Upgrade Status Tool 11-07-2022 22:39:5
    21. Container Database: DB
    22. [CON_ID: 5 => TESTDB]
    23. Component Current Full Elapsed Time
    24. Name Status Version HH:MM:SS
    25. Oracle Server UPGRADED 19.3.0.0.0 00:33:14
    26. JServer JAVA Virtual Machine UPGRADED 19.3.0.0.0 00:04:33
    27. Oracle XDK UPGRADED 19.3.0.0.0 00:02:52
    28. Oracle Database Java Packages UPGRADED 19.3.0.0.0 00:00:27
    29. OLAP Analytic Workspace UPGRADED 19.3.0.0.0 00:00:50
    30. Oracle Label Security UPGRADED 19.3.0.0.0 00:00:36
    31. Oracle Database Vault UPGRADED 19.3.0.0.0 00:02:11
    32. Oracle Text UPGRADED 19.3.0.0.0 00:00:45
    33. Oracle Workspace Manager UPGRADED 19.3.0.0.0 00:01:11
    34. Oracle Real Application Clusters UPGRADED 19.3.0.0.0 00:00:00
    35. Oracle XML Database UPGRADED 19.3.0.0.0 00:08:16
    36. Oracle Multimedia UPGRADED 19.3.0.0.0 00:01:23
    37. Spatial UPGRADED 19.3.0.0.0 00:13:36
    38. Oracle OLAP API UPGRADED 19.3.0.0.0 00:00:23
    39. Datapatch 00:04:44
    40. Final Actions 00:05:16
    41. Post Upgrade 00:00:25
    42. Total Upgrade Time: 01:17:47 [CON_ID: 5 => TESTDB]
    43. Database time zone version is 26. It is older than current release time
    44. zone version 32. Time zone upgrade is needed using the DBMS_DST package.
    45. Grand Total Upgrade Time: [0d:1h:20m:47s]

            9.2 启动到open状态

    1. ---目标端更新完PDB之后,PDB会变成mount状态,
    2. SQL> show pdbs;
    3. CON_ID CON_NAME OPEN MODE RESTRICTED
    4. ---------- ------------------------------ ---------- ----------
    5. 2 PDB$SEED READ ONLY NO
    6. 3 PDB READ WRITE NO
    7. 4 TESTDB MOUNTED
    8. SQL>
    9. ---需要手动进行open
    10. alter pluggable database TESTDB open instances=all;
    11. SQL> show pdbs;
    12. CON_ID CON_NAME OPEN MODE RESTRICTED
    13. ---------- ------------------------------ ---------- ----------
    14. 2 PDB$SEED READ ONLY NO
    15. 3 PDB READ WRITE NO
    16. 4 TESTDB READ WRITE NO
    17. ---确认pdb的状态正常,在目标CDB里面检查PDB_PLUG_IN_VIOLATIONS确认里面的问题已经解决,没有新的问题
    18. alter session set container=cdb$root;
    19. select * from pdb_plug_in_violations where name ='TESTDB' and status <> 'RESOLVED' and type <> 'WARNING';
    20. SQL>
    21. no rows selected
    22. SQL>

            9.3 检查组件状态为upgrade

    1. ---目标端执行utlusts查询当前pdb组件以及状态
    2. #当前组件状态为upgrade
    3. #时区需要更新
    4. alter session set container=TESTDB;
    5. @?/rdbms/admin/utlusts
    6. SQL> Enter value for 1: text
    7. Enter value for 1: text
    8. ####################日志输出样例
    9. Oracle Database Release 19 Post-Upgrade Status Tool 11-07-2022 22:46:5
    10. Container Database: DB
    11. [CON_ID: 5 => TESTDB]
    12. Component Current Full Elapsed Time
    13. Name Status Version HH:MM:SS
    14. Oracle Server UPGRADED 19.3.0.0.0 00:33:14
    15. JServer JAVA Virtual Machine UPGRADED 19.3.0.0.0 00:04:33
    16. Oracle XDK UPGRADED 19.3.0.0.0 00:02:52
    17. Oracle Database Java Packages UPGRADED 19.3.0.0.0 00:00:27
    18. OLAP Analytic Workspace UPGRADED 19.3.0.0.0 00:00:50
    19. Oracle Label Security UPGRADED 19.3.0.0.0 00:00:36
    20. Oracle Database Vault UPGRADED 19.3.0.0.0 00:02:11
    21. Oracle Text UPGRADED 19.3.0.0.0 00:00:45
    22. Oracle Workspace Manager UPGRADED 19.3.0.0.0 00:01:11
    23. Oracle Real Application Clusters UPGRADED 19.3.0.0.0 00:00:00
    24. Oracle XML Database UPGRADED 19.3.0.0.0 00:08:16
    25. Oracle Multimedia UPGRADED 19.3.0.0.0 00:01:23
    26. Spatial UPGRADED 19.3.0.0.0 00:13:36
    27. Oracle OLAP API UPGRADED 19.3.0.0.0 00:00:23
    28. Datapatch 00:04:44
    29. Final Actions 00:05:16
    30. Post Upgrade 00:00:25
    31. Total Upgrade Time: 01:17:47 [CON_ID: 5 => TESTDB]
    32. Database time zone version is 26. It is older than current release time
    33. zone version 32. Time zone upgrade is needed using the DBMS_DST package.
    34. SQL>

            9.4 进行重编译

    1. ---目标端执行utlrp重编译pl/sql 包
    2. cd $ORACLE_HOME/rdbms/admin
    3. $ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utlrp -d '''.''' utlrp.sql
    4. ####################输出日志样例
    5. [oracle@rac19a admin]$ $ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utlrp -d '''.''' utlrp.sql
    6. catcon::set_log_file_base_path: ALL catcon-related output will be written to [/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/utlrp_catcon_115232.lst]
    7. catcon::set_log_file_base_path: catcon: See [/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/utlrp*.log] files for output generated by scripts
    8. catcon::set_log_file_base_path: catcon: See [/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/utlrp_*.lst] files for spool files, if any
    9. catcon.pl: completed successfully

            9.5 检查组件状态为VALID

    1. #目标端再次utlusts确认组件状态是否为VALID
    2. alter session set container=TESTDB;
    3. @?/rdbms/admin/utlusts
    4. SQL> @?/rdbms/admin/utlusts
    5. Enter value for 1: text
    6. Enter value for 1: text
    7. ####################日志输出样例
    8. Oracle Database Release 19 Post-Upgrade Status Tool 11-07-2022 23:05:4
    9. Container Database: DB
    10. [CON_ID: 5 => TESTDB]
    11. Component Current Full Elapsed Time
    12. Name Status Version HH:MM:SS
    13. Oracle Server VALID 19.3.0.0.0 00:33:14
    14. JServer JAVA Virtual Machine VALID 19.3.0.0.0 00:04:33
    15. Oracle XDK VALID 19.3.0.0.0 00:02:52
    16. Oracle Database Java Packages VALID 19.3.0.0.0 00:00:27
    17. OLAP Analytic Workspace VALID 19.3.0.0.0 00:00:50
    18. Oracle Label Security VALID 19.3.0.0.0 00:00:36
    19. Oracle Database Vault VALID 19.3.0.0.0 00:02:11
    20. Oracle Text VALID 19.3.0.0.0 00:00:45
    21. Oracle Workspace Manager VALID 19.3.0.0.0 00:01:11
    22. Oracle Real Application Clusters VALID 19.3.0.0.0 00:00:00
    23. Oracle XML Database VALID 19.3.0.0.0 00:08:16
    24. Oracle Multimedia VALID 19.3.0.0.0 00:01:23
    25. Spatial VALID 19.3.0.0.0 00:13:36
    26. Oracle OLAP API VALID 19.3.0.0.0 00:00:23
    27. Datapatch 00:04:44
    28. Final Actions 00:05:16
    29. Post Upgrade 00:00:25
    30. Post Compile 00:14:07
    31. Total Upgrade Time: 01:31:55 [CON_ID: 5 => TESTDB]
    32. Database time zone version is 26. It is older than current release time
    33. zone version 32. Time zone upgrade is needed using the DBMS_DST package.

            9.6 执行更新后的修复脚本postupgrade_fixups.sql

    1. ---执行脚本postupgrade_fixups
    2. alter session set container=TESTDB;
    3. @/tmp/preupgrade_log/postupgrade_fixups_TESTDB.sql
    4. ####################输出日志样例
    5. WARNING - This script was generated for database TESTDB.
    6. Executing Oracle POST-Upgrade Fixup Script
    7. Auto-Generated by: Oracle Preupgrade Script
    8. Version: 19.0.0.0.0 Build: 13
    9. Generated on: 2022-11-06 17:21:57
    10. For Source Database: TESTDB
    11. Source Database Version: 12.2.0.1.0
    12. For Upgrade to Version: 19.0.0.0.0
    13. Executing in container: TESTDB
    14. Preup Preupgrade
    15. Action Issue Is
    16. Number Preupgrade Check Name Remedied Further DBA Action
    17. ------ ------------------------ ---------- --------------------------------
    18. 6. old_time_zones_exist NO Manual fixup recommended.
    19. 7. post_dictionary YES None.
    20. 8. post_fixed_objects NO Informational only.
    21. Further action is optional.
    22. The fixup scripts have been run and resolved what they can. However,
    23. there are still issues originally identified by the preupgrade that
    24. have not been remedied and are still present in the database.
    25. Depending on the severity of the specific issue, and the nature of
    26. the issue itself, that could mean that your database upgrade is not
    27. fully complete. To resolve the outstanding issues, start by reviewing
    28. the postupgrade_fixups.sql and searching it for the name of
    29. the failed CHECK NAME or Preupgrade Action Number listed above.
    30. There you will find the original corresponding diagnostic message
    31. from the preupgrade which explains in more detail what still needs
    32. to be done.
    33. SQL> SQL>

            9.7 更新timezone

    1. 参考: Scripts to update the RDBMS DST (timezone) version in an 11gR2 or 12c database . (Doc ID 1585343.1)
    2. ---pdb需要重启
    3. ---查看当前pdb的dst
    4. Alter session set container=TESTDB;
    5. SELECT version FROM v$timezone_file;
    6. ---也可以通过以下检查
    7. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
    8. FROM DATABASE_PROPERTIES
    9. WHERE PROPERTY_NAME LIKE 'DST_%'
    10. ORDER BY PROPERTY_NAME;
    11. ---如果查询出现以下值,需要进行处理
    12. ---PROPERTY_NAME VALUE
    13. -- ------------------------------ ------------------------------
    14. -- DST_PRIMARY_TT_VERSION <current DST version> <<<<------ this should match version FROM v$timezone_file if not make sure the database is open when selecting from v$timezone_file;
    15. -- DST_SECONDARY_TT_VERSION 0 <<<<------ this should be "0" if not then see point 3a) in note 977512.1 (for 11gR2) or note 1509653.1 (for 12c)
    16. -- DST_UPGRADE_STATE NONE <<<<------ this should be "NONE" if not then see point 3a) in note 977512.1 (for 11gR2) or note 1509653.1 (for 12c)
    17. SQL> SELECT version FROM v$timezone_file;
    18. VERSION
    19. ----------
    20. 26
    21. SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
    22. FROM DATABASE_PROPERTIES
    23. WHERE PROPERTY_NAME LIKE 'DST_%'
    24. ORDER BY PROPERTY_NAME;
    25. 2 3 4
    26. PROPERTY_NAME
    27. --------------------------------------------------------------------------------
    28. VALUE
    29. --------------------------------------------------------------------------------
    30. DST_PRIMARY_TT_VERSION
    31. 26
    32. DST_SECONDARY_TT_VERSION
    33. 0
    34. DST_UPGRADE_STATE
    35. NONE
    36. ---查看更新的脚本是否存在,有四个脚本
    37. ls -lrt $ORACLE_HOME/rdbms/admin/utltz_*
    38. rw-r--r-- 1 oracle oinstall 8317 Feb 25 2017 utltz_countstats.sql
    39. -rw-r--r-- 1 oracle oinstall 7423 Feb 25 2017 utltz_countstar.sql
    40. -rw-r--r-- 1 oracle oinstall 33684 Sep 9 2017 utltz_upg_check.sql
    41. -rw-r--r-- 1 oracle oinstall 21526 Sep 9 2017 utltz_upg_apply.sql
    42. --- utltz_countstats.sql脚本通过统计信息查看使用TSTZ column的表
    43. --- utltz_countstar.sql 通过实际count(*) 查看使用TSTZ column的表
    44. 通过这两个脚本主要是用于显示当前是否有大的使用tstz的表,这会影响升级timezone的时间,但实际不一定要执行
    45. ---执行utltz_upg_check.sql脚本,
    46. ---执行脚本时,RAC只能启动一个节点,所以把节点二的pdb关闭
    47. Alter pluggable database TESTDB close immediate;
    48. 注意,upg_tzv_check.sql不需要任何参数,它将自动检测已安装的最高DST补丁,并且不需要停机,这可以在实时生产数据库上执行,但它会清除dba_recyclebin
    49. alter session set container=TESTDB;
    50. spool /tmp/utltz_upg_check.log
    51. @?/rdbms/admin/utltz_upg_check.sql
    52. spool off
    53. ---输出没有报错
    54. INFO: Starting with RDBMS DST update preparation.
    55. INFO: NO actual RDBMS DST update will be done by this script.
    56. INFO: If an ERROR occurs the script will EXIT sqlplus.
    57. INFO: Doing checks for known issues ...
    58. INFO: Database version is 19.0.0.0 .
    59. INFO: This database is a Multitenant database.
    60. INFO: This database is a PDB.
    61. INFO: Current PDB is TESTDB .
    62. INFO: Database RDBMS DST version is DSTv26 .
    63. INFO: No known issues detected.
    64. INFO: Now detecting new RDBMS DST version.
    65. A prepare window has been successfully started.
    66. INFO: Newest RDBMS DST version detected is DSTv32 .
    67. INFO: Next step is checking all TSTZ data.
    68. INFO: It might take a while before any further output is seen ...
    69. A prepare window has been successfully ended.
    70. INFO: A newer RDBMS DST version than the one currently used is found.
    71. INFO: Note that NO DST update was yet done.
    72. INFO: Now run utltz_upg_apply.sql to do the actual RDBMS DST update.
    73. INFO: Note that the utltz_upg_apply.sql script will
    74. INFO: restart the database 2 times WITHOUT any confirmation or prompt.
    75. ---执行upg_tzv_apply.sql脚本
    76. 注意: upg_tzv_apply.sql将重新启动pdb 2
    77. alter session set container=TESTDB;
    78. spool /tmp/utltz_upg_apply.log
    79. @?/rdbms/admin/utltz_upg_apply.sql
    80. spool off
    81. ---输出更新完成
    82. INFO: Upgrading all non-SYS TSTZ data.
    83. INFO: It might take time before any further output is seen ...
    84. INFO: Do NOT start any application yet that uses TSTZ data!
    85. INFO: Next is a list of all upgraded tables:
    86. Table list: "GSMADMIN_INTERNAL"."AQ$_CHANGE_LOG_QUEUE_TABLE_S"
    87. Number of failures: 0
    88. Table list: "GSMADMIN_INTERNAL"."AQ$_CHANGE_LOG_QUEUE_TABLE_L"
    89. Number of failures: 0
    90. Table list: "MDSYS"."SDO_DIAG_MESSAGES_TABLE"
    91. Number of failures: 0
    92. Table list: "DVSYS"."SIMULATION_LOG$"
    93. Number of failures: 0
    94. Table list: "DVSYS"."AUDIT_TRAIL$"
    95. Number of failures: 0
    96. INFO: Total failures during update of TSTZ data: 0 .
    97. An upgrade window has been successfully ended.
    98. INFO: Your new Server RDBMS DST version is DSTv32 .
    99. INFO: The RDBMS DST update is successfully finished.
    100. INFO: Make sure to exit this SQL*Plus session.
    101. INFO: Do not use it for timezone related selects.
    102. ---确认更新为32
    103. SQL> alter session set container=TESTDB;
    104. Session altered.
    105. SQL> SELECT version FROM v$timezone_file;
    106. VERSION
    107. ----------
    108. 32
    109. SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
    110. FROM DATABASE_PROPERTIES
    111. WHERE PROPERTY_NAME LIKE 'DST_%'
    112. ORDER BY PROPERTY_NAME;
    113. 2 3 4
    114. PROPERTY_NAME
    115. --------------------------------------------------------------------------------
    116. VALUE
    117. --------------------------------------------------------------------------------
    118. DST_PRIMARY_TT_VERSION
    119. 32
    120. DST_SECONDARY_TT_VERSION
    121. 0
    122. DST_UPGRADE_STATE
    123. NONE
    124. ---启动节点二的pdb
    125. Alter pluggable database TESTDB open;
    126. SQL>
    127. SQL> show pdbs;
    128. CON_ID CON_NAME OPEN MODE RESTRICTED
    129. ---------- ------------------------------ ---------- ----------
    130. 4 TESTDB READ WRITE NO

            9.8 更新版本到19c

    1. alter session set container=TESTDB;
    2. select con_id, owner, object_type, object_name from cdb_objects where status='INVALID' order by 1;

            9.9 更新版本到19c

    1. ---启动testdb的服务
    2. srvctl start service –d testdb -pdb testdb -service testdb_srv
    3. 通知应用升级完成

    10 迁移升级完成之后(可选)

            10.1 源端删除服务

    srvctl remove service –d <source CDB db_unique_name> -service <service name>

            10.2 源端删除pdb

    drop pluggable database <pdbname> including datafiles;
    drop database link <link name>;

            10.4 目标端DG同步新的PDB

    For Data Guard environments, follow the instructions in Making Use Deferred PDB Recovery and the STANDBYS=NONE Feature with Oracle Multitenant Document 1916648.1 to enable recovery of the PDB at the destination standby.

    11 回退方案

            11.1 relocate命令或者refresh命令执行失败

    1. #如果命令执行失败,可以使用以下方式在目标端清理数据,再重新开始执行relocate+refresh
    2. DestinationCDB-SQL> alter session set container=cdb$root;
    3. DestinationCDB-SQL> drop pluggable database <pdbname> including datafiles;

            11.2 正式迁移升级过程失败或者应用验证不通过

    1. ---关闭目标端环境
    2. srvctl stop service –d testdb -pdb testdb -service testdb_srv
    3. alter pluggable database TESTDB close instances=all;
    4. ----启动源端环境
    5. alter pluggable database TESTDB open instances=all;
    6. srvctl start service –d testdb -pdb testdb -service testdb_srv
    7. ----应用链接指向源环境

  • 相关阅读:
    SQL Server教程 - T-SQL-索引(INDEX)
    如何全面升级spring-boot-2.x及Spring-security-oauth2
    产品经理入门学习(二):产品经理问题思考维度
    【Java】List、Set、数据结构、Collections
    双链笔记软件 Roam Edit 的优点、缺点、评价及学习资源
    提高效率:VMLogin浏览器免密码同时登录多个Facebook账号
    C++算法竞赛常用编程模板总结
    GCC编译器生成库文件并编译
    图表展示X轴标题展示不全
    一文带你搞定抖音最近最火的情侣微信早报信息推送
  • 原文地址:https://blog.csdn.net/sinat_36757755/article/details/127814526