使用闪回从人为错误恢复

本课程介绍了支持自助式错误修正的 Oracle数据库 10g 闪回特性。

本课程介绍了以下主题:

概述

前提条件

填充回收站

查询回收站中的表

从回收站恢复表

从回收站清空表

使用闪回表恢复表

将鼠标移到该图标上可以显示所有屏幕截图。还可以将鼠标移到每个图标上来仅查看相关的屏幕截图。

在 Oracle 数据库 10g 中,闪回功能已经得到扩展。现在可以闪回整个表并快速恢复意外删除的表。

什么是回收站?

在早期的 Oracle 服务器中,DROP 命令可从数据库中永久删除对象。现在,当您删除表及其相关对象时,该表将被放置在回收站中。在您清空回收站之前,它不会从数据库中删除。在您清除对象之前,不会取消分配给段的范围。您可以随时从回收站中恢复这些已删除的对象。

在开始学习本单元之前,您应执行了以下操作:

1.

完成了教程为安装 Oracle 数据库 10g 配置 Linux

2.

完成了教程在 Linux 上安装 Oracle 数据库 10g

3.

flashback.zip 下载到您的工作目录中。

首先,您需要将对象添加到回收站中。执行以下步骤:

1.

打开 SQL*Plus 并输入以下命令来创建一个新表:

connect system/<password>
@create_job_hist

将鼠标移到该图标上可以查看该图像

 

2.

现在,输入以下 SQL 语句以删除刚刚创建的表。

drop table hr.jobs_hist;

将鼠标移到该图标上可以查看该图像

表已被删除。您刚才已将该表添加到了回收站中。

 

您在删除表之后仍然可以查询这些表。可以使用回收站中的对象名称针对这些对象执行 SELECT 语句。只要满足查询所需的撤消信息可用,您就还可以针对回收站中的对象执行闪回查询来查询过去的数据。仅当您是对象的最初所有者时才可以执行这些查询。执行以下操作

1.

此时,您可以查询回收站以获取刚刚删除的表。打开另一个浏览器窗口,并输入以下 URL:

http://<hostname>:5500/em

输入 sys/<password> 作为 SYSDBA,单击 Login

将鼠标移到该图标上可以查看该图像

 

2.

单击 Administration 选项卡。

将鼠标移到该图标上可以查看该图像

 

3.

单击 Tables

将鼠标移到该图标上可以查看该图像

 

4.

为 Schema 输入 HR,然后单击 GO

将鼠标移到该图标上可以查看该图像

 

5.

单击 Recycle Bin 链接。

将鼠标移到该图标上可以查看该图像

 

6.

输入 HR 模式,然后单击 Go

将鼠标移到该图标上可以查看该图像

 

7.

请注意,您删除的表已经列出。单击 View Content

将鼠标移到该图标上可以查看该图像

 

8.

您将看到已删除的表内容。单击 OK

将鼠标移到该图标上可以查看该图像

 

可以通过执行以下步骤从回收站中恢复表:

1.

在回收站中,选中 JOBS_HIST 对象旁边的复选框,然后单击 Flashback Drop

将鼠标移到该图标上可以查看该图像

 

2.

单击 Next

将鼠标移到该图标上可以查看该图像

 

3.

在提交恢复该表的作业前,单击 Show SQL 查看将执行的代码。

将鼠标移到该图标上可以查看该图像

 

4.

检查将要运行的 SQL 语句。完成时,单击 OK

将鼠标移到该图标上可以查看该图像

 

5.

单击 Submit

将鼠标移到该图标上可以查看该图像

 

6.

您收到一个表明闪回删除成功的消息。单击 OK

将鼠标移到该图标上可以查看该图像

 

7.

回收站中不再有 JOBS_HIST 表。您需要确保该表现在显示在列表中。单击 Tables 导航项。

将鼠标移到该图标上可以查看该图像

 

8.

您现在可以看到,JOBS_HIST 已经返回该列表中。

将鼠标移到该图标上可以查看该图像

 

返回主题列表

有时,您可能需要从数据库中永久删除某个对象,并在删除该对象后释放分配给它的空间。要从回收站中删除对象,请执行以下步骤:

1.

选择 JOBS_HIST 表之前的单选按钮,然后单击 Delete

将鼠标移到该图标上可以查看该图像

 

2.

单击 Yes 确认删除。

将鼠标移到该图标上可以查看该图像

 

3.

单击 Recycle Bin 链接。

将鼠标移到该图标上可以查看该图像

 

4.

