近期在某银行生产环境做的一次PDB迁移,使用的是PDB refresh方式,记录一下流程及遇到的坑。
推荐视频:经典知识库:Oracle PDB Refresh实战分享 - 李海清
上述视频详细介绍了什么是PDB Refresh、使用场景、迁移流程,本文流程也是依照该视频为主要参考,推荐学习。
源库与目标库情况:
源库 | 目标库 | |
---|---|---|
系统版本 | REHL 7.6 | RHEL 7.6 |
数据库版本 | 19.11 | 19.11 |
数据量 | 7 T | |
停机时间 | 2 hour |
根据以上的情况,认为DG与PDB refresh方式是比较好的选择。
最后还是定的使用PDB refresh,主要是因为没在生产上做过,积累下经验,另外也简单:)
简单来说:创建目标端到源端的DBlink,目标端create pluggable database,指向源端PDB,这样就将源端PDB copy过来,copy过程源端无需停机,再设置refresh刷新,可以将源库的增量也应用到目标端。切换时源端read only,目标端read write,完事。
注意:
sqlplus -v
archive log list
注意: 建议源库及目标库设置归档路径使用闪回区,否则刷新时可能会遇到如下BUG,这是我踩到的坑之一!
Bug 33331329 - Intermittent ORA-65345 in Clone PDB When log_archive_dest_n=‘location=use_db_recovery_file_dest’ is Not Set (Doc ID 33331329.8)
Bug 32631551 - Refresh pluggable database fails with ORA-283: recovery session canceled due to errors ORA-65345: cannot refresh pluggable database (Doc ID 32631551.8)
select userenv('language') from dual;
set lines 120
col platform_name for a20
select db.name,db.platform_id,db.platform_name,os.endian_format from v$database db,v$transportable_platform os where db.platform_id=os.platform_id;
col property_name for a30
col property_value for a20
select property_name,property_value from database_properties where property_name='LOCAL_UNDO_ENABLED';
--切换到PDB下查看undo表空间是否存在
select name from v$datafile where name like '%undo%';
参考:Undo Modes in 12.2 Multitenant Databases - Local and Shared Modes (Doc ID 2169828.1)
select comp_id from dba_registry where status!='REMOVED';
show parameter db_create_file_dest
11.另外参考视频中还提到:源库pdb中可能存在目标库cdb中没有的c##用户。需要进行删除操作。 生产环境不太适合删除,我是在目标库创建相同账户处理。
create user C##hf_refresh identified by Password123 container=all;
grant create session,sysoper,create pluggable database to c##hf_refresh container=all;
create public database link hf_refresh_dblink connect to c##hf_refresh identified by Password123 using '10.9.xxx.xx:1521/RAP010';
--由于不确定多久能create完成,所以使用脚本后台执行,这里我们设置create完成后每10分钟自动刷新
#!/bin/bash
export ORACLE_SID=xxxx
echo $ORACLE_SID;
sqlplus -S / as sysdba<<eof
show pdbs;
create pluggable database xxx from xxx@hf_refresh_dblink refresh mode every 10 minutes;
show pdbs;
eof
关于刷新方式:
--设置手工刷新模式
alter pluggable database xxx refresh mode manual;
--手工刷新,哪怕设置了自动刷新,也可以手动刷
alter pluggable database xxx refresh;
--每小时刷一次
alter pluggable database xxx refresh mode every 1 hours;
此步骤完成,可以正常刷新的话,后面没发现有什么坑。
--目标端操作
alter pluggable database xxx open read only instances=all;
alter session set container=xxx;
--检查测试数据传输后恢复到可刷新状态
alter pluggable database xxx close immediate;
alter pluggable database xxx refresh mode every 10 minutes;
alter pluggable database xxx refresh;
alter pluggable database xxx close immediate instances=all;
alter pluggable database xxx open read only instances=all;
alter pluggable database xxx refresh;
--设置刷新模式为none(不可逆)
alter pluggable database xxx refresh mode none;
alter pluggable database xxx open instances=all;
$ORACLE_HOME/OPatch/datapatch -pdbs xxx
--oracle run
srvctl add service -d 实例名 -pdb pdb名 -s 服务名 -r 节点1sid,节点2sid -P BASIC -y automatic -z 10 -w 10 -e select -m basic
完成此步骤,迁移结束。
如果应用测试有问题,则将源库关闭重新open,应用使用原先连接串即可。
实际切换用时20分钟,源库关闭执行检查点及目标库执行datapath稍微耗时多一点。
首先读redo,没有的话读归档日志,已测试验证。 另外rac环境切换归档,需要使用alter system archive log current;如果用了alter system switch logfile会导致refresh失败。
条件合适的情况下,使用PDB Refresh方式迁移PDB简单快捷,但是目前感觉坑多一点。