暂无图片
暂无图片
7
暂无图片
暂无图片
1
暂无图片

遭遇N个ORA报错--见证存储目录及数据库名称修改

原创 virvle 2024-03-21
555

今天拿到一个镜像还原了一台数据库服务器,实例名及文件存储都不是想要的。如此就动手改一改,坑一个个踩,让大家看看,还能有更多的ORA么

1. 部署环境:

操作系统 数据库版本
centos7.9 11.2.0.4

2. 数据库初始状态

数据库base目录直接被重命名了,数据库只能启动到mount状态,若要进入open,遇到
第一个ORA

3.读取文件错误:ORA-01157 & ORA-01110

SQL> select open_mode from v$database; OPEN_MODE -------------------- MOUNTED SQL> select name from v$datafile ; NAME -------------------------------- /mnt/oracle/tj/system01.dbf /mnt/oracle/tj/sysaux01.dbf /mnt/oracle/tj/undotbs01.dbf /mnt/oracle/tj/users01.dbf SQL> alter database open; alter database open * ERROR at line 1: ORA-01157: cannot identify/lock data file 1 - see DBWR trace file ORA-01110: data file 1: '/mnt/oracle/tj/system01.dbf'
复制

既然知道前因后果,要解决也简单,找到存储上真实的文件位置,告诉DB它们在哪儿。
数据表空间 & 临时表空间 & undo表空间 一锅处理了

2.1 遭遇ORA-27037

第一次执行变更,拿一条试试,咦,

SQL> alter database rename file '/mnt/oracle/tj/system01.dbf' to '/mnt/vir/oracle/virdata/system01.dbf' ; alter database rename file '/mnt/oracle/tj/system01.dbf' to '/mnt/vir/oracle/virdata/system01.dbf' * ERROR at line 1: ORA-01511: error in renaming log/data files ORA-01141: error renaming data file 1 - new file '/mnt/vir/oracle/virdata/system01.dbf' not found ORA-01110: data file 1: '/mnt/oracle/tj/system01.dbf' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3
复制

由报错特别是Linux-x86_64 Error可知,文件或者目录找不到,这里通常是目标的文件找不到,再次返回操作系统存储查看,还就是,目标目录 /mnt/vir/oracle/virdata/ 下无文件,原文件还在 tj目录下,手动移动文件到目标目录

[oracle@ZZDBA_B_10020 tj]$ ll
total 1526116
-rw-r-----. 1 oracle oinstall   9748480 Mar 20 23:02 control01.ctl
-rw-r-----. 1 oracle oinstall  52429312 Nov 22 01:22 redo01.log
-rw-r-----. 1 oracle oinstall  52429312 Nov 22 01:22 redo02.log
-rw-r-----. 1 oracle oinstall  52429312 Nov 22 01:31 redo03.log
-rw-r-----. 1 oracle oinstall 534781952 Nov 22 01:31 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 775954432 Nov 22 01:31 system01.dbf
-rw-r-----. 1 oracle oinstall  30416896 Aug 22  2023 temp01.dbf
-rw-r-----. 1 oracle oinstall  78651392 Nov 22 01:31 undotbs01.dbf
-rw-r-----. 1 oracle oinstall   5251072 Nov 22 01:31 users01.dbf
## 进入tj目录,执行
mv *.dbf ../virdata/
复制

2.2 再次执行变更(文件名重命名)

SQL> alter database rename file '/mnt/oracle/tj/system01.dbf' to '/mnt/vir/oracle/virdata/system01.dbf' ; Database altered. SQL> alter database rename file '/mnt/oracle/tj/sysaux01.dbf' to '/mnt/vir/oracle/virdata/sysaux01.dbf' ; alter database rename file '/mnt/oracle/tj/undotbs01.dbf' to '/mnt/vir/oracle/virdata/undotbs01.dbf' ; alter database rename file '/mnt/oracle/tj/users01.dbf' to '/mnt/vir/oracle/virdata/users01.dbf' ; alter database rename file '/mnt/oracle/tj/temp01.dbf' to '/mnt/vir/oracle/virdata/temp01.dbf' ; Database altered. SQL> Database altered. SQL> Database altered. SQL> Database altered.
复制

2.4 修改完成后,尝试打开数据库,遭遇ORA-03113,暂放过

SQL> alter database open; alter database open * ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 27143 Session ID: 1705 Serial number: 29383
复制

3. 修改初始化参数,修改相关存储目录及数据库名

-- 关闭数据库 SQL> shutdown immediate ORA-01507: database not mounted
复制

