暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

某人民医院7分钟完成11gRAC到19.20的升级迁移,信息科主任都感到不可思议~

【作者简介

本人医疗行业DBA,精通oracle底层;会文件、触发器加密的勒索恢复、asm磁盘组不能mount及各种灾难恢复,后面将利用空闲时间将自己工作中遇到的问题及整理的资料分享给更多愿意学习和提升自己的dba。作者微信号:Oray_123

【正文

一、方案编写



二、dg搭建

主库现有一个单机的备库,我们计划搭建第二个逻辑备库来进行升级,升级完成后处理后续的一系列操作,最后到停机时间直接进行失败切换,停掉原rac scan漂移ip,新主库挂上ip即可对外提供业务,整个事情就圆满完成。

搭建adg大致步骤:

1)主库修改:

alter system set log_archive_config='DG_CONFIG=(orcl,oral,orcldg1)';

alter system set log_archive_dest_3='service=tnsorcldg1 LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=orcldg1';

alter system set log_archive_dest_state_3='ENABLE';

alter system set fal_server='STANDBY','tnsorcldg1';

2)备1修改:

备库安装或者上传一个11204的安装目录,用11204的目录来搭建dg

3)其他和搭建dg一样,密码文件、静态监听..这里就不列出来了;

备库执行克隆动作:

rman target sys/his@ORCL1 auxiliary sys/his@tnsorcldg1

duplicate target database for standby from active database;

启动备1:

alter database open;

alter database recover managed standby database using current logfile disconnect from session;


测试主库和备1数据同步:

a)主库上操作


create table cs0529 (i int);

/

begin

 for i in 1..10000 loop

   insert into cs0529 values (i);

   commit;

   dbms_lock.sleep(2);

  end loop;

end;

/

alter system switch logfile;

archive log list;

b)备库上查看


select * from cs0529;

archive log list;

三、物理dg转逻辑dg

1)检备库不受支持的表

select distinct owner,table_name from dba_logstdby_unsupported  order by owner,table_name;

2)查看主库中不含主键和唯一索引的表

select owner,table_name,bad_column from  dba_logstdby_not_unique

   注意BAD_COLUMN列值,该列有两个值:


   Y :表示该表中有采用大数据类型的字段,比如LONG啦,CLOB啦之类。如果表中除log列某些行记录完全匹配,则该表无法成功应用于逻辑standby。

       standby会尝试维护这些表,不过你必须保证应用不允许。

   N :表示该表拥有足够的信息,能够支持在逻辑standby的更新,不过仍然建议你为该表创建一个主键或者唯一索引/约束以提高log应用效率

假设在某张表中你可以确认数据是唯一的,但是基于效率方面的考虑,不想为其创建主键或唯一约束,怎么办呢?没关系,Oracle早想到了这一点,你可以创建一个DISABLE的Primary-Key Rely约束。

ALTER TABLE zlhis.医保调用日志 ADD PRIMARY KEY (序号,病人id) RELY DISABLE;

3)将物理备库转换为逻辑备库

备库操作:

alter database recover managed standby database cancel;

shutdown immediate;

startup nomount;

alter database mount standby database;

主库操作:

之后需要在Primary Database中创建Logminer dictionary日志挖掘字典:

SQL> drop user zldhc cascade;

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

--如果一直卡住处理长事物

with transaction_details as

( select inst_id

  , ses_addr

  , sysdate - start_date as diff

  from gv$transaction

)

select s.username

, to_char(trunc(t.diff))

             || ' days, '

             || to_char(trunc(mod(t.diff * 24,24)))

             || ' hours, '

             || to_char(trunc(mod(t.diff * 24 * 60,24)))

             || ' minutes, '

             || to_char(trunc(mod(t.diff * 24 * 60 * 60,60)))

             || ' seconds' as transaction_duration

, s.program

, s.terminal

, s.status

, s.sid

, s.serial#

,'ALTER SYSTEM KILL SESSION '||''''||s.SID||','||s.SERIAL#||',@'||s.inst_id||''''||' IMMEDIATE;'

from gv$session s

, transaction_details t

where s.inst_id = t.inst_id

and s.saddr = t.ses_addr

order by t.diff desc


备库操作:

SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY KEEP IDENTITY;

SQL> select database_role from v$database;


DATABASE_ROLE

----------------

LOGICAL STANDBY


SQL> alter database open;


我们还需要完成一系列逻辑备库的配置:


a.在逻辑备库中禁用自动删除外部存档日志

SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT', 'FALSE' ); #BUG 12353543 version 11.2

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DELETE', 'FALSE');

如果报错:

/* 缺少DBMS_LOGSTDBY包,可以从以下脚本创建 */


SQL> @?/rdbms/admin/dbmslsby.sql


b.执行以下语句可以将逻辑备库不支持的而又在主库上运行过的事务记录到DBA_LOGSTDBY_EVENTS中


SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('MAX_EVENTS_RECORDED',DBMS_LOGSTDBY.MAX_EVENTS);

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('RECORD_UNSUPPORTED_OPERATIONS', 'TRUE');