输入 HR 模式,然后单击 Go

将鼠标移到该图标上可以查看该图像

 

5.

在回收站中,选中 JOBS_HIST 对象旁边的复选框,然后单击 Purge

将鼠标移到该图标上可以查看该图像

 

6.

单击 Yes 确认删除。

将鼠标移到该图标上可以查看该图像

 

7.

该表已从回收站中清除。单击 Tables 导航项。 .

将鼠标移到该图标上可以查看该图像

 

早在 Oracle9i 中就引入了闪回查询。使用此特性您可以查看和修复历史数据。您可以按照某个时钟时间或用户指定的系统更改编号 (SCN) 对数据库执行查询。

Oracle 数据库 10G 已经扩展了闪回功能。可以使用 VERSIONS BETWEEN 子句检索执行查询时和之前的某个时间点之间存在或曾经存在的所有行版本。此类查询称作闪回版本查询。

闪回版本查询返回的行是跨事务的行的更改历史记录。

闪回版本查询检索所有已提交的行匹配项。但不返回当前活动事务所做的更改。换言之,将不显示事务中未提交的行版本。

可以使用闪回版本查询检索行历史记录。闪回版本查询提供了审核表的行和检索有关更改行的事务信息的方法。您可以使用从闪回版本查询中获得的事务 ID 执行事务挖掘(使用 LogMiner 或闪回事务查询获取有关事务的其他信息)。

您将执行以下任务:

更新 JOBS 表
对 JOBS 表启用行移动

将 JOBS 表恢复到某个特定时间点

更新 JOBS 表

返回列表

要演示闪回的工作方式,您需要对表进行更改。执行以下步骤:

1.

SQL*Plus 会话中,以 system 的身份执行以下脚本:

updatejobs.sql

updatejobs.sql 包含以下内容:

UPDATE hr.jobs
SET max_salary = max_salary + 2000
WHERE job_id = 'IT_PROG'
/
COMMIT
/

将鼠标移到该图标上可以查看该图像

 

2.

要查看当前值,请输入以下 SQL 语句:

connect hr/hr
select * from jobs where job_id='IT_PROG';

将鼠标移到该图标上可以查看该图像

您将看到更新后的当前值为 12000。

 

对 JOBS 表启用行移动

返回列表

必须先对要执行闪回表的表启用行移动。启用行移动使您可以指定 Oracle 能否移动表行。行可以移动,例如,在对分区数据执行表压缩或更新操作期间。执行以下步骤:

1.

切换到 Enterprise Manager 浏览器会话,单击 JOBS 表。

将鼠标移到该图标上可以查看该图像

 

2.

选择 Options 选项卡。

将鼠标移到该图标上可以查看该图像

 

3.

为 Enable Row Movement 选择 Yes,然后单击 Apply

将鼠标移到该图标上可以查看该图像

 

4.

您现在可以执行闪回表。单击 Tables 导航项。

将鼠标移到该图标上可以查看该图像

 

将 JOBS 表恢复到某个特定时间点

现在,您要将 JOBS 表恢复到某个特定时间点。执行以下步骤:

1.

选择 JOBS 表之前的单选按钮,并从 Actions 列表框中选择 Flashback by Row Versions,然后单击 GO

将鼠标移到该图标上可以查看该图像

 

2.

选择 JOB_IDMAX_SALARY 并单击 Move。然后,在 Bind the Row Value 域中输入 WHERE job_id = 'IT_PROG' 并单击 Next

将鼠标移到该图标上可以查看该图像

 

3.

该列表中列出了您以前所做的更新。单击 Next

将鼠标移到该图标上可以查看该图像

 

4.

单击 Next

将鼠标移到该图标上可以查看该图像

 

5.

您可能要查看将要更改的内容。单击 Show Row Changes

将鼠标移到该图标上可以查看该图像

 

6.

您将看到由于闪回操作而将更改的对象。单击 OK

将鼠标移到该图标上可以查看该图像

 

7.

您现在要准备执行闪回操作。单击 Submit

将鼠标移到该图标上可以查看该图像

 

8.

闪回操作已经成功完成。单击 OK

将鼠标移到该图标上可以查看该图像

 

9.

再次切换到 SQL*Plus 会话,然后执行以下 SQL 语句以检查薪水值是否已经恢复:

select * from jobs where job_id='IT_PROG';

将鼠标移到该图标上可以查看该图像

您将看到该值已经恢复为 10000。

 

将鼠标移到该图标上可以隐藏所有屏幕截图