文档库 最新最全的文档下载
当前位置:文档库 › Oracle Database 11g PLSQL程序设计 10.1 触发器简介

Oracle Database 11g PLSQL程序设计 10.1 触发器简介

Oracle Database 11g PLSQL程序设计 10.1 触发器简介
Oracle Database 11g PLSQL程序设计 10.1 触发器简介

数据库触发器是特殊的存储程序。通常不直接调用它们,而要由数据库中的事件触发。它们在执行命令时和执行数据库管理系统动作之间运行。触发器可以用PL/SQL或Java编写。触发器可以捕获创建、修改或删除对象的事件,也可以捕获表或视图中的插入、更新或删除操作。它们还可以监控数据库或模式的状态变化及用户动作的变化。

本章包括如下主题:

●触发器简介

●触发器体系结构

●数据定义语言触发器

●数据操作语言触发器

●复合触发器

● instead-of触发器

●系统或数据库事件触发器

●触发器限制

这些部分首先介绍基础知识,然后提出一些思想。如果想马上开始编写具体类型的触发器,也可以将它们作为快速参考。例如,可以翻到本章10.4节了解如何编写插入、更新和删除的触发器。

10.1 触发器简介

数据库触发器是特殊的存储程序。因此,它们的定义与DDL规则非常相似。同样,触发器可以调用SQL语句和PL/SQL函数与过程。可以选择用PL/SQL或Java实现触发器。可以参见第14章和附录D了解编写Java库支持触发器的语法。

数据库触发器不同于存储函数和过程,因为不能直接调用它们。当数据库中发生触发事件时会激发数据库触发器。所以它们是管理数据库的有力工具。可以通过触发器来限制或重定向程序的行为。

触发器的用途有:

●控制DDL语句的行为,如通过更改、创建或重命名对象

●控制DML语句的行为,如插入、更新和删除

●实施参照完整性、复杂业务规则和安全性策略

●在修改视图中的数据时控制和重定向DML语句

●通过创建透明日志来审核系统访问和行为的信息

另一方面,由于不能控制对触发器的同步调用序列,所以如果过分依赖触发器的话,这可能成为问题。您唯一能控制的是让它们在某个事件之前还是之后触发。Oracle 11g提供了复合触发器来辅助管理较大的事件,比如需要排序的触发器事件。

使用触发器有一定的风险。风险比较复杂,因为当SQL语句激发触发器时,触发器会调用SQL语句。一个触发器可能调用一个会激发另一个触发器的SQL语句。后来的触发器可能重复这一行为并激发另一个触发器。这样就创建了连锁触发(cascading trigger)。Oracle 11g和更早的版本将连锁触发的数量限制为32,超过这个数时就会抛出异常。

下面概括了5种触发器类型及它们的用途。

●数据定义语言触发器当创建、修改或删除数据库模式中的对象时会激发这些触发器。它们有助于控制或监控DDL语句。instead-of create表触发器提供了一个工具,它可以确保表的创建符合开发标准,比如包括存储或分区子句。也可以用它们监控不良的编程行为,比如当程序创建和删除临时表而不是使用Oracle集合时。临时表会分割磁盘空间,随着时间的推移而降低数据库的性能。

●数据操作语言触发器当在表中执行插入、更新或删除数据的操作时激活这些触发器。可以分别用语句级或行级触发器类型对表上的所有修改或每行的修改激发一次触发器。DML触发器可用来控制DML语句。在修改值之前可以用这些触发器来审核、检查、保存和替换值。数值主键的自动编号经常通过一个行级DML触发器来完成。

●复合触发器当在表中执行插入、更新或删除数据的操作时,这些触发器同时充当语句级和行级触发器的角色。该触发器可以捕获关于4个计时点的信息:(a)激发语句前; (b)激发语句中的每一行变化前;(c)激发语句中的第一行变化后;(d)激发语句后。当需要在语句和行事件级别中采取动作时,可以用这些类型的触发器来审核、检查、保存和替换值。

● instead-of触发器这些触发器可以停止DML语句的执行,并重定向DML语句。INSTEAD OF触发器常用于管理编写不可更新的视图的方式。INSTEAD OF 触发器向定义可更新的视图的表中应用业务规则和直接插入、更新或删除行。另外,INSTEAD OF触发器在与视图相关的指定表中插入、更新或删除行。

●系统或数据库事件触发器当数据库中的系统活动发生时激发这些触发器,比如登录和退出事件触发器。它们对于审核系统访问信息比较有用。这些

触发器可以用来跟踪系统事件并将它们反映给用户。

触发器有一些重要的限制要注意。最大的限制是触发器主体绝不能大于32 760字节。这是因为触发器主体存储在LONG数据类型的列中。这意味着应当尽量保持触发器主体比较小。可以将编码逻辑放在其他模式级组件(比如函数、过程和包)中来做到这一点。将编码逻辑移出触发器主体中的另一个优点是:当它位于触发器主体中时不能包装它,这将在附录F中解释。

每一个触发器都有一套管理它用法的规则。我们将用5个小节来介绍这5个触发器。下一节将描述数据库触发器的体系结构。

使用触发器所需的权限

必须具有CREATE TRIGGER系统权限才能在自己拥有的对象上创建触发器。如果对象由另一名用户拥有,就需要那一名用户授予您对该对象的ALTER权限。还有一种办法,拥有权限的用户可以授予您ALTER ANY TABLE和CREATE ANY TRIGGER 权限。

虽然您有自己的模式级组件上的定义者权限,但当调用另一个用户拥有的模式级组件时必须执行EXECUTE权限。在开发期间应当列出所有必需的权限,才能使接下来的实现更顺利。

10.2 数据库触发器体系结构

数据库触发器是在数据库(比如在包)中定义的。它们由两块组成:数据库触发器声明和主体。声明指出了如何以及何时调用触发器。不能直接调用触发器。它们通过激发事件触发(调用)。激发事件是DDL或DML 语句,或者数据库或系统事件。数据库触发器实现一种面向对象的观测器模式,这意味着它们监听事件然后采取行动。

触发器声明由4个部分组成:触发器名、语句、限制和动作。前3个部分定义了触发器声明,最后一个部分定义触发器主体。触发器名必须是独一无二的,但是可以与模式中的其他任何对象的名称重名,因为触发器有自己的命名空间。触发器语句标识激发触发器的事件或语句类型。触发器限制(比如WHEN子句或INSTEAD OF子句)用来限制触发器何时运行。触发器动作是触发器主体。

注意:

命名空间是数据库目录中维护的独有标识符列表。

除非删除了数据库触发器观测到的对象,否则数据库触发器声明是有效的。当某个事件激发数据库触发器时,数据库触发器声明还会创建一个运行时进程。触发器主体并不简单。触发器主体可能依赖于表、视图或存储程序。这意味着去掉依

赖关系会使触发器主体无效。虽然依赖关系是局部模式对象,但是它们包括可能需要跨网络解析的同义词。当触发器主体变得无效时,触发器就会变得无效。触发器主体是特殊的匿名块程序。只能通过触发器调用和传递参数给它们。

当在创建事件上定义一个DDL触发器时,连接就变更敏锐。正如本章10.3节将讨论的,CREATE触发器的无效触发器主体会使您失去重新创建丢失的依赖关系的能力。ALTER和DROP等其他DDL事件也会发生类似的行为。

替换任何丢失的依赖关系后可以重新编译触发器。语法为:

ALTER TRIGGER trigger_name COMPILE;

触发器事件直接与触发器通信。通信的发生过程不可控制或不可见。除了通过系统定义的事件属性可用的数据库外,您没有其他数据(可参见本章后面的10.3.1节了解关于DDL、语句级DML及系统与数据库事件触发器)。但您具有对行级DML 或INSTEAD OF触发器中的new和old伪记录类型的访问权限。这些类型的结构是动态的,在运行时定义它们。触发器声明从激发它的DML语句中继承了这些值的声明。

