误删oracle安装目录,如何恢复

oracle19c删除了安装目录,只保留了几个之前新建的DBF表空间文件(业务数据都放在这里面),是否还可以通过之前新建的几个业务数据对应的DBF表空间文件恢复数据,system01.dbf,sysaux01.dbf,redo.log等已经被删除,如何恢复

找数据恢复工具

一般删除了什么东西,只要不重启就有希望拯救

通过现存的Oracle进程还可以恢复

首先,检查程序是否在回收站,如果在,恢复就好了,如果不在,前往甲骨文官网查询就可以

删库 跑路

只要电脑不重启,数据就应该还在电脑上一段时间,找数据恢复工具试试,或者去社区交流一下

花几十块钱,买个数据恢复工具

1.按原来的方式重新安装oracle
2.重新创建pfile
3.创建好pfile 之后,利用pfile把数据库启动到nomount状态
SQL> startup nomount pfile='/u01/xxxxx/dbs/initorcl.ora';
ORA-32006: SQL_TRACE initialization parameter has been deprecated
ORACLE instance started.
4.重新打开
SQL> alter database mount;
Database altered.
SQL> alter database open;
Database altered.

oracle数据库有类似回收站的功能,所以平时如果误删数据是有很大可能可以进行恢复的,前提是没有使用 truncate 方式来删除表以及没有使用 purge(drop table table_name purge)
1、误删单条数据时进行数据恢复:
首先通过历史命令目录查询执行删除数据语句的时间 可以通过快捷键(ctrl+e)或者v$sql表来查看具体的详细信息
确认时间之后可以通过执行

select * from 表名 as of timestamp to_timestamp(‘确认删除的时间’,‘yyyy-mm-dd hh24:mi:ss’);

查看被删除的数据是否存在,如果存在则可以进行数据恢复,如果没有可以把时间向前提一下。
然后恢复数据的方法就看自己喜欢那种方法了,可以复制出来,也可以使用语句进行恢复,例如我要恢复已经删除的id为 1 的语句为:

insert into 表名 (select * from 表名 as of timestamp to_timestamp(‘2021-10-16 10:35:51’,‘yyyy-mm-dd hh24:mi:ss’) where id = 1);

2、使用drop命令把整张表删除时,进行表恢复:
flashback table 表名 to before drop 执行该条语句就可以对表进行恢复了。

1、回收站看能不能回复
2、用磁盘数据还原工具🛠️恢复数据

  • 执行所有操作前,可让存储工程师,对OCR物理盘进行dd备份下
  • 清理机器注册信息
       这里可使用Geek工具一键卸载,很方便实用
  • 重装软件

误删Oracle家目录的恢复方法
https://blog.csdn.net/shipeng1022/article/details/53126581?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%AF%AF%E5%88%A0oracle%E5%AE%89%E8%A3%85%E7%9B%AE%E5%BD%95%E7%9A%84%E6%81%A2%E5%A4%8D%E6%96%B9%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-1-53126581.nonecase&spm=1018.2226.3001.4450

