一、DST 是什么?
DST(Daylight Saving Time)在 Oracle 中可以简单理解为数据库使用的全球时区规则版本。
Oracle 通过时区文件维护这些规则,例如:
timezlrg_32.dat → DST 版本 32 timezlrg_43.dat → DST 版本 43在进行 Data Pump 数据迁移时,如果源库 DST 版本高于目标库,例如:
源库:43 目标库:32导入报错:
ORA-39405因此,新数据库部署完成后,在正式impdp前,应先检查源库和目标库 DST 版本。版本一致无需处理;目标版本较低时再进行升级。
二、检查源库和目标库 DST 版本
源库和目标库分别执行:
SELECT filename, version FROM v$timezone_file;例如:
源库: timezlrg_43.dat 43 目标库: timezlrg_32.dat 32这种情况目标库需要升级。
如果源、目标版本已经一致,无需执行后面的 DST 升级操作。
三、确认目标 Oracle Home 存在对应时区文件
例如源库是 43:
ls -l $ORACLE_HOME/oracore/zoneinfo/timezlrg_43.dat文件存在即可继续。
也可以查看 Oracle Home 已安装的时区文件:
ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat注意:Oracle RU 更新后,Oracle Home 中可能已经包含新版时区文件,但已有数据库实际使用的 DST 版本不一定同步升级,所以最终以
v$timezone_file查询结果为准。
四、升级 CDB$ROOT
登录数据库:
sqlplus / as sysdba确认当前容器:
SHOW CON_NAME;如果不是CDB$ROOT:
ALTER SESSION SET CONTAINER=CDB$ROOT;关闭所有业务 PDB:
ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;1. 执行官方检查脚本
SPOOL /tmp/utltz_upg_check.log @?/rdbms/admin/utltz_upg_check.sql SPOOL OFF确认检查没有异常后,再进行正式升级。
2. 执行官方升级脚本
SPOOL /tmp/utltz_upg_apply.log @?/rdbms/admin/utltz_upg_apply.sql SPOOL OFF升级过程中脚本可能自动重启数据库,不要人为中断或手工重启数据库。
成功后会看到类似:
INFO: The RDBMS DST update is successfully finished.完成后退出:
EXIT;五、确认 CDB$ROOT 升级结果
重新登录:
sqlplus / as sysdba执行:
SHOW CON_NAME; SELECT filename, version FROM v$timezone_file;例如:
timezlrg_43.dat 43说明 CDB$ROOT 已升级成功。
六、检查并升级业务 PDB
打开业务 PDB,例如:
ALTER PLUGGABLE DATABASE YJXTPDB OPEN; ALTER SESSION SET CONTAINER=YJXTPDB; SHOW CON_NAME; SELECT filename, version FROM v$timezone_file;如果已经是:
timezlrg_43.dat 43不需要继续升级。
如果仍然是旧版本,例如:
timezlrg_32.dat 32则在当前业务 PDB 中继续执行官方脚本。
先检查:
SPOOL /tmp/YJXTPDB_utltz_check.log @?/rdbms/admin/utltz_upg_check.sql SPOOL OFF确认没有异常后执行升级:
SPOOL /tmp/YJXTPDB_utltz_apply.log @?/rdbms/admin/utltz_upg_apply.sql SPOOL OFF七、最终检查
升级完成后重新连接数据库。
检查 CDB$ROOT:
ALTER SESSION SET CONTAINER=CDB$ROOT; SELECT filename, version FROM v$timezone_file;检查业务 PDB:
ALTER SESSION SET CONTAINER=YJXTPDB; SELECT filename, version FROM v$timezone_file;最终确认:
源库 = 43 CDB$ROOT = 43 业务 PDB = 43确认无误后,即可开始业务表结构和数据迁移。
八、日后快速操作流程
以后新建 Oracle 19c 数据库,按照下面流程操作即可:
安装 Oracle 19c ↓ 安装 RU 补丁 ↓ 创建 CDB / PDB ↓ 检查源库 DST ↓ 检查目标库 DST ↓ 版本一致? ↓是 ↓否 无需处理 检查 Oracle Home ↓ utltz_upg_check.sql ↓ utltz_upg_apply.sql ↓ 检查 CDB$ROOT ↓ 检查业务 PDB ↓ PDB 版本低则继续升级 ↓ 最终确认版本一致 ↓ 执行 impdp最常用的 4 个命令
① 查询数据库当前 DST:
SELECT filename, version FROM v$timezone_file;② 查看 Oracle Home 时区文件:
ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat③ Oracle 官方升级前检查:
@?/rdbms/admin/utltz_upg_check.sql④ Oracle 官方执行升级:
@?/rdbms/admin/utltz_upg_apply.sql操作原则:先查版本,不一致才升级;先升级 CDB$ROOT,再检查业务 PDB;最终确认 DST 版本满足迁移要求后,再进行 Data Pump 导入。
其中43和YJXTPDB都只是示例。以后操作时,分别替换为实际目标 DST 版本和实际业务 PDB 名称即可。