c.启动在逻辑备库上的SQL APPLY:(因为windows打了补丁,所以不需要马上验证同步情况,因为linux没有windows那些补丁,开启下面的同步,数据也不会过来。会报找不到xx补丁的错误。所以我们直接跳过。开始升级,升级到12c后再打开同步即可。)----(不执行该步骤)

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

3)物理转换成逻辑dg后,表空间不能再使用db_file_name_convert了,需要单独的过程处理:

备库执行:

SQL> CREATE OR REPLACE PROCEDURE SYS.HANDLE_TBS_DDL (  

OLD_STMT  IN  VARCHAR2,  

STMT_TYP  IN  VARCHAR2,  

SCHEMA    IN  VARCHAR2,  

NAME      IN  VARCHAR2,  

XIDUSN    IN  NUMBER,  

XIDSLT    IN  NUMBER,  

XIDSQN    IN  NUMBER,  

ACTION    OUT NUMBER,  

NEW_STMT  OUT VARCHAR2  

) AS 


BEGIN 


--NEW_STMT := REPLACE(OLD_STMT, 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\','/oradata/orcldg/');  

NEW_STMT := REPLACE(REPLACE(OLD_STMT,'+DATA/orcl/datafile/','/u01/app/oracle/oradata/ORCL/'),'+DATA/orcl/tempfile/','/u01/app/oracle/oradata/ORCL/');

--NEW_STMT := REPLACE(OLD_STMT, '/u01/app/oracle/oradata/orcl/','/oradata/orcldg/');  

ACTION := DBMS_LOGSTDBY.SKIP_ACTION_REPLACE;  


EXCEPTION  


    WHEN OTHERS THEN 

      ACTION := DBMS_LOGSTDBY.SKIP_ACTION_ERROR;  

      NEW_STMT := NULL;  

END HANDLE_TBS_DDL;  

/  

执行DBMS_LOGSTDBY.SKIP过程,将编写的过程注册到表空间处理的SQL应用中:


SQL> EXEC DBMS_LOGSTDBY.SKIP (stmt => 'TABLESPACE',proc_name => 'sys.handle_tbs_ddl');  

这里也要借助DBMS_LOGSTDBY.SKIP过程实现。该过程功能非常强大,而且操作非常灵活。

重启SQL应用:


SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

四、逻辑dg升级操作

1、 主库停止传输

select name,thread#,sequence#,first_time,first_change#,next_time,next_change# from v$archived_log where dest_id=1 and name is not null order by sequence# asc;

通过查询看到主库归档保留了7天;


SQL> alter system set log_archive_dest_state_3 = DEFER scope=both;


2、 备库停止日志应用

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY; 

3、 备库执行升级前工具(11204数据库打开的情况下操作)

[oracle@his1 arch]$  u02/app/oracle/product/11.2.0/db_1/jdk/bin/java -jar u01/app/oracle/product/19c/dbhome_1/rdbms/admin/preupgrade.jar 

==================

PREUPGRADE SUMMARY

==================

  u02/app/oracle/cfgtoollogs/orcldg/preupgrade/preupgrade.log

  u02/app/oracle/cfgtoollogs/orcldg/preupgrade/preupgrade_fixups.sql

  u02/app/oracle/cfgtoollogs/orcldg/preupgrade/postupgrade_fixups.sql


Execute fixup scripts as indicated below:


Before upgrade:


Log into the database and execute the preupgrade fixups

@/u02/app/oracle/cfgtoollogs/orcldg/preupgrade/preupgrade_fixups.sql


After the upgrade:


Log into the database and execute the postupgrade fixups

@/u02/app/oracle/cfgtoollogs/orcldg/preupgrade/postupgrade_fixups.sql


Preupgrade complete: 2023-07-13T23:25:14


4. 备库预升级检查

Copy the $ORACLE_HOME/rdbms/admin/emremove.sql script from the target

     19c ORACLE_HOME into the source 11.2.0.4.0 ORACLE_HOME.

[oracle@new-his-01 db_1]$ cp u01/app/oracle/product/19c/dbhome_1/rdbms/admin/emremove.sql u02/app/oracle/product/11.2.0/db_1/rdbms/admin/


 sqlplus as sysdba

SQL> alter database guard none; --不执行

SQL> alter session disable guard;

@/u02/app/oracle/product/11.2.0/db_1/rdbms/admin/emremove.sql


--11g home执行

@$ORACLE_HOME/olap/admin/catnoamd.sql

5、旧库执行

SQL> @/u02/app/oracle/cfgtoollogs/orcldg1/preupgrade/preupgrade_fixups.sql --直接执行

Executing Oracle PRE-Upgrade Fixup Script


Auto-Generated by:       Oracle Preupgrade Script

                         Version: 19.0.0.0.0 Build: 11

Generated on:            2022-06-14 09:49:52


For Source Database:     ORCL

Source Database Version: 11.2.0.4.0

For Upgrade to Version:  19.0.0.0.0


Preup                             Preupgrade

Action                            Issue Is

Number  Preupgrade Check Name     Remedied    Further DBA Action

------  ------------------------  ----------  --------------------------------

    1.  two_pc_txn_exist          NO          Manual fixup required.

    2.  invalid_usr_tabledata     YES         None.

    3.  invalid_sys_tabledata     YES         None.

    4.  parameter_obsolete        NO          Manual fixup recommended.

    5.  em_present                YES         None.

    6.  invalid_objects_exist     NO          Manual fixup recommended.

    7.  amd_exists                YES         None.

    8.  default_resource_limit    NO          Manual fixup recommended.

    9.  network_acl_priv          NO          Manual fixup recommended.

   10.  exclusive_mode_auth       NO          Manual fixup recommended.

   11.  case_insensitive_auth     NO          Manual fixup recommended.

   12.  streams_setup             NO          Manual fixup recommended.

   13.  mv_refresh                NO          Manual fixup recommended.

   14.  hidden_params             NO          Informational only.

                                              Further action is optional.

   15.  dictionary_stats          YES         None.

   16.  trgowner_no_admndbtrg     YES         None.

   17.  component_info            NO          Informational only.

                                              Further action is optional.

   18.  parameter_deprecated      NO          Informational only.

                                              Further action is optional.

   19.  exf_rul_exists            NO          Informational only.

                                              Further action is optional.

   20.  min_archive_dest_size     NO          Informational only.

                                              Further action is optional.

   21.  rman_recovery_version     NO          Informational only.

                                              Further action is optional.

   22.  invalid_all_obj_info      NO          Informational only.

                                              Further action is optional.


The fixup scripts have been run and resolved what they can. However,

there are still issues originally identified by the preupgrade that

have not been remedied and are still present in the database.

Depending on the severity of the specific issue, and the nature of

the issue itself, that could mean that your database is not ready

for upgrade.  To resolve the outstanding issues, start by reviewing

the preupgrade_fixups.sql and searching it for the name of

the failed CHECK NAME or Preupgrade Action Number listed above.

There you will find the original corresponding diagnostic message

from the preupgrade which explains in more detail what still needs

to be done.


PL/SQL procedure successfully completed.

5、 备库关监听和库

SQL> shutdown immediate

[oracle@new-his-01 db_1]$ lsnrctl stop


6、 备库oracle用户切换环境变量到19c

export ORACLE_SID=orcl

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1

#export ORACLE_BASE=/u02/app/oracle;

#export ORACLE_HOME=/u02/app/oracle/product/11.2.0/db_1;

7、 dbca先把之前实例删除

[oracle@new-his-01 oradata]$ dbca -silent -deleteDatabase -sourceDB orcl -sysDBAUserName sys -sysDBAPassword his -forceArchiveLogDeletion

8、 备库rac1 在oracle_home/dbs下新建参数文件


[oracle@his1 ~]$ cd $ORACLE_HOME/dbs

[oracle@his1 dbs]# vi initorcl.ora

[oracle@his1 dbs]$ mkdir -p u01/app/oracle/admin/orcldg1/adump

[oracle@his1 dbs]$ mkdir -p u01/app/oracle/fast_recovery_area

9、 备库rac1启动到nomount并创建spfile到asm

SQL> create spfile from pfile;

SQL> startup mount;


10、 备库19c 密码文件处理

将/u02下的dbs/orapworcl 拷贝到 u01目录下

[oracle@his1dbs]$cp u02/app/oracle/product/11.2.0/db_1/dbs/orapworcl u01/app/oracle/product/19c/dbhome_1/dbs/

11、 备库his 添加tnsnames.ora sqlnet.ora处理

oracle用户添加:

ORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

    )

  )