可以选择一些数据恢复软件
也i可以尝试以下方法(参考:https://www.cndba.cn/cndba/Marvinn/article/2876
1.GRID处理:

1、执行所有操作前,可让存储工程师,对OCR物理盘进行dd备份下
备份命令如下(自行采用):
[root@server ~]# dd if=/dev/sda of=/dev/sdb   =>    备份整个磁盘到另外一个磁盘
[root@server ~]# dd if=/dev/sdb of=sda.bak     =>    备份整个磁盘为某个文件
[root@server ~]# dd if=/dev/sda | gzip > sda.bak.gz    =>    备份并且压缩
[root@server ~]# dd if=/dev/sdaof=dbt.bak count=1 bs=512 skip=446
=>     跳过前446字节备份磁盘第一扇区的后66字节DPT信息到指定文件
=================================================================================================
恢复:
[root@server ~]# dd if=/dev/sdb of=/dev/sda
[root@server ~]# dd if=/dev/sda.bak of=/dev/sdb
[root@server ~]# gzip -dc sda.bak.gz | dd of=/dev/sda
[root@server ~]# dd if=/path/to/image of=/dev/hdx count=1 bs=512 seek=446


2、清理机器注册信息
要不然重装软件报错:[INS-40404] The installer has detected a configured instance of  oracle grid infrastructure software on the server!

[root@server ~]# cd /etc/oracle/
[root@server oracle]# ll
total 2216
drwxrwx---. 2 root oinstall      56 Dec  1  2017 lastgasp
-rw-r--r--. 1 root oinstall      40 Dec  1  2017 ocr.loc
-rw-r--r--. 1 root root           0 Dec  1  2017 ocr.loc.orig
-rw-r--r--. 1 root oinstall      80 Dec  1  2017 olr.loc
-rw-r--r--. 1 root root           0 Dec  1  2017 olr.loc.orig
drwxrwxr-x. 5 root oinstall      44 Dec  1  2017 oprocd
drwxr-xr-x. 3 root oinstall      18 Dec  1  2017 scls_scr
-rws--x---  1 root oinstall 2260760 May 23 14:02 setasmgid

为确保安全,采用MV命令备份
mv ocr.loc ocr.loc.bak
mv ocr.loc.orig ocr.loc.orig.bak
mv olr.loc olr.loc.bak
mv olr.loc.orig olr.loc.orig.bak

3、重装软件
注意:
    1、安装软件前,oracle用户属组注意,需要具备asmadmin属组(也可以不用,但是要跟ASM磁盘同样属组就好),要不然后面oracle用户无法访问ASM磁盘
    2、oracle 用户属组需要dba,要不然系统验证sqlplus  / as sysdba  报错ORA-01017: 用户名/口令无效; 登录被拒绝
上面今天处理过程中就出现该问题...一笔提出带过

3.1、由于之前清理过注册信息,重装软件,安装之前的安装步骤安装就好....相当于重装软件,重新节点信息注册到OCR
    ./runInstall
    Standalone Server:选择 Install and Configure Grid Infrastructure for a Standalone Server  命令安装
    (顺带提一下 RAC: 选择 Install and Configure Grid Infrastructure for a Cluster)

    后面注意的就是OCR磁盘组:
        1、OCR磁盘组名跟之前OCR磁盘组命名需一致
        2、OCR磁盘组中的物理ASM磁盘也需要一致不能选错...

    其他正常选择安装即可....

3.2、GI软件重装完毕,最后报错:INS-20802,选择忽略,无关紧要......root用户执行脚本并且重启has服务

    本来以为直接MOUNT 数据盘DATA就好了,使用asmca mount数据盘DATA,结果发现,ASM实例启动不起来,于是,尝试手动起ASM报错如下:
     [grid@server]$ sqlplus "/as sysasm"

    SQL*Plus: Release 11.2.0.1.0 Production on Sun Oct 25 10:16:21 2009

    Copyright (c) 1982, 2009, Oracle. All rights reserved.

    Connected to an idle instance.
    SQL> startup
    ORA-01078: failure in processing system parameters
    ORA-29701: unable to connect to Cluster Synchronization Service               --发现CSS服务没启动

    无法连接到CSS服务上.到操作系统上检查一下看看

    [grid@server]$ crsctl check css
    CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
    [grid@server]$  
    [grid@server]$  ps -ef|grep cssd
    果然没有CSS的服务daemon进程,再看一下HAS(High Availability Service)的状态

    [grid@server]$  crsctl check has
    CRS-4638: Oracle High Availability Services is online

    [grid@server]$  ps -ef|grep d.bin
    grid 5886 1 0 10:06 ? 00:00:01 /u01/app/grid/product/11.2/grid/bin/ohasd.bin reboot
    [grid@server]$  
    发现HAS的服务确实启动了的,而ora.cssd和ora.diskmon这2个服务是依赖于HAS维护的.


    进一步查看各资源的状态,发现当前资源并没有ora.asm资源,并且ora.cssd资源是offline.
    (由于当前我只处理了ora.cssd资源,并没有添加ora.asm资源,只是手动sqlplus / as sysasm 内启动了asm实例,导致后续,DB数据库无法Mount报错,请继续往下看...)

    [grid@server]$  crs_stat -t
    Name                Type                 Target    State Host 
    --------------------------------------------------------------
    ora....ER.lsnr ora....er.type ONLINE    ONLINE    server
    ora.ons        ora.ons.type   ONLINE    ONLINE    server 
    ora.evmd        ora.evmd.type   ONLINE    ONLINE    server 
    ora.cssd            ora.cssd.type        OFFLINE OFFLINE server 
    ora.diskmon         ora.diskmon.type     OFFLINE OFFLINE server

    [grid@server]$  

    再看一下ora.cssd和ora.diskmon的属性
    [grid@server]$  crs_stat -p ora.cssd
    NAME=ora.cssd
    TYPE=ora.cssd.type
    ACTION_SCRIPT=
    ACTIVE_PLACEMENT=0
    AUTO_START=never                    --nerver无法跟随has服务自启动
    CHECK_INTERVAL=30
    DESCRIPTION="Resource type for CSSD"
    FAILOVER_DELAY=0
    FAILURE_INTERVAL=3
    FAILURE_THRESHOLD=5
    HOSTING_MEMBERS=
    PLACEMENT=balanced
    RESTART_ATTEMPTS=5
    SCRIPT_TIMEOUT=600
    START_TIMEOUT=600
    STOP_TIMEOUT=900
    UPTIME_THRESHOLD=1m

    [grid@server]$  crs_stat -p ora.diskmon
    NAME=ora.diskmon
    TYPE=ora.diskmon.type
    ACTION_SCRIPT=
    ACTIVE_PLACEMENT=0
    AUTO_START=never                     --nerver无法跟随has服务自启动
    CHECK_INTERVAL=20
    DESCRIPTION="Resource type for Diskmon"
    FAILOVER_DELAY=0
    FAILURE_INTERVAL=3
    FAILURE_THRESHOLD=5
    HOSTING_MEMBERS=
    PLACEMENT=balanced
    RESTART_ATTEMPTS=10
    SCRIPT_TIMEOUT=60
    START_TIMEOUT=60
    STOP_TIMEOUT=60
    UPTIME_THRESHOLD=5s
    [grid@server]$  

    到这里基本就找到了原因了,可以看到这两个资源的AUTO_START属性默认都设置为never,也就是说他们不会随着HAS服务的启动而自动启动的,
尽管默认情况下HAS服务是开机自动启动的.好了,那我们就手动启动一下吧:
    [grid@server]$  crsctl start resource ora.cssd
    CRS-2672: Attempting to start 'ora.cssd' on 'server'
    CRS-2679: Attempting to clean 'ora.diskmon' on 'server'
    CRS-2681: Clean of 'ora.diskmon' on 'server' succeeded
    CRS-2672: Attempting to start 'ora.diskmon' on 'server'
    CRS-2676: Start of 'ora.diskmon' on 'server' succeeded
    CRS-2676: Start of 'ora.cssd' on 'server' succeeded


    注:ora.cssd和ora.diskmon这两个服务是有依赖关系的,启动哪个都会把两个都起来. 

   [grid@server]$  crs_stat -t
    Name                Type                 Target    State Host 
    --------------------------------------------------------------
    发现该两个资源已经被启动

    ora.cssd            ora.cssd.type        ONLINE  ONLINE  server 
    ora.diskmon         ora.diskmon.type     ONLINE  ONLINE  server 
    [grid@server]$ 

   =====================================================================================================
    tips

      1)默认情况下HAS(High Availability Service)是自动启动的.通过如下命令可以取消和启用自动启动
        crsctl disable has
        crsctl enable has
      2)HAS手动启动和停止
        crsctl start has
        crsctl stop has
      3)查看HAS的状态
        crsctl check has
      4)如果想让ora.css和ora.diskmon服务随着HAS的启动而自动启动,那么你可以这两个服务的AUTO_START属性
        crsctl modify resource "ora.cssd" -attr "AUTO_START=1"
        or 
        crsctl modify resource "ora.diskmon" -attr "AUTO_START=1"
      5)如果想取消ora.css和ora.diskmon的Auto start 
        crsctl modify resource "ora.cssd" -attr "AUTO_START=never"
        crsctl modify resource "ora.diskmon" -attr "AUTO_START=never"
