oracle其它高可用性,

更新时间:2023-06-12 10:37:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章

其他各种高可用性特性

在本章中,将会学习能够显著增强数据库应用程序可用性的各种功能特性的实现细节。其中一些特性,如LogMiner选项,是对以前Oracle版本中可用的特性的增强。其他特性,如回收站和flashback database命令,是在Oracle Database 10g新引入并在Oracle Database 11g中得到增强。第7章全面涵盖了只依赖于撤销表空间的其他闪回选项,例如闪回表(Flashback Table)和闪回查询(Flashback Query)。在本章中,将会学习如何使用如下特性来增强数据库的可用性:

● Flashback Drop(闪回删除)

● Flashback Database(闪回数据库)

● LogMiner

● 联机对象重组织选项

闪回删除(Flashback Drop)依赖于Oracle Database 10g中引入的一种结构——回收站,回收站的行为非常类似于基于Windows计算机中的回收站:如果表空间中有足够的空间,则被删除的对象会恢复到它们最初的模式,所有索引和约束原封不动。闪回数据库(Flashback Database)依赖于闪回恢复区中存储的数据,闪回恢复区也是Oracle Database 10g中新引入的一种存储区域。从Oracle9i开始可用的LogMiner

依赖归档重做日志文件来持续查看对表、索引和其他数

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

450 第III部分 高 可 用 性

据库结构(DDL操作)所做的变更。

14.1 使用闪回删除来恢复被删除的表

当删除一个表(及其相关的索引、约束和嵌套表)时,Oracle并不会立即释放该表的磁盘空间供表空间中的其他对象使用。相反,对象仍维护在回收站(recycle bin)中,直到对象被其所有者清除,或者有新的对象需要已删除对象所占用的空间。

在此例中,考虑AUTHOR表,它定义如下:

SQL> describe AUTHOR

Name Null? Type

---------------- -------- ----------------------------

AUTHORNAME NOT NULL VARCHAR2(50)

COMMENTS VARCHAR2(100)

现在,假设意外地删除了该表。当一个用户对存在于多个环境中的一个表拥有权限,他打算在开发环境中删除一个表,但在命令执行时却实际指向了产品数据库的时候,就会出现这种情况。

SQL> drop table AUTHOR cascade constraints;

Table dropped.

如何才能恢复该表呢?自从Oracle Database 10g以来,删除的表并没有完全消失。它的块仍旧保持在其表空间中,并且仍旧占用空间限额。可以通过查询RECYCLEBIN数据字典视图来查看删除的对象。需要注意的是,在不同的版本之间OBJECT_NAME列的格式可能有所不同:

SQL> select object_name, original_name, operation, type, user,

2 can_undrop, space from recyclebin;

OBJECT_NAME ORIGINAL_NAME OPERATION

----------------------------- -------------------- ---------

TYPE USER CAN_UNDROP SPACE

------------------------ --------------- ---------- --------

BIN$OyXS+NT+J47gQKjAXwJcSA==$0 AUTH_NAME_IDX DROP

INDEX HR NO 384

BIN$OyXS+NT/J47gQKjAXwJcSA==$0 AUTHORS DROP

TABLE HR YES 1152

SQL>

RECYCLEBIN是用于USER_RECYCLEBIN数据字典视图的公共同义词,为当前的用户显示了回收站表项。数据库管理员可以通过DBA_RECYCLEBIN数据字典视图来查看所有删除的对象。

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性 451

从上面的清单中可以看到,一个用户已经删除了AUTHOR表及其相关的主键索引。尽管删除了它们,它们仍可用于闪回。索引不能独自恢复(它的CAN_UNDROP列的值是'NO',同时AUTHOR表的CAN_UNDROP值为'YES')。

可以使用flashback table to before drop命令从回收站中恢复该表:

SQL> flashback table AUTHOR to before drop;

Flashback complete.

此时,已经恢复了该表以及它的行、索引和统计信息。

如果删除AUTHOR表,重新创建该表,然后再次删除它,那么会出现什么情况呢?回收站将会包含这两个表。回收站中的每个表项将会通过它的SCN和删除时间戳来标识。