ORCL1 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.92.170.104)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

    )

  )

STANDBY =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = oral)

    )

  )



PG=

  (DESCRIPTION=

    (ADDRESS=(PROTOCOL=tcp)(HOST=10.92.170.98)(PORT=1521))

    (CONNECT_DATA=(SID=PG))

    (HS=OK) 

  )


tnsorcldg1 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = wshis)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl)

    )

  )

[oracle@his1 admin]$ cat sqlnet.ora 

SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

12、备库19c 添加静态监听

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcl)

      (ORACLE_HOME = u01/app/oracle/product/19c/dbhome_1)

      (SID_NAME = orcl)

    )

  )


LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = wshis)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )


ADR_BASE_LISTENER = u01/app/oracle


注意ORACLE_HOME路径为RDBMS的oraclehome路径

两个节点分别stop start监听

[grid@his2 admin]$ lsnrctl stop

[grid@his2 admin]$ lsnrctl start

13、 备库his升级到19c

SQL> SHUTDOWN IMMEDIATE

SQL> startup upgrade;


--19c oracle目录

[oracle@his1 dbs]$ cd $ORACLE_HOME/rdbms/admin

[oracle@his1 admin]$ $ORACLE_HOME/perl/bin/perl catctl.pl -n 8 catupgrd.sql

+++++++升级脚本介绍

4 (默认) – 最大: 8个并行进程

中断可继续运行:

$ dbupgrade -R -l tmp/logs

封装脚本:

catctl.pl

$ perl catctl.pl -n 4 -l tmp/logs catupgrd.sql

+++++++

[oracle@his1 admin]$ $ORACLE_HOME/perl/bin/perl catctl.pl -n 8 catupgrd.sql

Argument list for [catctl.pl]

For Oracle internal use only A = 0

Run in                       c = 0

Do not run in                C = 0

Input Directory              d = 0

Echo OFF                     e = 1

Simulate                     E = 0

Forced cleanup               F = 0