===========================================================================================================

   CSS服务起来了,重启动asm instance,发现ASM启动,但是仍然有报错

    [grid@server]$  sqlplus "/as sysasm"

    SQL*Plus: Release 11.2.0.1.0 Production on Sun Oct 25 10:30:03 2009

    Copyright (c) 1982, 2009, Oracle. All rights reserved.

    Connected to an idle instance.

    SQL> startup 

        ORA-00099: warning: no parameter filespecified for ASM instance
        ASM instance started
        Total System Global Area 284565504 bytes
        Fixed Size 1336036 bytes
        Variable Size 258063644 bytes
        ASM Cache 25165824 bytes
        ORA-15110: no diskgroups mounted

    事后回想:这里是不是可以直接添加ora.asm资源,因为ASM参数文件位于DATA磁盘组,然后在启动即可? 而不是通过我得方式处理,可能是不行的,因为当前DATA磁盘组并没有MOUNT上....根本无法获取到ASM参数文件
        grid用户添加命令如下:
        $srvctl add asm -l LISTENER         (-l listener name)
        $srvctl start asm -n server -o open

    当前处理方式:
ORA-00099: warning: no parameter filespecified for ASM instance
pfile 参数文件的路径$ORACLE_HOME/dbs/init$ORACLE_SID.ora  例如 ORACLE_SID=+ASM 
pfile $ORACLE_HOME/dbs/init+ASM.ora
内容如下:
*.asm_diskstring='/dev/sda2'            --DATA磁盘组物理盘路径
*.asm_diskgroups='DATA'                    --DATA数据磁盘组名称
*.asm_power_limit=1
*.diagnostic_dest='/opt/app/oracle'         --GRID用户下ORACLE_BASE目录 
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'            --其他配置不变

