資料庫升級之-Dataguard滾動升級

yingyifeng306發表於2020-08-11

說明

概述

本文的環境為Linux 11.2.0.4 單機 + 物理dg ,透過將物理dg臨時轉換為邏輯dg ,然後利用sql apply來降低升級過程中的停機時間,主要步驟如下

 

1. 生產庫建立強制閃回點

2. 將物理dg轉換為邏輯dg

3. 將邏輯dg升級至12c,資料和生產同步

4. 第一次主備切換,邏輯dg變為生產,接管業務

5. 原生產閃回至邏輯dg升級開始的時候

6. 用12c軟體將原生產庫啟動到mount,並轉換為物理standby,同步資料

7. 第二次主備切換
從以上過程可以看出,停機時間僅僅在於第一步建立強制閃回點的時間和兩次dg切換的時間,如果不需要切換回原生產主機,則只需要第一次切換就行。

生產端前期準備

生產建立回退方案

  生產庫建立閃回點

SQL> STARTUP MOUNT;

SQL> CREATE RESTORE POINT pre_upgrade GUARANTEE FLASHBACK DATABASE;

需要提前設定好閃回空間

 

為了回退需要,還要備份控制檔案和 redo

[oracle@backup ~]$ cp /oracle/ora11204/oradata/orcl/*.ctl /oracle/ora11204/oradata/orcl/redo* /oracle/ora11204/bak/

 

為了使用 sql apply ,主庫必須執行在最大可用或者最大效能模式。

SQL> alter database set standby database to maximize availability;

SQL> ALTER DATABASE OPEN;

 

生產開啟附加日誌

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;

 

端設定一個額外的目錄存放邏輯dg 產生的歸檔

SQL> alter system set log_archive_dest_3='LOCATION=/oracle/ora11204/arch/std VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)';

SQL> alter system set log_archive_dest_state_3=enable;

 

 

檢查包含不受sql apply 支援的資料型別的表

SELECT * FROM DBA_LOGSTDBY_EDS_SUPPORTED;

 

For any tables returned that have unsupported data types, you can use the Extended Datatype Support (EDS) feature to replicate them. To do so, execute the following PL/SQL procedure for each table to be replicated using EDS:

SQL> EXECUTE DBMS_LOGSTDBY.EDS_ADD_TABLE(schema_name, table_name);

 

在生產庫上透過如下命令捕捉不受 sql apply 支援的事務,記錄到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');

 

生成sql apply 需要的資料字典

從主庫上獲取備庫所需的資料字典資訊

 sql> exec dbms_logstdby.build

logmnr 根據這個將 redo 轉換為邏輯 dg sql

 

dg 端前期準備

端建立閃回點

SQL> STARTUP MOUNT;

SQL> CREATE RESTORE POINT pre_upgrade GUARANTEE FLASHBACK DATABASE;

需要提前設定好閃回空間

 

將物理dg 轉換為邏輯dg

確認主備同步後,在備庫上執行

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY KEEP IDENTITY;

a dg 需要關閉,重啟到 mount 狀態。如果卡住,先啟用 real time apply 然後關閉再嘗試。

 

KEEP IDENTITY 是為了保持dbid 不變,這是11g 引入的新特性。10g 只能 ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;

 

 

關閉邏輯dg 的自動刪除歸檔

在備庫上執行

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

 

 

邏輯dg 啟用sql apply

在邏輯 dg 上啟動 sql apply immediate 表示實時應用

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

Immediate 需要 standby redolog 否則會報錯

 

安裝12c 軟體

dg 端都安裝 12c 軟體,過程略

 

關閉資料庫,停監聽

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;

SQL> SHUTDOWN IMMEDIATE;

 

LSNRCTL STOP;

 

備庫關閉監聽後,主庫無法傳輸日誌過來,可以在生產端臨時停用日誌傳輸

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;


 

升級邏輯dg 12c

執行preupgrade.jar 升級預檢

12c preupgrade.jar 替換了 utlu112i.sql 來執行預檢工作,這個 java 程式會生成兩個 sql 指令碼檔案來修復一些簡單的問題,比如提前收集字典統計資訊之類,但是很多仍然需要手工操作

preupgrade.jar 語法如下

 

$Earlier_release_Oracle_home/jdk/bin/java -jar $New_release_Oracle_home/rdbms/admin/preupgrade.jar [FILE|TERMINAL] [TEXT|XML] [DIR output_dir]

FILE|TERMINAL  指定檢查結果輸出到終端還是檔案,預設是檔案

TEXT|XML       指定結果格式是文字還是XML ,預設是文字

DIR -            指定日誌輸出到<output_dir> 目錄. 如果沒有指定output_dir 目錄,則優先到$ORACLE_BASE/cfgtoollogs/<dbname>/preupgrade/ 目錄,如果沒有ORACLE_BASE 環境變數則到 $ORACLE_HOME/cfgtoollogs/<db_name>/preupgrade/

 

export ORACLE_BASE=/oracle/ora11204 注意要用11g jdk 來執行

export ORACLE_HOME=$ORACLE_BASE/db_1

export ORACLE_SID=tt

$ORACLE_HOME/jdk/bin/java -jar /oracle/12c/product/12.2.0/dbhome_1/rdbms/admin/preupgrade.jar file text dir ./precheck.log

Preupgrade generated files:

    /home/oracle/precheck.log/preupgrade.log  檢查結果

    /home/oracle/precheck.log/preupgrade_fixups.sql 升級前預檢問題修復指令碼,檢查結果中標記為AUTOFIXUP 的可以透過這個修復

/home/oracle/precheck.log/postupgrade_fixups.sql 升級後問題修復指令碼

這裡檢查出以下問題

 + Update NUMERIC INITIALIZATION PARAMETERS to meet estimated minimums.

     Parameter                         12.2.0.1.0 minimum

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

     processes                                        300

建議刪除sec_case_sensitive_logon 引數

刪除em 元件減少升級停機時間(升級過程會自動刪除,但是建議提前做掉)

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

     12.2.0.1.0 ORACLE_HOME into the source 11.2.0.4.0 ORACLE_HOME.

    

     Step 1: If database control is configured, stop EM Database Control,

     using the following command    

       $> emctl stop dbconsole    

     Step 2: Connect to the database using the SYS account AS SYSDBA

       SET ECHO ON;

       SET SERVEROUTPUT ON;

      @emremove.sql

    

Remove OLAP Catalog by running the 11.2.0.4.0 SQL script

     $ORACLE_HOME/olap/admin/catnoamd.sql script. 

    

     The OLAP Catalog component, AMD, exists in the database.

     Starting with Oracle Database 12c, the OLAP Catalog (OLAP AMD) is

     desupported and will be automatically marked as OPTION OFF during the

     database upgrade if present. Oracle recommends removing OLAP Catalog

     (OLAP AMD) before database upgrade.

 

(AUTOFIXUP) Gather stale data dictionary statistics prior to database

     upgrade in off-peak time using:

    

      EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;

 

 

收集資料字典統計資訊

EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

 

確認物化檢視都已停止重新整理

SELECT o.name FROM sys.obj$ o, sys.user$ u, sys.sum$ s

WHERE o.type# = 42 AND bitand(s.mflags, 8) =8;

 

確認資料檔案不需要介質恢復且不處於backup 模式

select * from v$recover_file;
SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';

 

 

處理分散式事務

SQL> SELECT * FROM DBA_2PC_PENDING; 

 

IF THIS RETURNS ROWS YOU SHOULD DO THE FOLLOWING:

SQL> SELECT LOCAL_TRAN_ID FROM DBA_2PC_PENDING;

SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('');

SQL> COMMIT;

建立dblink 的指令碼

in case the database has to be downgraded again

 

 

SELECT 'CREATE '||DECODE(U.NAME,'PUBLIC','public ')||'DATABASE LINK '||CHR(10)
||DECODE(U.NAME,'PUBLIC',Null, 'SYS','',U.NAME||'.')|| L.NAME||chr(10)
||'CONNECT TO ' || L.USERID || ' IDENTIFIED BY "'||L.PASSWORD||'" USING
'''||L.HOST||''''
||chr(10)||';' TEXT
FROM SYS.LINK$ L, SYS.USER$ U
WHERE L.OWNER# = U.USER#;

4.7 清理回收站

PURGE DBA_RECYCLEBIN;

收集em 資訊

emdwgrd -save -sid tt -path /home/oracle

降級回退的時候需要

另外,建議升級 12c 之前先刪除 em 元件,減少升級時間

 $ emctl stop dbconsole

  複製 12c emremove.sql 指令碼到 /tmp 目錄

 cp /oracle/12c/product/12.2.0/dbhome_1/rdbms/admin/emremove.sql /tmp

       SET ECHO ON;

       SET SERVEROUTPUT ON;

      @/tmp/emremove.sql

 

修改必要引數

vi initorcl.ora

*.audit_file_dest='/oracle/12c/admin/orcl/adump'

*.audit_trail='NONE'

*.compatible='11.2.0.4.0'

*.control_files='/oracle/ora11204/oradata/orcl/std'

*.db_block_size=8192

*.db_domain=''

*.db_name='orcl'

*.diagnostic_dest='/oracle/12c'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

*.fal_client='DG'

*.fal_server='prod'

*.log_archive_dest_1='location=/oracle/ora11204/arch valid_for=(online_logfiles,all_roles)' 這個用來存放邏輯dg 寫操作產生的歸檔

*.log_archive_dest_2='service=prod valid_for=(online_logfile,primary_role)'

*.log_archive_dest_3='LOCATION=/oracle/ora11204/arch/std VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)' 這個是為了接收生產傳過來的歸檔

*.open_cursors=300

*.pga_aggregate_target=1203765248

*.processes=500

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=3613392896

*.undo_tablespace='UNDOTBS1'

*.db_recovery_file_dest='/oracle/ora11204/fast_recovery_area'

*.db_recovery_file_dest_size='20G'

 

[oracle@backup ~]$ mkdir -p /oracle/12c/admin/orcl/adump

刪除olap 元件

SQL> @?/olap/admin/catnoamd.sql

SQL> select distinct(trunc(last_refresh)) from dba_snapshot_refresh_times;

SQL> select s.obj#,o.obj#,s.containerobj#,lastrefreshdate,pflags,xpflags,o.name,o.owner#, bitand(s.mflags, 8) from obj$ o, sum$ s
where o.obj# = s.obj# and o.type# = 42 AND bitand(s.mflags, 8) = 8;

 

檢查ADMINISTER DATABASE TRIGGER 許可權使用者

如果使用者建立了資料庫級別的觸發器,則必須要擁有 ADMINISTER DATABASE TRIGGER 許可權,但是建立完之後該許可權可能被回收

 

SELECT OWNER,     TRIGGER_NAME FROM DBA_TRIGGERS WHERE BASE_OBJECT_TYPE='DATABASE' AND

     OWNER NOT IN (SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE

     PRIVILEGE='ADMINISTER DATABASE TRIGGER');

grant ADMINISTER DATABASE TRIGGER to xxxx;

升級APEX

為了減少升級時間,可以提前升級 apex ,本例沒有提前升級,在資料庫升級過程中一起升級

 The database contains APEX version 3.2.1.00.12 and will need to be upgraded to at least version 5.0.4.00.12.

To reduce database upgrade time, you can upgrade APEX manually before the database upgrade.  Refer to My Oracle Support Note 1088970.1 for information on APEX installation upgrades.

 

升級資料庫刷資料字典

12c 軟體啟動邏輯 dg

SQL> startup upgrade

 

nohup dbupgrade -oracleHome /oracle/12c/product/12.2.0/dbhome_1  &

 

重新開啟資料庫刷無效物件

Sqlplus / as sysdba

SQL> create spfile from pfile;

SQL> Startup

 

[oracle@backup ~]$ cd $ORACLE_HOME/rdbms/admin

[oracle@backup admin]$ $ORACLE_HOME/perl/bin/perl catcon.pl -n 1 -e -b utlrp -d '''.''' utlrp.sql

此時 dba_registry 內所有元件狀態從 UPGRADED 變為 VALID

 

刷完之後對比之前的無效物件進行確認

select owner,object_name from dba_objects where status<>'VALID' and object_name not in (select object_name from invalid_object_20160224);

 

執行預檢生成的修復指令碼,包括重新收集 x$ 基表和字典 統計資訊等

SQL> @/home/oracle/precheck.log/postupgrade_fixups.sql

複製tnsnames.ora 和密碼檔案到12c 環境

 

[oracle@high admin]$ cp /oracle/ora11204/db_1/network/admin/tnsnames.ora .

[oracle@high dbs]$ cp /oracle/ora11204/db_1/dbs/orapworcl .


 

第一次主備切換

 

啟用sql apply 追平資料

邏輯 dg 再次啟用 sql apply

SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'yy-mm-dd HH24:MI:SS';

SQL> SELECT SYSDATE, APPLIED_TIME FROM V$LOGSTDBY_PROGRESS;

SYSDATE           APPLIED_TIME

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

17-04-18 17:38:38 17-04-18 05:47:34

監控以上 SQL APPLY 進度,是否與當前時間接近,可以透過一個測試表來檢查

處理不受sql apply 支援的表

這裡正式關閉應用,確保生產庫沒有連線

 

set lin 200

SET LONG 1000

SET PAGESIZE 180

SET LINESIZE 79

col EVENT_TIMESTAMP for a30;

col event for a30

col status for a30

SQL> SELECT EVENT_TIMESTAMP, EVENT, STATUS FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP;

審查升級過程中的監控事件 , 在邏輯 dg 上查詢 DBA_LOGSTDBY_EVENTS 檢視,該檢視記錄了在邏輯備庫上沒有 applied DDL DML 操作

ORA-16226 錯誤表示相關 DDL 操作在邏輯備庫上不受支援,常見的原因是該類操作涉及內部物件

ORA-16129 錯誤表示相關 DML 操作在邏輯備庫上不受支援

 

如果有業務表出現上面的錯誤,則透過 impdp 將生產數同步到邏輯 dg

Impdp \”/ as sysdba\” NETWORK_LINK=databasea TABLES=scott.emp TABLE_EXISTS_ACTION=TRUNCATE

 

切換

生產狀態

SQL> SELECT database_role,SWITCHOVER_STATUS FROM V$DATABASE;

DATABASE_ROLE    SWITCHOVER_STATUS

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

PRIMARY          SESSIONS ACTIVE

 

邏輯 dg 狀態

SQL> SELECT database_role,SWITCHOVER_STATUS FROM V$DATABASE;

 

DATABASE_ROLE    SWITCHOVER_STATUS

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

LOGICAL STANDBY  NOT ALLOWED

 

將主庫切換成邏輯 dg ,這條命令會等待事務完成

ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;

切換完成之後,主備庫 DATABASE_ROLE 都變成了 LOGICAL STANDBY ,將原先的邏輯 dg 切換成主庫

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

現在由原邏輯 dg 12c 版本)接管應用


 

升級原生產庫(當前的邏輯dg

閃回原生產

將原主庫閃回到之前建立的還原點上( 2.1 步驟建立的)

 

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT;

SQL> flashback database to restore point pre_upgrade;

SQL> SHUTDOWN IMMEDIATE;

dbs 目錄下密碼檔案和 network/admin 中的 listener.ora tnsnames.ora 至新的 12c 目錄中

準備引數檔案

先從當前生產(原邏輯 dg )複製相關檔案

$ scp initorcl.ora orapworcl 192.168.200.34:/oracle/12c/product/12.2.0/dbhome_1/dbs

$ vi initorcl.ora 修改如下內容

*.control_files='/oracle/ora11204/oradata/orcl/control01.ctl'

*.fal_client='PROD'

*.fal_server='dg'

*.log_archive_dest_1='location=/oracle/ora11204/arch valid_for=(online_logfiles,all_roles)'

*.log_archive_dest_2='service=dg valid_for=(online_logfile,primary_role)'

*.log_archive_dest_3='LOCATION=/oracle/ora11204/arch/std VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)'

 

12c 載入原生產庫

$ cp nsnames.ora /oracle/12c/product/12.2.0/dbhome_1/network/admin/

$ mkdir /oracle/12c/admin/orcl/adump

$ startup mount;

停止 11g 監聽,啟動 12c 監聽

 

將原生產庫切換回物理備庫

SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

轉換完成後歸檔全部接收過來了

SQL> SHUTDOWN IMMEDIATE;

重啟後開始追原邏輯 dg 12c 軟體讀寫開啟後產生的歸檔

SQL> STARTUP MOUNT;

SQL> RECOVER MANAGED STANDBY DATABASE DISCONNECT;

等歸檔追平,就表示升級完成

第二次主備切換 (視需求而定)

第二次停機,主備物理切換,回到升級前的狀態( 12c 下),按需求來做(如果備機效能跟原生產相當則可以不做)

當前生產

SQL> alter database commit to switchover to physical standby;

完成後自動關閉

SQL>startup

SQL> recover managed standby database using current logfile disconnect;

物理 dg

SQL> alter database commit to switchover to primary;

SQL> alter database open;

測試日誌是否實時應用 .


 

升級失敗的回退措施

 

升級邏輯dg 失敗

如果在第四大步升級邏輯 dg 12c 失敗,則直接用 3.1 建立的閃回點閃回升級開始前的狀態,生產不用做任何操作。

SQL>startup mount

SQL>flashback database to restore point pre_upgrade;

SQL>shutdown immediate

SQL>startup mount;

SQL>recover managed standby database disconnect;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23732248/viewspace-2710660/,如需轉載,請註明出處,否則將追究法律責任。

相關文章