Log Id                       i = 0

Child Process                I = 0

Log Dir                      l = 0

Priority List Name           L = 0

Upgrade Mode active          M = 0

SQL Process Count            n = 8

SQL PDB Process Count        N = 0

Open Mode Normal             o = 0

Start Phase                  p = 0

End Phase                    P = 0

Reverse Order                r = 0

AutoUpgrade Resume           R = 0

Script                       s = 0

Serial Run                   S = 0

RO User Tablespaces          T = 0

Display Phases               y = 0

Debug catcon.pm              z = 0

Debug catctl.pl              Z = 0


catctl.pl VERSION: [19.0.0.0.0]

           STATUS: [Production]

            BUILD: [RDBMS_19.19.0.0.0DBRU_LINUX.X64_230321.1]



/u01/app/oracle/product/19c/dbhome_1/rdbms/admin/orahome = [/u01/app/oracle/product/19c/dbhome_1]

/u01/app/oracle/product/19c/dbhome_1/bin/orabasehome = [/u01/app/oracle/product/19c/dbhome_1]

catctlGetOraBaseLogDir = [/u01/app/oracle/product/19c/dbhome_1]


Analyzing file u01/app/oracle/product/19c/dbhome_1/rdbms/admin/catupgrd.sql


Log file directory = [/tmp/cfgtoollogs/upgrade20230713234617]


catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/cfgtoollogs/upgrade20230713234617/catupgrd_catcon_92205.lst]


catcon::set_log_file_base_path: catcon: See [/tmp/cfgtoollogs/upgrade20230713234617/catupgrd*.log] files for output generated by scripts


catcon::set_log_file_base_path: catcon: See [/tmp/cfgtoollogs/upgrade20230713234617/catupgrd_*.lst] files for spool files, if any



Number of Cpus        = 32

Database Name         = orcldg

DataBase Version      = 11.2.0.4.0

catcon::set_log_file_base_path: ALL catcon-related output will be written to [/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618/catupgrd_catcon_92205.lst]


catcon::set_log_file_base_path: catcon: See [/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618/catupgrd*.log] files for output generated by scripts


catcon::set_log_file_base_path: catcon: See [/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618/catupgrd_*.lst] files for spool files, if any



Log file directory = [/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618]


Parallel SQL Process Count            = 8

Components in [orcldg]

    Installed [APEX APS CATALOG CATJAVA CATPROC CONTEXT JAVAVM ORDIM OWM SDO XDB XML XOQ]

Not Installed [DV EM MGW ODM OLS RAC WK]

DataBase Version      = 11.2.0.4.0


------------------------------------------------------

Phases [0-107]         Start Time:[2023_07_13 23:46:19]

------------------------------------------------------

***********   Executing Change Scripts   ***********

Serial   Phase #:0    [orcldg] Files:1    Time: 71s

***************   Catalog Core SQL   ***************

Serial   Phase #:1    [orcldg] Files:5    Time: 41s

Restart  Phase #:2    [orcldg] Files:1    Time: 1s

***********   Catalog Tables and Views   ***********

Parallel Phase #:3    [orcldg] Files:19   Time: 21s

Restart  Phase #:4    [orcldg] Files:1    Time: 0s

*************   Catalog Final Scripts   ************

Serial   Phase #:5    [orcldg] Files:7    Time: 15s

*****************   Catproc Start   ****************

Serial   Phase #:6    [orcldg] Files:1    Time: 9s

*****************   Catproc Types   ****************

Serial   Phase #:7    [orcldg] Files:2    Time: 7s

Restart  Phase #:8    [orcldg] Files:1    Time: 0s

****************   Catproc Tables   ****************

Parallel Phase #:9    [orcldg] Files:71   Time: 12s

Restart  Phase #:10   [orcldg] Files:1    Time: 0s

*************   Catproc Package Specs   ************

Serial   Phase #:11   [orcldg] Files:1    Time: 51s

Restart  Phase #:12   [orcldg] Files:1    Time: 0s

**************   Catproc Procedures   **************

Parallel Phase #:13   [orcldg] Files:95   Time: 2s

Restart  Phase #:14   [orcldg] Files:1    Time: 0s

Parallel Phase #:15   [orcldg] Files:122  Time: 4s

Restart  Phase #:16   [orcldg] Files:1    Time: 0s

Serial   Phase #:17   [orcldg] Files:26   Time: 2s

Restart  Phase #:18   [orcldg] Files:1    Time: 0s

*****************   Catproc Views   ****************

Parallel Phase #:19   [orcldg] Files:32   Time: 6s

Restart  Phase #:20   [orcldg] Files:1    Time: 1s

Serial   Phase #:21   [orcldg] Files:3    Time: 8s

Restart  Phase #:22   [orcldg] Files:1    Time: 0s

Parallel Phase #:23   [orcldg] Files:25   Time: 104s

Restart  Phase #:24   [orcldg] Files:1    Time: 0s

Parallel Phase #:25   [orcldg] Files:12   Time: 65s

Restart  Phase #:26   [orcldg] Files:1    Time: 1s

Serial   Phase #:27   [orcldg] Files:1    Time: 0s

Serial   Phase #:28   [orcldg] Files:7    Time: 3s

