如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
RMAN 备份和执行 Flashback 恢复
在日常生活中,人不可避免地会犯错,作为一个数据库管理员,管理着成千上百个数据库,你应该能够撤回,解决人们在数据库上犯的错,所以,你需要,你需要配置数据库,使用 Oracles功能成功解决用户不正确操作犯得错误,本章讲述如何配置数据库,向Bob学习一点不执行数据库不完全恢复,如何成功地从不同的情况中恢复数据。
恢复数据库分不同的情况,部分数据库被不正确地改变、删除或丢弃, Oracle 提供了每一种人类错误的不同复杂情况,让你很快回到具体的时间!
假设:
你是一个开发商,忘记在语句末使用WHERE 语句,改变了公司每个职员的工资,提交了事务。
或者,你不小心删除了一个重要的命名为 emp_salary 的表,而非删除了emp_salary_backup.
你运行一个晚上脚本,改变表号,你收到经理电话,告诉你脚本中有错误,所以,你需要不执行不完全恢复,不能有停机时间,返回到数据库的之前状态。
你收到用户电话,他错误地改变了一些数据,想要不对整个数据库执行不完全恢复,只恢复那个表。
你需要撤销用户在三小时前提交的一个交易或很多交易。
在每个版本中, Oracle 有不同的新功能和方法增加数据库的可用性,所以,如果你正确地进行必要的配置,你能够不影响连接到数据库上的用户进行任何恢复操作。
在本章中,你会学会面对人的错误,使用Oracle flashback 技术解决错误,该技术包括很多功能,帮助你因为认得错误不执行不完全恢复。下面是不同的场景下的功能,并进行了详细解释:
Flashback 查询
Flashback版本查询
Flashback 交易查询
Flashback交易回退
Flashback 表
Flashback 删除
Flashback 数据库
Flashback 数据归档
- 作为一个概述,这里是每一个这些功能的简要说明:
Oracle flashback查询功能让你能够看到表的提交的数据,因为它是在过去的某一时间。
Oracle flashback 版本查询功能是你能够看到存在于过去具体时间间隔的行的所有提交版本。
- Oracle flashback 交易查询功能使你能够看到交易水平某一个表的变化,执行交易恢复。
Oracle flashback交易回退功能 使你能够回滚交易和所有依赖的交易。
Oracle flashback 表功能使你能够恢复一个表或很多表到具体的时间点。
Oracle flashback 删除 颅功能使你能够很快地删除表,如果它还存在于回收站的话。
Oracle flashback数据库功能使你通过不执行任何复原/恢复操作,将数据库及时返回到某一点。
Oracle flashback 数据归档功能是你能够从表创建开始存储所有的交易变化。
一些功能使用撤销信息,一些使用回收站和 flashback日志检索时间点上的数据。在下列表中你可以看到flashback 恢复过程中检索的数据的来源。
Flashback Technology |
The Source of the Data Retrieved |
Flashback query |
undo tablespace |
Flashback version query |
undo tablespace |
Flashback transaction query |
undo tablespace |
Flashback transaction backout |
undo tablespace |
Flashback drop |
recycle bin |
Flashback table |
undo tablespace |
Flashback data archive |
flashback data archive |
Flashback database |
flashback logs |
Table 11.1: Flashback 恢复过程中检索的数据的来源
详细地涉及每个技术之前,首先要了解一些功能是如何使用撤销信息检索信息的机制,用户改变数据时,之前的数据图被写入到撤消表空间上,这是那时一致的数据图,如果用户想要使用 rollback 命令恢复变化, Oracle使用写入到撤销表空间的信息来撤销变化,如果在撤消表空间上没有足够的数据,那么你不能使用这些功能,因为,Oracle覆盖了撤销表空间,以防止它不能为新的变化找到足够的可用空间,为了在具体的时间使提交的数据留在撤消表空间中,设置以秒为单位的指定的 undo_retention 初始化参数,另外,应该为撤消表空间指定RETENTION GUARANTEE 语句,保证过期的撤销数据不会被覆盖。
注释: 所有的 flashback 技术只在Oracle 企业版中可用,除了 flashback 查询,也可以在标准版中使用。 |
现在你对 flashback技术功能有了基本的了解,不同情况下的使用方法会进行详细解释。
RMAN Oracle Flashback 数据库
从Oracle 10g开始,不执行任何不完全恢复,将整个数据库恢复到任意时间是可能的,这由一个叫做 flashback 数据库的新功能完成,它有一个新的后台进程叫做 Recovery Writer (RVWR) ,它从数据库高速缓存区复制变化块到新引进的缓存。这些叫做 flashback 缓存,从哪里它可以复制变化到flashback 日志。
启动 flashback数据库时,性能开销可以是2%或更小,当在高交易环境中(尤其在插入环境中)使用flashback日志时,用Oracle Support 检查有关潜在性能下降的信息。
正如之前提到的那样,执行 flashback 数据库比不完全恢复快,因为,恢复需要首先复原数据文件你,通过使用flashback数据库,你不复原任何东西,这样就消耗了更少的时间,此技术用来纠正用户的错误,所以,你不能用它从多媒体损坏中恢复。
请看下面的情景和更清楚地理解这个概念的方法:
- 情景 5: Bob收到应用开发商团队负责人的电话。你好, Bob。我们正在测试数据库上测试一个批量作业,但是,不幸的是,由于不正确的SQL语句,该作业中断了,我们需要恢复数据库,请帮忙恢复到一小时前的状态,可以吗 .?
作为一个有经验的数据库管理员,Bob决定不执行不完全恢复,而是使用 flashback 数据库功能,如果在错误产生之前他已经启动了 flashback日志,那么他能够flashback 数据库,下面的例子显示的是 Bob的操作,你可以自己测试。
通过设置下列的初始参数启动flash恢复区域 :
SQL>
alter
system set db_recovery_file_dest_size=1g scope=both;
System altered.
SQL>
alter
system set db_recovery_file_dest=
‘/u01/oracle/product/10.2.0/db_1/flash_recovery_area’;
System altered.
SQL>
为获取有关 flash 恢复区域的更多信息,请参考第二章Configuring and Using the Flashback Recovery Area?一节
为了在以后停用 flash恢复区,运行:
SQL>
alter
system set db_recovery_file_dest= ”;
System altered.
SQL>
下一步应该是检查数据库的归档模式,为了启用flashback 数据库,数据库应该处于归档日志模式下:
SQL>
archive
log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination use_db_recovery_file_dest
Oldest online log sequence 66
Next log sequence to archive 68
Current log sequence 68
SQL>
或者通过查询v$database视图:
SQL>
select
log_mode
from
v$database;
LOG_MODE
————
ARCHIVELOG
SQL>
注释: 如果数据库正在非归档日志模式下运行,就不能打开 flashback 数据库,因为启用 flashback 的最低要求是数据库处于归档日志模式下,此外, 一旦你在数据库级别打开 flashback ,除非并且直到你关闭数据库,否则不能改变归档日志模式。 |
如果数据库在非归档日志模式下运行,那么阅读第二章Switching to Archivelog Mode?一节。
现在,以分钟为单位,指定 db_flashback_retention_target参数(默认是一天 1440分钟) ,定义数据库可能闪回的时间,五天才能完成:
SQL>
alter
system set db_flashback_retention_target=7200;
System altered.
SQL>
到了启用 flashback 选项的时间,为此,使数据库处于安装模式下:
SQL>
shutdown
immediate
SQL>
startup
mount
SQL>
alter
database flashback on;
database altered.
SQL>
alter
database open;
Database altered.
SQL>
为检查是否已启用flashback 数据库,使用:
SQL>
select
flashback_on
from
v$database;
FLASHBACK_ON
——————
YES
SQL>
另外,正如上面显示的那样,当启用flashback数据库时,新的后台进程 (RVWR) 启动。
[oracle@localhost ~]$ ps -ef | grep rvwr
oracle 10930 1 0 04:50 ? 00:00:00 ora_rvwr_FB
[oracle@localhost ~]$
当flashback 数据库启用时,下面几行被写入到alert.log文件:
ALTER DATABASE FLASHBACK ON
Sat Mar 13 11:53:25 2015
db_recovery_file_dest_size of 5120 MB is 31.08%
used. This is a
user-specified limit on the amount of space that
will be used by this
database for recovery-related files, and does not
reflect the amount of
space available in the underlying filesystem or ASM
diskgroup.
Allocated 3981120 bytes in shared pool for flashback
generation buffer
Starting background process RVWR
RVWR started with pid=16, OS id=274508
Sat Mar 13 11:53:26 2015
Flashback Database Enabled
Turn database flashback on at SCN 3212381
DB_RECOVERY_FILE_DEST/<db_name>/flashback
Completed: ALTER DATABASE FLASHBACK ON
Sat Mar 13 11:54:07 2015
注释: 带有 the .flb扩展名的Flashback日志文件在下列位置生成: |
创建一个表,并插入一行,然后,获得当前时间:
SQL>
create
table tbl_fl_db (id number);
Table created.
SQL>
insert
into tbl_fl_db values(1);
1 row created.
SQL>
commit;
Commit complete.
SQL>
select
dbms_flashback.get_system_change_number() scn,
to_char(sysdate,’ddmmyyyy hh24:mi:ss’) ddate
from
dual;
SCN DDATE
———- —————–
817520 14022010 04:59:58
SQL>
Now delete the row and drop the table by getting scn and sysdate after each operation:
SQL>
delete from
tbl_fl_db;
1 row deleted.
SQL>
commit;
commit complete.
SQL>
select
dbms_flashback.get_system_change_number() scn,
to_char(sysdate,’ddmmyyyy hh24:mi:ss’) ddate
from
dual;
SCN DDATE
———- —————–
817527 14022010 05:00:13
SQL>
drop
table tbl_fl_db;
Table dropped.
SQL>
select
dbms_flashback.get_system_change_number() scn,
to_char(sysdate,’ddmmyyyy hh24:mi:ss’) ddate
from
dual;
SCN DDATE
———- —————–
817629 14022010 05:00:37
SQL>
现在,使用flashback database to命令,恢复数据库到之前采用的每个scn ,为此,关闭数据库,使其处于安装模式,使用你恢复数据库的最后一个scn 值,因为运行drop table命令之后,采用 scn 值,所以不能查询表:
SQL>
shutdown
immediate
SQL>
startup
mount
SQL>
flashback
database to scn 817629;
Flashback complete.
SQL>
alter
database open read only;
Database altered.
SQL>
select * from
tbl_fl_db;
select * from tbl_fl_db
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>
到这里,你决定使数据库回到另一个没有删除表或行的 scn,因此,关闭数据库,使其处于安装模式,使用一个不同的scn值再次发出命令:
SQL>
shutdown
abort
ORACLE instance shut down.
SQL>
startup
mount
SQL>
flashback
database to scn 817520;
Flashback complete.
SQL>
alter
database open read only;
Database altered.
SQL>
select * from
tbl_fl_db;
ID
———-
1
SQL>
可能进行重复测试,直到你确信恢复数据库到你想要恢复到的点,然后应该关闭数据库,使用重设日志选项打开,否则你会收到下列错误:
SQL>
alter
database open;
alter database open
*
error at line 1:
ORA-01589: must use resetlogs or noresetlogs option for database open
SQL>
shutdown
abort
SQL>
startup
mount
SQL>
alter
database open resetlogs;
Database altered.
SQL>
Comment