3.1 由spfile创建pfile,并进行修改目录及dbname

再次之前,也要检查下环境变量文件 ~/.bash_profile

SQL> create pfile='/mnt/pfile20240321.ora' from spfile; File created.
复制

复制一份通过vim修改完成后,保存文件名为vir_pfile20240321.ora,再次创建spfile

3.2 创建spfile二进制初始化参数文件

SQL> create spfile from pfile='/mnt/vir_pfile20240321.ora'; File created.
复制

3.3 mount数据库,遭遇ORA-09925

SQL> startup mount; ORA-09925: Unable to create audit trail file Linux-x86_64 Error: 2: No such file or directory Additional information: 9925
复制

咦,看这报错,好像是目录的问题,来查看下

SQL> show parameter au ORA-01012: not logged on Process ID: 0 Session ID: 0 Serial number: 0 SQL> exit
复制

3.4 重新登录sql*plus 遭遇报错 ORA-09925 & ORA-01075

[oracle@ZZDBA_B_10020 mnt]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 20 23:37:06 2024 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-09925: ?????????? Linux-x86_64 Error: 2: No such file or directory Additional information: 9925 ORA-01075: ?????? Warning: You are no longer connected to ORACLE.
复制

怎么回事,sqlplus都进不去了,文件不存在,什么文件不存在呢?提示都是“???”,回头看看3.1说到的环境变量问题
好家伙,目录指向不对,修改环境变量相关目录

[oracle@ZZDBA_B_10020 ~]$ vi .bash_profile export ORACLE_BASE=/mnt/vir/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=virdb export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin export ORACLE_UNQNAME=virdb; export JAVA_HOME=/usr/local/java; export ORACLE_TERM=xterm; export NLS_DATE_FORMAT="YYYY:MM:DD HH24:MI:SS"; export NLS_LANG=american_america.AL32UTF8; export TNS_ADMIN=$ORACLE_HOME/network/admin; export ORA_NLS11=$ORACLE_HOME/nls/data; LD_LIBRARY_PATH=$ORACLE_HOME/lib LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib CLASSPATH=$ORACLE_HOME/JRE CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib export TEMP=/tmp export TMPDIR=/tmp -- 使之立即生效 [oracle@ZZDBA_B_10020 ~]$ source .bash_profile
复制

再次进入sqlplus,吖~可以了