Serial   Phase #:29   [orcldg] Files:1    Time: 0s

Restart  Phase #:30   [orcldg] Files:1    Time: 0s

***************   Catproc CDB Views   **************

Serial   Phase #:31   [orcldg] Files:1    Time: 0s

Restart  Phase #:32   [orcldg] Files:1    Time: 0s

Serial   Phase #:34   [orcldg] Files:1    Time: 0s

*****************   Catproc PLBs   *****************

Serial   Phase #:35   [orcldg] Files:297  Time: 20s

Serial   Phase #:36   [orcldg] Files:1    Time: 0s

Restart  Phase #:37   [orcldg] Files:1    Time: 0s

Serial   Phase #:38   [orcldg] Files:10   Time: 4s

Restart  Phase #:39   [orcldg] Files:1    Time: 1s

***************   Catproc DataPump   ***************

Serial   Phase #:40   [orcldg] Files:3    Time: 37s

Restart  Phase #:41   [orcldg] Files:1    Time: 0s

******************   Catproc SQL   *****************

Parallel Phase #:42   [orcldg] Files:13   Time: 63s

Restart  Phase #:43   [orcldg] Files:1    Time: 1s

Parallel Phase #:44   [orcldg] Files:11   Time: 3s

Restart  Phase #:45   [orcldg] Files:1    Time: 1s

Parallel Phase #:46   [orcldg] Files:3    Time: 0s

Restart  Phase #:47   [orcldg] Files:1    Time: 0s

*************   Final Catproc scripts   ************

Serial   Phase #:48   [orcldg] Files:1    Time: 17s

Restart  Phase #:49   [orcldg] Files:1    Time: 0s

**************   Final RDBMS scripts   *************

Serial   Phase #:50   [orcldg] Files:1    Time: 23s

************   Upgrade Component Start   ***********

Serial   Phase #:51   [orcldg] Files:1    Time: 0s

Restart  Phase #:52   [orcldg] Files:1    Time: 0s

**********   Upgrading Java and non-Java   *********

Serial   Phase #:53   [orcldg] Files:2    Time: 264s

*****************   Upgrading XDB   ****************

Restart  Phase #:54   [orcldg] Files:1    Time: 0s

Serial   Phase #:56   [orcldg] Files:3    Time: 14s

Serial   Phase #:57   [orcldg] Files:3    Time: 1s

Parallel Phase #:58   [orcldg] Files:10   Time: 1s

Parallel Phase #:59   [orcldg] Files:25   Time: 2s

Serial   Phase #:60   [orcldg] Files:4    Time: 4s

Serial   Phase #:61   [orcldg] Files:1    Time: 0s

Serial   Phase #:62   [orcldg] Files:32   Time: 2s

Serial   Phase #:63   [orcldg] Files:1    Time: 0s

Parallel Phase #:64   [orcldg] Files:6    Time: 5s

Serial   Phase #:65   [orcldg] Files:2    Time: 12s

Serial   Phase #:66   [orcldg] Files:3    Time: 49s

****************   Upgrading ORDIM   ***************

Restart  Phase #:67   [orcldg] Files:1    Time: 0s

Serial   Phase #:69   [orcldg] Files:1    Time: 1s

Parallel Phase #:70   [orcldg] Files:2    Time: 21s

Restart  Phase #:71   [orcldg] Files:1    Time: 0s

Parallel Phase #:72   [orcldg] Files:2    Time: 0s

Serial   Phase #:73   [orcldg] Files:2    Time: 0s

*****************   Upgrading SDO   ****************

Restart  Phase #:74   [orcldg] Files:1    Time: 1s

Serial   Phase #:76   [orcldg] Files:1    Time: 19s

Serial   Phase #:77   [orcldg] Files:2    Time: 1s

Restart  Phase #:78   [orcldg] Files:1    Time: 0s

Serial   Phase #:79   [orcldg] Files:1    Time: 10s

Restart  Phase #:80   [orcldg] Files:1    Time: 0s

Parallel Phase #:81   [orcldg] Files:3    Time: 13s

Restart  Phase #:82   [orcldg] Files:1    Time: 0s

Serial   Phase #:83   [orcldg] Files:1    Time: 3s

Restart  Phase #:84   [orcldg] Files:1    Time: 0s

Serial   Phase #:85   [orcldg] Files:1    Time: 5s

Restart  Phase #:86   [orcldg] Files:1    Time: 0s

Parallel Phase #:87   [orcldg] Files:4    Time: 37s

Restart  Phase #:88   [orcldg] Files:1    Time: 0s

Serial   Phase #:89   [orcldg] Files:1    Time: 0s

Restart  Phase #:90   [orcldg] Files:1    Time: 0s

Serial   Phase #:91   [orcldg] Files:2    Time: 5s

Restart  Phase #:92   [orcldg] Files:1    Time: 0s

Serial   Phase #:93   [orcldg] Files:1    Time: 0s

Restart  Phase #:94   [orcldg] Files:1    Time: 1s

*******   Upgrading ODM, WK, EXF, RUL, XOQ   *******

Serial   Phase #:95   [orcldg] Files:1    Time: 11s

Restart  Phase #:96   [orcldg] Files:1    Time: 0s