DML行级和INSTEAD OF触发器对它们的触发器主体的调用不同于语句级的触发器。当一个事件激发这种类型的触发器时,触发器声明产生了一个运行时程序单元。这个运行时单元是该进程中“真正的”触发器。这个触发器通过与激发它的DML语句通信来使new和old伪记录结构可用。触发器代码块可以通过将伪记录结构作为绑定变量调用来访问这些伪记录结构。触发器代码块是匿名PL/SQL块,只能通过触发器声明访问。

正如第3章的表3-1中讨论的,绑定变量允许延伸到程序的作用域之外。可以访问在调用程序的作用域中定义的变量。:in和:out变量是触发器主体中的绑定变量。它们让触发器代码块与触发器会话通信。只有行级触发器可以引用这些伪记录结构绑定变量。行级触发器代码块可以通过这些绑定变量来读写,如图10-1所示。

也可以从触发器主体中调用外部独立或包函数和过程。当从触发器主体中调用程序时,调用的程序是黑盒。这意味着外部存储程序不能访问:new和:old绑定变量。可以选择按值或按引用将它们传递给存储函数和过程。

Oracle 11g引入了复合触发器。这种新触发器改变了触发器编写的前景。现在可以激发复合触发器,捕获行级语句信息,在全局触发器集合中累积,并在AFTER STATEMENT计时块中访问数据。在本章10.5节将详细介绍这些内容。

可以在任何对象或事件上定义多个触发器。Oracle 11g没有提供同步触发器的方式,即不能确定何时激发第一个、第二个或最后一个触发器。这一限制是因为触发器是交叉存取的,也就是说程序单元是作为离散的进程彼此无关地工作的。触发器可能使应用程序接口变慢,尤其是行级语句。应当注意何时及在何处部署

触发器来解决问题。

图10-1 触发器体系结构

10.3 数据定义语言触发器

当创建、修改或删除数据库模式中的对象时,会激发数据定义语言触发器。它们可以用来控制或监控DDL语句。表10-1列出了使用DDL触发器的数据定义事件。这些触发器都支持BEFORE和AFTER事件触发器,并在数据库或模式级运行。

通常,DDL触发器用于监控数据库中的重要事件。有时用它们来监控错误代码。错误代码可能会执行破坏数据库或使数据库不稳定的活动。更常见的情况是,在开发、测试和stage系统中用它们来了解和监控数据库活动的动态。

注意:

stage系统用于在部署到生产中之前进行终端用户测试和负载平衡度量。

为应用程序打补丁时,DDL触发器非常有用。通过它们可以发现不同版本之间的潜在变化。也可以在升级过程中用instead-of create触发器来实施表创建存储子句或分区规则。

警告:

在生产系统中应当小心监控此类触发器的开销。

这些触发器也可以通过导致数据库碎片的应用程序来跟踪表的创建和修改。当监控GRANT和REVOKE权限语句时,它们也是有效的安全工具。下面几节列出并详细描述了可以用来补充DDL触发器的事件属性函数。

表10-1 可用的数据定义事件

DDL 事件

说明

ALTER

可以通过对对象的某些部分进行一些修改来ALTER(更改)对象,比如它们的约束、名称、存储子句或结构

ANALYZE

ANALYZE(分析)对象用来计算基于代价的优化器的统计信息

ASSOCIATE

STATISTICS

ASSOCIATE STATISTICS(关联统计信息)用来将统计类型链接到列、函数、包、类型、域索引或索引类型

AUDIT

AUDIT(审核)用来启用对象或系统上的审核

COMMENT

COMMENT(注释)用来说明列或表的作用

CREATE

在数据库中CREATE(创建)对象,比如对象、权限、角色、表、用户和视图

DDL

用DDL事件来表示任一主要数据定义事件。它有效地说明了DDL事件可以作用于任何事情

DISASSOCIATE

STATISTICS

DISASSOCIATE STATISTICS(取消统计信息的关联)用来取消统计信息类型与列、函数、包、类型、域索引或索引类型之间的链接

DROP

DROP(删除)数据库中的对象,比如对象、权限、角色、表、用户和视图

GRANT

向数据库中的用户GRANT(授予)权限或角色。权限使用户可以执行一些对象,比如对象、权限、角色、表、用户和视图

NOAUDIT

NOAUDIT(禁用审核)可以禁用对对象或系统的审核

RENAME

RENAME数据库中的对象,比如列、约束、对象、权限、角色、同义词、表、用户和视图

REVOKE

REVOKE(取消)数据库用户的权限或角色。该权限使用户可以对一些对象起作用,比如对象、权限、角色、表、用户和视图

TRUNCATE

TRUNCATE(清空)表,它删除表中的所有行,并将高水位标记重置为原始存储子句最初的扩展值。与DML的DELETE语句不同,TRUNCATE命令不能用ROLLBACK命令恢复。可以用这种新的闪回技术来取消修改

10.3.1 事件属性函数

下面是系统定义的事件属性函数列表:

● ORA_CLIENT_IP_ADDRESS

● ORA_DATABASE_NAME

● ORA_DES_ENCRYPTED_PASSWORD

● ORA_DICT_OBJ_NAME

● ORA_DICT_OBJ_NAME_LIST

● ORA_DICT_OBJ_OWNER

● ORA_DICT_OBJ_OWNER_LIST

● ORA_DICT_OBJ_TYPE

● ORA_GRANTEE

● ORA_INSTANCE_NUM

● ORA_IS_ALTER_COLUMN

● ORA_IS_CREATING_NESTED_TABLE

● ORA_IS_DROP_COLUMN

● ORA_IS_SERVERERROR

● ORA_LOGIN_USER

● ORA_PARTITION_POS

● ORA_PRIVILEGE_LIST

● ORA_REVOKEE

● ORA_SERVER_ERROR

● ORA_SERVER_ERROR_DEPTH

● ORA_SERVER_ERROR_MSG

● ORA_SERVER_ERROR_NUM_PARAMS

● ORA_SERVER_ERROR_PARAM

● ORA_SQL_TXT

● ORA_SYSEVENT

● ORA_WITH_GRANT_OPTION

● SPACE_ERROR_INFO

1. ORA_CLIENT_IP_ADDRESS

ORA_CLIENT_IP_ADDRESS函数不接受形参。它返回的客户端IP地址为VARCHAR2数据类型。

用法如下:

DECLARE

ip_address VARCHAR2(11);

BEGIN

IF ora_sysevent = 'LOGON' THEN

ip_address := ora_client_ip_address;

END IF;

END;

2. ORA_DATABASE_NAME

ORA_DATABASE_NAME函数不接受形参。它返回的数据库名称为VARCHAR2数据类型。

用法如下:

DECLARE

database VARCHAR2(50);

BEGIN

database := ora_database_name;

END;

3. ORA_DES_ENCRYPTED_PASSWORD

ORA_DES_ENCRYPTED_PASSWORD 函数不接受形参。它返回的DES加密口令为VARCHAR2数据类型。这等价于Oracle 11g中https://www.wendangku.net/doc/5510451169.html,ER$表的PASSWORD列中的值。不再能够从DBA_USERS或ALL_USERS视图中访问口令。

用法如下:

DECLARE

password VARCHAR2(60);

BEGIN

IF ora_dict_obj_type = 'USER' THEN

password := ora_des_encrypted_password;

END IF;

END;

4. ORA_DICT_OBJ_NAME

ORA_DICT_OBJ_NAME函数不接受形参。它返回的对象名为VARCHAR2数据类型。对象名表示了DDL语句的目标。

用法如下:

DECLARE

database VARCHAR2(50);

BEGIN

database := ora_obj_name;

END;

5. ORA_DICT_OBJ_NAME_LIST

ORA_DICT_OBJ_NAME_LIST函数接受一个形参。返回该形参也是因为它是作为VARCHAR2变量的OUT模式列表按引用传递的。DBMS_STANDARD包中的形参数据类型被定义为 ORA_NAME_LIST_T。ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为 PLS_INTEGER。name_list包含触发事件所触发的对象名列表。

用法如下:

DECLARE

name_list DBMS_STANDARD.ORA_NAME_LIST_T;

counter PLS_INTEGER;

BEGIN

IF ora_sysevent = 'ASSOCIATE_STATISTICS' THEN

counter := ora_dict_obj_name_list(name_list);

END IF;

END;