注意:

flashback table to before drop命令不会恢复引用的约束。

为了从回收站中清除旧的记录项,可以使用purge命令。可以清除所有删除的对象、数据库中所有已删除的对象(如果您是数据库管理员)、特定的表空间中的所有对象或者特定的表空间中针对某个特定用户的所有对象。当闪回表时,可以使用flashback table命令的rename to子句对该表重命名。

在Oracle Database 10g和11g中,默认情况下,回收站是启用的。可以使用初始化参数RECYCLEBIN打开和关闭回收站,也可以在会话级别打开和关闭回收站,如下例所示:

alter session set recyclebin = off;

临时禁用回收站功能并不影响回收站中的当前对象。即使在回收站被禁用时,仍然可以恢复回收站中的当前对象。只有回收站被禁用时删除的对象不能恢复。

14.2 flashback database命令

flashback database命令将数据库返回到一个过去的时间或SCN,提供了一种执行不完整的数据库恢复的快速替换方法。采用flashback database操作时,为了具有到闪回的数据库的写访问权,必须使用alter database open resetlogs命令再次打开它。必须拥有SYSDBA系统权限,以便使用flashback database命令。

注意:

必须已经使用alter database flashback on命令将数据库置于FLASHBACK模式。当执行该命令时,必须以独占的模式安装数据库但不打开它。

flashback database命令的语法如下:

flashback [standby] database [database]

{ to {scn | timestamp} expr

| to before {scn | timestamp } expr

}

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

452 第III部分 高 可 用 性

可以使用to scn或to timestamp子句来设置应将整个数据库闪回到的时间点。可以闪回到一个临界点(例如一个对多个表产生了未预料的结果的事务处理)之前。使用ORA_ROWSCN伪列来查看最近作用于行上的事务处理的SCN。

如果还没有这样做的话,需要关闭数据库,并在启动过程中使用如下命令启用闪回: startup mount exclusive;

alter database archivelog;

alter database flashback on;

alter database open;

注意:

在执行alter database flashback on命令之前,必须通过alter database archivelog命令启用介质恢复。

有两个初始化参数用来控制保留在数据库中的闪回数据的数量。DB_FLASHBACK_ RETENTION_TARGET初始化参数为闪回数据库的时间程度设置上限(单位是分钟)。DB_RECOVERY_FILE_DEST初始化参数设定闪回恢复区的大小(有关闪回恢复区设置的更多信息请参见第12章)。需要注意的是,flashback table命令使用已经存储在撤销表空间中的数据(它没有创建额外的记录项),而flashback database命令依赖于存储在闪回恢复区中的闪回日志。

可以通过查询V$FLASHBACK_DATABASE_LOG视图来确定可以闪回数据库的程度。保留在数据库中的闪回数据量由初始化参数和闪回恢复区的大小来控制。下面的清单显示了V$FLASHBACK_DATABASE_LOG中可用的列和内容样本:

SQL> describe V$FLASHBACK_DATABASE_LOG

Name Null? Type

------------------------------------ ------- -------

OLDEST_FLASHBACK_SCN NUMBER

OLDEST_FLASHBACK_TIME DATE

RETENTION_TARGET NUMBER

FLASHBACK_SIZE NUMBER

ESTIMATED_FLASHBACK_SIZE NUMBER

SQL> select * from V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FL RETENTION_TARGET FLASHBACK_SIZE

-------------------- --------- ---------------- --------------

ESTIMATED_FLASHBACK_SIZE

------------------------

5903482 27-SEP-07 1440 8192000

可以通过查询V$DATABASE来检验数据库的闪回状态。如果已经为数据库启用了闪回,FLASHBACK_ON列将会有一个'YES'值:

select current_scn, flashback_on from V$DATABASE;

CURRENT_SCN FLA

----------- ---

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性

5910734 YES 453

保持数据库打开超过一个小时,检验闪回数据是可用的,然后对它执行闪回—— 这会丢失在此期间发生的所有事务处理:

shutdown;

startup mount exclusive;

flashback database to timestamp sysdate-1/24;

需要注意的是,flashback database命令要求以独占模式安装数据库,这将会影响它在任何RAC集群(参见第10章)中的分区。

当执行flashback database命令时,Oracle要检查确保所有需要的归档重做日志文件和联机重做日志文件是可用的。如果日志是可用的,则将联机数据文件还原到指定的时间或SCN。

如果在归档日志和闪回区中没有足够的联机数据,将需要使用传统的数据库恢复方法来恢复数据。例如,可能需要使用文件系统恢复方法,接着向前滚动数据。

一旦完成了闪回,必须使用resetlogs选项打开数据库,以便拥有到数据库的写访问权: alter database open resetlogs;

为了关闭闪回数据库选项,当安装了数据库但未打开它时执行alter database flashback off命令:

startup mount exclusive;

alter database flashback off;

alter database open;

可以使用闪回选项来执行一系列操作—— 恢复旧的数据、将表还原为它早期的数据、维护各个行变化的历史记录,以及快速恢复整个数据库。如果已经配置数据库支持自动撤销管理(AUM),那么可以极大地简化所有这些操作。另外,flashback database命令要求修改数据库的状态。尽管这些要求给数据库管理员增加了额外的负担,但在需要的恢复数量以及完成这些恢复的速度方面可以得到显著的好处。

14.3 使用LogMiner

Oracle使用联机重做日志文件来跟踪对用户数据和数据字典所做的每一处改动。在恢复过程中,使用存储在重做日志文件中的信息来重新创建部分或完整的数据库。为了支持将数据库恢复到创建了数据库备份之后的一个时间点,可以维护重做日志文件的归档副本。LogMiner实用程序提供了一种重要的视图来了解数据库中已经发生的改动。

当使用LogMiner时,可以看到已经做出的改动(SQL_redo)和可以用于还原这些改变的SQL(SQL_undo)。因此,可以查看数据库的历史记录而实际上不会应用任何重做日志,并可以获得用于还原有问题的事务处理的代码。使用LogMiner,可以指出首次出现损坏的事务处理,以便确定将合适的时间点或SCN用作数据库恢复的端点。

如果有少量的需要回滚的事务处理,在使用LogMiner之前,必须将表恢复到一个早期的状态,并且应用归档日志文件来将表前置到恰好在损坏出现之前的状态。当恢复表并应用归档日志文件时,将会有丢失随后想要保留的事务处理的风险。现在,可以使用LogMiner来仅仅

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

454 第III部分 高 可 用 性

回滚那些有问题的事务处理,而不会随后丢失有效的事务处理。

原始形式的LogMiner在使用上有一些限制。使用原始的方法,一次只能查看一个日志文件,并且该工具的界面使用起来很不方便。在Oracle 9i中,已经对该界面进行了重大改变,并大大增强了功能,包括一个和OEM(Oracle企业管理器)一起使用的LogMiner Viewer(LogMiner阅读器)。在本节中会对手动使用LogMiner的方法和OEM LogMiner Viewer予以介绍。 14.3.1 LogMiner的工作方式

为了运行LogMiner实用程序,必须拥有对DMBS_LOGMNR程序包的EXECUTE权限或者EXECUTE_CATALOG_ROLE角色。LogMiner需要数据字典来完全地翻译重做日志文件内容,并将内部对象标识符和数据类型转换为对象名和外部数据格式。如果不能使用数据字典,LogMiner将会返回以十六进制格式标识的数据和以内部对象ID表示的对象信息。

有三种选择来获得一个供LogMiner使用的数据字典:

● 将数据字典信息提取到一个平面文件中。

● 将数据字典提取到重做日志文件中。

● 从当前的数据库中使用联机数据字典。

LogMiner分析通常要求使用的数据字典源自于产生重做日志文件的同一个数据库。但是,如果正在使用平面文件格式或者正在使用源自重做日志文件的数据字典,则可以从LogMiner正在其上运行的数据库或从另一个数据库来分析重做日志文件。但是,如果正从当前的数据库中使用联机目录,只能从当前的数据库来分析重做日志文件。