***********   Final Component scripts    ***********

Serial   Phase #:97   [orcldg] Files:1    Time: 2s

*************   Final Upgrade scripts   ************

Serial   Phase #:98   [orcldg] Files:1    Time: 72s

*******************   Migration   ******************

Serial   Phase #:99   [orcldg] Files:1    Time: 30s

***   End PDB Application Upgrade Pre-Shutdown   ***

Serial   Phase #:100  [orcldg] Files:1    Time: 0s

Serial   Phase #:101  [orcldg] Files:1    Time: 0s

Serial   Phase #:102  [orcldg] Files:1    Time: 41s

*****************   Post Upgrade   *****************

Serial   Phase #:103  [orcldg] Files:1    Time: 35s

****************   Summary report   ****************

Serial   Phase #:104  [orcldg] Files:1    Time: 1s

***   End PDB Application Upgrade Post-Shutdown   **

Serial   Phase #:105  [orcldg] Files:1    Time: 0s

Serial   Phase #:106  [orcldg] Files:1    Time: 0s

Serial   Phase #:107  [orcldg] Files:1     Time: 27s


------------------------------------------------------

Phases [0-107]         End Time:[2023_07_14 00:07:43]

------------------------------------------------------


Grand Total Time: 1285s 


 LOG FILES: (/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618/catupgrd*.log)


Upgrade Summary Report Located in:

/u01/app/oracle/product/19c/dbhome_1/cfgtoollogs/orcldg/upgrade20230713234618/upg_summary.log


Grand Total Upgrade Time:    [0d:0h:21m:25s]

14、 升级后处理

set line 200

col PROPERTY_NAME format a30

SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value  FROM DATABASE_PROPERTIES  WHERE PROPERTY_NAME LIKE 'DST_%'

ORDER BY PROPERTY_NAME;

select * from v$timezone_file;



--升级后脚本执行

SQL> @/u02/app/oracle/cfgtoollogs/orcldg1/preupgrade/postupgrade_fixups.sql

SQL> @?/rdbms/admin/utlrp.sql


升级后查询确认:

select * from DBA_REGISTRY_HISTORY;

select comp_name,status,version from dba_server_registry;

select comp_id,version,status from dba_registry;  

select * from v$version;

show parameter compatible


升级后的检查:

select * from utl_recomp_errors;

五、逻辑dg升级后操作

1、统计信息收集

exec dbms_stats.set_param('DEGREE','8');

select dbms_stats.get_param('DEGREE') from dual; 

exec dbms_stats.gather_database_stats;

exec dbms_stats.gather_dictionary_stats;

exec dbms_stats.gather_system_stats(gathering_mode => 'noworkload');

exec dbms_stats.gather_fixed_objects_stats;

exec DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'SYS')

exec dbms_stats.set_param('DEGREE','0');

业务表的统计信息收集方式就不发出来了;

2、wm_concat函数增加

alter session disable guard;

alter user wmsys account unlock;

alter user wmsys account unlock identified by wmsys;

grant connect to wmsys;

grant dba to  wmsys;

登陆wmsys执行如下语句:

alter session disable guard;


CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT 

-- AUTHID CURRENT_USER AS OBJECT 

CURR_STR VARCHAR2(32767), 

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, 

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, 

P1 IN VARCHAR2) RETURN NUMBER, 

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, 

RETURNVALUE OUT VARCHAR2, 

FLAGS IN NUMBER) 

RETURN NUMBER, 

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, 

SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER 

); 

/

--定义类型body: 

CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL 

IS 

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) 

RETURN NUMBER 

IS 

BEGIN 

SCTX := WM_CONCAT_IMPL(NULL) ; 

RETURN ODCICONST.SUCCESS; 

END; 

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, 

P1 IN VARCHAR2) 

RETURN NUMBER 

IS 

BEGIN 

IF(CURR_STR IS NOT NULL) THEN 

CURR_STR := CURR_STR || ',' || P1; 

ELSE 

CURR_STR := P1; 

END IF; 

RETURN ODCICONST.SUCCESS; 

END; 

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, 

RETURNVALUE OUT VARCHAR2, 

FLAGS IN NUMBER) 

RETURN NUMBER 

IS 

BEGIN 

RETURNVALUE := CURR_STR ; 

RETURN ODCICONST.SUCCESS; 

END; 

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, 

SCTX2 IN WM_CONCAT_IMPL) 

RETURN NUMBER 

IS 

BEGIN 

IF(SCTX2.CURR_STR IS NOT NULL) THEN 

SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ; 

END IF; 

RETURN ODCICONST.SUCCESS; 

END; 

END; 

--自定义行变列函数: 

CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) 

RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; 

/

--三.创建同义词并授权

create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL 

create public synonym wm_concat for wmsys.wm_concat 

/

grant execute on WM_CONCAT_IMPL to public 

grant execute on wm_concat to public 

/

3、业务相关授权

4、业务相关表处理

5、重新开启同步

在逻辑备库上启用SQL APPLY(rac1开启即可)

SQL>  ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;


主库开启日志传输

SQL> alter system set log_archive_dest_state_3 = ENABLE scope=both;

如果备库应用日志慢,可以考虑合理调整logical standby上apply进程的数量