6. ORA_DICT_OBJ_OWNER

ORA_DICT_OBJ_OWNER函数不接受形参。它返回事件相关的对象的拥有者,数据类型为VARCHAR2。

用法如下:

DECLARE

owner VARCHAR2(30);

BEGIN

database := ora_dict_obj_owner;

END;

7. ORA_DICT_OBJ_OWNER_LIST

ORA_DICT_OBJ_OWNER_LIST函数接受一个形参。该形参也返回是因为它是按引用传递的OUT模式的VARCHAR2变量。DBMS_STANDARD包中的形参数据类型被定义为 ORA_NAME_LIST_T。ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为 PLS_INTEGER。

在本例中,owner_list包含对象拥有者的列表,其中它们的统计信息由触发事件分析。用法如下:

DECLARE

owner_list DBMS_STANDARD.ORA_NAME_LIST_T;

counter PLS_INTEGER;

BEGIN

IF ora_sysevent = 'ASSOCIATE_STATISTICS' THEN

counter := ora_dict_obj_owner_list(owner_list);

END IF;

END;

8. ORA_DICT_OBJ_TYPE

ORA_DICT_OBJ_TYPE函数不接受形参。它返回事件修改的字典对象的数据类型,数据类型为VARCHAR2。

用法如下:

DECLARE

type VARCHAR2(19);

BEGIN

database := ora_dict_obj_type;

END;

9. ORA_GRANTEE

ORA_GRANTEE函数接受一个形参。该形参也返回是因为它是按引用传递的OUT模

式的VARCHAR2变量。DBMS_STANDARD包中的形参数据类型被定义为

ORA_NAME_LIST_T。 ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为PLS_INTEGER。 user_list包含触发事件授予了权限或角色的用户列表。

用法如下:

DECLARE

user_list DBMS_STANDARD.ORA_NAME_LIST_T;

counter PLS_INTEGER;

BEGIN

IF ora_sysevent = 'GRANT' THEN

counter := ora_grantee(user_list);

END IF;

END;

10. ORA_INSTANCE_NUM

ORA_INSTANCE_NUM函数不接受形参。它返回当前数据库实例编号,数据类型为NUMBER。

用法如下:

DECLARE

instance NUMBER;

BEGIN

instance := ora_instance_num;

END;

11. ORA_IS_ALTER_COLUMN

ORA_IS_ALTER_COLUMN函数接受一个形参,它是一个列名。该函数返回BOOLEAN 数据类型的真或假值。当列被更改时返回真,列未被更改时返回假。该函数使用传统的大写目录信息,但是如果在Oracle 11g中选择了以区分大小写的格式保存所有表,就需要匹配目录的大小写。该示例用了一个区分大小写的字符串作为

实参:

用法如下:

DECLARE

TYPE column_list IS TABLE OF VARCHAR2(32);

columns COLUMN_LIST := column_list('CREATED_BY','LAST_UPDATED_BY');

BEGIN

IF ora_sysevent = 'ALTER' AND

ora_dict_obj_type = 'TABLE' THEN

FOR i IN 1..columns.COUNT THEN

IF ora_is_alter_column(columns(i)) THEN

INSERT INTO logging_table

VALUES (ora_dict_obj_name||'.'||columns(i)||' changed.');

END IF;

END LOOP;

END IF;

END;

如果要防止修改标准who-audit列,比如 CREATED_BY、CREATION_DATE、

LAST_UPDATED_BY或LAST_UPDATE_DATE,这会非常有用。这些是安全列,通常用来标识谁最后通过标准应用程序接口(API)接触数据。对这些列的任何修改都可能使API不稳定。

12. ORA_IS_CREATING_NESTED_TABLE

ORA_IS_CREATING_NESTED_TABLE函数不接受形参。当创建一个带嵌套表的表时,它返回BOOLEAN数据类型的真或假值。

用法如下:

BEGIN

IF ora_sysevent = 'CREATE' AND

ora_dict_obj_type = 'TABLE' AND

ora_is_creating_nested_table THEN

INSERT INTO logging_table

VALUES (ora_dict_obj_name||'.'||' created with nested table.');

END IF;

END;

13. ORA_IS_DROP_COLUMN

ORA_IS_DROP_COLUMN函数接受一个形参,它是一个列名。该函数返回BOOLEAN 数据类型的真或假值。当列被删除时返回真,当列没有被删除时它返回假。虽然这个函数使用传统的大写目录信息,但是在Oracle 11g中如果选择以区分大小写的格式保存所有表,则需要匹配目录的大小写。本例使用一个不区分大小写的字符串作为实参。

用法如下:

DECLARE

TYPE column_list IS TABLE OF VARCHAR2(32);

columns COLUMN_LIST := column_list('CREATED_BY','LAST_UPDATED_BY');

BEGIN

IF ora_sysevent = 'DROP' AND

ora_dict_obj_type = 'TABLE' THEN

FOR i IN 1..columns.COUNT THEN

IF ora_is_drop_column(columns(i)) THEN

INSERT INTO logging_table

VALUES (ora_dict_obj_name||'.'||columns(i)||' changed.');

END IF;

END LOOP;

END IF;

END;

如果要防止修改who-audit列,比如这个表中前面讨论的ORA_IS_DROP_COLUMN

函数的那些列,则该函数非常有用。

14. ORA_IS_SERVERERROR

ORA_IS_SERVERERROR函数接受一个形参,它是一个错误号。当该错误在错误堆

栈上时,它返回BOOLEAN数据类型的真或假值。

用法如下:

BEGIN

IF ora_is_servererror(4082) THEN

INSERT INTO logging_table

VALUES ('ORA-04082 error thrown.');

END IF;

END;

15. ORA_LOGIN_USER

ORA_LOGIN_USER函数不接受形参。该函数返回当前模式名,数据类型为VARCHAR2。用法如下:

BEGIN

INSERT INTO logging_table

VALUES (ora_login_user||' is the current user.');

END;

16. ORA_PARTITION_POS

ORA_PARTITION_POS函数不接受形参。该函数返回带SQL文本的数值位置,表示

插入分区子句的地方。本函数仅用于INSTEAD OF CREATE触发器。

如果添加了自己的分区子句,可以使用下面的代码:

DECLARE

sql_text ORA_NAME_LIST_T;

sql_stmt VARCHAR2(32767);

partition VARCHAR2(32767) := 'partitioning_clause';

BEGIN

FOR i IN 1..ora_sql_txt(sql_text) LOOP

sql_stmt := sql_stmt || sql_text(i);

END LOOP;

sql_stmt := SUBSTR(sql_text,1,ora_partition_pos – 1)||' '

|| partition||' '||SUBSTR(sql_test,ora_partition_pos);

-- Add logic to prepend schema because this runs under SYSTEM.

sql_stmt := REPLACE(UPPER(sql_stmt),'CREATE TABLE '

,'CREATE TABLE '||ora_login_user||'.');

EXECUTE IMMEDIATE sql_stmt;

END;

这段编码示例要求授予触发器的拥有者CREATE ANY TRIGGER权限。应当为应用程序安排一个主权限用户,并且要避免使用SYSTEM模式。

17. ORA_PRIVILEGE_LIST

ORA_PRIVILEGE_LIST函数接受一个形参。该形参也返回是因为它是按引用传递的OUT模式的VARCHAR2变量。DBMS_STANDARD包中的形参数据类型被定义为ORA_NAME_LIST_T。ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为 PLS_INTEGER。priv_list包含触发事件授予的权限或角色的列表。

用法如下:

DECLARE

priv_list DBMS_STANDARD.ORA_NAME_LIST_T;

counter PLS_INTEGER;

BEGIN

IF ora_sysevent = 'GRANT' OR

ora_sysevent = 'REVOKE' THEN

counter := ora_privilege_list(priv_list);

END IF;

END;

18. ORA_REVOKEE

ORA_REVOKEE函数接受一个形参。该形参也返回是因为它是按引用传递的OUT模式的VARCHAR2变量。DBMS_STANDARD包中的形参数据类型被定义为

ORA_NAME_LIST_T。 ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为PLS_INTEGER。 priv_list包含触发事件授予的权限或角色列表。