由于可以从一个数据库中依据另一个数据库中的重做日志文件来运行LogMiner,这两个数据库上使用的字符集必须匹配。硬件平台也必须和生成重做日志文件时采用的平台相匹配。 14.3.2 提取数据字典

将数据字典提取到平面文件中的一个潜在问题是,当正在提取数据字典的时候,其他人可能正在发送DDL语句。因此,提取出的数据字典可能和数据库不同步。相比于使用重做日志文件,使用平面文件来存储数据字典时需要更少的系统资源。

当提取数据字典到重做日志文件时,在提取数据字典的过程中不能处理DDL语句。因此,字典将会和数据库同步。提取过程更加耗费资源,但是更为迅速。

为了将数据字典提取到平面文件或重做日志文件中,可以使用DBMS_LOGMNR_D.BUILD程序。数据字典文件放置在一个目录中。因此,必须拥有放置该文件的目录的写权限。为了定义目录的位置,使用初始化参数UTL_FILE_DIR。例如,为了指定位置D:\Oracle\Ora10\database作为LogMiner的输出位置,将以下的记录项放在参数文件中:

UTL_FILE_DIR= D:\Oracle\Ora10\database

注意:

不能使用alter system命令动态地改变UTL_FILE_DIR参数。必须修改初始化文件,然后停止并重启数据库。

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性 455

为了执行DBMS_LOGMNR_D.BUILD程序,必须为目录指定文件名,为文件指定目录路径名,并指定希望将目录写入到平面文件中还是重做日志文件中。为了将数据字典提取到位于G:\Oracle\Ora10\database目录中的文件名为mydb_dictionary的平面文件中,可以发出如下命令:

execute DBMS_LOGMNR_D.BUILD

('mydb_dictionary.ora',

'G:\Oracle\Ora10\database',

options=>DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);

可以使用DBMS_LOGMNR_D.STORE_IN_FLAT_FILE作为其他的可选项。

一旦将字典存储在平面文件中,可以将它复制到另一个平台来运行LogMiner。可能需要运行其他数据库上的dbmslmd.sql来建立正确的环境。可以在Unix系统上的$ORACLE_HOME\rdbms\admin目录中找到dbmslmd.sql文件。

14.3.3 分析一个或多个重做日志文件

为了使用LogMiner分析重做日志文件,遵照以下步骤:

(1) 使用V$LOGMNR_LOGS获得一个可用的重做日志文件的清单。

(2) 使用DBMS_LOGMNR.START_LOGMNR程序启动LogMiner实用程序。参见本节后面

的表14-2来了解START_LOGMNR参数。

(3) 查询V$LOGMNR_CONTENTS来查看结果。

(4) 一旦已经完成对重做日志的查看,发出如下命令来结束会话:

execute DBMS_LOGMNR.END_LOGMNR;

表14-1 中介绍了DBMS_LOGMNR程序包可用的子程序。

表14-2 显示了START_LOGMNR程序的参数。

为了创建一个可用于分析的重做日志文件的清单,如下所示运行带有NEW选项的DBMS_LOGMNR.ADD_LOGFILE程序,此例使用Linux文件系统:

execute DBMS_LOGMNR.ADD_LOGFILE(

LogFileName=> '/oracle/ora10/redo01.ora',

Options=> DBMS_LOGMNR.NEW);

execute DBMS_LOGMNR.ADD_LOGFILE(

LogFileName=> '/oracle/ora10/redo02.ora',

Options=> DBMS_LOGMNR.NEW);

表14-1 DBMS_LOGMNR子程序

子 程 序

ADD_LOGFILE

START_LOGMNR

END_LOGMNR

MINE_VALUE (函数) 说 明 向要处理的归档文件清单添加一个文件 初始化LogMiner实用程序 完成并结束一个LogMiner会话 对于任何从V$LOGMNR_CONTENT返回的行,返回由

COLUMN_NAME参数指定的列名的撤销或重做列的值