解释:
*.asm_diskgroups='DGASM1' 的作用是在启动asm实例的时候自动加载的磁盘组,如果不设置这个参数,那么只能启动asm实例,但是不能加载asm磁盘组,只能后来手动挂载asm磁盘组了。
如果 asm实例的启动没有用spfile文件,但是也没有用pfile文件,而是用了默认的文件,那我我们可以手动创建pfile文件,然后在create出spfile文件即可。spfile文件是位于asm磁盘组上

     [grid@server]$  sqlplus "/as sysasm"

    SQL> shutdown immediate
    SQL> startup                    --ASM实例启动成功,并且数据磁盘组DATA也自动挂载mount 
    SQL> create spfile ='+DATA/orcl/asm/spfile+ASM.ora' from pfile='/u01/oracle/11.2.0/dbs/init+ASM.ora'   --该步骤可以后期处理...再重新init+ASM.ora指定位置重新启动ASM,或者mv $ORACLE_HOME/dbs/init+ASM.ora文件重新启动....当前处理方法,没有采用...采用的本地pfile

==================================================================================================================
额外说明:
    由于当前并没有,添加ora.asm资源,导致后面mount数据报错:
    (处理方法步骤清往下看 第二章节DB处理)
    ORA-00205: error in identifying control file, check alert log for more info

查看数据库ALERT告警日志:发现一大推类似错误,权限不足
ORA-15025:could not open disk "/dev/asma"
ORA-27041:unable to open file
Linux-x86_64Error: 13: Permission denied
Additionalinformation: 9
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete

====================================================================================================================

2.DB处理

1、重装DB软件,注册数据库信息

1.1、重装DB软件过程省略.
    注册数据库:(ORACLE用户)
    srvctl add database -d orcl -o $ORACLE_HOME -p +data/stdby/spfilestdby.ora   -p参数:填写位于磁盘组DATA下的spfile参数文件(可grid用户下asmcmd查看)
    srvctl add instance -d orcl -i orcl -n server


1.2、启动数据库nomount,发现报错不能创建Audit审计目录,因为我们已经Mount 数据磁盘组,可以grid用户 asmcmd内cp 出数据库参数文件,并且vi 打开,查看adump目录创建位置,并且创建,然后重新nomount数据库即可...