用法如下:

DECLARE

revokee_list DBMS_STANDARD.ORA_NAME_LIST_T;

counter PLS_INTEGER;

BEGIN

IF ora_sysevent = 'REVOKE' THEN

counter := ora_revokee(priv_list);

END IF;

END;

19. ORA_SERVER_ERROR

ORA_SERVER_ERROR函数接受一个形参,它是错误堆栈上的位置,其中1是错误堆栈的顶端。它返回NUMBER数据类型的错误号。

用法如下:

DECLARE

error NUMBER;

BEGIN

FOR i IN 1..ora_server_error_depth LOOP

error := ora_server_error(i);

END LOOP;

END;

20. ORA_SERVER_ERROR_DEPTH

ORA_SERVER_ERROR_DEPTH函数不接受形参。该函数返回的错误堆栈上的错误号为PLS_INTEGER数据类型。ORA_SERVER_ERROR和ORA_SERVER_ERROR_MSG函数的代码示例演示了本函数的用法。

21. ORA_SERVER_ERROR_MSG

ORA_SERVER_ERROR_MSG函数接受一个参数,它是错误堆栈上的位置,其中1是错误堆栈的顶端。它返回VARCHAR2数据类型的错误消息文本。

用法如下:

DECLARE

error VARCHAR2(64);

BEGIN

FOR i IN 1..ora_server_error_depth LOOP

error := ora_server_error_msg(i);

END LOOP;

END;

22. ORA_SERVER_ERROR_NUM_PARAMS

ORA_SERVER_ERROR_NUM_PARAMS 函数不接受形参。该函数返回错误消息中所有替代字符串的数目,数据类型为PLS_INTEGER。例如,错误格式可以是“Expected %s, found %s.” ORA_SERVER_ERROR_PARAM函数的代码示例显示了本函数的用法。

23. ORA_SERVER_ERROR_PARAM

ORA_SERVER_ERROR_PARAM函数接受一个形参,它是错误消息中的位置,其中1

是错误消息中出现的第一个字符串的位置。它返回VARCHAR2数据类型的错误消息文本。

用法如下:

DECLARE

param VARCHAR2(32);

BEGIN

FOR i IN 1..ora_server_error_depth LOOP

FOR j IN 1..ora_server_error_num_params(i) LOOP

param := ora_server_error_param(j);

END LOOP;

END LOOP;

END;

24. ORA_SQL_TXT

ORA_SQL_TXT函数接受一个形参。该形参也返回是因为它是按引用传递的OUT模式的VARCHAR2变量。DBMS_STANDARD包中的形参数据类型被定义为

ORA_NAME_LIST_T。 ORA_NAME_LIST_T是一个VARCHAR2(64)数据类型的表。该函数返回列表中的元素个数,数据类型为PLS_INTEGER。该列表包含触发事件的SQL 语句处理的子串。代码示例见ORA_PARTITION_POS函数。

25. ORA_SYSEVENT

ORA_SYSEVENT函数不接受形参。该函数返回负责激发触发器的系统事件,数据

类型为VARCHAR2。

用法如下:

BEGIN

INSERT INTO logging_table

VALUES (ora_sysevent||' fired the trigger.');

END;

26. ORA_WITH_GRANT_OPTION

ORA_WITH_GRANT_OPTION函数不接受形参。该函数返回BOOLEAN数据类型的真或假值。当用授权选项授予权限时它返回真值。

用法如下:

BEGIN

IF ora_with_grant_option THEN

INSERT INTO logging_table

VALUES ('ORA-04082 error thrown.');

END IF;

END;

27. SPACE_ERROR_INFO

SPACE_ERROR_INFO函数使用6个按引用传递的形参。它们都是OUT模式参数。原型为:

space_error_info( error_number OUT NUMBER

, error_type OUT VARCHAR2

, object_owner OUT VARCHAR2

, table_space_name OUT VARCHAR2

, object_name OUT VARCHAR2

, sub_object_name OUT VARCHAR2)

当触发事件与out-of-space条件相关时,该函数返回真,它填充所有输出参数。

ORACLE数据备份与数据恢复方案

O R A C L E数据备份与数据恢 复方案 Prepared on 24 November 2020

摘要 结合金华电信IT系统目前正在实施的备份与恢复策略,重点介绍电信业务计算机管理系统(简称97系统)和营销支撑系统的ORALCE数据库备份和恢复方案。 Oracle数据库有三种标准的备份方法,它们分别是导出/导入 (EXP/IMP)、热备份和冷备份。要实现简单导出数据(Export)和导入数据(Import),增量导出/导入的按设定日期自动备份,可考虑,将该部分功能开发成可执行程序,然后结合操作系统整合的任务计划,实现特定时间符合备份规划的备份应用程序的运行,实现数据库的本级备份,结合ftp简单开发,实现多服务器的数据更新同步,实现数据备份的异地自动备份。 关键字:数据库远程异地集中备份 目录

一、前言 目前,数据已成为信息系统的基础核心和重要资源,同时也是各单位的宝贵财富,数据的丢失将导致直接经济损失和用户数据的丢失,严重影响对社会提供正常的服务。另一方面,随着信息技术的迅猛发展和广泛应用,业务数据还将会随业务的开展而快速增加。但由于系统故障,数据库有时可能遭到破坏,这时如何尽快恢复数据就成为当务之急。如做了备份,恢复数据就显得很容易。由此可见,做好数据库的备份至关重要。因此,建立一个满足当前和将来的数据备份需求的备份系统是必不可少的。传统的数据备份方式主要采用主机内置或外置的磁带机对数据进行冷备份,这种方式在数据量不大、操作系统种类单一、服务器数量有限的情况下,不失为一种既经济又简明的备份手段。但随着计算机规模的扩大,数据量几何级的增长以及分布式网络环境的兴起,将越来越多的业务分布在不同的机器、不同的操作平台上,这种单机的人工冷备份方式越来越不适应当今分布式网络环境。 因此迫切需要建立一个集中的、自动在线的企业级备份系统。备份的内容应当包括基于业务的业务数据,又包括IT系统中重要的日志文件、参数文件、配置文件、控制文件等。本文以ORACLE数据库为例,结合金华电信的几个相关业务系统目前正在实施的备份方案,介绍ORACLE数据库的备份与恢复。 二、金华电信ORACLE数据库的备份与恢复方案 由于金华电信IT系统以前只采用逻辑备份方式进行数据库备份,速度较慢并且数据存储管理都很分散,甚至出现备份数据不完整的现象。为了提高备份数据的效率,提供可靠的数据备份,完善备份系统,保证备份数据的完整性,降低数据备份对网络和服务器的影响,对每个IT系统的备份数据进行集中管理,我们对备份工作进行了改进,将逻辑备份与物理备份相结合,在远程建立了一个异地集中、自动在线的备份系统即网络存储管理系统。(这里用到的物理备份指热备份)其具备的主要功能如下:(1)集中式管理 :网络存储备份管理系统对整个网络的数据进行管理。利用集中式管理工具的帮助,系统管理员可对全网的备份策略进行统一管理,备份服务器可以监控所有机器的备份作业,也可以修改备份策略,并可即时浏览所有目录。所有数据可以备份到同备份服

oracle数据库恢复方案

目录 数据库恢复方案 (1) 文档控制 (1) 一、相关概念 (3) 1,恢复的两个阶段 (3) 2,Oracle实例启动的三个阶段 (3) 3,RMAN信息的保存位置 (3) 二、完全恢复 (3) (一) 控制文件 (3) 1) 丢失部分控制文件: (3) 2) 丢失全部控制文件 (3) (二) 重做日志文件 (4) 1) 非当前使用的重做日志文件: (4)

2) 当前使用的重做日志文件(未归档): (4) (三) 数据文件 (4) 1) 无归档模式下的完全恢复 (4) 2) 归档模式下的完全恢复 (5) 三、不完全恢复 (6) (一) 基于SCN的不完全恢复 (6) 1) 准备工作 (6) 2) 使用RMAN进行恢复 (7) (二) 基于时间点的不完全恢复 (8) 1) 准备工作 (8) 2) 使用RMAN进行恢复 (8) 四、高级篇 (9)