COLUMN_PRESENT (函数)

对于任何从V$LOGMNR_CONTENT返回的行,决定是否存在

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

456 第III部分 高 可 用 性

由COLUMN_NAME参数指定的列名的撤销或重做列的值

REMOVE_LOGFILE 从LogMiner将要处理的日志文件清单中删除一个日志文件

表14-2 START_LOGMNR选项的值

选 项

COMMITTED_DATA_ONLY

SKIP_CORRUPTION 说 明 如果设定了这个选项,只返回对应于提交的事务处理的DML 在从V$LOGMNR_CONTENTS选择的过程中,跳过重做日志

文件中遇到的任何损坏的块。只有在实际的重做日志文件中存

在一个损坏的块时,该选项才有用,如果数据头块损坏,则该

选项不起作用

DDL_DICT_TRACKING 如果发生一个DDL事件,启用LogMiner来更新内部数据字典,

以确保SQL_REDO 和SQL_UNDO信息被维护并保持正确

DICT_FROM_ONLINE_CATALOG 指示LogMiner使用联机数据字典来代替平面文件或重做日志

文件存储的字典

DICT_FROM_REDO_LOGS 指示LogMiner使用存储在一个或多个重做日志文件中的数据

字典

NO_SQL_DELIMITER

NO_ROWID_IN_STMT

PRINT_PRETTY_SQL

CONTINUOUS_MINE 指示LogMiner在重构的SQL语句末尾不插入SQL定界符(;) 指示LogMiner在重构的SQL语句中不包含ROWID语句 指示LogMiner格式化重构的SQL语句以便于阅读 指示LogMiner自动添加重做日志文件来找到感兴趣的数据。

指定起始SCN、日期或要挖掘的第一个日志。LogMiner必须

连接到正在生成重做日志文件的同一个数据库实例

可以指定数据字典文件的位置,如下所示:

