涉及工具版本oracle 10g 服务odu: odu_309_win32问题描述及时间线以前一直仅限于使用oracle没有遇到过实例不能启动的情况这次经历后把我的排查流程整理一下方便以后如果在遇到能有个印象。现场报数据库连接不上。远程支援也没解决。看现象是监听问题一直报ora-12560,一直围绕监听部分查找问题包括新建了监听新建实例都没能解决始终连接不上数据库最后就连新安装了数据库在新建实例都没能连接成功最终放弃了去了趟现场。排查及操作流程根据业务配置文件确定所使用的odbc源及对应的驱动。在开始菜单中对应的oracle程序中排查问题不要搞错了要操作的数据库服务或客户端在服务中找到对应的实例服务和监听我们只需要一套其他的服务全部停止并禁用。将环境变量中对应的数据库服务或者客户端放在path的最前面其他的数据库或客户端的路径相关可以直接在path中删除。确认完以上信息后启动了对应的服务和监听用plsql测试确实没有连接上。在cmd中执行对应oracle目标中执行了 sqlplus / as sysdba这里有个小插曲输入sqlplus / as sysdba时不能自动登录执行了如下指令后才成功。set oracle_sidorcl执行了这句话后在输入sqlplus / as sysdba成功进入sqlplus环境。应该是我的生成环境有多个实例的原因。在sqlplus 环境中查询数据库状态执行以下语句selectname, open_mode fromv$database;返回结果是 mounted 数据库只挂载没有打开所以外部无法访问。执行打开数据库命令alter databaseopen;输出结果如下至此连不上数据库的原因找到了数据文件5损坏。恢复流程及操作找到文件5对应的表空间idRFNO及文件全路径。查看所有表空间及对应数据文件SQLSELECT ts.name AS tablespace_name, df.file# AS file_id, df.name AS datafile_path, df.bytes/1024/1024 AS size_m FROM v$tablespace ts JOIN v$datafile df ON ts.ts# df.ts# ORDER BY df.file#;输出SYSTEM 1 L:\DB\ORACLE\ORADATA\ORCL\SYSTEM01.DBF 480UNDOTBS1 2 L:\DB\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF 65SYSAUX 3 L:\DB\ORACLE\ORADATA\ORCL\SYSAUX01.DBF 250USERS 4 L:\DB\ORACLE\ORADATA\ORCL\USERS01.DBF 5ZCXT 5 L:\DB\ORACLE\ORADATA\ORCL\ZCXT.DBF 2048查看所有表空间id及对应表空间名称。SQLSELECT TS#, NAME FROM V$TABLESPACE;输出 TS# NAME---------- ------------------------------0SYSTEM1UNDOTBS12SYSAUX4USERS3TEMP **6ZCXT**odu控制文件odu控制文件中文件id表空间id要填对或者直接填 0 这两个值填不对会读不出来数据我当时就是折在这里了乱填的99 就一直读不出来数据后面都改成0 居然就读出来了。根据上面两个指令我们可以获得fno 及 对应的rfno 文件的全路径也要填对。control.txt中这样赋值的以空格为分隔符即可#ts #fno #rfno filename block_size010L:\db\oracle\oradata\orcl\system01.dbf8192156L:\db\oracle\oradata\orcl\zcxt.dbf8192序号 文件ID 表空间ID 本机真实路径 数据块大小第1位1自定义序号随便写不影响 随便 0,1,2,3… 都行只是ODU内部编号 第2位5 文件IDFILE_ID第3位6 表空间IDTABLESPACE_ID。我赋值的文件id 为5是报错那里知道的通过命令可以知道该文件id属于表空间ZCXT1。我赋值的表空间id 为6根据表空间名zcxt结合命令2得知表空间id为6。odu操作修改完control.txt后在odu.exe同级目录创建一个data的文件夹后续恢复的数据会存储在这里这个版本是这样的 双击odu.exe,进入odu环境在打开的环境中有如下输出控制文件不同输出不同load controlfileconfig.txtsuccessful loading default controlfile......ts# fn rfn bsize blocks bf offset filename---- ---- ---- ----- -------- -- ------ --------------------------------------------011819261440N0L:\db\oracle\oradata\orcl\system01.dbf6558192262144N0L:\db\oracle\oradata\orcl\zcxt.dbf load controlfilecontrol.txtsuccessful loading dictionary data......在环境中可以输入以下指令unload dict加载字典。这个命令据说在这个版本必须执行一下ODUunload dict输出CLUSTER C_USER# file_no: 1 block_no: 89TABLE OBJ$ file_no:1block_no:121CLUSTER C_OBJ# file_no: 1 block_no: 25CLUSTER C_OBJ# file_no: 1 block_no: 25found IND$s obj# 19... found IND$s dataobj#:2,ts#:0,file#:1,block#:25,tab#:3 found TABPART$s obj# 266found TABPART$s dataobj#:266,ts#:0,file#:1,block#:2121,tab#:0 found INDPART$s obj# 271查看有哪些用户ODUlist user输出USER# USERNAME---------- ------------------------------ 0SYS 1PUBLIC 2CONNECT ... 53MGMT_VIEW 54SCOTT 55ZCXT查看用户有哪些表ODUlist table zcxt输出OBJ# OBJECT_NAME---------- ------------------------------51757STUDENT查看表结构ODUdesc zcxt.student输出Object ID:51757 Storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)NO. SEG INT Column Name Null? Type --- --- --- ------------------------------ --------- ------------------------------111STUDENT_ID NOT NULL NUMBER(10)222STUDENT_NAME NOT NULL VARCHAR2(50)333GENDER VARCHAR2(4)444AGE NUMBER(3)555MAJOR VARCHAR2(100)666ENROLL_DATE DATE777CLASS_NAME VARCHAR2(50)888PHONE VARCHAR2(11)导出/恢复表数据单表ODUunload table zcxt.student输出Unloading table: STUDENT,object ID:51757Unloading segment,storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)10rows unloaded导出/恢复用户的所有表ODUunload user zcxt输出Unloading user ZCXTs tables. Unloading table: STUDENT,object ID:51757Unloading segment,storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)10rows unloaded数据恢复成功。查看data下会出现表相关的数据文件和控制文件。可以根据恢复的ctl文件及txt文件恢复数据到表中sqlldr 用户名/密码 control你的文件.ctl log导入日志.log如果提示找不到txt文件可以修改ctl中的文件名。L:\db\odu_全版本\odu_全版本\odu_309_win32\odu\datasqlldr zcxt/zcxtcontrolZCXT_STUDENT.ctlloga.log 输出 SQL*Loader: Release10.2.0.3.0 - Production on 星期二5月2602:01:092026Copyright(c)1982,2005, Oracle. All rights reserved. 达到提交点 - 逻辑记录计数10恢复前数据如下恢复后数据如下参考 “查看所有表空间及对应数据文件”命令部分 ↩︎参考 “查看所有表空间id及对应表空间名称”命令部分。 ↩︎
记一次odu恢复Oracle 10g过程
涉及工具版本oracle 10g 服务odu: odu_309_win32问题描述及时间线以前一直仅限于使用oracle没有遇到过实例不能启动的情况这次经历后把我的排查流程整理一下方便以后如果在遇到能有个印象。现场报数据库连接不上。远程支援也没解决。看现象是监听问题一直报ora-12560,一直围绕监听部分查找问题包括新建了监听新建实例都没能解决始终连接不上数据库最后就连新安装了数据库在新建实例都没能连接成功最终放弃了去了趟现场。排查及操作流程根据业务配置文件确定所使用的odbc源及对应的驱动。在开始菜单中对应的oracle程序中排查问题不要搞错了要操作的数据库服务或客户端在服务中找到对应的实例服务和监听我们只需要一套其他的服务全部停止并禁用。将环境变量中对应的数据库服务或者客户端放在path的最前面其他的数据库或客户端的路径相关可以直接在path中删除。确认完以上信息后启动了对应的服务和监听用plsql测试确实没有连接上。在cmd中执行对应oracle目标中执行了 sqlplus / as sysdba这里有个小插曲输入sqlplus / as sysdba时不能自动登录执行了如下指令后才成功。set oracle_sidorcl执行了这句话后在输入sqlplus / as sysdba成功进入sqlplus环境。应该是我的生成环境有多个实例的原因。在sqlplus 环境中查询数据库状态执行以下语句selectname, open_mode fromv$database;返回结果是 mounted 数据库只挂载没有打开所以外部无法访问。执行打开数据库命令alter databaseopen;输出结果如下至此连不上数据库的原因找到了数据文件5损坏。恢复流程及操作找到文件5对应的表空间idRFNO及文件全路径。查看所有表空间及对应数据文件SQLSELECT ts.name AS tablespace_name, df.file# AS file_id, df.name AS datafile_path, df.bytes/1024/1024 AS size_m FROM v$tablespace ts JOIN v$datafile df ON ts.ts# df.ts# ORDER BY df.file#;输出SYSTEM 1 L:\DB\ORACLE\ORADATA\ORCL\SYSTEM01.DBF 480UNDOTBS1 2 L:\DB\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF 65SYSAUX 3 L:\DB\ORACLE\ORADATA\ORCL\SYSAUX01.DBF 250USERS 4 L:\DB\ORACLE\ORADATA\ORCL\USERS01.DBF 5ZCXT 5 L:\DB\ORACLE\ORADATA\ORCL\ZCXT.DBF 2048查看所有表空间id及对应表空间名称。SQLSELECT TS#, NAME FROM V$TABLESPACE;输出 TS# NAME---------- ------------------------------0SYSTEM1UNDOTBS12SYSAUX4USERS3TEMP **6ZCXT**odu控制文件odu控制文件中文件id表空间id要填对或者直接填 0 这两个值填不对会读不出来数据我当时就是折在这里了乱填的99 就一直读不出来数据后面都改成0 居然就读出来了。根据上面两个指令我们可以获得fno 及 对应的rfno 文件的全路径也要填对。control.txt中这样赋值的以空格为分隔符即可#ts #fno #rfno filename block_size010L:\db\oracle\oradata\orcl\system01.dbf8192156L:\db\oracle\oradata\orcl\zcxt.dbf8192序号 文件ID 表空间ID 本机真实路径 数据块大小第1位1自定义序号随便写不影响 随便 0,1,2,3… 都行只是ODU内部编号 第2位5 文件IDFILE_ID第3位6 表空间IDTABLESPACE_ID。我赋值的文件id 为5是报错那里知道的通过命令可以知道该文件id属于表空间ZCXT1。我赋值的表空间id 为6根据表空间名zcxt结合命令2得知表空间id为6。odu操作修改完control.txt后在odu.exe同级目录创建一个data的文件夹后续恢复的数据会存储在这里这个版本是这样的 双击odu.exe,进入odu环境在打开的环境中有如下输出控制文件不同输出不同load controlfileconfig.txtsuccessful loading default controlfile......ts# fn rfn bsize blocks bf offset filename---- ---- ---- ----- -------- -- ------ --------------------------------------------011819261440N0L:\db\oracle\oradata\orcl\system01.dbf6558192262144N0L:\db\oracle\oradata\orcl\zcxt.dbf load controlfilecontrol.txtsuccessful loading dictionary data......在环境中可以输入以下指令unload dict加载字典。这个命令据说在这个版本必须执行一下ODUunload dict输出CLUSTER C_USER# file_no: 1 block_no: 89TABLE OBJ$ file_no:1block_no:121CLUSTER C_OBJ# file_no: 1 block_no: 25CLUSTER C_OBJ# file_no: 1 block_no: 25found IND$s obj# 19... found IND$s dataobj#:2,ts#:0,file#:1,block#:25,tab#:3 found TABPART$s obj# 266found TABPART$s dataobj#:266,ts#:0,file#:1,block#:2121,tab#:0 found INDPART$s obj# 271查看有哪些用户ODUlist user输出USER# USERNAME---------- ------------------------------ 0SYS 1PUBLIC 2CONNECT ... 53MGMT_VIEW 54SCOTT 55ZCXT查看用户有哪些表ODUlist table zcxt输出OBJ# OBJECT_NAME---------- ------------------------------51757STUDENT查看表结构ODUdesc zcxt.student输出Object ID:51757 Storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)NO. SEG INT Column Name Null? Type --- --- --- ------------------------------ --------- ------------------------------111STUDENT_ID NOT NULL NUMBER(10)222STUDENT_NAME NOT NULL VARCHAR2(50)333GENDER VARCHAR2(4)444AGE NUMBER(3)555MAJOR VARCHAR2(100)666ENROLL_DATE DATE777CLASS_NAME VARCHAR2(50)888PHONE VARCHAR2(11)导出/恢复表数据单表ODUunload table zcxt.student输出Unloading table: STUDENT,object ID:51757Unloading segment,storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)10rows unloaded导出/恢复用户的所有表ODUunload user zcxt输出Unloading user ZCXTs tables. Unloading table: STUDENT,object ID:51757Unloading segment,storage(Obj#51757 DataObj#51757 TS#6 File#5 Block#11 Cluster0)10rows unloaded数据恢复成功。查看data下会出现表相关的数据文件和控制文件。可以根据恢复的ctl文件及txt文件恢复数据到表中sqlldr 用户名/密码 control你的文件.ctl log导入日志.log如果提示找不到txt文件可以修改ctl中的文件名。L:\db\odu_全版本\odu_全版本\odu_309_win32\odu\datasqlldr zcxt/zcxtcontrolZCXT_STUDENT.ctlloga.log 输出 SQL*Loader: Release10.2.0.3.0 - Production on 星期二5月2602:01:092026Copyright(c)1982,2005, Oracle. All rights reserved. 达到提交点 - 逻辑记录计数10恢复前数据如下恢复后数据如下参考 “查看所有表空间及对应数据文件”命令部分 ↩︎参考 “查看所有表空间id及对应表空间名称”命令部分。 ↩︎