(一) 使用RMAN进行异机同目录 (9) 1) 准备工作 (9) 2) 通过RMAN进行异机恢复 (10) (二)使用RMAN进行异机异目录 (11) 1) 准备工作 (11) 2) 通过RMAN进行异机恢复 (11) (三)使用RMAN进行在线数据块恢复 (14) 一、相关概念 1,恢复的两个阶段 数据库无论采取哪种方式进行恢复都分为Restore和Recover两个步骤。Restore(还原):把控制文件、重做日志文件和数据文件还原到正确位置。Recover(恢复):恢复还原后的数据文件,使数据库达到一致状态。

2,Oracle实例启动的三个阶段 Oracle实例启动经过三个阶段: l NOMOUNT(未装载):读入参数文件,验证参数文件中的目录是否存在。 l MOUNT(装载):读入参数文件指定位置的控制文件。 l OPEN(打开):验证控制文件中指定的重做日志文件和数据文件是否正确、数据文件是否一致,然后读入数据文件中的数据。 所以按照如下顺序使数据库正确打开。 1) SHUTDOWN(关闭)状态下,确保参数文件指定的文件夹存在,启动到NOMMUNT 状态。 2) NOMOUNT状态下,保证控制文件的位置和命名与参数文件中相同,控制文件中指定的重做日志文件和数据文件存在,然后启动到MOUNT状态。 3) MOUNT状态下,执行RMAN还原和恢复操作。

Oracle Export/Import数据库备份与恢复的三种方法

Oracle数据库备份与恢复的三种方法 Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。 一、导出/导入(Export/Import) 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。 1、简单导出数据(Export)和导入数据(Import) Oracle支持三种方式类型的输出: (1)、表方式(T方式),将指定表的数据导出。 (2)、用户方式(U方式),将指定用户的所有对象及数据导出。 (3)、全库方式(Full方式),瘵数据库中的所有对象导出。 数据导入(Import)的过程是数据导出(Export)的逆过程,分别将数据文件导入数据库和将数据库数据导出到数据文件。 2、增量导出/导入 增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。 增量导出包括三种类型: (1)、“完全”增量导出(Complete) 即备份三个数据库,比如: exp system/manager inctype=complete file=040731.dmp (2)、“增量型”增量导出 备份上一次备份后改变的数据,比如: exp system/manager inctype=incremental file=040731.dmp

Oracle数据库恢复

Oracle 数据库恢复 一、停止ORACLE数据库 用oracle用户登录,用sqlplus的sysdba用户登录,执行shutdown immediate oracle@JSBC-SIHUA-DB01:~> sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Mon Feb 6 14:02:45 2012 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn /as sysdba Connected. SQL> shutdown immediate SQL>quit 停止监听 oracle@JSBC-SIHUA-DB01:~> lsnrctl stop oracle@JSBC-SIHUA-DB01:~> ps -ef |grep ora root 4655 4524 0 Nov11 ? 00:00:48 hald-addon-storage: polling /dev/sr0 (every 16 sec) root 42514 42162 0 11:40 pts/0 00:00:00 su - oracle oracle 42515 42514 0 11:40 pts/0 00:00:00 -bash root 42853 42815 0 12:02 pts/2 00:00:00 su - oracle oracle 42854 42853 0 12:02 pts/2 00:00:00 -bash root 42924 42889 0 12:03 pts/1 00:00:00 su - oracle oracle 42925 42924 0 12:03 pts/1 00:00:00 -bash oracle 42975 42854 0 12:09 pts/2 00:00:00 ps -ef oracle 42976 42854 0 12:09 pts/2 00:00:00 grep ora 二、数据库备份 #root用户,创建sihua.bak目录 JSBC-SIHUA-DB01:/oradata # mkdir sihua.bak JSBC-SIHUA-DB01:/oradata # chown oracle:dba /oradata/sihua.bak JSBC-SIHUA-DB01:/oradata # ll total 24 drwx------ 2 root root 16384 Sep 16 11:53 lost+found drwxr-x--- 4 oracle dba 4096 Nov 8 14:16 sihua drwxr-xr-x 2 oracle dba 4096 Nov 28 12:15 sihua.bak #oracle用户 JSBC-SIHUA-DB01:/oradata # su - oracle oracle@JSBC-SIHUA-DB01:~> cd /oradata oracle@JSBC-SIHUA-DB01:/oradata> cp -r sihua sihua.bak oracle@JSBC-SIHUA-DB01:/oradata> cd sihua.bak/ oracle@JSBC-SIHUA-DB01:/oradata/sihua.bak> cd sihua/

实验8 Oracle数据库备份与恢复

实验8 Oracle数据库备份与恢复 1 实验目的 (1)掌握Oracle数据库各种物理备份方法。 (2)掌握Oracle数据库各种物理恢复方法。 (3)掌握利用RMAN工具进行数据库的备份与恢复。 (4)掌握数据的导入与导出操作。 2 实验要求 (1)对BOOKSALES数据库进行一次冷备份。 (2)对BOOKSALES数据库进行一次热备份。 (3)利用RMAN工具对BOOKSALES数据库的数据文件、表空间、控制文件、初始化参数文件、 归档日志文件进行备份。 (4)利用热备份恢复数据库。 (5)利用RMAN备份恢复数据库。 (6)利用备份进行数据库的不完全恢复。 3 实验步骤 (1)关闭BOOKSALES数据库,进行一次完全冷备份。 select file_name from dba_data_files; select member from v$logfile; select value from v$parameter where name='control_files';

(2)启动数据库后,在数据库中创建一个名为cold表,并插入数据,以改变数据库的状态。 CREATE TABLE COLD( ID NUMBER PRIMARY KEY, NAME VARCHAR2(25) );

(3)利用数据库冷备份恢复BOOKSALES数据库到备份时刻的状态并查看恢复后是否存在cold表。 (4)将BOOKSALES数据库设置为归档模式。 shutdown immediate 正常关闭数据 startup mount;将数据库启动到mount状态 3)、关闭flash闪回数据库模式,如果不关闭的话,在后面关闭归档日志的时候就会出现讨厌的ora-38774错误。 alter database flashback off alter database archivelog;发出设置归档模式的命令 alter database open;打开数据库 再次正常关闭数据库,并备份所有的数据文件和控制文件 archive log list;在将数据库设置为归档模式后,可以执行此命令进行确认 Database log mode 为Archive Mode说明当前的数据库为归档模式 Automatic archival为Enable说明启动了自动归档。

Oracle数据库文件及恢复方法

1参数文件 对于参数文件,启动根据如下顺序查找参数文件,先查找spfile.ora,然后查找init.ora,若两者均查找不到,则无法创建和启动instance。确认当前使用的是spfile/pfile可通过sql语句查询(show parameter spfile) 一般情况下pfile保存在$ORACLE_HOME/dbs下,其中内容制定SPFILE位置,SPFILE保存在裸设备上,主被机共享。参数文件中保存数据库启动的初始参数,如控制文件位置等。 1.1参数文件恢复: 如果损坏或丢失,从其他机器拷贝一个到$ORACLE_HOME/dbs %sqlplus / as sysdba SQL>startup pfile=’/dbs/’; 2控制文件 数据库启动到nomount状态后,可以查询v$parameter视图,获得控制文件信息,这部分信息来自启动的参数文件,oracle从参数文件spfile/pfile中获得控制文件的位置信息,找到控制文件,启动到MOUNT状态下,可以查询v$controlfile视图获得关于控制文件的信息,可以通过sql语句(select * from v$controlfile;),数据库读取控制文件controlfile 中的内容,并按照控制文件中指定的参数找到相应的数据文件,并启动数据库的归档或非归档状态。 控制文件中包含的内容 数据库的名字、ID、创建的时间戳

