十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
任何软件都有可能在有意或无意的情况下被重新安装,如Oracle重装后数据库怎么恢复呢?情况发生在你是无意的情况下!ORACLE数据库恢复的方法我们经常会用到,下面就为您介绍重装系统后ORACLE数据库恢复的方法,希望对您学习ORACLE数据库恢复方面能有所帮助。\x0d\x0a\x0d\x0a我的电脑突然挂了,不得不重装系统,不过我的ORACLE装在了D盘,所有的文件都还在,我相信一定能够恢复,直到搞定工作,我才开始整我的数据库,花了两天时间,终于恢复了,庆祝一下,同时总结一下,希望有遇到同样问题的朋友能够快速搞定此类问题\x0d\x0a\x0d\x0a第一种:\x0d\x0a\x0d\x0a首先,备份数据库(X:\oracle\oradata)下的数据文件,重新命名即可(否则装数据库的时候会提示sid已存在)。重新安装数据\x0d\x0a库,当然数据库的名字就是你要恢复的名字。安装完成后,打开控制面板,停止oracle的服务。把(X:\oracle\oradata)下新生成的文件\x0d\x0a改名,把原先目录下的文件恢复名字。再重新启动oracle服务和监听。用sys/as dba \x0d\x0a登陆数据库,可能会提示权限不够(ora-01031)修改(X:\oracle\ora92\network\admin \x0d\x0a)文件夹下的sqlnet.ora文件,添加SQLNET.AUTHENTICATION_SERVICES= \x0d\x0a(NTS),增加权限。登陆进去后,打开table提示不能打开。打开common页,执行命令alert database \x0d\x0aopen;这时再刷新table,发现原先的表可以打开了。恢复成功了。再用原先数据库的普通用户进入。发现一切正常。至此,大功告成。\x0d\x0a\x0d\x0a第二种:\x0d\x0a\x0d\x0a1、首先,将原来的ORACLE文件夹改名,原来的路径是D:/oracle.我暂时改成D:/oracle_old.找来ORACLE(我用\x0d\x0a的是ORACLE 9I)安装光盘,将ORACLE安装在原来安装的目录下,这样恢复起来更加方便,主要是注册表的内容不用修改。\x0d\x0a\x0d\x0a2、安装完了之后,系统中又有一个可以使用的ORACLE了。这个时候要做的就是将原来的文件和数据恢复过来。第一步,先关闭ORACLE的所\x0d\x0a有已经启动的项目,在"服务"里面逐一关闭。然后,将安装目录改名。我现在用的是D:/oracle.改成D:/oracle_new.再将D:\x0d\x0a/oracle_old改成D:/oracle. \x0d\x0a这样理论上说从物理层面恢复了ORACLE了。但是我们发现,现在还不能启动ORACLE的监听程序和服务程序。我们还要从逻辑上解决。\x0d\x0a\x0d\x0a3、在dos环境下执行一个删除命令:oradim -delete -sid mm,其中mm为创建oracle时候创建的实例 \x0d\x0a建议执行这个命令后重新启动机器,重启后就可以建立和原来实例名相同的实例。当然你懒,不重新启动也可以,但是你的实例名就不能和原来的一样了。\x0d\x0a\x0d\x0a4、在dos环境下执行命令 oradim -new -sid mm -startmode a -pfile "D:\oracle\admin\mm\pfile\initmm.ora "创建一个新的实例,其中 "mm"为新数据库的名称。\x0d\x0a\x0d\x0a5、启动服务,先打开数据库,然后可以用以前的用户名和密码登陆进去。 \x0d\x0a要补充的是,一般的ORACLE数据库的监听程序都是用电脑的名称来识别地址的,而不是127.0.0.1或者localhost.所以,如果我们安装系\x0d\x0a统的时候用的是不同的电脑名称(比如我原来用的是wm_mm.重新安装后用的是wenming_mm),那么我们还有一个工作要做,就是修改文件 \x0d\x0alistener.ora.将里面的相关的东西改过来就可以了。\x0d\x0a\x0d\x0a需要耐心、细心,可能在一步里有一个细小的差别就会出些古怪的错误提示,有时需要根据错误提示采取策略,总之原理是,先装一个一模一样的ORACLE,安装目录、数据库名称都一样,这样保证注册表里不用更改;再覆盖物理文件,最后重新实例化,打开数据库就可以进去了。
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序制作、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了海城免费建站欢迎大家使用!
不知道你重装前都备份了哪些文件,只要你那五种文件都有备份,恢复起来不是很难。主要归纳为以下几步:
1.将原来的oracle文件夹重命名,比如oracle_old;然后重新安装oracle
到原目录,即跟重装操作系统前同一目录,假设为d:\oracle;安装过程选择"只安装软件"
即不创建数据库,这样可以节省很多时间.
注:恢复必须要有以下文件
a、初始化参数文件INIT.ORA
b、所有数据文件 .dbf
c、所有重做日志文件(联机日志、归档日志)redo
d、所有控制文件 crtl
e、internal密码文件
2.配置listener和tns:
运行lsnrctl start,即可在创建监听服务;
使用net manager配置tns,但不要测试(数据库没有起来肯定测试不通过的);
3.将oradata文件夹拷贝回原目录(如d:oracleoradata);
4.将spfile拷贝回原目录(如d:oracleora92database);
5.创建实例服务:
oradim -new -sid orcl -startmode auto
6.重建口令文件:或是复制原来的pwdorcl.ora yhy9为实例名
orapwd file=d:oracleora92database password=orcl entries=5
7.重启监听和实例.
8.如果数据库没有启动就进入sqlplus手工打开数据库
sqlplus /nolog
sqlconn sys/orcl@orcl as sysdba
sqlstartup;
一定要有提示成功打开,否则重复以上办法解决。
9.如果数据库顺利打开,整个实例恢复过程即完成.
经验证通过以上操作,完全可以恢复成功。需要的是耐心、细心。
如果中间有报错,则一步步根据报错到网上查找解决办法。
Oracle认证:Oracle控制件文件修复
查看文件头SCN号:
SQL select file#, checkpoint_change# from v;
FILE# CHECKPOINT_CHANGE#
1 18120070
2 18120070
3 18120070
4 18120070
5 18120070
6 18120070
7 18120070
8 18120070
9 18120070
10 18120070
11 18121207
FILE# CHECKPOINT_CHANGE#
12 18121196
12 rows selected.
查看控制文件SCN号:
SQL select file#, checkpoint_change# from v;
FILE# CHECKPOINT_CHANGE#
1 18120070
2 18120070
3 18120070
4 18120070
5 18120070
6 18120070
7 18120070
8 18120070
9 18120070
10 18120070
11 18121207
FILE# CHECKPOINT_CHANGE#
12 18121196
12 rows selected.
SQL
当数据文件SCN号大于控制文件scn号,即会发生控制文件太久的提示,
当数据文件SCN号小于控制文件scn号时, 则提示mediea recovery提示
当数据文件sCN号等于控制文件scn号,正常启动实例
SQL alter database backup controlfile to trace as '/u01/Oracle/admin/ora9i/udump/c.trc';
Database altered.
SQL
/u01/Oracle/oradata/ora9i
[oracle@test ora9i]$ rm control0*
[oracle@test ora9i]$
SQL shutdown immediate;
ORA-00210: cannot open the specified controlfile
ORA-00202: controlfile: '/u01/Oracle/oradata/ora9i/control01.ctl'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
SQL shutdown abort;
ORACLE instance shut down.
SQL
修改备份c.trc文件使用第一个sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA9I" NORESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 '/u01/Oracle/oradata/ora9i/redo01.log' SIZE 100M,
GROUP 2 '/u01/Oracle/oradata/ora9i/redo02.log' SIZE 100M,
GROUP 3 '/u01/Oracle/oradata/ora9i/redo03.log' SIZE 100M
DATAFILE
'/u01/Oracle/oradata/ora9i/system01.dbf',
'/u01/Oracle/oradata/ora9i/undotbs01.dbf',
'/u01/Oracle/oradata/ora9i/cwmlite01.dbf',
'/u01/Oracle/oradata/ora9i/drsys01.dbf',
'/u01/Oracle/oradata/ora9i/example01.dbf',
'/u01/Oracle/oradata/ora9i/indx01.dbf',
'/u01/Oracle/oradata/ora9i/odm01.dbf',
'/u01/Oracle/oradata/ora9i/tools01.dbf',
'/u01/Oracle/oradata/ora9i/users01.dbf',
'/u01/Oracle/oradata/ora9i/xdb01.dbf',
'/u01/Oracle/oradata/ora9i/app2.dbf',
'/u01/Oracle/oradata/ora9i/app1_01.dbf'
CHARACTER SET ZHS16GBK
;
# Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE
# All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
# Database can now be opened normally.
ALTER DATABASE OPEN;
# Commands to add tempfiles to temporary tablespaces.
# Online tempfiles have complete space information.
# Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/Oracle/oradata/ora9i/temp01.dbf' REUSE;
# End of tempfile additions.
# ;
Oracle数据恢复专题
备份恢复是Oracle中永恒的话题, 只要有数据 就有备份恢复的需求。 而在国内对于备份以及备份的可用性往往被企业所忽视。这造成了再数据库恢复上存在着东西方的差异。 更多的老外DBA把经历花在对Oracle内部原理和性能优化的研究上。
oracle data block structure
而我们国内 DBA似乎必须要精通一门额外的技术==》 在没有任何备份的情况下 恢复Oracle数据库中数据的技术! 虽然这在大多数情况下是屠龙之技, 但很多时候却又变成了衡量一个DBA技术水准的标准了,(这样不好.. 不好)。
当然也并不是说 这种无备份下的数据恢复是无技术含金量的,实际上它们很需要对Oracle数据文件、数据块及其数据结构的理解,以及对数据字典构成的了解。
这里我们总结Oracle数据恢复专题的专题,包括一些在无备份情况下的数据恢复:例如DUL和BBED工具恢复等技术。
【数据恢复】利用构造ROWID实现无备份情况下绕过ORA-1578、ORA-8103、ORA-1410等逻辑/物理坏块问题
【数据恢复】ORA-600[kccpb_sanity_check_2]一例
Oracle rman中set newname可能很慢
如何清除Oracle控制文件中的无用记录,例如v$archived_log中的deleted归档日志记录
如何找回被create or replace覆盖的PL/SQL对象
Archivelog Completed Before VS UNTIL TIME
ASM丢失disk header导致ORA-15032、ORA-15040、ORA-15042 Diskgroup无法mount
Overcome ORA-600[4xxx] open database
数据恢复:解决ORA-600[kghstack_free2][kghstack_err+0068]一例
清理RMAN Catalog恢复目录
如何rename datafile name中存在乱码的数据文件
11g新特性recover corruption list
解决ORA-01578错误一例
Script:收集介质恢复诊断信息
如何重建SYSAUX表空间上的对象
Oracle数据恢复:解决ORA-00600:[4000] ORA-00704: bootstrap process failure错误一例
Script:检查数据库当前是否有备份操作在执行中
数据恢复:模拟2个逻辑坏块
Script:收集Oracle备份恢复信息
Oracle备份恢复:Rman Backup缓慢问题一例
了解rman catalog的兼容性
Oracle内部错误:ORA-00600[2608]一例
使用bbed解决ORA-01189错误
Fractured block found during backing up datafile
手动递增SCN号的几种方法:How to increase System Change Number by manual
DBMS_REPAIR example
Oracle的损坏/坏块 主要分以下几种:
ORA-1578
ORA-8103
ORA-1410
ORA-1499
ORA-1578
ORA-81##
ORA-14##
ORA-26040
ORA-600 Errors
Block Corruption
Index Corruption
Row Corruption
UNDO Corruption
Control File
Consistent Read
Dictionary
File/RDBA/BL
一种方法是重装数据库后用IMP来导入原来的数据,但使用这种方法的前提是你有以前数据的备份,并且这种方法还有许多不足的地方,如备份过旧,可能会丢失许多数据、导入数据太长等。
一般情况下我们可以采用重用原来的数据库的方法来恢复。在讲步骤前先说说这种方法的原理。
数 据库与实例对应,当数据库服务启动后,我们可以用SQLPLUS "/AS SYSDBA"方法连接到一个空闲的例程,当执行startup启动数据库时,首先会在%ORACLE_HOME%/database下找当前SID对应 的参数文件(PFILE或者SPFILE)和密码文件,然后启动例程;接着根据参数文件记录的信息找到控制文件,读取控制文件的信息,这就是mount数 据库了;最终根据控制文件的信息打开数据库。这个过程相当于对数据库着了一次冷备份的恢复。
下面的具体步骤:(我们假设原库的所有相关文件都存在)1、安装数据库软件只需安装同版本的数据库软件即可,不需要创建数据库。最好安装在和原来数据库同样的%ORACLE_HOME%下,省得还要修改参数文件路径等。(直接覆盖原来的oracle即可)再次强调,只安装软件,不创建数据库,否则将数据库软件安装在同样的目录下旧的部分数据文件会被覆盖,这样数据库也不能被恢复了。
2、新建一个实例在cmd窗口执行oradim -new -sid xinhai注意,这个SID名称最好与你以前的SID一样,否则在启动的数据需要指明pfile,并且需要重建密码文件,比较麻烦。(当然,如果你就不想用原来的SID也可以,把参数文件、密码文件的名称都改成与新SID对应的名称)。
3、启动数据库做完以上两步,就可以启动数据库了。用net start 检查oracle服务是否已经启动,如果oracle服务没有启动,则在cmd下运行如下命令:net start oracleservicexinhai然后设定必要的环境变量,在cmd窗口运行set ORACLE_SID=xinhai
接着连接数据库sqlplus "/as sysdba"startup
如果正常的话,数据库应该就能起来了
4、启动监听lsnrctl start
5、后续工作经过以上几步后,基本上就可以使用oracle了,但是使用起来有点不方便,如每次在cmd中启动数据库都需要先SET ORACLE_SID、在本机连接数据库也都需要加上@TNSNAME等。我们可以修改注册表,添加ORACLE_SID的信息,避免这些麻烦。
在注册表的HKEY_LOCAL_MACHINESOFTWAREORACLE下新建字符串值,名称为ORACLE_SID,值为xinhai。也可以将以下内容保持成一个后缀名为reg的文件(文件名随便起),然后双击,即可将信息导入到注册表中。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREORACLE]"ORACLE_SID"="xinhai"
注意,以上步骤都是在%ORACLE_HOME%、%ORACLE_SID%都与原库一样的情况下讨论的,虽然%ORACLE_HOME%和%ORACLE_SID%可以与原库不一样,但为了减少麻烦和出错的几率,建议不要改变则两个值。
6、如果系统启动时 还不能启动oracle就增加以下
编辑一个oracle_startup.bat文档 内容为:
set sid=xinhailsnrctl starte:/oracle_startuplog.logsqlplus /nolog @e:oracle_startupsql.txte:/ oracle_startuplog.log
在e盘下增加文档oracle_startuplog.log,内容为:
connect / as sysdba;startup nomount;alter database mount;alter database open;quit
然后把oracle_startup.bat放到系统启动项里面,这样每次启动系统时oracle就自动启动了。
根据oracle数据库的特点和提供的工具,主要方法有以下几种方法:
利用逻辑备份使用import工具丢失数据的表
利用物理备份来通过还原数据文件并进行不完全恢复
利用dbms_logmnr包从redo log文件中恢复
利用flashback特性恢复数据
前提
为了方便使用方法的介绍,上述恢复方法都将基于以下场景进行:系统管理员在前一天晚上11点用export对数据库做了全库逻辑备份,然后对所有数据文件进行了热备份。第二天上午10点,系统管理员在修改表TFUNDASSET的数据时,由于修改语句的条件写错了,导致一批记录(几千条)的ztm字段被修改成了错误的值,而且已经提交。这个表是资产表,相对而言数据变化不频繁。
一、利用逻辑备份使用import工具恢复丢失的数据
export/import是oracle提供的用于对数据库进行逻辑备份的工具。该工具适用于备份那些数据量不大、业务量不多的数据库系统。因为如果在前一天晚上11点用export做了逻辑备份,那么当今天上午10点数据库意外崩溃时,从备份起到数据库崩溃的这段时间里的数据修改操作(包括DDL和DML)都会丢失。如果丢失数据内的表上的数据是相对比较稳定,也就是说该表上基本没有DML操作,例如标准代码表、分区表里的历史数据,那么采用import来导入该表可以比较完整的恢复数据。如果该表是经常变化的业务表,那么这些丢失的数据只能根据业务情况从纸质记录恢复,或者其他途径恢复。
▲示例如下:这个表是一个资产表。相对来说,今天系统运行中修改的数据较少,丢失的数据量可以承受或者可以从别的途径恢复。那就可以用import来恢复。
方法一:
1、把这个表的数据备份到另一个表:
8bef9890242e5d20d09563896cef1471.png
2、删除该表的记录:
625dfa5d5986ca5c37dd5017953407cb.png
3、执行下面的命令:
3754d50cc473bd44236d927f00196d24.png
这个命令中在关键字tables中指定需要导入的表名字,ignore=y表示忽略表已经存在的错误。
4、导入结束后,检查表中的记录,并用适当的方法恢复当天的修改。
方法二:
1、 把需要恢复的表导入到另一个用户下面:
33806d1216df5ae9c45890d3d45930ee.png
2、检查数据以后,把原表记录删除:
fe23a8a4602702e951e5ab48a7460e3b.png
3、然后从另一用户表中插入回去:
729976810ef459046df40b791a6ca773.png
4、 数据量比较大时可以采用如下方法:
e377d10ff07132f160185cb1ba119cfc.png
二、利用物理备份来通过还原数据文件并进行不完全恢复
如果数据库运行在归档模式下,那么可以通过使用以前的数据文件备份进行还原,然后利用归档日志进行前滚,直到回滚到错误操作的时间点前,然后重置日志文件打开数据库。
可以通过下列方法确认是否是运行在归档模式:
c8406e42aef7ccc8ef232cfdd535e825.png
如果是如上所示,那么就是运行在归档模式了。
▲假定在前一天晚上11点做了全库物理备份,那么可以考虑如下恢复:
1、关闭数据库:
由于数据库的不完全恢复必须在一个关闭的数据库上实施,利用一个旧的数据库的备份还原,然后用日志根据需要逐步前滚,而不能还原一个新的备份,再回退到某个时间点。
通知各客户端数据库将关闭,然后发出:
401f68e89cbfa03388f5913bf5f1ecfd.png
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
2、确定错误操作的时间:
可以根据操作员的估计来确定不完全恢复需要前滚停止的时间,也可以利用LogMiner来分析日志文件(这个工具将在后面介绍),找出错误操作的准确时间。
3、还原数据文件:
先对当前的数据库文件进行备份,然后再用以前的最近一次备份覆盖现有数据文件。注意:不覆盖现有的控制文件。
4、基于时间点恢复,启动数据库到装配状态:
8802043c250eb2a060285be160f48c36.png
这样数据库就恢复到了2015年10月20日的9点58分零秒。
然后再利用业务资料补充这段时间内的数据。
三、利用dbms_logmnr包从log文件中恢复
这个包是由Oracle提供,与dbms_logmnr_d包配合使用可以方便地分析联机日志文件和归档日志文件,从这些日志文件中提取出所有对数据库的更改操作。
在使用这个包之前,需要先做一些设置和修改:
1、打开initorcl.ora,修改初始化参数utl_file_dir,设置dbms_logmnr_d包将要使用的数据字典文件的放置目录。
eb6dad504d6f5841641cbd02c5f6dee1.png
然后重启数据库使参数生效。
2、以sys用户连接到数据库执行dbmslmd.sql脚本重建dbms_logmnr_d这个包。
应用Logminer分析重做日志文件的操作主要有以下步骤:
● 使用dbms_logmnr_d里的存储过程build创建一个外部数据字典文件;
● 使用dbms_logmnr里的存储过程add_logfile添加要分析的日志文件;
● 使用dbms_logmnr里的存储过程start_logmnr启动分析;
● 查询与dbms_logmnr相关的几个视图来获取日志文件内容;
● 使用dbms_logmnr里的存储过程end_logmnr结束分析。
▲下面详细讲述使用的过程
1、使用dbms_logmnr_d里的存储过程build创建一个外部数据字典文件:
a0975e25f5049f1ffdfdd49ad7ae943d.png
2、使用dbms_logmnr里的存储过程add_logfile添加要分析的日志文件到待分析文件列表:
d16ea343204a3a15b29bc6b94985d48d.png
如果没有运行在归档模式,那么由于重做日志文件的循环使用可能导致日志文件被覆盖而无法获取到所要寻找的恢复条目。如果运行在归档模式,则可以通过查看$ORACLE_HOMEadminorclbdump目录下的alert_orcl.log里日志文件归档的时间和错误操作的时间来确定加入哪些归档日志文件到待分析的文件列表中去。
eff89b61175131d3edda456d8d9bc18e.png
注意:执行以上过程时logfilename参数需要写日志文件的全路径,否则会报错。重复以上操作直到把所有需要分析的文件都加到列表中去。这样就可以启动进行分析。
3、使用dbms_logmnr里的存储过程start_logmnr启动分析;
3630359ea5afa57b5ea51c89da5b8c41.png
这样就可以通过下面的查询来获取日志文件的内容了。
4、查询与dbms_logmnr相关的几个视图来获取日志文件内容;
3f8098efdbe50d4b5b4a5311eab6b5d0.png
这样就可以找出要恢复所需的语句。注意:v$logmnr_contents只对执行dbms_logmnr.start_logmnr的会话有效,如果通过其他会话或者使用dbms_logmnr.end_logmnr终止了分析,都将不能访问v$logmnr_contents的数据。如果要使其他会话也能获取到这些数据,可以通过另外建表来实现,如:
create table undo_sql as select * from v$logmnr_contents。
再对undo_sql进行授权,其他用户就可以访问v$logmnr_contents的数据了。
5、使用dbms_logmnr里的存储过程end_logmnr结束分析。
使用完成以后用下面的命令来结束分析活动:exec dbms_logmnr.end_logmnr;
这样就释放了分配给logminer的资源(内存和数据结构)。
从上面的过程可知,如果是更新的数据量比较大,而日志文件比较小,就可能会导致日志文件的切换。如果没有及时去挖掘日志文件(没有运行在归档模式),那么可能会由于日志文件的循环使用而导致数据不可恢复。如果运行在归档模式,也可能由于需要分析的日志文件比较多而时间较长。
四、利用flashback新特性恢复数据
Oracle9i 开始提供了闪回查询(Flashback Query)功能,对于误删除或者误更新并且已经commit了的情况提供了简便快捷的恢复方法;而在Oracle 提供闪回查询之前,碰到这种情况只能通过备份来进行基于时间点的恢复或者使用logmnr挖掘日志来恢复,无疑这比闪回查询要麻烦而且费时。
使用这个Flashback Query特性的前提条件:
1. 数据库必须处于Automatic Undo Management 状态。
9d9facd0a8d3e8675284d38f601525d1.png
2. 最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定
b7a419e2f47bd4d31005ca2d9b4a7c58.png
可以通过ALTER SYSTEM SET UNDO_RETENTION = ;来动态修改参数值。
▲如何使用Flashback Query来恢复数据呢?
1. 通过SQL
28b1053a806762ec87261e80f0e8751f.png
使用SELECT 语句的AS OF 来进行闪回查询,语法如下:
使用AS OF 关键字来对表,视图或者物化视图进行Flashback Query,如果指定了SCN,那么expr 部分必须是一个数字,如果指定了TIMESTAMP,那么expr 必须是一个timestamp类型的值。查询结果将返回在指定的SCN 或者时间点上的数据。
下面我们使用scott 方案来作一个实验。
24547dbf2f8f3515319435d98acc0f10.png
如果想在update 的子查询部分使用AS OF,那么该查询只能返回一条记录,否则将会报错。
可以通过添加一个临时表作为中转,然后再作更新,如下:
5605ae591ab357c7148787937df03e17.png
2.通过DBMS_FLASHBACK包来恢复
DBMS_FLASHBACK 包提供了以下几个函数:
ENABLE_AT_TIME:设置当前SESSION 的闪回查询时间
ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION 的闪回查询SCN
GET_SYSTEM_CHANGE_NUMBER:取得当前数据库的SCN
DISABLE:关闭当前SESSION 的闪回查询
当将一个SESSION 设置为闪回查询模式之后,后续的查询都会基于那个时间点或者SCN 的数据库状态,如果SESSION 结束,那么即使没有明确指定DISABLE,闪回查询也会自动失效。
当SESSION 运行在闪回查询状态时,不允许进行任何DML 和DDL 操作。如果要用DML操作来进行数据恢复就必须使用PL/SQL 游标。
▲示例:
fbaf8acfe357d8f21039d588c8b658df.png
通过上面的例子可以看出,只要这个修改的时间不早于sysdate- (UNDO_RETENTION指定的秒数),就可通过这种方式来恢复数据。
e93c4d7b11cf4e7c8ed9a0d27c79ea80.png
对于问题中的批量数据,可以写个过程来完成获取到更改前的数据:
然后再用这个临时表里的数据来更新TFUNDASSET就可以了。
五、总结
比较以上几种恢复数据的方法的使用过程,我们可以看出:
● exp/imp只适合于数据变化不大的表的数据丢失的情况,即使用这种方法处理后也需要从业务办理资料中修正数据,否则导致数据丢失;
● 采用基于时间点的不完全恢复可以恢复丢失的数据,但是需要关关闭数据库,减少系统可用时间,而且也会丢失恢复时间点以后的数据;
● 使用LogMiner可以较好的恢复数据,但是要求数据库尽可能运行在归档模式,否则也可能导致数据丢失。好处是不用关闭系统,能够从日志文件中得到所有的数据。
● 使用Flashback最方便和简洁,可以直接得到修改前的数据,但是需要依赖系统设置,并且需要占用大量的回滚表空间。
因此选择什么样的方法来恢复数据,取决于你的系统环境和具体情况,不能生搬硬套。采用正确的方法才能最大程度的减少数据的丢失。
当然,最好是不需要用到这些恢复的办法。前提是,你必须做好以下的工作:
1、 为不同环境创建不同的数据库用户、不同密码(如果不能用户不同,一定要密码不同);
2、 将owner和应用用户分开,并做适度授权;
3、 在做DML前,先用同样的条件做查询,看根据结果集是否符合预期。