三个参数设置推荐如下等式关系:

    APPLY_SERVERS + PREPARE_SERVERS = MAX_SERVERS – 3


比如,设置max_servers在1~20之间,则分配一个进程作为PREPARER,其余进程作为applers;如果max_servers值在21~40之间,则分配2个进程作为PREPARER,其余进程作为applers。


SELECT * FROM V$LOGSTDBY_STATS WHERE NAME in('number of preparers','number of appliers','maximum SGA for LCR cache (MB)');


SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;

SQL> begin DBMS_LOGSTDBY.APPLY_SET('MAX_SERVERS', 24);end;

SQL> begin DBMS_LOGSTDBY.APPLY_SET('PREPARE_SERVERS', 1);end;

SQL> begin DBMS_LOGSTDBY.APPLY_SET('APPLY_SERVERS', 20);end;

begin DBMS_LOGSTDBY.APPLY_SET('MAX_SGA',1024);  end;  --100

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

6、检查同步进度

set line 200 pages 2222

col file_name for a50

SELECT FILE_NAME, SEQUENCE# AS SEQ#, FIRST_CHANGE# AS F_SCN#,NEXT_CHANGE# AS N_SCN#, TIMESTAMP, DICT_BEGIN AS BEG, DICT_END AS END,THREAD# AS THR#, APPLIED FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;

检查实时应用的语句

select ls.serial# "Apply Process"

         , sas.state "State"

         , sas.sid SID

         , s.sql_address "SQL Address"

         , s.sql_hash_value "SQL Hash Value"

         ,s.SQL_ID

         , sa.sql_text "SQL Text"

     from v$logstdby ls

       , v$streams_apply_server sas

       , v$session s

      , v$sqlarea sa

    where ls.type = 'APPLIER'

    and sas.state != 'IDLE'

    and sas.serial# = ls.serial#

    and s.sid = sas.sid

    and sa.address (+) = s.sql_address

    and sa.hash_value (+) = s.sql_hash_value;

检查目前应用到哪个时段

SELECT SYSDATE, APPLIED_TIME FROM V$LOGSTDBY_PROGRESS;


检查备库进程相关状态

select * from V$LOGSTDBY_STATS;

SELECT SID,SERIAL#,SPID,TYPE,STATUS,HIGH_SCN FROM  V$LOGSTDBY_PROCESS;  

SELECT SESSION_ID, STATE FROM V$LOGSTDBY_STATE;

7、检查和处理未应用或者报错的表(备库执行)

SELECT XIDUSN, XIDSLT, XIDSQN , status , EVENT_TIME,to_char(EVENT), STATUS FROM DBA_LOGSTDBY_EVENTS 

where EVENT not like '%SYSMAN%' and EVENT not like '%SYSLS%' and to_char(EVENT) is not null  ORDER BY EVENT_TIMESTAMP;


SELECT distinct trunc(event_time),to_char(EVENT) FROM DBA_LOGSTDBY_EVENTS where EVENT not like '%SYSMAN%' and EVENT not like '%SYSLS%' and to_char(EVENT) is not null; 


select STATEMENT_OPT,OWNER,NAME from DBA_LOGSTDBY_SKIP;


--跳过表的应用


alter database stop logical standby apply;

begin DBMS_LOGSTDBY.SKIP('DML', 'SYS', 'JOB$');  end;

begin DBMS_LOGSTDBY.SKIP('DML', 'ZLHIS', '体检任务结果');  end;

begin DBMS_LOGSTDBY.SKIP('DML', 'SYS', 'aud$');  end;

select STATEMENT_OPT,OWNER,NAME from DBA_LOGSTDBY_SKIP;

alter database start logical standby apply immediate;


--跳过某个事物

alter database stop logical standby apply;

begin dbms_logstdby.skip_transaction (19,10,306300); end;

alter database start logical standby apply immediate;


--查看跳过的表是否有其他表引用,并且是级联删除或者级联更新,如果没有则直接可以导入,如果有要先禁用级联更新、删除再导入

--a) 从DBA_LOGSTDBY_SKIP获取 

select pk.OWNER,pk.table_name,fk_col.constraint_name, fk_col.table_name, fk_col.column_name,fk.DELETE_RULE

 from dba_constraints pk, dba_constraints fk,dba_cons_columns fk_col

 where pk.table_name in (select NAME from DBA_LOGSTDBY_SKIP)

 and pk.constraint_type = 'P'

 and fk.r_constraint_name = pk.constraint_name

 and fk_col.constraint_name = fk.constraint_name

 order by 2, 3;

--b) 从DBA_LOGSTDBY_EVENTS获取

select pk.OWNER,pk.table_name,fk_col.constraint_name, fk_col.table_name, fk_col.column_name,fk.DELETE_RULE

 from dba_constraints pk, dba_constraints fk,dba_cons_columns fk_col

 where pk.table_name in ( 'TEST_GETDATA_XML','ZLMOBILEMSLOG','病人医嘱执行','病区公告栏样式','ZLMBDEVICELIST','ZLMBIF_CALL_LOG')

 and pk.constraint_type = 'P'

 and fk.r_constraint_name = pk.constraint_name

 and fk_col.constraint_name = fk.constraint_name

 order by 2, 3;