表空间的名字 联机日志文件、数据文件的位置、个数、名字 联机日志的Sequence号码 检查点的信息 撤销段的开始或结束 归档信息 备份信息 2.1控制文件恢复: 损坏或丢失部分控制文件: SQL>shutdown immediate; SQL>startup nomount; 修改数据库控制文件,将坏的那个排除在外: SQL>alter system set control_files='+DG_ORA/ora11g/','+DG_ORA/ora11g/' scop e=spfile"; SQL>alter database open; 损坏或丢失全部控制文件: (获取恢复脚本SQL>alter database backup controlfile to trace;) STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORA11G" NORESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 200 MAXLOGMEMBERS 3 MAXDATAFILES 1024 MAXINSTANCES 8 MAXLOGHISTORY 2920 LOGFILE GROUP 1 '+DG_ORA/ora11g/ora_redo01_1' SIZE 1000M BLOCKSIZE 512, GROUP 2 '+DG_ORA/ora11g/ora_redo02_2' SIZE 1000M BLOCKSIZE 512, GROUP 3 '+DG_ORA/ora11g/ora_redo03_3' SIZE 1000M BLOCKSIZE 512, GROUP 4 '+DG_ORA/ora11g/ora_redo04_4' SIZE 1000M BLOCKSIZE 512, GROUP 5 '+DG_ORA/ora11g/ora_redo05_5' SIZE 1000M BLOCKSIZE 512,

Oracle数据库恢复案例

Oracle数据库恢复案例 当我们在使用Oracle数据库时,突然断电,造成很多问题,致使旧数据丢失,影响了数据的正确性,破坏了数据库。此时,用户急切需求恢复数据。本文以此为例,讲述数据库数据恢复。 一、案例描述: 数据库因突然断电,数据库启库报system01.dbf需要更多的恢复来保持一致性,数据库无法打开;数据库没有备份,归档日志也不连续。客户提供了数据库的在线文件,急需恢复zxfg用户下的数据。 二、恢复流程: 1 数据库的故障检测 2 尝试挂起数据库并修复数据库 3解析数据文件 4验证数据 5导出数据与交付数据(导入) 三、恢复数据 1数据库的故障检测 利用DBV 命令检测数据文件的完整性 结果如下:

分析结果发现SYSAUX01.DBF文件数据块(Data)检测失败40页,索引页(Index)检测失败29页,说明SYSAUX01.DBF存在坏块。 结论:通过dbv对数据文件的完整性检验,SYSAUX01.DBF存在坏块,其他检测的文件完整。 2 用客户的数据库本地挂起数据库,尝试修复数据库。 2.1创建新的OS :windows server 2008 x86,安装oracle 11.2.0.1.0 for 32-bit 版本数据库,挂起数据库 起库报ORA-01110错误,System01.dbf需要更多一致性恢复。使用recover database 命令,利用在线日志做介质恢复。

数据库的控制文件已被修改,需要使用控制文件恢复数据库 恢复数据库需要2016_01_19的11号归档日志。由于归档日志丢失,使用cancel 参数进行不完全恢复。 再次执行alter database open 命令,数据库打开。

Oracle数据库文件及恢复方法

1 参数文件 对于参数文件,启动根据如下顺序查找参数文件,先查找spfile.ora,然后查找init.ora,若两者均查找不到,则无法创建和启动instance。确认当前使用的是spfile/pfile可通过sql语句查询(show parameter spfile) 一般情况下pfile保存在$ORACLE_HOME/dbs下,其中内容制定SPFILE位置,SPFILE保存在裸设备上,主被机共享。参数文件中保存数据库启动的初始参数,如控制文件位置等。 1.1 参数文件恢复: 如果损坏或丢失,从其他机器拷贝一个initora01.ora到$ORACLE_HOME/dbs %sqlplus / as sysdba SQL>startup pfile=’?/dbs/initora01.ora’; 2 控制文件 数据库启动到nomount状态后,可以查询v$parameter视图,获得控制文件信息,这部分信息来自启动的参数文件,oracle从参数文件spfile/pfile中获得控制文件的位置信息,找到控制文件,启动到MOUNT状态下,可以查询v$controlfile视图获得关于控制文件的信息,可以通过sql语句(select * from v$controlfile;),数据库读取控制文件controlfile中的内容,并按照控制文件中指定的参数找到相应的数据文件,并启动数据库的归档或非归档状态。控制文件中包含的内容 数据库的名字、ID、创建的时间戳 表空间的名字

精选文档联机日志文件、数据文件的位置、个数、名字 联机日志的Sequence号码 检查点的信息 撤销段的开始或结束 归档信息 备份信息 2.1 控制文件恢复: 损坏或丢失部分控制文件: SQL>shutdown immediate; SQL>startup nomount; 修改数据库控制文件,将坏的那个排除在外: SQL>alter system set control_files='+DG_ORA/ora11g/control02.ctl','+DG_ORA/o ra11g/control03.ctl' scope=spfile"; SQL>alter database open; 损坏或丢失全部控制文件: (获取恢复脚本SQL>alter database backup controlfile to trace;) STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORA11G" NORESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 200 MAXLOGMEMBERS 3 MAXDATAFILES 1024 MAXINSTANCES 8 MAXLOGHISTORY 2920 LOGFILE GROUP 1 '+DG_ORA/ora11g/ora_redo01_1' SIZE 1000M BLOCKSIZE 512, GROUP 2 '+DG_ORA/ora11g/ora_redo02_2' SIZE 1000M BLOCKSIZE 512, GROUP 3 '+DG_ORA/ora11g/ora_redo03_3' SIZE 1000M BLOCKSIZE 512, GROUP 4 '+DG_ORA/ora11g/ora_redo04_4' SIZE 1000M BLOCKSIZE 512, GROUP 5 '+DG_ORA/ora11g/ora_redo05_5' SIZE 1000M BLOCKSIZE 512,

ORACLE数据库备份与恢复详解

ORACLE数据库备份与恢复详解 Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归档模式(Archivelog-style),通常,我们把非归档模式称为冷备份,而相应的把归档模式称为热备份,他们的关系如下所示 三种方式各有优点,我们做个比较(这个是用Fireworks画的,有点糙):

$A: 现在先来介绍一下逻辑备份方式的方法,利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。理论基础:Oracle 提供的Export和Import具有三种不同的操作方式(就是备份的数据输出(入)类型): 1,表方式(T) 可以将指定的表导出备份; 2,全库方式(Full) 将数据库中的所有对象导出; 3,用户方式(U) 可以将指定的用户相应的所有数据对象导出; *在导入导出备份方式中,提供了很强大的一种方法,就是增量导出/导入,但是它必须作为System来完成增量的导入导出,而且只能是对整个数据库进行实施。增量导出又可以分为三种类别: 1,完全增量导出(完全备份)(Complete Export) 这种方式将把整个数据库文件导出备份;exp system/manager inctype=complete file=20041125.dmp(为了方便检索和事后的查询,通常我们将备份文件以日期或者其他有明确含义的字符命名) 2,增量型增量导出(增量备份)(Incremental Export) 这种方式将只会备份上一次备份后改变的结果;exp system/manager inctype=incremental file=20041125.dmp 3,累积型增量导出(差异备份)(Cumulate Export) 这种方式的话,是导出自上次完全增量导出后数据库变化的信息。exp system/manager inctype=cumulative file=20041125.dmp 通常情况下,DBA们所要做的,就是按照企业指定或者是自己习惯的标准(如果是自己指定的标准,建议写好计划说明),一般,我们采用普遍认可的下面的方式进行每天的增量备份: Mon:完全备份(A) Tue:增量导出(B) Wed:增量导出(C) Thu:增量导出(D)

oracle数据库备份与恢复的三种方法(1)

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。 一、导出/导入(Export/Import) 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。 1、简单导出数据(Export)和导入数据(Import) Oracle支持三种方式类型的输出: (1)、表方式(T方式),将指定表的数据导出。 (2)、用户方式(U方式),将指定用户的所有对象及数据导出。 (3)、全库方式(Full方式),瘵数据库中的所有对象导出。 数据导入(Import)的过程是数据导出(Export)的逆过程,分别将数据文件导入数据库和将数据库数据导出到数据文件。 2、增量导出/导入 增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。 增量导出包括三种类型: (1)、“完全”增量导出(Complete) 即备份三个数据库,比如: (2)、“增量型”增量导出 备份上一次备份后改变的数据,比如: (3)、“累积型”增量导出 累计型导出方式是导出自上次“完全”导出之后数据库中变化了的信息。比如: 数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效的完成。 比如数据库的被封任务可以做如下安排: 星期一:完全备份(A)