1.3、因为之前说过,即使手动启动了ASM实例,但GI online资源没有ora.asm资源,数据库安装完毕,mount数据库会报错
ORA-00205: error in identifying control file, check alert log for more info

查看数据库ALERT告警日志:发现一大推类似错误,权限不足
ORA-15025:could not open disk "/dev/asma"
ORA-27041:unable to open file
Linux-x86_64Error: 13: Permission denied
Additionalinformation: 9
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete
ORA-15040:diskgroup is incomplete

解决:
1、检查ASM磁盘权限660,属主grid,属组asmadmin正常....
2、检查oracle用户属组,发生没有在属组asmadmin
    id oracle
    usermod -G asmadmin,asmoper,dba oracle

修改ORACLE用户属组后,再次mount数据库仍然是报错ORA-00205,alert告警仍然是这些....但是发现其他特别的报错:GRID资源 "ora.asm not register"以及"ora.crsd not register" 因为has高可用封装了crs,这个可以不管,只要处理ora.asm资源即可...
解决方法:
        grid用户添加命令如下:
        $srvctl add asm -l LISTENER         (-l listener name)
        $srvctl start asm -n server -o open

1.4、再次mount数据库,mount成功,
1.5open数据库,报错本地文件缺失,因为当前环境有些本地数据文件,所以直接offline drop丢失的本地数据文件即可
如:
alter database datafile '/u01/oralce/db.dbf' offline drop1.6、重新Open数据库,open成功
问题总结
恢复流程:

1、清OCR注册信息

2、重装GI软件,重配置注册OCR

3、添加CSSD资源并启动

4、编辑ASM参数文件,并MOUNT数据磁盘组DATA

5、重装DB软件

6、srvctl 命令添加数据库

7open数据库

可以尝试使用硬盘数据恢复工具,看能否把删除的数据找回来。

看看是不是在回收站,如果在回收站,直接回收站还原即可
如果回收站没有,你用删除文件恢复工具恢复,
可以下载数据恢复工具试试
https://www.onlinedown.net/soft/612276.htm
工具安装到U盘,在没恢复文件之前,不要存取任何文件到被删除的盘

解决方法

1、使用的linux的服务版本还是桌面版本
2、如果是后者,直接从回收站恢复,
如果是前者,需要知道是什么操作系统

恢复错误删除文件夹是可能的,但有许多因素会限制您可以执行的操作,包括文件系统类型、删除时间等

下面这两种恢复方法或许可以尝试下:

上面两种都是或许可行的恢复方案,你可以试下

当然,如果之前你这边提前有备份的话,那就直接用备份恢复

如果时间来得及,并且上述操作都没生效,
这个方法或许也可以试下:

误删oracle数据库文件,Oracle数据库运行时rm误删文件的解决方法_东方银的博客-CSDN博客 网上可以看到不少有关oracle运行时误删数据文件的讨论,对于使用rm操作系统命令删除的文件,可以通过copy文件描述符来恢复文件,当然这种方式的前提还是数据库还在运行。但在DB还在运行时直接copy文件描述符来恢复文件,这样操作其实有几个问题:copy过程中需要额外的存储空间在数据库checkpoint发起之前,对误删数据文件的所有copy操作必须完成,否则来不及copy的数据文件将会因为实例终... https://blog.csdn.net/weixin_36206388/article/details/116388463?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-6-116388463-ask-7727908.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-6-116388463-ask-7727908.pc_feed_download_top3ask

参考链接:


如有问题及时沟通

处理思路:
1、要么在原机器清理,重装软件、注册
2、要么新开一台机器,安装软件,ASM磁盘可见访问,注册ASM磁盘即可(添加节点方式)

可参考如下链接ORACLE 删除软件安装目录恢复处理 -- cnDBA.cn_中国DBA社区

1,找工具恢复删除的文件,花点钱恢复的效果还是不错的
https://huifu.wondershare.cn/undelete-freewares.html


2,如果业务部分数据有,加上你之前有备份数据或者,主要数据都有,可以重装数据库,然后恢复已有表结构和数据