[oracle@ZZDBA_B_10020 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 20 23:38:25 2024 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance.
复制

好嘞,回头再聊看看3.3的问题,找不到audit trail file

SQL> startup nomount ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/mnt/vir/oracle/product/11.2.0/dbhome_1/dbs/initvirdb.ora' SQL> SQL> create spfile from pfile='/mnt/vir_pfile20240321.ora'; File created. SQL> startup nomount; ORA-09925: Unable to create audit trail file Linux-x86_64 Error: 2: No such file or directory Additional information: 9925 SQL>
复制

检查初始化参数文件,大家是否发现了问题:目录不存在

[oracle@ZZDBA_B_10020 mnt]$ cat vir_pfile20240321.ora|grep au
*.audit_file_dest='/mnt/vir/oracle/admin/virdb/adump'
*.audit_trail='db'
[oracle@ZZDBA_B_10020 mnt]$ ll /mnt/vir/oracle/admin/virdb/adump
ls: cannot access /mnt/vir/oracle/admin/virdb/adump: No such file or directory
复制

创建相关目录

[oracle@ZZDBA_B_10020 mnt]$ mkdir -p /mnt/vir/oracle/admin/virdb/adump

复制

再来启动到nomount状态,可以了

Connected to an idle instance. SQL> startup nomount; ORACLE instance started. Total System Global Area 2455228416 bytes Fixed Size 2255712 bytes Variable Size 1040188576 bytes Database Buffers 1392508928 bytes Redo Buffers 20275200 bytes SQL>
复制

4. 启动到monut状态,读取控制文件,遭遇ORA-00205

SQL> alter database mount; alter database mount * ERROR at line 1: ORA-00205: error in identifying control file, check alert log for more info
复制

解决:控制文件所在目录出错导致:找到原控制文件,移动到正确的路径

4.1 再次重启,遭遇ORA-01103

shuntdown immediate SQL> startup mount; ORACLE instance started. Total System Global Area 2455228416 bytes Fixed Size 2255712 bytes Variable Size 1040188576 bytes Database Buffers 1392508928 bytes Redo Buffers 20275200 bytes ORA-01103: database name 'TJ' in control file is not 'virdb'
复制

控制文件的database name 与初始化参数的一致,导致启动失败
解决思路:重建控制文件,为此需要找到原有控制文件进行编辑,而目前在nomount下

4.2 重建控制文件

思路:关闭数据库,更改为原database name ,启动到mount ,并备份控制文件

SQL> shutdown immediate ORA-01507: database not mounted ORACLE instance shut down.
复制

– 修改参数文件,重启

SQL> create spfile from pfile='/mnt/pfile20240321-tj.ora'; File created. SQL> startup mount; ORACLE instance started. Total System Global Area 2455228416 bytes Fixed Size 2255712 bytes Variable Size 1040188576 bytes Database Buffers 1392508928 bytes Redo Buffers 20275200 bytes Database mounted. -- 再关闭数据库
复制

关键点,备份控制文件

SQL> alter database backup controlfile to trace ; Database altered.
复制

在追踪日志文件里面,会看到一条记录,说明备份的控制文件所在的trace文件

Thu Mar 21 02:18:37 2024 alter database backup controlfile to trace Backup controlfile written to trace file /mnt/vir/oracle/diag/rdbms/tj/virdb/trace/virdb_ora_6163.trc Completed: alter database backup controlfile to trace
复制

找到文件,并获取及修改创建控制文件脚本

SQL> create spfile from pfile='/mnt/pfile20240321-sc.ora'; File created. SQL> startup nomount; ORACLE instance started. Total System Global Area 2455228416 bytes Fixed Size 2255712 bytes Variable Size 1040188576 bytes Database Buffers 1392508928 bytes Redo Buffers 20275200 bytes SQL> CREATE CONTROLFILE SET DATABASE "virdb" RESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/mnt/vir/oracle/virdata/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/mnt/vir/oracle/virdata/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/mnt/vir/oracle/virdata/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/mnt/vir/oracle/virdata/system01.dbf', '/mnt/vir/oracle/virdata/sysaux01.dbf', '/mnt/vir/oracle/virdata/undotbs01.dbf', '/mnt/vir/oracle/virdata/users01.dbf' CHARACTER SET AL32UTF8 ;
复制

其中,这一句很关键:
CREATE CONTROLFILE [SET|REUSE] DATABASE “virdb” [RESETLOGS|NORESETLOGS] [FORCE LOGGING ARCHIVELOG|NOARCHIVELOG]

未选好参数,你可能会遇到

CREATE CONTROLFILE REUSE DATABASE "virdb" RESETLOGS NOARCHIVELOG * ERROR at line 1: ORA-01503: CREATE CONTROLFILE failed ORA-01161: database name TJ in file header does not match given name of virdb ORA-01110: data file 1: '/mnt/vir/oracle/virdata/system01.dbf'
复制

也可能会遇到

CREATE CONTROLFILE DATABASE "VIRDB" RESETLOGS NOARCHIVELOG * ERROR at line 1: ORA-01503: CREATE CONTROLFILE failed ORA-01161: database name TJ in file header does not match given name of VIRDB ORA-01110: data file 1: '/mnt/vir/oracle/virdata/system01.dbf'
复制

再次调整创建控制文件的脚本

CREATE CONTROLFILE SET DATABASE "virdb" RESETLOGS FORCE LOGGING ARCHIVELOG * ERROR at line 1: ORA-01503: CREATE CONTROLFILE failed ORA-00200: control file could not be created ORA-00202: control file: '/mnt/vir/oracle/virdata/control01.ctl' ORA-27038: created file already exists Additional information: 1
复制

从报错可以看出,控制文件已存在,不允许创建。由此可见:创建控制文件的脚本应该是没有问题了
解决:进入操作系统,将控制文件备份,然后再次执行脚本,创建成功

..... Control file created.
复制

5. 恢复控制文件(推荐步骤),遭遇ORA-2703

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE ORA-00279: change 987371 generated at 11/22/2023 01:31:49 needed for thread 1 ORA-00289: suggestion : /mnt/vir/oracle/fast_recovery_area/VIRDB/archivelog/2024_03_21/o1_mf_1_6_%u_.arc ORA-00280: change 987371 for thread 1 is in sequence #6 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} auto ORA-00308: ������������������������ '/mnt/vir/oracle/fast_recovery_area/VIRDB/archivelog/2024_03_21/o1_mf_1_6_%u_.arc' ORA-2703 7: ������������������������ Linux-x86_64 Error: 2: No such file or directory Additional information: 3 ORA-00308: ������������������������ '/mnt/vir/oracle/fast_recovery_area/VIRDB/archivelog/2024_03_21/o1_mf_1_6_%u_.arc' ORA-2703 7: ������������������������ Linux-x86_64 Error: 2: No such file or directory Additional information: 3
复制

查看对应目录,确实没有相关的归档文件,略过

6. open数据库,遭遇 ORA-01113 & ORA-01110,需要进行介质恢复

SQL> ALTER DATABASE OPEN RESETLOGS; ALTER DATABASE OPEN RESETLOGS * ERROR at line 1: ORA-01113: file 1 needs media recovery ORA-01110: data file 1: '/mnt/vir/oracle/virdata/system01.dbf'
复制

6.1 进入RMAN 进行数据库文件恢复,由于无归档,直接按默认方式

RMAN> recover database ; Starting recover at 2024:03:21 02:55:25 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=572 device type=DISK starting media recovery unable to find archived log archived log thread=1 sequence=6 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 03/21/2024 02:55:25 RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 6 and starting SCN of 987371 RMAN> exit Recovery Manager complete. `` ### 6.2 恢复完成,再次open数据库 ```sql SQL> select open_mode from v$database; OPEN_MODE -------------------- MOUNTED
复制

尝试1

SQL> alter database open; alter database open * ERROR at line 1: ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
复制

提示想要使用参数 RESETLOGS or NORESETLOGS

尝试2

SQL> alter database open NORESETLOGS; alter database open NORESETLOGS * ERROR at line 1: ORA-01588: must use RESETLOGS option for database open
复制

尝试3

SQL> alter database open RESETLOGS; Database altered. -- 查看打开状态 SQL> select open_mode from v$database; OPEN_MODE -------------------- READ WRITE
复制

7. 数据库open成功后,查看告警日志,遭遇ORA-25153: 临时表空间为空

Thu Mar 21 23:18:36 2024 Errors in file /mnt/vir/oracle/diag/rdbms/virdb/easdb/trace/virdb_m000_5669.trc: ORA-25153: 临时表空间为空
复制

解决:增加临时表空间文件,若已存在,可重用

SQL> select * from dba_temp_files; no rows selected SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/mnt/vir/oracle/virdata/temp01.dbf' REUSE; Tablespace altered. SQL> select file_name from dba_temp_files; FILE_NAME -------------------------------------------------- /mnt/vir/oracle/virdata/temp01.dbf
复制

8. 简单操作测试

SQL> create table t (a int,b varchar2(12)); Table created. SQL> insert into t values(1,'广州'); 1 row created. SQL> insert into t values(2,'上海'); 1 row created. SQL> commit; Commit complete. SQL> select * from t; A B ---------- ------------ 1 广 2 上海 `` 基本可用,收工~
复制
最后修改时间:2024-03-22 14:43:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

黄陈(天使与魔鬼)
暂无图片
1年前
评论
暂无图片 1
怎么感觉一个简单的问题搞这么复杂
1年前
暂无图片 1
评论
bigger
关注
暂无图片
获得了22次点赞
暂无图片
内容获得2次评论
暂无图片
获得了2次收藏
TA的专栏
目录
  • 1. 部署环境:
  • 2. 数据库初始状态
  • 3.读取文件错误:ORA-01157 & ORA-01110
    • 2.1 遭遇ORA-27037
    • 2.2 再次执行变更(文件名重命名)
    • 2.4 修改完成后,尝试打开数据库,遭遇ORA-03113,暂放过
  • 3. 修改初始化参数,修改相关存储目录及数据库名
    • 3.1 由spfile创建pfile,并进行修改目录及dbname
    • 3.2 创建spfile二进制初始化参数文件
    • 3.3 mount数据库,遭遇ORA-09925
    • 3.4 重新登录sql*plus 遭遇报错 ORA-09925 & ORA-01075
  • 4. 启动到monut状态,读取控制文件,遭遇ORA-00205
    • 4.1 再次重启,遭遇ORA-01103
    • 4.2 重建控制文件
  • 5. 恢复控制文件(推荐步骤),遭遇ORA-2703
  • 6. open数据库,遭遇 ORA-01113 & ORA-01110,需要进行介质恢复
    • 6.1 进入RMAN 进行数据库文件恢复,由于无归档,直接按默认方式
      • 尝试1
      • 尝试2
      • 尝试3
  • 7. 数据库open成功后,查看告警日志,遭遇ORA-25153: 临时表空间为空
  • 8. 简单操作测试