星期二:增量导出(B) 星期三:增量导出(C) 星期四:增量导出(D) 星期五:累计导出(E) 星期六:增量导出(F) 星期日:增量导出(G) 如果在星期日,数据库遭到意外破坏,数据库管理员可按一下步骤来回复数据库: 第一步:用命令CREATE DATABASE重新生成数据库结构; 第二步:创建一个足够大的附加回滚。 第三步:完全增量导入A: 第四步:累计增量导入E: 第五步:最近增量导入F: 二、冷备份 冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言,冷备份时最快和最安全的方法。冷备份的优点是: 1、是非常快速的备份方法(只需拷文件) 2、容易归档(简单拷贝即可) 3、容易恢复到某个时间点上(只需将文件再拷贝回去) 4、能与归档方法相结合,做数据库“最佳状态”的恢复。 5、低度维护,高度安全。 但冷备份也有如下不足: 1、单独使用时,只能提供到“某一时间点上”的恢复。 2、再实施备份的全过程中,数据库必须要作备份而不能作其他工作。也就是说,在冷备份过程中,数据库必须是关闭状态。

冷恢复oracle数据库步骤流程

Oracle 数据库冷还原、冷恢复详情 目的: 帮助更多的程序员、dba、项目负责人在遇到灾难性的oracle数据库崩溃时少走弯路、准确、快速恢复oracle数据库。 步骤: 废话少说,但我还是啰嗦一句:作为技术人员,请对马虎说不,处事不惊,静下心来认认真真看看别人写下来的相关文档,这对自己受益匪浅。 一、前提条件: 在冷恢复oracle 数据库之前,前提条件是非常重要的,想自己少走点弯路,务必明确每一个点。必须明确的、所需要用到的文件如下: 1、控制文件,数据文件,日志文件用户文件。文件在Oracle安装目录\oradata\全局数据库名称文件夹\ 下(包括控制文件,数据文件,日志文件、用户文件等都在里面)。 如:E:\Oracle\oradata\orcl\ 如下图列出所有文件,此处控制文件一个,还有一个在另外一个地方下面会说到,数据库文件5个,日志文件3个,用户文件若干个或者没有(没有也没关系): 注意:还有一个控制文件control02.ctl位置在: Oracle安装目录\flash_recovery_area\全局数据库名文件夹\ 下面 如:E:\Oracle\flash_recovery_area\orcl\control02.ctl 2、初始化参数文件、密码文件。在Oracle安装目录\product\11.2.0\dbhome_1\database\

下面。 注意:数据库的初始化参数文件记载着数据库的所有初始化信息,此文件的正确性是整个数据库能否恢复关键。后面在重建新实例时会详细说明如何编辑初始化参数文件。密码文件是二进制加密的数据文件,千万不能使用文本打开手动编辑,否则密码文件将失效,将可能无法还原用户数据库。 初始化参数文件位置:Oracle安装目录\product\11.2.0\dbhome_1\database\init数据库_sid.ora。 如:E:\Oracle\product\11.2.0\dbhome_1\database\INITorcl.ORA 密码文件位置:Oracle安装目录\product\11.2.0\dbhome_1\database\pwd数据库_sid.ora。如:E:\Oracle\product\11.2.0\dbhome_1\database\PWDorcl.ora。 3、必须要明确知道数据库名db_name、全局数据库名db_unique_name、数据库实例名SID 。事实上这三个数据库关键名称前两个都已加载在初始化参数文件,使用文本可以打开查看到参数db_name=’xxx’和db_unique_name=’xxx’,数据库实例名SID就是初始化参数文件名称去掉init部分,如E\Oracle\product\11.2.0\dbhome_1\database\initorcl.ora 文件orcl就是SID。 二、安装数据库服务端 如果是在原机器上。请重新安装oracle服务端。 如果是在新机器上。若已经安装有完好可用的oracle数据库服务端,可以忽略这第二步,直接到第三步,要是现版本和原来的数据库版本不一致不妨先到第三步试试版本不一致的情况是否可以行(答案等着你来回答)。不放心的可以卸载后重新安装一致的版本。 注:要是时间比较紧迫,建议安装数据库服务端时先不要创建默认数据库orcl,这样可以快很多(节省时间)。 很多人说安装oracle数据库服务端版本要与原数据库版本一致,所以最好安装跟原来版本一致的oracle服务端。至于版本不一致的情况打个疑问号(谁要是有时间可以试试,并把答案在评论上发表出来,感激不尽)。 三、创建实例 注:安装好oracle数据库服务端后,打开开始菜单找到oracle安装主目录下面有若干工具,其中有一个叫Database Configuration Assistant 。 创建oracle实例有两种方式 第一种方式是使用oracle服务端工具Database Configuration Assistant 简称DBCA工具创建。

Oracle数据库备份还原操作流程

1数据库备份和恢复 1.1数据库备份 数据库备份有两种方法:一、使用数据库备份向导;二、输入数据库备份命令。 方法一:向导备份 1. 点击“开始-运行”,输入cmd,在命令行中输入“exp”,回车,如图: 图 1-1向导备份 2. 输入要导出数据库方案的用户名和密码: 图 1-2输入用户名和密码 3. 依次输入缓冲区大小、导出文件存放路径、选择导出方式(导出完整数据库、按用 户导出、按表导出)、是否导出权限、是否导出表数据、是否压缩,一般情况下“是 否导出权限”改成“no”,其余使用默认即可。 4. 最后输入导出数据库方案所属用户名,回车,如图:

图 1-3输入导出数据库方案用户名 5. 再次回车,完成导出。 方法二:命令备份 根据数据库的具体情况,可以将方法一的第2、3步中需要的信息在第1步“exp”命令后进行描述。 例如:在本机上导出10.1.1.240服务器上用户ptac的数据库,点击“开始-运行”,输入cmd,命令行中输入: exp ptac/ptac@jqdemo_l0.1.1.240 file=d:\ptac.dmp full=n grants=n 回车,完成备份。 ●exp:oracle数据库导出指令; ●ptac/ptac:用户名/密码; ●jqdemo_l0.1.1.240:数据库服务名 ●file=d:\ptac.dmp:导出文件保存路径及名称; ●full=n:是否导出整个文件,n表示选择no; ●grants=n:是否导出权限,n表示选择no。 ●statistics=NONE:是否忽略字符集 输入exp help=y,可获得过更多关于数据库备份命令的信息。 1.2数据库恢复 如果是初次恢复数据库方案,需要先添加相应的表空间和用户,详见“4.数据库的配置”。 如果是要覆盖已有数据库方案,恢复之前要删除原方案,详见“7.1删除方案”。 数据库恢复有两种方法: 一、使用数据库恢复向导; 二、输入数据库恢复命令。

ORACLE使用数据文件恢复数据库

ORACLE使用数据文件恢复数据库 一、问题描述 Oracle控制文件丢失,数据文件完整,导致数据库实例不能启动。在修改数据库服务器的计算机名称、IP地址后,修改listener.ora和tnsnames.ora文件中的HOST地址后不能启动数据库实例或启动后不能登录使用数据,以及未能查找并解决数据库启动失败原因时可以通过重建控制文件的方式对数据库实例进行恢复。 二、恢复方法 1、恢复前准备工作 1)备份数据文件,文件路径为%ORACLE_NOME%/oradata/xxxx(xxxx为数据库实例)。 2)备份ORACLE安装路径下的Oracle\product\10.2.0\admin\xxxx\bdump\alert_xxxx.log (xxxx为数据库实例)。 3)ORACLE安装文件 2、恢复步骤 1)安装oracle数据库,安装时不要创建数据库实例 2)创建数据库实例:安装完成后创建数据库实例,实例名与原数据库实例相同,并创建监听服务。 3)拷贝数据文件:停止oracle相关服务,拷贝备份的数据文件到新安装的oracle数据库安装位置对应路径下,删除新成的控制文件及日志文件(%ORACLE_NOME%/oradata/ 下所有文件)、完成后重启oracle相关服务。 4)准备重建控制文件脚本:打开事先备份的alert_xxxx.log文件,查找最后一个create controlfile语句并修改以下几部分。 a)若该语句中包含NORESETLOGS,则将其修改为RESETLOGS;原因是重做日志文件 已经丢失。 b)LOGFILE段是指定重做日志文件到期望的文件位置。 c)DATAFILE段是指定到数据文件的实际文件位置。不能包含临时表空间用到的文件, 否则报错(ora-01503,ora-01160,ora-01110)。 注意:create controlfile语句中如果包含NOARCHIVELOG,则为非归档模式,如为 ARCHIVELOG,则为归档模式,没有则保持没有。 5)重建控制文件 a)打开sqlplus,使用DBA(sys)用户登录到数据库 示例:打开cmd,执行sqlplus /nolog 回车 SQL>Conn sys/password as sysdba b)关闭数据库 示例:SQL>Shutdown immediate; c)启动数据库,但不挂载数据文件 SQL>Startup nomount;

