oracle数据库恢复三板斧,最大限度减少因为ORACLE不能open导致的数据损失
第一板:HIDE PARAMETER AND EVENT
第二板:BBED
第三板:DUL
当我们使用第一和第二板斧头无法解决问题之时,我们就需要考虑使用ORACLE数据库恢复终极工具DUL,这里对于dul的相关测试进行总结,便于查询
dul处理分区表
dul恢复drop表测试
dul抽取异常asm文件
使用dul恢复asm中数据
dul恢复truncate表测试
dul 10支持oracle 11g r2
使用 dul 挖数据文件初试
DUL挖ORACLE 8.0数据库
dul实现对数据文件内容更新
dul 10 export_mode=true功能增强
dul实现exp dump文件转换sqlldr格式
dul支持ORACLE 12C CDB数据库恢复
dul实现expdp dump文件转换sqlldr格式
使用DUL挖数据文件恢复非数据外对象方法
为推进国内DUL的发展,欢迎在DUL使用过程中的问题探讨
Monthly Archives: 十二月 2013
ORACLE 12C RAC hub AND leaf 相互转换
感谢Lunar的指导,完成ORACLE 12C RAC hub和leaf相互转换,参考官方文档Oracle Flex Clusters部分
当前数据库状态
--集群状态 [root@rac1 ~]# crsctl status res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.DATA.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.LISTENER.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.SYSDB_NEW.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.SYSDG.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.net1.network ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.proxy_advm ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac1 STABLE ora.LISTENER_SCAN2.lsnr 1 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN3.lsnr 1 ONLINE ONLINE rac2 STABLE ora.MGMTLSNR 1 ONLINE ONLINE rac2 169.254.177.226 10.1 .1.104,STABLE ora.asm 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE 3 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac2 STABLE ora.gns 1 ONLINE ONLINE rac2 STABLE ora.gns.vip 1 ONLINE ONLINE rac2 STABLE ora.mgmtdb 1 ONLINE ONLINE rac2 Open,STABLE ora.oc4j 1 ONLINE ONLINE rac2 STABLE ora.ora12c.db 1 ONLINE ONLINE rac1 Open,STABLE 2 ONLINE ONLINE rac2 Open,STABLE ora.rac1.vip 1 ONLINE ONLINE rac1 STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan1.vip 1 ONLINE ONLINE rac1 STABLE ora.scan2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan3.vip 1 ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- --rac运行在flex模式 [root@rac1 ~]# crsctl get cluster mode status Cluster is running in "flex" mode --asm运行在flex模式 [grid@rac1 ~]$ asmcmd ASMCMD> showclustermode ASM cluster : Flex mode enabled --节点角色 [root@rac1 ~]# crsctl get node role config Node 'rac1' configured role is 'hub' [root@rac2 ~]# crsctl get node role config Node 'rac2' configured role is 'hub'
转换hub to leaf
--转换hub为leaf [root@rac1 ~]# crsctl set node role leaf CRS-4408: Node 'rac1' configured role successfully changed; restart Oracle High Availability Services for new role to take effect. --关闭集群 [root@rac1 ~]# crsctl stop crs CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'rac1' CRS-2673: Attempting to stop 'ora.crsd' on 'rac1' CRS-2790: Starting shutdown of Cluster Ready Services-managed resources on 'rac1' CRS-2673: Attempting to stop 'ora.LISTENER_SCAN1.lsnr' on 'rac1' CRS-2673: Attempting to stop 'ora.LISTENER.lsnr' on 'rac1' CRS-2673: Attempting to stop 'ora.SYSDB_NEW.dg' on 'rac1' CRS-2673: Attempting to stop 'ora.DATA.dg' on 'rac1' CRS-2673: Attempting to stop 'ora.SYSDG.dg' on 'rac1' CRS-2673: Attempting to stop 'ora.ora12c.db' on 'rac1' CRS-2673: Attempting to stop 'ora.proxy_advm' on 'rac1' CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.rac1.vip' on 'rac1' CRS-2677: Stop of 'ora.LISTENER_SCAN1.lsnr' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.scan1.vip' on 'rac1' CRS-2677: Stop of 'ora.rac1.vip' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.rac1.vip' on 'rac2' CRS-2677: Stop of 'ora.ora12c.db' on 'rac1' succeeded CRS-2677: Stop of 'ora.scan1.vip' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.scan1.vip' on 'rac2' CRS-2676: Start of 'ora.rac1.vip' on 'rac2' succeeded CRS-2677: Stop of 'ora.SYSDB_NEW.dg' on 'rac1' succeeded CRS-2676: Start of 'ora.scan1.vip' on 'rac2' succeeded CRS-2672: Attempting to start 'ora.LISTENER_SCAN1.lsnr' on 'rac2' CRS-2677: Stop of 'ora.DATA.dg' on 'rac1' succeeded CRS-2677: Stop of 'ora.SYSDG.dg' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.asm' on 'rac1' CRS-2677: Stop of 'ora.asm' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.ASMNET1LSNR_ASM.lsnr' on 'rac1' CRS-2676: Start of 'ora.LISTENER_SCAN1.lsnr' on 'rac2' succeeded CRS-2677: Stop of 'ora.proxy_advm' on 'rac1' succeeded CRS-2677: Stop of 'ora.ASMNET1LSNR_ASM.lsnr' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.ons' on 'rac1' CRS-2677: Stop of 'ora.ons' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.net1.network' on 'rac1' CRS-2677: Stop of 'ora.net1.network' on 'rac1' succeeded CRS-2792: Shutdown of Cluster Ready Services-managed resources on 'rac1' has completed CRS-2677: Stop of 'ora.crsd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.storage' on 'rac1' CRS-2673: Attempting to stop 'ora.crf' on 'rac1' CRS-2673: Attempting to stop 'ora.mdnsd' on 'rac1' CRS-2673: Attempting to stop 'ora.gpnpd' on 'rac1' CRS-2673: Attempting to stop 'ora.drivers.acfs' on 'rac1' CRS-2677: Stop of 'ora.storage' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.asm' on 'rac1' CRS-2677: Stop of 'ora.drivers.acfs' on 'rac1' succeeded CRS-2677: Stop of 'ora.crf' on 'rac1' succeeded CRS-2677: Stop of 'ora.mdnsd' on 'rac1' succeeded CRS-2677: Stop of 'ora.gpnpd' on 'rac1' succeeded CRS-2677: Stop of 'ora.asm' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.cluster_interconnect.haip' on 'rac1' CRS-2677: Stop of 'ora.cluster_interconnect.haip' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.ctssd' on 'rac1' CRS-2673: Attempting to stop 'ora.evmd' on 'rac1' CRS-2677: Stop of 'ora.evmd' on 'rac1' succeeded CRS-2677: Stop of 'ora.ctssd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.cssd' on 'rac1' CRS-2677: Stop of 'ora.cssd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.gipcd' on 'rac1' CRS-2677: Stop of 'ora.gipcd' on 'rac1' succeeded CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'rac1' has completed CRS-4133: Oracle High Availability Services has been stopped. --启动集群 [root@rac1 ~]# crsctl start crs -wait CRS-4123: Starting Oracle High Availability Services-managed resources CRS-2672: Attempting to start 'ora.mdnsd' on 'rac1' CRS-2672: Attempting to start 'ora.evmd' on 'rac1' CRS-2676: Start of 'ora.evmd' on 'rac1' succeeded CRS-2676: Start of 'ora.mdnsd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.gpnpd' on 'rac1' CRS-2676: Start of 'ora.gpnpd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.gipcd' on 'rac1' CRS-2676: Start of 'ora.gipcd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cssdmonitor' on 'rac1' CRS-2676: Start of 'ora.cssdmonitor' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cssd' on 'rac1' CRS-2672: Attempting to start 'ora.diskmon' on 'rac1' CRS-2676: Start of 'ora.diskmon' on 'rac1' succeeded CRS-2789: Cannot stop resource 'ora.diskmon' as it is not running on server 'rac1' CRS-2676: Start of 'ora.cssd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cluster_interconnect.haip' on 'rac1' CRS-2672: Attempting to start 'ora.ctssd' on 'rac1' CRS-2676: Start of 'ora.cluster_interconnect.haip' on 'rac1' succeeded CRS-2676: Start of 'ora.ctssd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.storage' on 'rac1' CRS-2676: Start of 'ora.storage' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.crf' on 'rac1' CRS-2676: Start of 'ora.crf' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.crsd' on 'rac1' CRS-2676: Start of 'ora.crsd' on 'rac1' succeeded CRS-6017: Processing resource auto-start for servers: rac1 CRS-6016: Resource auto-start has completed for server rac1 CRS-6024: Completed start of Oracle Cluster Ready Services-managed resources CRS-4123: Oracle High Availability Services has been started. --hub转换为leaf后状态 [root@rac1 ~]# crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr ONLINE ONLINE rac2 STABLE ora.DATA.dg ONLINE ONLINE rac2 STABLE ora.LISTENER.lsnr ONLINE ONLINE rac2 STABLE ora.SYSDB_NEW.dg ONLINE ONLINE rac2 STABLE ora.SYSDG.dg ONLINE ONLINE rac2 STABLE ora.net1.network ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac2 STABLE ora.proxy_advm ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN2.lsnr 1 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN3.lsnr 1 ONLINE ONLINE rac2 STABLE ora.MGMTLSNR 1 ONLINE ONLINE rac2 169.254.177.226 10.1 .1.104,STABLE ora.asm 1 ONLINE OFFLINE STABLE 2 ONLINE ONLINE rac2 STABLE 3 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac2 STABLE ora.gns 1 ONLINE ONLINE rac2 STABLE ora.gns.vip 1 ONLINE ONLINE rac2 STABLE ora.mgmtdb 1 ONLINE ONLINE rac2 Open,STABLE ora.oc4j 1 ONLINE ONLINE rac2 STABLE ora.ora12c.db 1 ONLINE OFFLINE Instance Shutdown,ST ABLE 2 ONLINE ONLINE rac2 Open,STABLE ora.rac1.vip 1 ONLINE INTERMEDIATE rac2 FAILED OVER,STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan1.vip 1 ONLINE ONLINE rac2 STABLE ora.scan2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan3.vip 1 ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- --集群角色 [root@rac1 ~]# crsctl get node role config Node 'rac1' configured role is 'leaf' [root@rac2 ~]# crsctl get node role config Node 'rac2' configured role is 'hub'
leaf转换为hub
--leaf转换为hub [root@rac1 ~]# crsctl set node role hub CRS-4408: Node 'rac1' configured role successfully changed; restart Oracle High Availability Services for new role to take effect. --关闭集群 [root@rac1 ~]# crsctl stop crs CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'rac1' CRS-2673: Attempting to stop 'ora.crsd' on 'rac1' CRS-2677: Stop of 'ora.crsd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.storage' on 'rac1' CRS-2673: Attempting to stop 'ora.mdnsd' on 'rac1' CRS-2673: Attempting to stop 'ora.gpnpd' on 'rac1' CRS-2673: Attempting to stop 'ora.drivers.acfs' on 'rac1' CRS-2677: Stop of 'ora.storage' on 'rac1' succeeded CRS-2677: Stop of 'ora.drivers.acfs' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.crf' on 'rac1' CRS-2673: Attempting to stop 'ora.ctssd' on 'rac1' CRS-2673: Attempting to stop 'ora.evmd' on 'rac1' CRS-2673: Attempting to stop 'ora.cluster_interconnect.haip' on 'rac1' CRS-2677: Stop of 'ora.cluster_interconnect.haip' on 'rac1' succeeded CRS-2677: Stop of 'ora.gpnpd' on 'rac1' succeeded CRS-2677: Stop of 'ora.crf' on 'rac1' succeeded CRS-2677: Stop of 'ora.evmd' on 'rac1' succeeded CRS-2677: Stop of 'ora.mdnsd' on 'rac1' succeeded CRS-2677: Stop of 'ora.ctssd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.cssd' on 'rac1' CRS-2677: Stop of 'ora.cssd' on 'rac1' succeeded CRS-2673: Attempting to stop 'ora.gipcd' on 'rac1' CRS-2677: Stop of 'ora.gipcd' on 'rac1' succeeded CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'rac1' has completed CRS-4133: Oracle High Availability Services has been stopped. --启动集群 [root@rac1 ~]# crsctl start crs -wait CRS-4123: Starting Oracle High Availability Services-managed resources CRS-2672: Attempting to start 'ora.mdnsd' on 'rac1' CRS-2672: Attempting to start 'ora.evmd' on 'rac1' CRS-2676: Start of 'ora.evmd' on 'rac1' succeeded CRS-2676: Start of 'ora.mdnsd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.gpnpd' on 'rac1' CRS-2676: Start of 'ora.gpnpd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.gipcd' on 'rac1' CRS-2676: Start of 'ora.gipcd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cssdmonitor' on 'rac1' CRS-2676: Start of 'ora.cssdmonitor' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cssd' on 'rac1' CRS-2672: Attempting to start 'ora.diskmon' on 'rac1' CRS-2676: Start of 'ora.diskmon' on 'rac1' succeeded CRS-2789: Cannot stop resource 'ora.diskmon' as it is not running on server 'rac1' CRS-2676: Start of 'ora.cssd' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.cluster_interconnect.haip' on 'rac1' CRS-2672: Attempting to start 'ora.ctssd' on 'rac1' CRS-2676: Start of 'ora.ctssd' on 'rac1' succeeded CRS-2676: Start of 'ora.cluster_interconnect.haip' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.asm' on 'rac1' CRS-2676: Start of 'ora.asm' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.storage' on 'rac1' CRS-2676: Start of 'ora.storage' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.crf' on 'rac1' CRS-2676: Start of 'ora.crf' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.crsd' on 'rac1' CRS-2676: Start of 'ora.crsd' on 'rac1' succeeded CRS-6017: Processing resource auto-start for servers: rac1 CRS-2672: Attempting to start 'ora.ons' on 'rac1' CRS-2673: Attempting to stop 'ora.rac1.vip' on 'rac2' CRS-2672: Attempting to start 'ora.ASMNET1LSNR_ASM.lsnr' on 'rac1' CRS-2673: Attempting to stop 'ora.LISTENER_SCAN1.lsnr' on 'rac2' CRS-2677: Stop of 'ora.LISTENER_SCAN1.lsnr' on 'rac2' succeeded CRS-2673: Attempting to stop 'ora.scan1.vip' on 'rac2' CRS-2677: Stop of 'ora.rac1.vip' on 'rac2' succeeded CRS-2672: Attempting to start 'ora.rac1.vip' on 'rac1' CRS-2677: Stop of 'ora.scan1.vip' on 'rac2' succeeded CRS-2672: Attempting to start 'ora.scan1.vip' on 'rac1' CRS-2676: Start of 'ora.rac1.vip' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.LISTENER.lsnr' on 'rac1' CRS-2676: Start of 'ora.scan1.vip' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.LISTENER_SCAN1.lsnr' on 'rac1' CRS-2676: Start of 'ora.ASMNET1LSNR_ASM.lsnr' on 'rac1' succeeded CRS-2676: Start of 'ora.ons' on 'rac1' succeeded CRS-2676: Start of 'ora.LISTENER.lsnr' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.asm' on 'rac1' CRS-2676: Start of 'ora.LISTENER_SCAN1.lsnr' on 'rac1' succeeded CRS-2676: Start of 'ora.asm' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.proxy_advm' on 'rac1' CRS-2676: Start of 'ora.proxy_advm' on 'rac1' succeeded CRS-2672: Attempting to start 'ora.ora12c.db' on 'rac1' CRS-2676: Start of 'ora.ora12c.db' on 'rac1' succeeded CRS-6016: Resource auto-start has completed for server rac1 CRS-6024: Completed start of Oracle Cluster Ready Services-managed resources CRS-4123: Oracle High Availability Services has been started. --集群状态 [root@rac1 ~]# crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.DATA.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.LISTENER.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.SYSDB_NEW.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.SYSDG.dg ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.net1.network ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.proxy_advm ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac1 STABLE ora.LISTENER_SCAN2.lsnr 1 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN3.lsnr 1 ONLINE ONLINE rac2 STABLE ora.MGMTLSNR 1 ONLINE ONLINE rac2 169.254.177.226 10.1 .1.104,STABLE ora.asm 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE 3 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac2 STABLE ora.gns 1 ONLINE ONLINE rac2 STABLE ora.gns.vip 1 ONLINE ONLINE rac2 STABLE ora.mgmtdb 1 ONLINE ONLINE rac2 Open,STABLE ora.oc4j 1 ONLINE ONLINE rac2 STABLE ora.ora12c.db 1 ONLINE ONLINE rac1 Open,STABLE 2 ONLINE ONLINE rac2 Open,STABLE ora.rac1.vip 1 ONLINE ONLINE rac1 STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan1.vip 1 ONLINE ONLINE rac1 STABLE ora.scan2.vip 1 ONLINE ONLINE rac2 STABLE ora.scan3.vip 1 ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- --集群角色 [root@rac1 ~]# crsctl get node role config Node 'rac1' configured role is 'hub' [root@rac2 ~]# crsctl get node role config Node 'rac2' configured role is 'hub'
这里实现了ORACLE 12C RAC的leaf和hub 角色相互转换,在转换的过程中需要转移确认集群和ASM均为flex mode,如果参考相关文档完成转换
OLR相关维护
官方关于OLR描述
OLR is a registry similar to OCR located on each node in a cluster, but contains information specific to each node. It contains manageability information about Oracle Clusterware, including dependencies between various services. Oracle High Availability Services uses this information. OLR is located on local storage on each node in a cluster. Its default location is in the path Grid_home/cdata/host_name.olr, where Grid_home is the Oracle Grid Infrastructure home, and host_name is the host name of the node.
OLR是类似OCR的东西,存储在集群的每个节点本地
查看OLR位置
[root@rac2 cdata]# cd /etc/oracle [root@rac2 oracle]# ls -l total 2868 drwxrwx--- 2 root oinstall 4096 Nov 24 20:00 lastgasp drwxrwxrwt 2 root oinstall 4096 Dec 21 20:51 maps -rw-r--r-- 1 root oinstall 96 Nov 25 18:38 ocr.loc -rw-r--r-- 1 root root 0 Nov 24 19:58 ocr.loc.orig -rw-r--r-- 1 root oinstall 80 Nov 24 19:58 olr.loc -rw-r--r-- 1 root root 0 Nov 24 19:58 olr.loc.orig drwxrwxr-x 5 root oinstall 4096 Nov 24 19:57 oprocd drwxr-xr-x 3 root oinstall 4096 Nov 24 19:57 scls_scr -rws--x--- 1 root oinstall 2904377 Nov 24 19:57 setasmgid [root@rac2 oracle]# more olr.loc olrconfig_loc=/u01/app/12.1.0/grid/cdata/rac2.olr crs_home=/u01/app/12.1.0/grid --在部分平台olr.loc文件可能在/var/opt/oracle/目录下 [root@rac2 oracle]# ocrcheck -config -local Oracle Local Registry configuration is : Device/File Name : /u01/app/12.1.0/grid/cdata/rac2.olr [root@rac2 oracle]# ocrcheck -local Status of Oracle Local Registry is as follows : Version : 4 Total space (kbytes) : 409568 Used space (kbytes) : 996 Available space (kbytes) : 408572 ID : 816087519 Device/File Name : /u01/app/12.1.0/grid/cdata/rac2.olr Device/File integrity check succeeded Local registry integrity check succeeded Logical corruption check succeeded [root@rac2 oracle]# ls -l /u01/app/12.1.0/grid/cdata/rac2.olr -rw------- 1 root oinstall 503484416 Dec 22 12:09 /u01/app/12.1.0/grid/cdata/rac2.olr
查看OLR备份
[root@rac2 oracle]# ocrconfig -local -showbackup rac2 2013/11/24 20:02:38 /u01/app/12.1.0/grid/cdata/rac2/backup_20131124_200238.olr
备份OLR
[root@rac2 oracle]# ocrconfig -local -manualbackup rac2 2013/12/22 12:09:33 /u01/app/12.1.0/grid/cdata/rac2/backup_20131222_120933.olr rac2 2013/11/24 20:02:38 /u01/app/12.1.0/grid/cdata/rac2/backup_20131124_200238.olr [root@rac2 oracle]# ls -l /u01/app/12.1.0/grid/cdata/rac2/ total 1908 -rw-r--r-- 1 root root 860160 Nov 24 20:02 backup_20131124_200238.olr -rw-r--r-- 1 root root 1085440 Dec 22 12:09 backup_20131222_120933.olr
OLR异常恢复
--破坏OLR [root@rac2 oracle]# ls -l /u01/app/12.1.0/grid/cdata/rac2.olr -rw------- 1 root oinstall 503484416 Dec 22 12:09 /u01/app/12.1.0/grid/cdata/rac2.olr [root@rac2 oracle]# /u01/app/12.1.0/grid/cdata/rac2.olr /u01/app/12.1.0/grid/cdata/rac2.olr_bak --关闭crs [root@rac2 oracle]# crsctl stop crs --启动crs报错 [root@rac2 oracle]# crsctl start crs PROCL-26: Error while accessing the physical storage Operating System error [No such file or directory] [2] CRS-4000: Command Start failed, or completed with errors. --跟踪crs启动 [root@rac2 oracle]# strace crsctl start crs …… uname({sys="Linux", node="rac2", ...}) = 0 open("/etc/oracle/olr.loc", O_RDONLY) = 14 fstat(14, {st_mode=S_IFREG|0644, st_size=80, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd8ac628000 read(14, "olrconfig_loc=/u01/app/12.1.0/gr"..., 4096) = 80 read(14, "", 4096) = 0 close(14) = 0 munmap(0x7fd8ac628000, 4096) = 0 stat("/u01/app/12.1.0/grid/cdata/rac2.olr", 0x7fffa215a580) = -1 ENOENT (No such file or directory) --这里可以看到先是读取/etc/oracle/olr.loc,然后获取/u01/app/12.1.0/grid/cdata/rac2.olr失败 …… --确定ohasd.bin关闭 [root@rac2 cdata]# ps -ef|grep ohasd root 15715 31578 0 14:34 pts/3 00:00:00 grep ohasd --还原OLR [root@rac2 oracle]# ocrconfig -local -restore /u01/app/12.1.0/grid/cdata/rac2/backup_20131124_200238.olr PROTL-35: The configured OLR location is not accessible [root@rac2 oracle]# cd /u01/app/12.1.0/grid/cdata/ [root@rac2 cdata]# ls localhost rac12c-cluster rac2 rac2.olr_bak [root@rac2 cdata]# touch rac2.olr [root@rac2 cdata]# chmod 600 rac2.olr [root@rac2 cdata]# ocrconfig -local -restore /u01/app/12.1.0/grid/cdata/rac2/backup_20131124_200238.olr --确定还原成功 [root@rac2 cdata]# ls -l total 84200 drwxr-xr-x 2 grid oinstall 4096 Nov 24 19:37 localhost drwxrwxr-x 2 grid oinstall 4096 Dec 22 09:07 rac12c-cluster drwxr-xr-x 2 grid oinstall 4096 Dec 22 12:09 rac2 -rw------- 1 root root 503484416 Dec 22 14:29 rac2.olr -rw------- 1 root oinstall 503484416 Dec 22 12:43 rac2.olr_bak --启动crs [root@rac2 cdata]# crsctl start crs CRS-4123: Oracle High Availability Services has been started.
其他OLR命令
To export OLR to a file: # ocrconfig –local –export file_name To import a specified file to OLR: # ocrconfig –local –import file_name To view the contents of the OLR file: ocrdump -local file_name To view the contents of the OLR backup file: ocrdump -local -backupfile olr_backup_file_name To change the OLR backup location: ocrconfig -local -backuploc new_olr_backup_path
当OLR异常时,RAC节点不能正常启动,而且OLR不像OCR会定时自动备份,建议人工定时备份OLR
通过bbed替换bootstarp$表
在11G和12C中,我们可以通过DBMS_DDL_INTERNAL.SWAP_BOOTSTRAP过程来替换bootstarp$表(见:替换bootstarp$表),但是对于10G或者其他版本,oracle没有提供相关程序来完成使用其他表替换bootstarp$,通过分析,使用bbed修改root rdba也可以完成DBMS_DDL_INTERNAL.SWAP_BOOTSTRAP的任务
SQL> SELECT * FROM V$VERSION; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod PL/SQL Release 10.2.0.3.0 - Production CORE 10.2.0.3.0 Production TNS for 32-bit Windows: Version 10.2.0.3.0 - Production NLSRTL Version 10.2.0.3.0 - Production SQL> DESC DBMS_DDL_INTERNAL PROCEDURE CHECK_TRIGGER_FIRING_PROPERTY 参数名称 类型 输入/输出默认值? ------------------------------ ----------------------- ------ -------- TRIG_OWNER VARCHAR2 IN TRIG_NAME VARCHAR2 IN CANON_OWNER VARCHAR2 OUT CANON_ONAME VARCHAR2 OUT P_PROPERTY NUMBER IN/OUT UNSUPPORTED_TRIG BOOLEAN OUT FUNCTION HAS_ALTER_ANY_TRIGGER_PRIV RETURNS BOOLEAN 参数名称 类型 输入/输出默认值? ------------------------------ ----------------------- ------ -------- P_USER VARCHAR2 IN P_TRIG_PROPERTY NUMBER IN FUNCTION HAS_EXP_IMP_PRIV RETURNS BOOLEAN 参数名称 类型 输入/输出默认值? ------------------------------ ----------------------- ------ -------- P_UID NUMBER IN P_PRIVS_TO_CHECK VARCHAR2 IN FUNCTION IS_DDL_TRIGGER RETURNS BOOLEAN 参数名称 类型 输入/输出默认值? ------------------------------ ----------------------- ------ -------- SYS_EVTS NUMBER IN
跟踪数据库启动过程
SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 209715200 bytes Fixed Size 1289724 bytes Variable Size 100663812 bytes Database Buffers 100663296 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 SQL> oradebug setmypid 已处理的语句 SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 已处理的语句 SQL> alter session set db_file_multiblocK_read_count=1; 会话已更改。 SQL> oradebug TRACEFILE_NAME e:\oracle\product\10.2.0\admin\ora10g\udump\ora10g_ora_8360.trc SQL> alter database Open; 数据库已更改。 SQL> oradebug EVENT 10046 trace name context off 已处理的语句
阅读10046 trace文件
WAIT #1: nam='instance state change' ela= 28 layer=2 value=1 waited=1 obj#=-1 tim=377999209439 WAIT #1: nam='db file sequential read' ela= 94860 file#=1 block#=377 blocks=1 obj#=-1 tim=377999304467 ===================== PARSING IN CURSOR #2 len=188 dep=1 uid=0 oct=1 lid=0 tim=377999305344 hv=1365064427 ad='8baee680' create table bootstrap$ ( line# number not null, obj# number not null, sql_text varchar2(4000) not null) storage (initial 50K objno 56 extents (file 1 block 377)) END OF STMT PARSE #2:c=0,e=662,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=377999305341 BINDS #2: EXEC #2:c=0,e=102,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=377999305545 ===================== PARSING IN CURSOR #2 len=55 dep=1 uid=0 oct=3 lid=0 tim=377999305925 hv=2111436465 ad='8baedf0c' select line#, sql_text from bootstrap$ where obj# != :1 END OF STMT PARSE #2:c=0,e=308,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=377999305922 BINDS #2: kkscoacd Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=00288360 bln=22 avl=02 flg=05 value=56 EXEC #2:c=0,e=580,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=377999306621 WAIT #2: nam='db file sequential read' ela= 328 file#=1 block#=377 blocks=1 obj#=-1 tim=377999307005 WAIT #2: nam='db file sequential read' ela= 345 file#=1 block#=378 blocks=1 obj#=-1 tim=377999307423
这里可以发现,数据库是在启动的时候读file 1 block 377,然后create table bootstrap$(注意:这里的语句小写),对于bootstarp$的查询除掉了obj#<>56
分析bootstarp$对象
SQL> select header_file,header_block from dba_segments where segment_name='BOOTSTRAP$'; HEADER_FILE HEADER_BLOCK ----------- ------------ 1 377 SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='BOOTSTRAP$'; OBJECT_ID ---------- 56 SQL> select line#, sql_text from bootstrap$ where obj# =56; LINE# ---------- SQL_TEXT -------------------------------------------------------------------------------- 56 CREATE TABLE BOOTSTRAP$("LINE#" NUMBER NOT NULL,"OBJ#" NUMBER NOT NULL,"SQL_TEXT " VARCHAR2(4000) NOT NULL) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 56K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJN O 56 EXTENTS (FILE 1 BLOCK 377))
这里可以发现bootstrap$中obj#=56的那条记录为CREATE TABLE BOOTSTRAP$(注意:该表里面保存为大写)
bbed查看root rdba
C:\Windows\system32>e:\oracle\product\10.2.0\dbhome_1\bin\bbed password=blockedit blocksize=8192 BBED: Release 2.0.0.0.0 - Limited Production on Tue Dec 17 18:36:01 2013 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> set block 1 BBED-00310: no datafile specified BBED> set filename 'E:\APP\XIFENFEI\ORADATA\ORA10G\SYSTEM01.DBF' FILENAME E:\APP\XIFENFEI\ORADATA\ORA10G\SYSTEM01.DBF BBED> set block 2 BLOCK# 2 BBED> map File: E:\APP\XIFENFEI\ORADATA\ORA10G\SYSTEM01.DBF (0) Block: 2 Dba:0x00000000 ------------------------------------------------------------ Data File Header struct kcvfh, 360 bytes @0 ub4 tailchk @8188 BBED> p kcvfhrdb ub4 kcvfhrdb @96 0x00400179 SQL> Select to_number('00400179','xxxxxxxxxxxxxxxxxx') from dual; TO_NUMBER('00400179','XXXXXXXXXXXXXXXXXX') ------------------------------------------ 4194681 SQL> select dbms_utility.data_block_address_block(4194681) "block", 2 dbms_utility.data_block_address_file(4194681) "file" from dual; block file ---------- ---------- 377 1
通过bbed查看kcvfhrdb(root rdba)指向的地址和数据库启动扫描block一致(file 1b block 377)
创建bootstarp$替换表(xifenfei)
SQL> create table xifenfei as select * from bootstrap$; 表已创建。 SQL> select count(*) from bootstrap$; COUNT(*) ---------- 57 SQL> select count(*) from xifenfei; COUNT(*) ---------- 57 SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='XIFENFEI'; OBJECT_ID ---------- 51736 SQL> select header_file,header_block from dba_segments where segment_name='XIFENFEI'; HEADER_FILE HEADER_BLOCK ----------- ------------ 1 60241 SQL> SELECT TO_CHAR(60241,'XXXX') FROM DUAL; TO_CH ----- EB51 --对应rdba为0040EB51
这里可以确定创建的xifenfei的segment header rdba为0x0040EB51,obj#为51736
清理bootstarp$中对象
SQL> DELETE FROM BOOTSTRAP$; 已删除57行。 SQL> COMMIT; 提交完成。 SQL> SHUTDOWN IMMEDIATE; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> STARTUP MOUNT ORACLE 例程已经启动。 Total System Global Area 209715200 bytes Fixed Size 1289724 bytes Variable Size 104858116 bytes Database Buffers 96468992 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 SQL> oradebug setmypid 已处理的语句 SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 已处理的语句 SQL> alter session set db_file_multiblocK_read_count=1; 会话已更改。 SQL> oradebug TRACEFILE_NAME e:\oracle\product\10.2.0\admin\ora10g\udump\ora10g_ora_7704.trc SQL> SQL> alter database Open; alter database Open * 第 1 行出现错误: ORA-01092: ORACLE 实例终止。强制断开连接 --trace文件 PARSING IN CURSOR #2 len=55 dep=1 uid=0 oct=3 lid=0 tim=379061819061 hv=2111436465 ad='8baedf18' select line#, sql_text from bootstrap$ where obj# != :1 END OF STMT PARSE #2:c=0,e=346,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=379061819058 BINDS #2: kkscoacd Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=00288360 bln=22 avl=02 flg=05 value=56 EXEC #2:c=0,e=681,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=379061819868 WAIT #2: nam='db file sequential read' ela= 343 file#=1 block#=377 blocks=1 obj#=-1 tim=379061820273 WAIT #2: nam='db file sequential read' ela= 291 file#=1 block#=378 blocks=1 obj#=-1 tim=379061820651 WAIT #2: nam='db file sequential read' ela= 309 file#=1 block#=379 blocks=1 obj#=-1 tim=379061821012 WAIT #2: nam='db file sequential read' ela= 293 file#=1 block#=380 blocks=1 obj#=-1 tim=379061821416 FETCH #2:c=0,e=1542,p=4,cr=5,cu=0,mis=0,r=0,dep=1,og=4,tim=379061821450 ORA-00704: 引导程序进程失败 ORA-00702: 引导程序版本 '' 与版本 '8.0.0.0.0' 不一致 *** 2013-12-17 18:50:07.325 EXEC #1:c=62400,e=4990345,p=10,cr=6,cu=0,mis=0,r=0,dep=0,og=1,tim=379065822300 ERROR #1:err=1092 tim=37915057
删除掉bootstarp中记录后,数据库无法正常启动,报错误为ORA-00704/ORA-00702,因为数据库读取bootstarp$中记录出错导致.
bbed修改root rdba
BBED> set mode edit MODE Edit BBED> set count 32 COUNT 32 BBED> d File: E:\APP\XIFENFEI\ORADATA\ORA10G\SYSTEM01.DBF (0) Block: 2 Offsets: 96 to 127 Dba:0x00000000 ------------------------------------------------------------------------ 79014000 0b000000 00000000 d10ff624 485dbc31 4bf60700 00000000 00000000 <32 bytes per line> BBED> m /x 51eb File: E:\APP\XIFENFEI\ORADATA\ORA10G\SYSTEM01.DBF (0) Block: 2 Offsets: 96 to 127 Dba:0x00000000 ------------------------------------------------------------------------ 51eb4000 0b000000 00000000 d10ff624 485dbc31 4bf60700 00000000 00000000 <32 bytes per line> BBED> sum apply Check value for File 0, Block 2: current = 0xa3bd, required = 0xa3bd BBED> p kcvfhrdb ub4 kcvfhrdb @96 0x0040eb51
修改root rdba地址为xifenfei segment header的地址
尝试启动数据库
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 209715200 bytes Fixed Size 1289724 bytes Variable Size 113246724 bytes Database Buffers 88080384 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 SQL> oradebug setmypid 已处理的语句 SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 已处理的语句 SQL> alter session set db_file_multiblocK_read_count=1; 会话已更改。 SQL> oradebug TRACEFILE_NAME e:\oracle\product\10.2.0\admin\ora10g\udump\ora10g_ora_7356.trc SQL> alter database Open; alter database Open * 第 1 行出现错误: ORA-01092: ORACLE 实例终止。强制断开连接 --trace文件 WAIT #1: nam='db file sequential read' ela= 26895 file#=1 block#=60241 blocks=1 obj#=-1 tim=380397162424 ===================== PARSING IN CURSOR #2 len=193 dep=1 uid=0 oct=1 lid=0 tim=380397162916 hv=1250491271 ad='8baee6a0' create table bootstrap$ ( line# number not null, obj# number not null, sql_text varchar2(4000) not null) storage (initial 50K objno 51736 extents (file 1 block 60241)) END OF STMT PARSE #2:c=0,e=372,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=380397162912 BINDS #2: EXEC #2:c=0,e=80,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=380397163083 ===================== PARSING IN CURSOR #2 len=55 dep=1 uid=0 oct=3 lid=0 tim=380397163449 hv=2111436465 ad='8baedf2c' select line#, sql_text from bootstrap$ where obj# != :1 END OF STMT PARSE #2:c=0,e=311,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=380397163447 BINDS #2: kkscoacd Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=00288360 bln=22 avl=04 flg=05 value=51736 EXEC #2:c=0,e=515,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=380397164052 WAIT #2: nam='db file sequential read' ela= 314 file#=1 block#=60241 blocks=1 obj#=-1 tim=380397164415 WAIT #2: nam='db file sequential read' ela= 396 file#=1 block#=60242 blocks=1 obj#=-1 tim=380397164902 ………… PARSING IN CURSOR #2 len=272 dep=1 uid=0 oct=1 lid=0 tim=380397203298 hv=2124945659 ad='8bacb620' CREATE TABLE BOOTSTRAP$("LINE#" NUMBER NOT NULL,"OBJ#" NUMBER NOT NULL,"SQL_TEXT" VARCHAR2(4000) NOT NULL) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 56K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 56 EXTENTS (FILE 1 BLOCK 377)) END OF STMT PARSE #2:c=0,e=239,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=380397203295 BINDS #2: EXEC #2:c=0,e=324,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=380397203701 ERROR #2:err=955 tim=38048197 ORA-00704: 引导程序进程失败 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-00955: 名称已由现有对象使用 *** 2013-12-17 19:12:21.783 EXEC #1:c=93601,e=4199938,p=10,cr=60,cu=0,mis=0,r=0,dep=0,og=1,tim=380400250570 ERROR #1:err=1092 tim=38048501
数据库启动到创建bootstarp$的时候报错,报错的原因是因为xifenfei对象中的obj#=56的为CREATE TABLE BOOTSTRAP$,而前面的查询bootstarp$是过滤掉了obj#=56(为过滤掉xifenfei对象本身的obj#[51736])
upgrade模式启动数据库
SQL> conn / as sysdba 已连接到空闲例程。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 209715200 bytes Fixed Size 1289724 bytes Variable Size 117441028 bytes Database Buffers 83886080 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 SQL> alter database Open upgrade; 数据库已更改。
虽然启动的时候在报CREATE TABLE BOOTSTRAP$(注意大写,而不是启动第一条的create table bootstrap$),但是upgrade模式可以正常启动数据库
修改xifenfei中关于CREATE TABLE BOOTSTRAP$语句对应的obj#为xifenfei object_id
SQL> UPDATE XIFENFEI SET OBJ#=51736 WHERE OBJ#=56; 已更新 1 行。 SQL> commit; 提交完成。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 209715200 bytes Fixed Size 1289724 bytes Variable Size 121635332 bytes Database Buffers 79691776 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 SQL> alter database open; 数据库已更改。
至此通过bbed结合修改CREATE TABLE BOOTSTRAP$语句对应的obj#完成数据库启动读取非bootstarp$表的过程
继续分析xifenfei和bootstarp$关系
SQL> select count(*) from bootstrap$; COUNT(*) ---------- 57 SQL> select count(*) from xifenfei; COUNT(*) ---------- 57 SQL> select obj# from bootstrap$ where line#=56; OBJ# ---------- 51736 SQL> select obj# from xifenfei where line#=56; OBJ# ---------- 51736 SQL> select header_file,header_block from dba_segments where segment_name='BOOTSTRAP$'; HEADER_FILE HEADER_BLOCK ----------- ------------ 1 377 SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='BOOTSTRAP$'; OBJECT_ID ---------- 56 SQL> truncate table xifenfei; truncate table xifenfei * 第 1 行出现错误: ORA-00701: 无法改变热启动数据库所需的对象
数据库启动过程中,会读xifenfei(root rdba指向表),然后加载bootstarp$表,而且bootstarp$表中记录和xifenfei表中记录完全相同.
替换bootstarp$表
对数据库有一定了解的人都知道,数据库启动是通过bootstarp$表来实现启动引导的。那这里有两个疑问:
1.引导表bootstarp$名字是否是唯一?
2.引导表的位置是不是在数据文件固定?比如11g/12c在file 1 block 520,10g在file 1 block 377?
跟踪数据库启动
[oracle@rac2 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on Sun Dec 15 14:16:58 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Advanced Analytics and Real Application Testing options SQL> startup mount; ORACLE instance started. Total System Global Area 400846848 bytes Fixed Size 2288872 bytes Variable Size 310379288 bytes Database Buffers 79691776 bytes Redo Buffers 8486912 bytes Database mounted. SQL> oradebug setmypid Statement processed. SQL> alter session set db_file_multiblocK_read_count=1; Statement processed. SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 Session altered. SQL> oradebug TRACEFILE_NAME /u01/app/oracle/diag/rdbms/test/TEST/trace/TEST_ora_31364.trc SQL> alter database Open; Database altered. SQL> oradebug EVENT 10046 trace name context off Statement processed. SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where segment_name='BOOTSTRAP$'; HEADER_FILE HEADER_BLOCK ----------- ------------ 1 520 SQL> select object_id from dba_objects where object_name='BOOTSTRAP$'; OBJECT_ID ---------- 59
分析trace文件
WAIT #140077386411120: nam='db file sequential read' ela= 56 file#=1 block#=520 blocks=1 obj#=-1 tim=1719385755334 ===================== PARSING IN CURSOR #140077386402760 len=188 dep=1 uid=0 oct=1 lid=0 tim=1719385757322 hv=4006182593 ad='6645d370' sqlid='32r4f1brckzq1' create table bootstrap$ ( END OF STMT PARSE #140077386402760:c=2000,e=1711,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1719385757319 EXEC #140077386402760:c=0,e=430,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=1719385757909 CLOSE #140077386402760:c=0,e=9,dep=1,type=0,tim=1719385758105 ===================== PARSING IN CURSOR #140077386402760 len=55 dep=1 uid=0 oct=3 lid=0 tim=1719385759507 hv=2111436465 ad='6645bc80' sqlid='6apq2rjyxmxpj' select line#, sql_text from bootstrap$ where obj# != :1 END OF STMT PARSE #140077386402760:c=1000,e=1365,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1719385759505 BINDS #140077386402760: Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=1000001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=7f664edb8780 bln=22 avl=02 flg=05 value=59 EXEC #140077386402760:c=3000,e=8859,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=867914364,tim=1719385768574 WAIT #140077386402760: nam='db file sequential read' ela= 27 file#=1 block#=520 blocks=1 obj#=59 tim=1719385768753 WAIT #140077386402760: nam='db file sequential read' ela= 23 file#=1 block#=521 blocks=1 obj#=59 tim=1719385769575
这里我们可以发现,数据库启动的时候是读file 1 block 520,object_id为59,为bootstarp$对象
bbed查看root rdba地址
ub4 kcvfhrdb @96 0x00400208 SQL> select to_number('208','xxx') from dual; TO_NUMBER('208','XXX') ---------------------- 520
这里可以看出来,数据库启动的file header rdba地址和trace文件中的一致,也是指定到bootstarp$;
替换bootstrap$表为xifenfei
SQL> create table xifenfei as select * from bootstrap$; Table created. SQL> desc xifenfei Name Null? Type ----------------------------------------- -------- ---------------------------- LINE# NOT NULL NUMBER OBJ# NOT NULL NUMBER SQL_TEXT NOT NULL VARCHAR2(4000) SQL> select sql_text from xifenfei where line#=59; SQL_TEXT -------------------------------------------------------------------------------- CREATE TABLE BOOTSTRAP$("LINE#" NUMBER NOT NULL,"OBJ#" NUMBER NOT NULL,"SQL_TEXT " VARCHAR2(4000) NOT NULL) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 56K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJN O 59 EXTENTS (FILE 1 BLOCK 520)) --清除bootstarp$记录 SQL> delete from xifenfei where line#=59; 1 row deleted. SQL> commit; Commit complete. SQL> select objECT_ID from dba_objects where object_name='XIFENFEI'; OBJECT_ID ---------- 20314 SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where segment_name='XIFENFEI'; HEADER_FILE HEADER_BLOCK ----------- ------------ 1 45712 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup upgrade; ORACLE instance started. Total System Global Area 400846848 bytes Fixed Size 2288872 bytes Variable Size 310379288 bytes Database Buffers 79691776 bytes Redo Buffers 8486912 bytes Database mounted. Database opened. --删除bootstarp$表 SQL> drop table bootstrap$; Table dropped. SQL> exec DBMS_DDL_INTERNAL.SWAP_BOOTSTRAP('XIFENFEI'); PL/SQL procedure successfully completed. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> EXIT Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Advanced Analytics and Real Application Testing options [oracle@rac2 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on Sun Dec 15 14:29:54 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> STARTUP MOUNT ORACLE instance started. Total System Global Area 400846848 bytes Fixed Size 2288872 bytes Variable Size 310379288 bytes Database Buffers 79691776 bytes Redo Buffers 8486912 bytes Database mounted. SQL> oradebug setmypid Statement processed. SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 Statement processed. SQL> alter session set db_file_multiblocK_read_count=1; Session altered. SQL> oradebug TRACEFILE_NAME /u01/app/oracle/diag/rdbms/test/TEST/trace/TEST_ora_32727.trc SQL> alter database Open; Database altered. SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='BOOTSTRAP$'; no rows selected SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME='XIFENFEI'; OBJECT_ID ---------- 20314
分析trace文件
WAIT #139841534602352: nam='db file sequential read' ela= 23 file#=1 block#=45712 blocks=1 obj#=-1 tim=1720082484775 ===================== PARSING IN CURSOR #139841534593992 len=193 dep=1 uid=0 oct=1 lid=0 tim=1720082488552 hv=2096904950 ad='6645d650' sqlid='bs6v55xygsfrq' create table bootstrap$ ( END OF STMT PARSE #139841534593992:c=2000,e=2925,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1720082488550 EXEC #139841534593992:c=0,e=466,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=1720082489124 CLOSE #139841534593992:c=0,e=8,dep=1,type=0,tim=1720082489266 ===================== PARSING IN CURSOR #139841534593992 len=55 dep=1 uid=0 oct=3 lid=0 tim=1720082490510 hv=2111436465 ad='6645c050' sqlid='6apq2rjyxmxpj' select line#, sql_text from bootstrap$ where obj# != :1 END OF STMT PARSE #139841534593992:c=1999,e=1211,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1720082490509 BINDS #139841534593992: Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=1000001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=7f2f64fe8780 bln=22 avl=04 flg=05 value=20314 EXEC #139841534593992:c=1000,e=1789,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=867914364,tim=1720082492533 WAIT #139841534593992: nam='db file sequential read' ela= 20 file#=1 block#=45712 blocks=1 obj#=20314 tim=1720082492685 WAIT #139841534593992: nam='db file sequential read' ela= 25 file#=1 block#=45713 blocks=1 obj#=20314 tim=1720082492986
这里可以看出来,数据库在启动的时候是读取file 1 block 45712,object_id为20314
bbed查看root rdba地址
ub4 kcvfhrdb @96 0x0040b290 SQL> select to_number('b290','xxxxxxx') from dual; TO_NUMBER('B290','XXXXXXX') --------------------------- 45712
证明现在的文件头里面的file header rdba 已经修改为file 1 block 45712和trace里面看到的一致,都是XIFENFEI这个表
测试结论
1. 通过使用SWAP_BOOTSTRAP可以置换掉数据库启动开始表bootstrap$变为另外一个表,而且该过程直接修改文件头的kcvfhrdb值
2. 通过试验证明,oracle启动的时候不是程序里面写死的去读file 1的某个block,而是通过读取kcvfhrdb然后启动数据库