动手为王 | Oracle 数据库跨版本升级迁移实践

简介:

实施背景

今年春节加班期间,将某客户的核心数据库从 Oracle 10.2.0.4 RAC 迁移升级至 12.2 RAC。原库是使用的 Raw,而且版本较低,无法直接升级到 12.2 版本,因此整个升级过程相对麻烦。

实施思路

我们在新环境部署了10g、11.2、12.2 的 Database 软件(其中 10g,11.2 均为单机,12.2 为已经安装好的 Oracle RAC 环境);

然后配置好主库到新环境的 DataGuard 数据同步,在正式割接之前确认主备同步正常。由于需要将数据库从 10gR2 迁移到新环境并且升级到 12.2,且需要使用 CDB 模式,因此整个过程相对繁琐。

如下是大致步骤:

  1. 停止 Job(将 job_queue_processes 参数提前置为0,并 kill 相关进程);
  2. 检查分布式事务,并进行相关处理(实际上我们检查确实发现了部分分布式事务需要手工介入);
select ' exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('||chr(39)||LOCAL_TRAN_ID||chr(39)||');'||chr(10)||'commit;' 

from dba_2pc_pending;
  1. 在确认主备数据同步之后,进行 switchover,如下是主备切换简约步骤:

--主库

alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;

startup mount;

alter database open read only;

--备库

alter database commit to switchover to primary;

startup force
  1. 新主库升级到 11.2 之前需要先创建还原点,防止有问题可以回退;
alter database flashback on;


alter database open;

alter system switch logfile;

create restore point restore_point_10g guarantee flashback database;
  1. 执行升级脚本,将数据库升级到 11.2;
  1. 确认升级成功之后,drop 还原点并创建新的还原点,准备将数据库升级到 12.2;
drop restore point restore_point_10g;

create restore point restore_point_11g guarantee flashback database;

这里需要注意的是,在升级到 12.2 之前需要将实例参数 compatible 设置为11.2.0.4,否则在升级过程中可能会遭遇 ORA-00600 错误。

  1. 执行升级脚本将数据库升级到 12.2;
@/home/oracle/shell/log/preupgrade_fixups.sql

$ORACLE_HOME/perl/bin/perl -I $ORACLE_HOME/perl/lib $ORACLE_HOME/rdbms/admin/catctl.pl -n 8 $ORACLE_HOME/rdbms/admin/catupgrd.sql

@/home/oracle/shell/log/postupgrade_fixups.sql
  1. 确认升级后数据库组件正常且无相关报错之后,drop 还原点;
select comp_name,VERSION,STATUS from dba_registry;

drop restore point restore_point_11g;
  1. 数据库升级到 12.2 之后,需要将 DB 从 NO-CDB 模式转换成 CDB 模式,将数据库作为 PDB 插入到 12.2 RAC 集群中;

如下是转 CDB 模式是相关简单步骤:

1)启动实例到只读模式

startup mount exclusive
;

alter database open read only;

2)创建 xml 元数据文件

EXEC DBMS_PDB.DESCRIBE( pdb_descr_file => '/tmp/XXXDB.xml');

3)检查兼容性

DECLARE

compatible CONSTANT VARCHAR2(3) := 

CASE 

DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/tmp/XXDB.xml',pdb_name => 'xxdb')

WHEN TRUE THEN 'YES'

ELSE 'NO'

END;

BEGIN

DBMS_OUTPUT.PUT_LINE(compatible);

END;

/

4)进行 nocopy 操作

CREATE PLUGGABLE DATABASE pdbcdrs USING '/tmp/XXDB.xml' NOCOPY;

5) 启动 PDB 进行并进行转换

alter session set container= pdbcdrs;


alter pluggable database pdbcdrs open;

shutdown immediate
;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
  1. 创建 Redo、Undo 以及修改相应参数,将数据库转成 RAC 实例。

问题讨论

在整个升级过程中,我们遇到了几个小问题,分别如下:

  1. DataGuard 的文件 convert 参数没有加入 tempfile,导致 DG 切换之后,主库 open 有问题,需要先 drop tempfile 之后才行;
  1. 在升级到 12.2 的过程中,遇到 ORA-01722 错误,如下所示:

    13


根据 Oracle Mos 文档 Upgrade to 12.2 Fails with Error:”ORA-01722: Invalid number : NONUPGRADED_TABLEDATA” (文档 ID 2279497.1) 的描述,可以通过如下的方式来解决:
set serveroutput on

@?/rdbms/admin/catuptabdata.sql

@?/rdbms/admin/utluptabdata.sql

execute dbms_preup.run_fixup_and_report('INVALID_SYS_TABLEDATA');

execute dbms_preup.run_fixup_and_report('INVALID_USR_TABLEDATA');

set serveroutput off
  1. 将数据库作为 PDB 插入到 CDB 之后,打开 PDB 时提示为受限模式。

    14


该问题经查是由于我们在执行的过程中漏掉了一个步骤(exec dbms_pdb.sync_pdb();),导致 PDB 的信息与 CDB 的信息不一致,本质上组件信息不一致。

实际上从 Oracle 官方的解释来看,只要 PDB 的组件属于 CDB 的子集就行,我们当时查询结果却是显示正常的,但是 PDB 的组件状态显示异常,因此让 Oracle 认为 PDB 的组件与 CDB 有巨大差异,将 PDB 置于受限模式“OPTION WARNING Database option mismatch: PDB installed version NULL” in PDB_PLUG_IN_VIOLATIONS(文档 ID 2020172.1)。

该文档中有详细的描述,认为这是 12.2 的一个加强。

Some warnings in PDB_PLUG_IN_VIOLATIONS prevent you from actually opening the PDB in READ WRITE mode; this is not one of them.  You can ignore these messages.   It is okay for a PDB to have a subset (fewer) options installed than the CDB into which it is plugged.  

(The reverse is NOT true, however -- the CDB must always have the same or more options as its PDBs).  

 

Unpublished Bug 16192980 : NO SIMPLE WAY TO CLEAN ROWS FROM PDB_PLUG_IN_VIOLATIONS AFTER DBMS_PDB CALL has been filed to request a way to clear out no-impact warnings from PDB_PLUG_IN_VIOLATIONS.  This enhancement is implemented in versions > 12.2.0.1.

我们尝试过将组件 Reinstall 然后再 Install 是可以的,但是组件较多,大约8个组件,尤其是 Java 或 xdb 相关组件比较麻烦,因此我们将 PDB 删除然后重新创建了 PDB 进行加载,最终解决了该问题。

原文发布时间为:2018-02-27
本文作者:李真旭
本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

相关文章
|
18天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
65 11
|
1月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
1月前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
24天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
24 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2
|
18天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
130 15
|
12天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
19天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。