(完整版)Oracle数据库备份和恢复操作手册

1 ORACLE数据库数据备份和恢复操作手册 1.1.ORACLE参数设置 进入CMD操作界面,使用sqlplus连接数据库, 图例 1 数据库连接操作 连接语法:sqlplus system/Oracle2013@orcl 参数说明备注sqlplus 语法命令 system 数据库管理员用户名 Oracle2013 system用户密码 orcl 数据库连接标示符数据库安装目录的tnsnames.ora文件中可以找到 Oracle11G目录: C:\app\Administrator\product\11.2.0\dbhome _1\NETWORK\ADMIN

图例 2 成功连接数据库 环境变量设置(在Sqlplus中执行) create or replace directory as ‘c:\tmpdir’; 参数说明备注 dir_name 路径名称 c:\tmpdir 文件路径也可以是另外的随意目录,用单引号括起来。

图例 3 环境变量设置

1.2. 数据备份 备份脚本:expdp system/Oracle2013@orcl directory=file_path dumpfile=ARADMIN.dat logfile=ARADMIN.log schemas=ARADMIN 参数说明备注expdp 语法命令 system 数据库管理员用户名 Oracle2013 system用户密码 orcl 数据库连接标示符数据库安装目录的tnsnames.ora文件中可以找到 Oracle11G目录: C:\app\Administrator\product\11.2.0\dbhome _1\NETWORK\ADMIN directory 文件目录名称导出数据库文件的存放目录dumpfile 数据库文件名称导出数据库文件的文件名logfile 数据库日志文件名称导出数据库的日志文件名称schemas 数据库用户 图例 4 数据库备份操作 成功导出。

Oracle数据库删除还原步骤

数据库还原步骤,分两种情况,一种是创建新库还原(1),一种是在老库上进行还原(2)。第一种情况:(1) ?首先在数据库服务器上创建表空间,和存储文件。执行以下语句,注意:创建表空间尽量和还原的库保存一致,不一致的情况下可能会报错,没测试过。 create tablespace MDF_DATA datafile 'D:\app\oracle\oradata\tsmes\MDF_DATA.DBF' size 500M AUTOEXTEND ON NEXT 50M; ?第二创建用户,并给用户分配表空间.将前面所创建的表空间分配给用户。 create user cpt identified by cpt Default Tablespace MDF_DATA; create user dbo identified by dbo Default Tablespace MDF_DATA; create user dps identified by dps Default Tablespace MDF_DATA; create user prm identified by prm Default Tablespace MDF_DATA; create user pub identified by pub Default Tablespace MDF_DATA; create user qua identified by qua Default Tablespace MDF_DATA; create user std identified by std Default Tablespace MDF_DATA; create user mdfsys identified by mdfsys Default Tablespace MDF_DATA; create user tpm identified by tpm Default Tablespace MDF_DATA; create user aps identified by aps Default Tablespace MDF_DATA; create user itg identified by itg Default Tablespace MDF_DATA; create user spc identified by spc Default Tablespace MDF_DATA; create user di identified by di Default Tablespace MDF_DATA; ?给用户赋权限。 grant connect,resource,dba to cpt; grant connect,resource,dba to dbo; grant connect,resource,dba to dps; grant connect,resource,dba to prm; grant connect,resource,dba to pub; grant connect,resource,dba to qua; grant connect,resource,dba to std; grant connect,resource,dba to mdfsys; grant connect,resource,dba to tpm; grant connect,resource,dba to aps; grant connect,resource,dba to itg; grant connect,resource,dba to spc; grant connect,resource,dba to di; ?导入备份的数据库文件。 Imp 用户名/密码@数据库名 file=文件地址下面为示例: imp system/meszz@meszznew file=C:\data0624-2.dmp full=y 第二种情况(2) 还原数据库跟第一种操作上稍微不同,步骤如下: ?删除用户,语句如下。 drop user cpt cascade; drop user dbo cascade; drop user dps cascade; drop user prm cascade;

oracle数据库备份和恢复方案

oracle数据库备份与恢复方案

目录 一、编写目的 (1) 二、备份工具及备份方式 (1) 三、软件备份 (1) 四、软件恢复 (1) 五、数据备份 (2) 六、备份的存储 (2) 七、备份数据的保存规定 (2) 八、备份介质的格式 (3) 九、数据恢复 (4)

一、编写目的 本文档主要说明公司项目在实施现场的软件及数据的备份和恢复方案。 二、备份工具及备份方式 1.备份工具 Oracle RMAN(Recovery Manager):是一种用于备份(backup)、还原(restore) 和恢复(recover)数据库的 Oracle 工具。RMAN只能用于ORACLE8或更高的版 本中。它能够备份整个数据库或数据库部件,如表空间、数据文件、控制文件、归档文件以及Spfile参数文件。RMAN也允许您进行增量数据块级别的备份, 增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的 那些数据块。 2.备份方式 (1)自动备份:由Windows 计划任务调度完成; (2)手工备份:完成特殊情况下的备份,分热备份和冷备份,热备份是指在不 关闭数据库情况下进行备份,冷备份则需要停止Oracle实例服务。 三、软件备份 1.以七天为一个周期每天23:00将所有软件拷贝到其他存储介质上 2.超出七天的备份依次删除 3.每月一号将上月最后7天的备份文件刻录到光盘上 四、软件恢复 1.找出最近的备份程序覆盖到正式运行环境的相应目录中

五、数据备份 1.业务系统或数据库在打重要补丁或升级的前后,必须按要求对业务系统进行停 机备份或非停机备份,备份需包含应用和数据库的文件系统及数据,备份方式 为手工备份,使用RMAN执行备份; 2.系统日常备份:作为7*24运行的重要系统,必须最小化数据丢失的同时,还需 要尽可能缩短恢复时间,数据库的日常备份策略如下: (1)确保数据库处于ArchiliveLog模式; (2)每日凌晨01:00执行数据库全备份,含控制文件备份; (3)每四小时间隔执行数据库归档日志备份,含控制文件备份; (4)每间隔两周执行数据库与应用系统文件备份,执行时间:数据库服务器在第一周的周六05:00,应用服务器在第一周的周六7:00。 3.每周一将上周的备份文件拷贝到其它存储介质上; 4.每月一号将上月最后一周的备份文件刻录到光盘上。 六、备份的存储 1.在确保成功备份数据的同时,必须严格保证存储结构的完整性,在备份服务器 或备份带库上需要保留足够的剩余空间,以存储需要保存的多份备份文件; 2.如项目上采用了专门的备份软件,有专用的备份存储,应提前规划好备份的存 储空间,比如按时间特征存储相对应的备份:年备份池、月备份池、日备份池; 和按类型存储的备份池:os文件系统池、db数据库池等; 3.如未采用专门的备份软件,在备份服务器上架设专门的ftp服务器,每次备份 之后,由计划任务定时调度,将备份数据传输至备份服务器,传输备份数据的 时间应选在服务器业务较少的空闲时间进行。 七、备份数据的保存规定 1.年备份永久保存(即每年最后一天的备份) 2.保留最近的12期月备份(即每月最后一天的备份)

相关文档
相关文档 最新文档