--重新初始化被跳过的表

select STATEMENT_OPT,OWNER,NAME from DBA_LOGSTDBY_SKIP;

OWNER NAME

ZLHIS YGJC_上传记录

ZLHIS 体检任务结果

ZLHIS 医保调用日志

ZLHIS 检验复查明细

SYS   AUD$

drop  public database link TO_PRIMARY;

create public database link TO_PRIMARY connect to zlhis identified by "!744B018D9" using '10.92.170.101/orcl';


alter database stop logical standby apply;

begin  dbms_logstdby.unskip('SCHEMA_DDL', 'ZLHIS','检验复查明细');end;

begin  dbms_logstdby.unskip('DML', 'ZLGS','YGJC_上传记录');end;

begin dbms_logstdby.instantiate_table('ZLGS','YGJC_上传记录','TO_PRIMARY'); end;

alter database start logical standby apply immediate;


alter table ZLHIS.体检任务结果 add constraint 体检任务结果_FK_清单id foreign key(任务id,病人id,清单id)

references zlhis.体检任务发送(任务id,病人id,清单id) on delete cascade enable novalidate;

8、his业务系统报表修改、相关处理

六、停机窗口

1、rac添加白名单,只允许rac和dg和调试的客户端连接,其他都不允许进入

su - grid

vi /g01/app/11.2.0/grid/network/admin/sqlnet.ora

tcp.validnode_checking=yes

tcp.invited_nodes=(10.92.170.102,10.92.170.103,10.92.170.104,10.92.170.105,10.0.0.2,10.0.0.3,10.92.170.101,192.168.35.7,10.92.170.164,127.0.0.1,192.168.1.9)

ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|wc -l

ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|xargs kill -9

rac重启监听

srvctl stop listener

srvctl start listener

rac停止scan和scan_listener

/g01/app/11.2.0/grid/bin/srvctl stop scan_listener

/g01/app/11.2.0/grid/bin/srvctl stop scan


2、数据检查

3、如有大对象之前跳过了,这里批量并行分片导出


//////////////////11g导出

create or replace directory dmp as '/backup/';

grant read,write on directory dmp to public;


#!/bin/bash

chunk=9

for ((i=0;i<=8;i++));

do

expdp zlhis/his TABLES=电子病历格式 QUERY=电子病历格式:\"where mod\(dbms_rowid.rowid_block_number\(rowid\)\, ${chunk}\) = ${i}\" directory=DMP dumpfile=BL_${i}.DMP logfile=BL_${i}.log &

echo $i

sleep 10

done 


sh expbl.sh &

scp /backup/BL* 172.16.106.188:/backup/


//////////////////19c导出

create or replace directory dmp as '/backup/';

grant read,write on directory dmp to public;

truncate table zlhis.电子病历格式; --19c库执行


--脚本导入

#!/bin/bash

for ((i=0;i<=8;i++));

do

#echo dumpfile=BL_${i}.DMP

impdp \"/ as sysdba\" directory=dmp  dumpfile=BL_${i}.DMP logfile=impdp_BL_${i}.log DATA_OPTIONS=DISABLE_APPEND_HINT TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y CONTENT=DATA_ONLY &

sleep 10

done

4、主库摘掉第二个dg

--主库先执行

alter system set log_archive_config='DG_CONFIG=(orcl,oral)';

alter system set log_archive_dest_3='';

alter system reset log_archive_dest_3 scope=spfile;

5、备库清理spfile参数

--备库(先备份现有spfile,然后再删除dg参数)

create pfile from spfile;

alter system set db_unique_name='orcl' scope=spfile;

alter system set log_archive_config='';  

alter system reset log_archive_config scope=spfile;

alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/ORCLARCH/' scope=both;

alter system set log_archive_dest_2='' scope=both;

alter system reset log_archive_dest_2 scope=spfile;

alter system set log_archive_dest_3='' scope=both;

alter system reset log_archive_dest_3 scope=spfile;


alter system reset standby_file_management scope=spfile;  

alter system reset db_file_name_convert scope=spfile; 

alter system reset log_file_name_convert scope=spfile;


alter system set fal_client='' scope=both; 

alter system reset fal_client scope=spfile;

alter system set fal_server='' scope=both; 

alter system reset fal_server scope=spfile;

shutdown immediate;

startup;

6、备库执行激活

alter database stop logical standby apply;

alter database activate logical standby database ;

select db_unique_name,open_mode,switchover_status,dataguard_broker,guard_status,database_role,force_logging,

       log_mode,protection_mode,protection_level,name,controlfile_type,fs_failover_status from v$database;

7、新主库修改ip

vi /etc/sysconfig/network-scripts/ifcfg-bond1

 nmcli con up bound

8、业务恢复

9、配置oracle pg的dblink


七、总结

1)本次项目预计30分钟停机,实际上我只用了7分钟,信息科都感到意外。还没开始就结束了;

2)由于涉及到部分用户信息,有部分内容未完全发出来,微信公众号格式不太好调整,大家将就看;有疑问欢迎加我微信沟通;

3)该方法适用于相同字节序可以做dg环境的升级、迁移、打补丁操作,如linux到linux,windows到linux;理论上支持dg的都可以;


文章转载自数据库技术加油站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论