execute DBMS_LOGMNR.ADD_LOGFILE(

DictFileName=> '/oracle/ora10/dictionary.ora',

在已经告知LogMiner数据字典的位置并添加了重做日志文件后,可以使用DBMS_LOGMNR.START_LOGMNR程序包开始分析重做日志文件。例如,以下的命令在一段时间内分析日志文件:

execute DBMS_LOGMNR.START_LOGMNR(

DictFileName => '/oracle/dictionary.ora',

StartTime => TO_DATE('01-SEP-2007 12:45:00', DD-MON-YYYY HH:MI:SS')

EndTime => TO_DATE('01-OCT-2007 00:00:00', DD-MON-YYYY HH:MI:SS'));

注意:

使用时间戳将不能保证重做记录的次序,必须使用SCN编号来确保记录的次序。

可以使用SCN值来筛选数据,如下所示:

execute DBMS_LOGMNR.START_LOGMNR(

DictFileName => '/oracle/dictionary.ora',

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性

StartScn => 125,

EndScr => 300); 457

如果没有输入起始和结束时间或者SCN编号范围,对于发出的每条select语句,将读取整个文件。

为了查看重做代码和取消代码,可以选择SQL_REDO和SQL_UNDO列,如下所示: select sql_redo, sql_undo

from V$LOGMNR_CONTENTS;

可以使用OEM服务器管理控制台(OEM Server Manager Console)启动基于Java的LogMiner Viewer来查看重做日志和归档的重做日志。为了在Windows平台上启动LogMiner Viewer,使用Start | Programs | Oracle_Home | Oracle Enterprise Manager Console选项。一旦已经连接到基于Java的OEM Server Console(Oracle Database 10g及更早版本),选择希望在它上面运行LogMiner Viewer的数据库。要确保已经启动了该数据库。

为了启动LogMiner Viewer,突出显示数据库并右击。将光标移动到Related Tools选项,然后移到LogMiner Viewer选项。当出现LogMiner Viewer Console屏幕时,通过单击图标面板中顶端的图标或从Object下拉菜单中选择Create Query来创建一个对象查询。LogMiner Viewer自动查找用来创建查询的可用的归档重做日志文件。如果没有可用的归档重做日志文件,会接收到错误消息。可以创建筛选选项(通过创建查询标准),查看每个可用的重做日志文件的起始和结束SCN,并选择要显示的列。OEM LogMiner Viewer可以简化筛选日志文件内容的过程。此外,可以使用Grid Control屏幕来访问和查看LogMiner的输出。

14.3.4 Oracle Database 10g中引入的LogMiner特性

如果使用过Oracle Database 10g之前版本的LogMiner,下面是一些现在可用的增强特性: 如前面的表14-1所示,现在DBMS_LOGMNR有一个REMOVE_LOGFILE程序,它可以从要分析的列表中删除文件。不应该再使用ADD_LOGFILE程序的REMOVEFILE选项。

可以使用START_LOGMNR的NO_ROWID_IN_STMT选项(参见表14-2)从重构的SQL命令中筛选出rowid子句。

可以通过alter database命令来扩充补充日志,使补充日志包含外键或行的所有变化。使用这些设置将会增加写入到重做日志文件中的数据量。

可以在表级别扩充补充日志来跟踪主键、外键、唯一的索引和所有的变化。还可以使用no log选项来防止记录用户定义的日志组中的列。

参见Oracle Utilities(Oracle实用程序)指南来进一步了解LogMiner及其程序的使用细节。 14.3.5 Oracle Database 11g中引入的LogMiner特性

在Oracle Database 11g之前,数据库管理员不得不使用基于Java的LogMiner控制台,它很难安装,且不能与Oracle Enterprise Manager Database Control完全集成。通过集成基于任务

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

458 第III部分 高 可 用 性

的日志挖掘操作与Flashback Transaction,LogMiner与OEM DB Control的集成进一步增强了LogMiner的易使用性。图14-1展示了LogMiner的OEM界面。

图14-1 OEM LogMiner和Flashback Transaction界面

14.4 联机对象重组织

可以联机重组织许多数据库对象,可用的选项如下:

● 联机创建索引

● 联机重建索引

● 联机合并索引

● 联机重建按索引组织的表

● 联机使用DBMS_REDEFINITION程序包来重新定义表

在以下的各小节中,可以看到以上每种操作的示例。

14.4.1 联机创建索引

在终端用户可以访问基本表时可以创建和重建索引。在创建索引的同时不允许DDL操作。为了联机建立索引,使用create index命令的online子句,如下面的示例所示:

create index AUTH$NAME on AUTHOR (AuthorName) online;

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性 459

14.4.2 联机重建索引

当使用alter index命令的rebuild子句时,Oracle使用现有的索引作为新索引的数据源。因此,在进行操作时必须有足够的空间来存储索引的两个副本。可以使用alter index rebuild命令来改变一个索引的存储特征和表空间分配。

为了联机重建索引,使用alter table命令的rebuild online子句,如下面的示例所示: alter index AUTH$NAME rebuild online;

14.4.3 联机合并索引

可以合并索引来收回索引内的空间。当合并索引时,不能将它移动到另一个表空间(对于重建索引是允许的)。合并不需要用于存储索引多个副本的空间,因此当试图在空间受限的环境下重组织索引时,这种方法可能是有用的。

为了合并索引,使用alter index命令的coalesce子句。所有的索引合并都是联机操作。下面是一个合并例子:

alter index AUTH$NAME coalesce;

14.4.4 联机重建以索引组织的表

可以使用alter table … move online命令来联机重建一个以索引组织的表。在存在溢出的数据段的情况下,如果指定overflow关键字,会重建该数据段。例如,如果BOOKSHELF是一个索引组织的表,可以通过如下的命令联机重建它:

alter table BOOKSHELF move online;

当使用该命令时,不能执行并行的DML。另外,移动联机选项只适用于非分割的索引组织的表。

14.4.5 联机重新定义表

当应用程序用户可以访问表的时候,可以改变它的定义。例如,当正在使用一个表时,可以分割以前未分割的表——这是一项对高可用OLTP应用程序很有用的功能。

从Oracle Database 11g开始,对于不能联机重新定义的表的类型只有很少的限制。下面列出了关键限制:

● 重新定义具有物化视图日志的表之后,必须完全刷新依赖的物化视图。

● 索引组织表(IOT)的溢出表必须与基本IOT同时重新定义。

● 具有细粒度访问控制的表不能联机重新定义。

● 包含BFILE列的表不能联机重新定义。

● 包含LONG和LONG RAW列的表可以重新定义,但必须将LONG和LONG RAW列

转换为CLOB和BLOB。

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

460 第III部分 高 可 用 性

● SYS和SYSTEM模式中的表不能联机重新定义。

● 临时表不能联机重新定义。

下面的示例说明了联机重新定义一个表需要的步骤。首先,要检验能够重新定义该表。对于这个示例,将会在SCOTT模式下创建CUSTOMER表,然后对其重新定义:

create table CUSTOMER

(Name VARCHAR2(25) primary key,

Street VARCHAR2(50),

City VARCHAR2(25),

State CHAR(2),

Zip NUMBER);

接下来,通过执行DBMS_REDEFINITION程序包的CAN_REDEF_TABLE程序来检验能够重新定义该表。它的输入参数是用户名和表名:

execute DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','CUSTOMER');

如果程序返回如下消息,该表成为联机重新定义的候选对象:

PL/SQL procedure successfully completed.

如果它返回一个错误,不能联机重新定义该表,并且错误消息会给出原因。

接下来,在相同的模式下创建一个临时表,它具有重新定义的表的期望属性。例如,可以分割CUSTOMER表(为了简化该示例,不显示用于分割的tablespace和storage子句):

create table CUSTOMER_INTERIM

(Name VARCHAR2(25) primary key,

Street VARCHAR2(50),

City VARCHAR2(25),

State CHAR(2),

Zip NUMBER)

partition by range (Name)

(partition PART1 values less than ('L'),

partition PART2 values less than (MAXVALUE))

;

现在可以执行DBMS_REDEFINITION程序包的START_REDEF_TABLE程序来开始重新定义过程。它的输入变量是模式所有者、将要重新定义的表、临时表名称和列映射(类似于一个选择查询中的列名称列表)。如果没有提供列映射,那么原始表和临时表中的所有列名和定义必须相同。

execute DBMS_REDEFINITION.START_REDEF_TABLE -

('SCOTT','CUSTOMER','CUSTOMER_INTERIM');

接下来,在临时表上创建要求的任何触发器、索引、授权或约束。在该示例中,已经在CUSTOMER_INTERIM上定义了主键,此时在重新定义过程中可以添加外键、二级索引和授权。不允许创建外键,直到完成了重新定义过程。

注意:

使用闪回删除来恢复被删除的表,flashback database命令,使用logminer,联机对象重组织

第14章 其他各种高可用性特性 461

为了避免手动操作步骤,可以使用COPY_TABLE_DEPENDENTS程序在临时表上创建所有相关的对象。通过这种方法支持的相关对象包括触发器、索引、授权和约束。

当重新定义过程完成时,临时表上的索引、触发器、约束和授权将会替代原始表上的对应对象。此时会启用临时表上禁用的引用约束。

为了完成重新定义,执行DBMS_REDEFINITION程序包的FINISH_REDEF_TABLE程序。它的输入参数是模式名、原始的表名称和临时表名称:

execute DBMS_REDEFINITION.FINISH_REDEF_TABLE -

('SCOTT','CUSTOMER','CUSTOMER_INTERIM');

可以通过查询数据字典来检验重新定义:

select table_name, high_value

from DBA_TAB_PARTITIONS

where owner = 'SCOTT';

TABLE_NAME HIGH_VALUE

----------------------- ------------------------

CUSTOMER MAXVALUE

CUSTOMER 'L'

在执行了START_REDEF_TABLE程序后,为了中断此过程,执行ABORT_REDEF_TABLE程序(输入参数是模式、原始的表名称和临时表名称)。

本文来源:https://www.bwwdw.com/article/zrb1.html

Top