資料庫升級之-Dataguard滾動升級
說明
概述
本文的環境為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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫升級之-XTTS資料庫TTS
- 資料庫升級之-資料泵資料庫
- android資料庫如何進行版本升級?架構之資料庫框架升級Android資料庫架構框架
- [譯] Elasticsearch 滾動升級Elasticsearch
- 【邏輯DG滾動升級三】ORACLE11204 邏輯DG滾動升級至12C---正式升級Oracle
- 入門Kubernetes - 滾動升級/回滾
- 資料庫升級和工具資料庫
- 靜默方式安裝、升級oracle(三): 升級資料庫軟體及資料庫Oracle資料庫
- 滴滴HBase大版本滾動升級之旅
- Kubernetes:Pod 升級、回滾
- oracle資料庫11.2.0.3升級到11.2.0.4Oracle資料庫
- 13 使用SQL Apply 升級資料庫SQLAPP資料庫
- 【資料庫升級】Oracle指令碼升級12c CDB to 19c CDB資料庫Oracle指令碼
- 自定義開發資料庫升級程式資料庫
- 14 使用DBMS_ROLLING 執行滾動升級
- iOS 資料庫升級資料遷移解決方案iOS資料庫
- 資料庫升級-物理重新整理資料字典資料庫
- 【邏輯DG滾動升級二】ORACLE11204 邏輯DG滾動升級至12C---DG端前期準備Oracle
- kubernetes實踐之四十:Pod的升級與回滾
- 【邏輯DG滾動升級一】ORACLE11204 邏輯DG滾動升級至12C---生產端前期準備Oracle
- phpStudy2018 升級資料庫 MySQL5.7PHP資料庫MySql
- 大資料:小白升級版大資料
- Nacos 爆重大 Bug!!不要升級,不要升級,不要升級
- 在Rainbond中實現資料庫結構自動化升級AI資料庫
- ABP Framework 手動升級指南:從6.0.1升級到7.0.0Framework
- Truffle 2.0升級3.0升級指南
- 故障分析 | MySQL 資料庫升級後,資料庫怎麼卡住了MySql資料庫
- 【資料庫】mysql5.6升級至5.7(物理方式)資料庫MySql
- iOS CoreData (二) 版本升級和資料庫遷移iOS資料庫
- Android 中的升級資料庫最佳方法實踐Android資料庫
- 成為MySQL DBA 部落格系列-資料庫升級MySql資料庫
- 如何理解騰訊雲資料庫戰略升級?資料庫
- java實現“資料平滑升級”Java
- LinkedIn大資料工程的升級大資料
- 淺入Kubernetes(12):Deployment 的升級、回滾
- 關閉chrome自動升級的教程 chrome如何取消自動升級Chrome
- Oracle資料庫升級或資料遷移的方法探討Oracle資料庫
- Java之學生資訊管理系統升級版(資料庫程式設計)Java資料庫程式設計