搜索
您的当前位置:首页ORACLE日常维护手册

ORACLE日常维护手册

来源:乌哈旅游


DOC.NO. TIMESON-SM-2002-11-0001A

Normal (公开)



本地电信业务计费帐务系统

ORACLE操作手册

Version 1.0.0



2002.11.05

TIMESON

长沙天辰科技有限公司2000,2001,2002

All Rights Reserved

ORACLE操作手册

前 言.............................................................................................................................. 3 1.

数据库的创建........................................................................................................ 4 1.1. 1.2. 2.

以下为ORACLE启动初始文件INITORA.ORA ............................................ 4 以下是建库脚本............................................................................................ 5

数据库基本操作.................................................................................................... 9 2.1. 数据库的正常启动........................................................................................ 9 2.2. 安装启动与非安装启动.............................................................................. 10 2.3. 独占和共享启动.......................................................................................... 10 2.4. 约束启动...................................................................................................... 10 2.5. 强制启动...................................................................................................... 11 2.6. 数据库关闭.................................................................................................. 11 2.7. PL/SQL基本程序的编写 ........................................................................... 11 2.7.1. SQL语言简介 ..................................................................................... 12 2.7.2. PL/SQL简介........................................................................................ 16

3. 解决RDBMS问题 ............................................................................................. 22 3.1. 性能优化...................................................................................................... 22 3.1.1. 优化内存.............................................................................................. 23 3.1.2. 优化输入/输出..................................................................................... 25 3.1.3. 优化排序.............................................................................................. 27 3.1.4. 优化索引建立...................................................................................... 27 3.2. 备份和恢复.................................................................................................. 27 3.2.1. 备份提示.............................................................................................. 28 3.3. ORACLE 8 SERVER诊断特性........................................................................ 29 3.3.1. Oracle跟踪文件.................................................................................. 30 3.3.2. 设置跟踪事件...................................................................................... 31 3.3.3. V$监视视图......................................................................................... 34 3.3.4. 锁实用程序.......................................................................................... 36 3.4. ORACLE错误分析和解决方案.................................................................... 37 3.4.1. 常见Oracle错误................................................................................. 37 3.4.2. ORACLE内部错误 ............................................................................. 45 3.4.3. 优先权1/优先权2问题分类和诊断操作 ......................................... 46 3.5. 常见问题...................................................................................................... 48

长沙天辰科技有限公司

2

ORACLE操作手册

前 言

为了加强计费系统数据库的操作安全及更有效的管理计费系统数据库,编写该操作手册。

在该手册若有错误及遗漏的地方还望各位读者不吝指出与谅解。

长沙天辰科技有限公司

3

ORACLE操作手册

1. 数据库的创建

以下仅为数据库创建的样例脚本,在实际系统中应根据数据库设计要与系统实际配置而改变参数:

1.1. 以下为ORACLE启动初始文件initora.ora

#this sampale init file writen by wzy 2002/11/15 db_name = \"jf\"

instance_name = ora8 #service_names = ora #db_files = 1024 control_files = (\"/home/oracle/OraCtl/control01.ctl\\"/home/oracle/OraCtl/control02.ctl\open_cursors = 100 max_enabled_roles = 50

db_file_multiblock_read_count = 8 db_block_buffers = 4096 shared_pool_size = 52428800 large_pool_size = 78643200 java_pool_size = 20971520

log_checkpoint_interval = 10000 log_checkpoint_timeout = 1800 processes = 115

parallel_max_servers = 5 log_buffer = 32768

max_dump_file_size = 10240 global_names = true

#oracle_trace_collection_name = \"\" db_block_size = 16384

#remote_login_passwordfile = exclusive #os_authent_prefix = \"\" job_queue_processes = 4 job_queue_interval = 60 open_links = 10

#large_pool_size = 614400 java_pool_size = 20971520 distributed_transactions = 10 mts_dispatchers = \"(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)\"

长沙天辰科技有限公司

4

ORACLE操作手册

mts_dispatchers = \"(protocol=TCP)\" #compatible = 8.1.0 sort_area_size = 65536

sort_area_retained_size = 65536 # log_archive_start = true

1.2. 以下是建库脚本

#!/bin/sh

ORACLE_SID=ora8 export ORACLE_SID

svrmgrl

connect internal

startup nomount pfile = $ORACLE_HOME/dbs/initora.ora CREATE DATABASE \"app1\" controlfile reuse maxdatafiles 500 maxinstances 8 maxlogfiles 32

character set ZHS16GBK

national character set ZHS16GBK

DATAFILE '/oradata/app1/system01.dbf' SIZE 200M

logfile group 1 ('/opt/oracle/oradata/app1/app1_redo01.log', '/oradata/app1/app1_redo01.log') SIZE 20M,

group 2 ('/opt/oracle/oradata/app1/app1_redo02.log', '/oradata/app1/app1_redo02.log') SIZE 20M, group 3 ('/opt/oracle/oradata/app1/app1_redo03.log', '/oradata/app1/app1_redo03.log') SIZE 20M; @/opt/oracle/product/8.1.7/rdbms/admin/catalog.sql;

CREATE ROLLBACK SEGMENT r0 TABLESPACE SYSTEM

STORAGE (INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS 20); ALTER ROLLBACK SEGMENT r0 ONLINE;

REM ************ TABLESPACE FOR OEM_REPOSITORY *************** CREATE TABLESPACE OEM_REPOSITORY DATAFILE '/oradata/app1/oemrep01.dbf' SIZE 5M REUSE

AUTOEXTEND ON NEXT 25M MAXSIZE 80M MINIMUM EXTENT 128k

DEFAULT STORAGE ( INITIAL 128k NEXT 128k MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0);

REM ************** TABLESPACE FOR ROLLBACK ***************** CREATE TABLESPACE RBS DATAFILE '/oradata/app1/rbs01.dbf' SIZE 200M REUSE

长沙天辰科技有限公司

5

ORACLE操作手册

DEFAULT STORAGE ( INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED PCTINCREASE 0);

REM ************** TABLESPACE FOR TEMPORARY ***************** CREATE TABLESPACE TEMP DATAFILE '/oradata/app1/temp01.dbf' SIZE 200M REUSE DEFAULT STORAGE ( INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED PCTINCREASE 0) TEMPORARY;

REM ************** TABLESPACE FOR USER *********************

CREATE TABLESPACE USERS DATAFILE '/oradata/app1/users01.dbf' SIZE 50M REUSE DEFAULT STORAGE ( INITIAL 128k NEXT 128k MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0);

REM ************** TABLESPACE FOR INDEX *********************

CREATE TABLESPACE INDX DATAFILE '/oradata/app1/indx01.dbf' SIZE 50M REUSE DEFAULT STORAGE ( INITIAL 128k NEXT 128k MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0);

REM **** Creating four rollback segments **************add rollback segment to 20*** CREATE ROLLBACK SEGMENT r01 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r02 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r03 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r04 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r05 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r06 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r07 TABLESPACE RBS

长沙天辰科技有限公司

6

ORACLE操作手册

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS

UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r08 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r09 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r10 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r11 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r12 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r13 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r14 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r15 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r16 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r17 TABLESPACE RBS

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r18 TABLESPACE RBS

长沙天辰科技有限公司

7

ORACLE操作手册

STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS

UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r19 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

CREATE ROLLBACK SEGMENT r20 TABLESPACE RBS STORAGE(INITIAL 128k NEXT 128k MINEXTENTS 2 MAXEXTENTS UNLIMITED optimal 4096K);

ALTER ROLLBACK SEGMENT r01 ONLINE; ALTER ROLLBACK SEGMENT r02 ONLINE; ALTER ROLLBACK SEGMENT r03 ONLINE; ALTER ROLLBACK SEGMENT r04 ONLINE; ALTER ROLLBACK SEGMENT r05 ONLINE; ALTER ROLLBACK SEGMENT r06 ONLINE; ALTER ROLLBACK SEGMENT r07 ONLINE; ALTER ROLLBACK SEGMENT r08 ONLINE; ALTER ROLLBACK SEGMENT r09 ONLINE; ALTER ROLLBACK SEGMENT r10 ONLINE; ALTER ROLLBACK SEGMENT r11 ONLINE; ALTER ROLLBACK SEGMENT r12 ONLINE; ALTER ROLLBACK SEGMENT r13 ONLINE; ALTER ROLLBACK SEGMENT r14 ONLINE; ALTER ROLLBACK SEGMENT r15 ONLINE; ALTER ROLLBACK SEGMENT r16 ONLINE; ALTER ROLLBACK SEGMENT r17 ONLINE; ALTER ROLLBACK SEGMENT r18 ONLINE; ALTER ROLLBACK SEGMENT r19 ONLINE; ALTER ROLLBACK SEGMENT r20 ONLINE;

ALTER ROLLBACK SEGMENT r0 OFFLINE;

REM **** SYS and SYSTEM users **************** alter user sys temporary tablespace TEMP;

alter user system temporary tablespace TEMP;

@/opt/oracle/product/8.1.7/rdbms/admin/catproc.sql; @/opt/oracle/product/8.1.7/rdbms/admin/caths.sql; @/opt/oracle/product/8.1.7/rdbms/admin/otrcsvr.sql; @/opt/oracle/product/8.1.7/rdbms/admin/catexp.sql;

@/opt/oracle/product/8.1.7/rdbms/admin/catdbsyn.sql;

长沙天辰科技有限公司

8

ORACLE操作手册

@/opt/oracle/product/8.1.7/rdbms/admin/catdefer.sql;

@/opt/oracle/product/8.1.7/rdbms/admin/catrep.sql;

@/opt/oracle/product/8.1.7/rdbms/admin/dbmspool.sql; @/opt/oracle/product/8.1.7/rdbms/admin/catparr.sql; @/opt/oracle/product/8.1.7/rdbms/admin/catblock.sql;

connect system/manager

@/opt/oracle/product/8.1.7/sqlplus/admin/pupbld.sql;

--create the product_profile and user_profile

--CATALOG.SQL, ---加载数据库本身的数据字典视图

--CATPROC.SQL, ---加载PL/SQL使用的PACKAGE --CATEXP.SQL ---加载EXPORT/IMPORT工具使用的数据字典

disconnect spool off exit

在数据库建立完后,可用以下语句(也可以在建库脚本中直接增加)对对tablespace增加数据文件: ALTER TABLESPACE \"tablespace_name\" ADD DATAFILE

'data_file_path/data_file_name' SIZE

2. 数据库基本操作

2.1. 数据库的正常启动

正常启动数据库的选项是normal,这也是数据启动的缺省选项。如果以这种方式启动则将打开一个现场(现场:现场为一逻辑概念,是系统为数据库打开提供的一系列的必需资源),并把数据库装入,然后打开数据库供用户使用。具体操作如下:

1.先进入SVRMGR管理器

$svrmgrl SVRMGR>

2.再联入inernal用户

$connect internal

3.在用startup命令启动(若不在启动文件所在目录进入的SVRMGR或

长沙天辰科技有限公司

9

ORACLE操作手册

启动文件名不是ORACLE缺省的文件名,则启动时应带启动目录与文件名)

SVRMGR>startup pfile=

2.2. 安装启动与非安装启动

安装启动的选项是mount,表示只将数据库装入现场而不打开数据库;非安装启动的选项是nomount,表示只建立数据库现场而不装入数据库,当然也不打开数据库。

1. 安装启动

SVRMGR>startup {pfile=} mount

该方式启动数据库的的用途一般为:  为数据文件更名;

 增加、删除或改名事物日志文件;

 使事物日志归档模式选项有效或失效;  进行完整数据库的恢复操作

2. 非安装启动

SVRMGR> startup {pfile=} nomount

该方式启动数据库的用途一般为:  创建一新的数据库

2.3. 独占和共享启动

独占启动选项是exclusive,表示只允许一个例程使用该数据库;共享启动的参数是shared,表示允许多个例程并行使用该数据库,即将数据库装入多个现场。

1.共享启动

SVRMGR>startup {pfile=} exclusive 2.独占启动

SVRMGR> startup {pfile=} shared

2.4. 约束启动

这种方式的选项是restrict,它启动数据库时装入并打开它,但此时的数据库只能为有特殊权限的数据库管理员使用,一般用户不能联入数据库。

1.约束启动 10

长沙天辰科技有限公司

ORACLE操作手册

SVRMGR> startup {pfile=} restrict

一般来说当用户有create session权限十可联入数据库,但对于restrict方式启动的数据库只有restricted session系统权限用户才允许联入。 若在restrict方式下改变数据库运行方式,则可用alter system命令,如下: SVRMGR>alter system disable restricted session;

2.5. 强制启动

在一些非正常情况下有可能在正常方式下启动数据库遇到麻烦,或在上次因不能正常关闭数据库(如:用了参数abort)而导致不能正常启动数据库,则可考虑使用强制启动数据库,其参数为:force.

1.强制启动

SVRMGR> startup {pfile=} force;

此时,除非数据库有重大系统错误,一般情况下数据库可以起来。在应注意的是用此方式启动的数据库会上次非正常关闭数据导致的非正常数据丢掉,数据库启动后应及时的查看数据库的日志文件。

2.6. 数据库关闭

1.正常关闭

SVRMGR>shutdown normal;

这种方式下关闭数据库在关闭前检查所有的连接,并且发出命令后不允许再有新的连接,在等所有用户断开连接后关闭数据库。在此方式下关闭的数据库下次启动时不需要任何恢复过程。 2.立即关闭

SVRMGR>shutdown immediate;

这种方式下关闭数据库并不等待用户断开连接,而是由系统断开与用户的连接,然后关闭数据库。 3.异常关闭

SVRMGR>shutdown abort;

这种方式下关闭数据库系统不做任何的检查与回退操作而直接将数据库现场撤消。

2.7. PL/SQL基本程序的编写

ORACLE提供功能了功能强大的第三代编程语言PL/SQL。在本小节主要介绍基本的存储过程、存储函数及触发器的编写。

长沙天辰科技有限公司

11

ORACLE操作手册

2.7.1. SQL语言简介

2.7.1.1. SQL概述

SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。

数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 2.7.1.1.1. SQL*PLUS界面

登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL>

退出:输入EXIT即可。 2.7.1.1.2. 命令的编辑与运行

 在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结

束输入;以空行结束输入;

 利用SQL缓冲区进行PL/SQL块的编辑和运行;  利用命令文件进行PL/SQL块的编辑和运行。

2.7.1.2. 数据库查询

2.7.1.2.1. 用SELECT语句从表中提取查询数据

SELECT 的语法为:

SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC];

说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。

2.7.1.2.2. SELECT中的操作符及多表查询WHERE子句

WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 2.7.1.2.3. ORDER BY 子句

ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。

长沙天辰科技有限公司

12

ORACLE操作手册

2.7.1.2.4. 连接查询

利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。

连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。 2.7.1.2.5. 子查询

如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询。 2.7.1.3. 基本数据类型

ORACEL支持下列内部数据类型:

       

VARCHAR2 变长字符串,最长为2000字符。 NUMBER 数值型。

LONG 变长字符数据,最长为2G字节。 DATE 日期型。

RAW 二进制数据,最长为255字节。

LONG RAW 变长二进制数据,最长为2G字节。 ROWID 二六进制串,表示表的行的唯一地址。 CHAR 定长字符数据,最长为255。

2.7.1.4. 常用函数

一个函数类似于一个算符,它操作数据项,返回一个结果。函数在格式上不同于算符,它个具有变元,可操作0个、一个、二个或多个变元,形式为:

函数名(变元,变元,„) 函数具有下列一般类形:  单行函数  分组函数 1. 单行函数对查询的表或视图的每一行返回一个结果行。它有数值函

数,字符函数,日期函数,转换函数等。

2. 分组函数返回的结果是基于行组而不是单行,所以分组函数不同于单

行函数。在许多分组函数中可有下列选项:

 DISTRNCT 该选项使分组函数只考虑变元表达式中的不同值。  ALL该选项使分组函数考虑全部值,包含全部重复。

全部分组函数(除COUNT(*)外)忽略空值。如果具有分组函数的查询,没有返回行或只有空值(分组函数的变元取值的行),则分组函数返回空值。

长沙天辰科技有限公司

13

ORACLE操作手册

2.7.1.5. 数据操纵语言命令

数据库操纵语言(DML)命令用于查询和操纵模式对象中的数据,它不隐式地提交当前事务。它包含UPDATE、INSERT、DELETE、EXPLAIN PLAN、SELECT和LOCK TABLE 等命令。下面简单介绍一下:

1)UPDATE tablename SET {column1=expression1,column2=expression2,…} WHERE {conditions};

例如:

SQL> update serv set state=‟F0K‟ where serv_id=123456 and serv_seq_nbr=1;

UPDATE子句指明了要修改的数据库是EMP,并用WHERE子句限制了只对名字(ENAME)为‟MARTIN‟的职工的数据进行修改,SET子句则说明修改的方式,即把‟MARTION‟的工作名称(JOB)改为‟MARAGER‟.

2)INSERT INTO

{expression1,expression2,…}; 例如:

tablename

{column1,column2,…}

VALUES

SQL> insert into bill.serv select * from trans.serv_bak;

3)DELETE FROM tablename WHERE {conditions};

例如: SQL>

delete

from

acct_item_area01

where

acct_id=123245

and

account_date=‟200110‟ and acct_item_type_id = 11001;

DELETE命令删除一条记录,而且DELETE命令只能删除整行,而不

能删除某行中的部分数据.

4)事务控制语句

提交命令(COMMIT):可以使数据库的修改永久化.设置

AUTOCOMMIT为允许状态:SQL >SET AUTOCOMMIT ON;

回滚命令(ROLLBACK):消除上一个COMMIT命令后的所做的全部修改,使得数据库的内容恢复到上一个COMMIT执行后的状态.使用方法是:

2.7.1.6. 创建表、视图、索引、同义词、用户 2.7.1.6.1. 表

建立表主要指定义下列信息:  列定义

 完整性约束  表所在表空间  存储特性

 可选择的聚集

 从一查询获得数据 语法如下:

CREATE TABLE tablename (column1 datatype [DEFAULT expression] [constraint],

column1 datatype [DEFAULT expression] [constraint], „„)

[STORAGE子句] [其他子句…];

例如: SQL> create table serv (serv_id number(10),serv_seq_nbr number(3))

14

长沙天辰科技有限公司

ORACLE操作手册

2 3

tablespace data_bill

storage (initial 10m next 5m);

2.7.1.6.2. 视图

视图是一个逻辑表,它允许操作者从其它表或视图存取数据,视图本身不包含数据。视图所基于的表称为基表。

引入视图有下列作用:

 提供附加的表安全级,限制存取基表的行或/和列集合。  隐藏数据复杂性。

 为数据提供另一种观点。

 促使ORACLE的某些操作在包含视图的数据库上执行,而不在另一个

数据库上执行。 2.7.1.6.3. 索引

索引是种数据库对象。对于在表或聚集的索引列上的每一值将包含一项,为行提供直接的快速存取。在下列情况ORACLE可利用索引改进性能:

 按指定的索引列的值查找行。  按索引列的顺序存取表。 语法:

create index on [storage语句] [其它语句]; 例如:

SQL> create index idx_serv_01 on serv(srev_id,serv_seq_nbr) 2 tablespace data_bill_idx 3 storage (initial 5m next 5m); 2.7.1.6.4. 同义词

同义词:为表、视图、序列、存储函数、包、快照或其它同义词的另一个名字。使用同义词为了安全和方便。对一对象建立同义词可有下列好处:  引用对象不需指出对象的持有者。

 引用对象不需指出它所位于的数据库。  为对象提供另一个名字。 语法:

craete synonym for [user_name].; 例如:

(假定在CALL用户下)

SQL> create synonym serv for bill.serv;

注意:在同义词建立后要授权

长沙天辰科技有限公司

15

ORACLE操作手册

2.7.1.6.5. 用户

语法:

CREATE USER username IDENTIFIED BY password; 例如:

SQL> create user bill identified by jfxt;

2.7.2. PL/SQL简介

2.7.2.1. PL/SQL概述

PL/SQL是Oracle对SQL规范的扩展,是一种块结构语言,即构成一个PL/SQL程序的基本单位(过程、函数和无名块)是逻辑块,可包含任何数目的嵌套了快。这种程序结构支持逐步求精方法解决问题。一个块(或子块)将逻辑上相关的说明和语句组合在一起,其形式为:

DECLARE --说明 BEGIN --语句序列 EXCEPTION --例外处理 END; 它有以下优点:

 支持SQL;  生产率高;  性能好;  可称植性;

 与ORACLE集成. 2.7.2.2. PL/SQL体系结构

PL/SQL运行系统是种技术,不是一种独立产品,可认为这种技术是PL/SQL块和子程序的一种机,它可接收任何有效的PL/SQL块或子程序。如图所示:

PL/SQL机 PL/SQL块 过程性语句 PL/SQL 执行器

SQL语句

PL/SQL机可执行过程性语句,而将SQL语句发送到ORACLE服务器上的SQL语句执行器。在ORACLE预编译程序或OCI程序中可嵌入无名的PL/SQL块。如果ORACLE具有PROCEDURAL选件,有名的PL/SQL块(子程序)可单独编译,永久地存储在数据库中,准备执行。

长沙天辰科技有限公司

16

ORACLE操作手册

2.7.2.3. PL/SQL基础

PL/SQL有一字符集、保留字、标点、数据类型、严密语法等,它与SQL有相同表示,现重点介绍。 2.7.2.3.1. 数据类型

如下表所示: 数据类型 子类型 纯量数值 BINARY_INTEGER NATURAL,POSITIVE 类型 NUMBER DEC,DECIMAL,DOUBLE PRECISION,PLOAT,INTEGER,INT,NUMERIC,REAL,SMALLINT 字符 CHAR CHARACTER,STRING VARCHAR2 VARCHAR LONG LONG RAW RAW RAWID 逻辑 BOOLEAN 日期 DATE 组合 记录 RECORD 类型 表 TABLE 2.7.2.3.2. 变量和常量

在PL/SQL程序中可将值存储在变量和常量中,当程序执行时,变量的值可以改变,而常量的值不能改变。 2.7.2.3.3. 程序块式结构

DECLARE

--变量说明部分 BEGIN „„„„ „„„„ „„„„ END; 2.7.2.3.4. 控制语句

分支语句:

IF condition THEN

长沙天辰科技有限公司

17

ORACLE操作手册

sequence_statements; END IF;

IF condition1 THEN

Sequence_statements1; ELSE

Sequence_statements2; END IF;

IF condition1 THEN

Sequence_statements1; ELSIF condition2 THEN Sequence_statements2; „„„„ ELSE

Sequence_statements(n+1); END IF;

2.7.2.3.5. 循环语句

LOOP

Statements;

IF condition THEN EXIT; END IF; END LOOP;

WHILE condition LOOP Statements; END LOOP;

FOR counter IN lower_con..high_con|(data-cube) LOOP Statements; END LOOP; 2.7.2.3.6. 子程序 2.7.2.3.6.1. 存储过程

语法:

create [or replace] procedure 函数名(参数1,参数2„„) IS | AS [局部变量说明]

BEGIN 执行语句;

18

长沙天辰科技有限公司

ORACLE操作手册

END;

例:

以下为一简单的样例存储过程:

CREATE OR REPLACE PROCEDURE

utl_analyze_prg(

iOnwer IN VARCHAR2 DEFAULT NULL,

/*该参数为需要统计的用户,缺省则为全部*/

IS

/*该程序用来计算统计*/

/*注意:该程序应在8i及以上版本中运行*/ -- -- tOwner t_Level

VARCHAR2(30); --存储 输入的用户名 VARCHAR2(30); --存储输入的统计参数 VARCHAR2(30); --存储选取的表名 VARCHAR2(300);--存储形成的分析语句

iLevel IN VARCHAR2 DEFAULT NULL /*参数iLevel为统计,

*/ )

其值为:1.for table

2.for colums 3.for all columNs 4.for all indexed columns 5.for all indexes

t_TaleName t_AnalyzeStr

BEGIN

t_Owner := UPPER(TRIM(iOwer)); t_Level := UPPER(LTRIM(RTRIM((iLevel)));

若输入的用户名为空时则退出程序 IF t_Owner IS NULL THEN

DBMS_OUTPUT.PUT_LINE('请输入要用户名'); RETURN;

END IF;

若输入的iLevel不合法则退出程序

IF t_Level NOT IN ('FOR TABLE','FOR COLUMS','FOR ALL COLUMS',

'FOR ALL INDEXED COLUMNS','FOR ALL INDEXES')

THEN

DBMS_OUTPUT.PUT_LINE('输入的第二参数不合法'); RETURN;

END IF;

FOR Rec IN (SELECT table_name FROM all_tables WHERE owner=t_Owner) LOOP BEGIN t_AnalyzeStr := 'analyze table '||Rec.table_name||' compute statistics '|| t_Level;

长沙天辰科技有限公司

19

ORACLE操作手册

EXECUTE IMMEDIATE t_AnalyzeStr;

EXCEPTION WHEN OTHERS THEN

ROLLBACK; RAISE;

END;

END LOOP;

END;

2.7.2.3.6.2. 存储函数

语法:

create [or replace] function 函数名(参数1,参数2„„) RETURN 类型 IS | AS

[局部变量说明] BEGIN 执行语句; END;

例:

CREATE OR REPLACE FUNCTION IS

/*该程序用来估算统计*/

/*注意:该程序应在8i及以上版本中运行*/

tOwner t_Per

VARCHAR2(30); --存储 输入的用户名

utl_analyze_prg(iOnwer IN VARCHAR2 DEFAULT NULL,

/*该参数为需要统计的用户,缺省则为全部*/ iEstimatePercent IN NUMBER DEFAULT 100 /*该参数为需要估算统计的百分比*/ )

RETURN INTEGER

NUMBER(3); --存储输入的估算统计的百分比参数

VARCHAR2(30); --存储选取的表名

t_TaleName t_AnalyzeStr

VARCHAR2(300);--存储形成的分析语句

BEGIN

t_Owner := UPPER(TRIM(iOwer));

-- t_Per := UPPER(LTRIM(RTRIM((iLevel)));

-- 若输入的用户名为空时则退出程序

IF t_Owner IS NULL THEN

20

长沙天辰科技有限公司

ORACLE操作手册

DBMS_OUTPUT.PUT_LINE('请输入要用户名'); RETURN -1;

END IF;

-- 若输入的估算统计百分比参数不正确则退出

IF t_Per NOT BETWEEN 1 AND 100 THEN

DBMS_OUTPUT.PUT_LINE('输入的估算统计百分比参数不正确'); RETURN -2;

END IF;

FOR Rec IN (SELECT table_name FROM all_tables WHERE owner=t_Owner) LOOP

BEGIN

t_AnalyzeStr := 'analyze table '||Rec.table_name||' estimate statistics '||

'sample '||to_char(t_Per)||' percent ';

EXECUTE IMMEDIATE t_AnalyzeStr;

EXCEPTION WHEN OTHERS THEN

ROLLBACK; RETURN -3;

END;

END LOOP; RETURN 0

END;

2.7.2.3.6.3. 触发器

语法: create [or replace ] trigger 触发器名[参数1,参数2„„] after|before update|delete|insert on 表名 [for each row] begin 语句序列; end; 例:

以下为一简单的触发器程序。写触发器需要注意的是:在触发器中不能有COMMIT或ROLLBACK等事务操作语句。

CREATE OR REPLACE TRIGGER tr_serv

长沙天辰科技有限公司

21

ORACLE操作手册

AFTER UPDATE OR DELETE OR INSERT ON serv FOR EACH ROW BEGIN

IF UPDATING('STATE') THEN

INSERT INTO serv_history(serv_id,serv_seq_nbr,state,state_date)

VALUES (:OLD.serv_id,:OLD.serv_seq_nbr,:OLD.state_date);

END IF;

IF deleting THEN

INSERT INTO serv_history(serv_id,serv_seq_nbr,state_date,fixed_address,

serv_type_id,billing_type_id,state,cust_id)

VALUES (:OLD.serv_id,:OLD.serv_seq_nbr,:OLD.state_date,:OLD.fixed_address,

:OLD.serv_type_id,:OLD.billing_type_id,:OLD.state,:OLD.cusr_id);

END IF;

IF ISNERTING THEN

INSERT INTO serv_history(serv_id,serv_seq_nbr,state_date,fixed_address,

serv_type_id,billing_type_id,state,cust_id)

VALUES

(:NEW.serv_id,:NEW.serv_seq_nbr,:NEW.state_date,:NEW.fixed_address,

:NEW.serv_type_id,:NEW.billing_type_id,:NEW.state,:NEW.cusr_id);

END IF; END;

3. 解决RDBMS问题

Oracle 8 Server是O r a c l e软件中商业事务解决方案的核心。本章讲解Oracle 8性能优化和诊断特性的技术和技巧,重点讨论O r a c l e错误解决方案,包括内部错误,最后一节FA Q,是从O S S接收的实时支持电话中汇编出来的。

3.1. 性能优化

Oracle RDBMS优化是一项要反复进行的工作,要耗费大量的时间和财力。下面介绍的是一些基本的优化提示和技术这对一般的D B A会很有帮助。尽管优

长沙天辰科技有限公司

22

ORACLE操作手册

化既昂贵又费时,应用程序在设计和开发期间仍要特别充分考虑优化,这一节将不涉及有关硬件或操作系统的优化处理, 然而,所介绍的知识有助于O r a c l e用户了解Oracle RDBMS的优化处理。

3.1.1. 优化内存

在O r a c l e体系结构中实现分布式快速存取和充实内存是很重要的。建议用户在优化应用程序后和输入/输出( I / O )优化前,进行与内存有关的优化操作。而且首先要优化操作系统,并在处理共享池前考虑私有S Q L和P L / S Q L区。 要不惜任何代价避免页面调度或交换。每次都必须把系统全局区( S G A )放入内存。用户可以连接Server Manager(服务器管理员)和数据库,并执行SHOW SGA命令,确定S G A的大小。 SVRMGR> show sga

系统全局区域合计有 221909152个字节 Fixed Size 73888个字节 Variable Size 154648576个字节 Database Buffers 67108864个字节 Redo Buffers 77824个字节

此外,可以查询V $ G A视图得到类似的结果。 SVRMGR> select * from v$sga;

NAME VALUE

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

Fixed Size 73888 Variable Size 154648576 Database Buffers 67108864 Redo Buffers 77824 已选择4行。

用户还可以在i n i t . o r a文件中设置参数P R E _ PA G E _ S G A,将S G A预装到物理内存中。

pre_page_sga=yes

除了S G A之外,还要确保S Q L和P L / S Q L区正确优化。用户必须尽量少地调用P a r s e。可以为事务产生一个S Q L跟踪文件,来查看P a r s e与E x e c u t e的调用比率(计数统计如下),这个比率应尽可能低。下面的内容摘自S Q L跟踪文件。

call count cpu elapsed disk query current rows ---- ------- ------ -------- -------- ------ --------- ---------

长沙天辰科技有限公司

23

ORACLE操作手册

parse 4 0.00 0.00 0 0 0 0 execute 7 0.00 0.00 0 0 0 0 fetch 0 0.00 0.00 0 0 0 0 ------ ------- ------- ---------- ---------- ----------- ------- ---------- 总计 11 0.00 0.00 0 0 0 0 在这个例子中, P a r s e调用与E x e c u t e调用的比率为4 / 7。应尽量优化应用程序,使这个比率最低。

通过i n i t . o r a文件O P E N _ C U R S O R S参数控制私有S Q L区也是很重要的。该参数决定了用户在某时刻可拥有的游标的最大数。但这个参数不控制整个系统,只决定每个进程使用的内存空间量。

用户必须最大程度地优化共享池中的库高速缓存和数据字典高速缓存。库高速缓存包括S Q L和P L / S Q L区。再重复一遍,这样做的宗旨是尽可能减少库高速缓存中的重载。用户应尽量减少对数据库的a d _ h o c查询,以确保库高速缓存的使用最优化。可以用下面的查询确定库高速缓存的性能:

SVRMGR> select sum(pins),sum(reloads) from v$librarycache; SUM(PINS) SUM(RELOAD ---------- ---------- 921798 152 已选择 1 行。

用户必须保证r e l o a d s和p i n s的比率尽可能低。为了优化库高速缓存,必须增加i n i t . o r a文件中SHARED_POOL_SIZE及(或) O P E N _ C U R S O R S的参数值。

另一项与库高速缓存有关的是游标在会话中的缓存方式。当相关应用程序游标打开时, 必须确保S Q L区不会再重新分配。此外,必须保证在一个会话中打开游标的最大数被放入缓存。可以使用i n i t . o r a文件中的参数,优化会话中缓存游标数:

# the following parameter will ensure that a shared SQL area never be de-allocated #when an associated cursor is open; cursor_space_for_time=true

#we have specified that a maxium of 50 cursors can be cached for a user session session_cached_cursor=50

要确定S E S S I O N _ C A C H E D _ C U R S O R S的正确值,可用类似下面的查询:

SQL> select sid,username,program from v$session;

SID USERNAME PROGRAM

长沙天辰科技有限公司

24

ORACLE操作手册

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

1 bill oracle@JF_SRV (PMON) 2 bill oracle@JF_SRV (DBW0) 3 bill oracle@JF_SRV (LGWR) 4 oracle@JF_SRV (CKPT) 5 oracle@JF_SRV (SMON)

6

必须尽量确保查询到的值与S Q L跟踪的P a r s e总计数之比接近1。 与数据字典高速缓存相关的问题类似于库高速缓存。其目标是,使数据字典高速缓存里的内存数据库块尽可能多。下面的查询可以查看性能的优劣:

SQL> select sum(gets),sum(getmisses) from v$rowcache;

SUM(GETS) SUM(GETMISSES) ----------

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

oracle@JF_SRV (RECO)

258411 43943

必须尽量使g e t m i s s e s比率接近0。要优化性能,可以增加i n i t . o r a文件中S H A R E D _ P O O L _ S I Z E和/或D B _ B L O C K _ B U F F E R S参数的值。

3.1.2. 优化输入/输出

输入/输出的优化必须在内存优化之后进行。

建议不要把非O r a c l e文件与O r a c l e文件放在同一个磁盘上。此外,用户也应当把重做日志文件与数据文件分开放置。这些表的相关表和索引应放在独立磁盘中具有数据文件的表空间内,其目的是减少对磁盘的并发存取。 V $ F I L E S TAT视图提供有关物理读写的信息(物理输入/输出针对磁盘,逻辑输入/输出针对内存)。

SQLWKS> select name,phyrds,phywrts from v$datafile a,v$filestat b 2> where a.file# = b.file#; NAME PHYRDS PHYWS RT ----------------------------------------------- ---------- ---------- /data2/ora_data/system01.dbf 1175 1123 /data1/ora_idx_data/rbs_system01.dbf 34 2281 /data2/ora_data/data_bill01.dbf 7 100

长沙天辰科技有限公司

25

ORACLE操作手册

/data1/ora_idx_data/data_bill_idx01.dbf 6 24 /data1/ora_data/temp01.dbf 12 12 /data1/ora_data/tool01.dbf 6 4 /data2/ora_data/data_bill02.dbf 7 55 /data2/ora_data/data_bill03.dbf 6 45 /data2/ora_data/data_bill04.dbf 6 115 /data2/ora_data/data_bill05.dbf 6 525 /data1/ora_idx_data/data_bill_idx02.dbf 6 192 /data2/ora_data/data_bill06.dbf 6 540 /data2/ora_data/data_bill07.dbf 6 101 /data1/ora_idx_data/data_bill_idx03.dbf 6 284 /data1/ora_idx_data/rbs_system02.dbf 6 4 /data1/ora_idx_data/rbs_system03.dbf 6 4 /data1/ora_idx_data/rbs_system04.dbf 6 4 /data2/ora_data/system02.dbf 2586 4054 /data2/ora_data/data_bill08.dbf 6 136 已选择19行。

必须把物理读写的总量控制在用户硬件和操作系统的最优限制内。 另一个普遍的输入/输出瓶颈是由链接的行引起的(链接的行跨多个块),可以采用下面描述的过程来减少链接的行。

首先从安装目的( $ ORACLE_HOME /rdbms /admin )中运行utlchain.sql脚本文件,生成CHAINED_ROWS表。使用AYALYZETABLE命令得到CHAINED _ R O W S表中链接的列表。

SQL>@$ORACLE_HOME/rdbms/admin/utlchain.sql 表已创建。

SQL> desc chained_rows

名称 空? 类型 ----------------------- -------- ------------- OWNER_NAME VARCHAR2(30) TABLE_NAME VARCHAR2(30) CLUSTER_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30)

长沙天辰科技有限公司

26

ORACLE操作手册

SUBPARTITION_NAME VARCHAR2(30) HEAD_ROWID ROWID ANALYZE_TIMESTAMP DATE SQL>ayalyze table list chined rows; Table Ayalyzed.

SQL>select * from chined rows; No rows selected.

如果想得到C H A I N E D _ R O W S表的记录,可以使用C R E ATE TABLES SELECT语句创建一个临时表。从现存表中用D E L E T E命令删除各项记录,再用I N S E RT命令将其从临时表中插回。

3.1.3. 优化排序

排序是一项花销很大的操作,而且对性能的影响程度也较大。因此,使大部分排序操作在内存中完成,而不在磁盘上进行,是至关重要的。要确定内存中排序的量和磁盘上排序的量,可用下述查询:

SQL> select name,values from v$sysstat where upper(name) in 2 („sorts (memory)‟,‟sorts(disk)‟);

如果用户认为在磁盘上的排序意义较大,可以增加i n i t . o r a文件S O RT _ A R E A _ S I Z E参数的设置值。

3.1.4. 优化索引建立

索引建立要花费大量时间。Oracle 7.3 中介绍了索引创建的一种新的方式,即A LT E R INDEX REBUILD,这比起删除和重建索引要迅速得多。如果用户的数据已经排序,在构造索引时可以使用N O S O RT选项。

SQL> alter index rebuild;

SQL> create index on ) > nosort; 若你的服务器为并行服务器则还可用parallel参数。如下语句: SQL> create index on ) > nosort 2 prallel (degree );

3.2. 备份和恢复

在此处,我们假定用户对备份和恢复的基本知识已较熟悉,而且清楚联机备份(热备份)与脱机备份(冷备份)之间的区别。同样,假设用户对以下的恢复命令也已熟悉: recover database

长沙天辰科技有限公司

27

ORACLE操作手册

recover datafile recover tablespace

在下一节中,我们将首先介绍数据库维护期间有关何时备份何种文件的技巧。接着介绍一个流程图,说明什么文件,在什么时候可以进行备份。最后,我们给出一个流程图,决定针对某种类型的错误应进行何种类型的恢复。

3.2.1. 备份提示

介质出错,如果想实现不丢失任何数据的恢复,下面的各小节就非常重要。 3.2.1.1. 总在A R C H I V E L O G模式下运行数据库

这样做的目的是,保证用户数据库的改变总是存储在人工归档日志文件中。从备份到数据库恢复,文档日志文件是基础。使用ARCHIVE LOG LIST命令查看数据库是否处于A R C H -I V E L O G模式。如果不是,用户需要执行两个基本步骤,将数据库设置成A R C H I V E L O G模式: 1) 关闭和安装数据库,并运行命令: SVRMGR>alter database archivelog;

2) 数据库打开后,使用下列命令激活自动归档设置: SVRMGR>archive log start;

每次打开数据库都要执行第2步。实现第2步的有效方法是,在i n i t . o r a 中设置参数L O G _ A R C H I V E _ S TA RT为真。这将使用户每次打开数据库时都激活自动文档。

3.2.1.2. 从不备份联机日志文件

不管是进行联机还是脱机备份,都不应该对联机日志文件做备份。只有一种特殊的情况是, 用户需要拷贝联机日志文件。O S S将提示什么时候适合。很多时候,用户对联机日志文件做过备份后会出现运行错误,都是因为在进行恢复时,不小心应用了联机日志文件,所以对于任何类型的物理备份,只需要备份数据文件、控制文件和文档日志文件,不备份联机日志文件。 3.2.1.3. 镜像联机日志文件

Oracle 8提供了多个联机日志文件的能力,这将避免介质错误引起的失败丢失在线日志文件。

3.2.1.4. 以R E S E T L O C K选项启动数据库时进行全面备份

情况不明时,用户不得不以RESETLOCK选项打开数据库,此时建议用户立刻对整个数据库备份。这里因为当前的备份不能用来恢复RESETLOCK点(该备份在RESETLOCK断点前进行)。如果RESETLOCK断点后没有进行备份,同时另一个介质出现错误,请立刻与O S S联系。

长沙天辰科技有限公司

28

ORACLE操作手册

3.2.1.5. 用户帐号改变后对控制文件备份

很多情况下,进行数据库管理时,可能要修改用户数据库的帐号。注意,不必每次都因为帐号改变而对数据库全面备份。参考下列指导拟定何时备份适宜:

注意:在此我们假设用户拥有一自动进程大约每周便进行一次常规备份。

 如果用户把数据文件从READ ONLY模式改换到R E A D / W R I T E

模式,那么应当总是仅对控制文件做备份,而不需要备份数据文件。其原因是,在使用备份的控制文件进行恢复时,控制文件应识别出数据文件处在R E A D / W R I T E模式;否则,该文件的改变部分, 无法作为恢复的一部分进行应用。

 如果用户添加或删除日志文件组,则不必对数据库整个备份。然而,

既然用户帐号的改变会影响到控制文件,就应立刻对控制文件备份。  如果用户要向数据库添加一个新的数据文件,应当对这个新数据库文

件以及控制文件进行备份,但不必对数据库备份。

 如果用户从数据库删去一个表空间,则备份控制文件。

3.2.1.6. 使用当前控制文件

建议用户在可能的时候使用当前控制文件,而避免使用备份过的控制文件。如果使用备份过的文件进行恢复,则必须以R E S E T L O G S选项打开数据库。这样必须对数据库整个备份(参见“以RESETLOCK选项启动数据库时进行全面备份” )。如果用户丢失了当前控制文件, 但保留着所有联机日志文件和数据文件,用户应使用C R E ATE CONTROL FILE命令,选择N O R E S E T L O G S选项,创建新的控制文件,以代替使用备份过的控制文件。

要恢复系统失败, D B A有多项选择。D B A经常会为O r a c l e提供的恢复手段所惊叹。首先需要确定是能进行完全恢复还是非完全恢复,其次需要决定是进行联机恢复还是脱机恢复,同样还需要决定使用哪种恢复命令—RECOVER DATA B A S E,RECOVER TABLE SPA C E还是RECOVER DATA F I L E。在Oracle 8中,引入了恢复管理器( R M A N )的概念,有关恢复的概念、恢复过程和R M A N使用的细节建议参阅机械工业出版社1 9 9 8年出版的《Oracle 8备份与恢复手册》。

3.3. Oracle 8 Server诊断特性

现在来熟悉一下Oracle 8的诊断工具。要诊断与R D B M S有关的问题,首先要熟悉O r a c l e提供的调试工具,此外还必须理解有关概念,如读文件转储或跟踪文件等。跟踪文件里记录的所有信息,可能对D B A或用户没有帮助,但这些信息对O S S分析员和O r a c l e开发组特别有用。如果用户能给O r a c l e支持分析人员提供正确的信息,将能够获取更好的支持与帮助。

本节我们首先讨论由O r a c l e自动生成的各种跟踪文件,然后再介绍一下调试R D B M S可用的常见诊断工具。注意,这里我们仅学习R D B M S诊断工具的内容,而调试优化应用程序的工具如S Q L _ T R A C E,T K P R O F,或数据库优化脚本程序如U T L B S TAT / U T L E S TAT,不在本章讨论范围内。

长沙天辰科技有限公司

29

ORACLE操作手册

3.3.1. Oracle跟踪文件

警告日志文件(实际文件名与操作系统有关)是非常有用的,便于D B A了解跟踪文件的关键信息。当诊断数据库问题时,查看的第一个文件通常就是警告日志文件。获取跟踪文件中信息的能力,与用户认识文件中的各种信息的经验有关。值得指出的是,有相当一部分信息是日志信息,与错误条件无关。

如果警告日志文件不存在,那么启动数据库时, O r a c l e会自动生成一个警告日志文件。以下是部分警告日志文件。 Thu Aug 30 12:01:19 2001 Shutting down instance (abort) Tue Jan 31 20:08:20 2012

Starting ORACLE instance (normal) Fri Oct 26 16:28:19 2001

Starting ORACLE instance (normal) Mon Nov 26 16:35:03 2001 Starting ORACLE instance (normal) LICENSE_MAX_SESSION = 0 LICENSE_SESSIONS_WARNING = 0 LICENSE_MAX_USERS = 0

Starting up ORACLE RDBMS Version: 8.1.6.1.0. System parameters with non-default values: shared_pool_size = 20971520 db_block_buffers = 2500 db_block_size = 8192 compatible = 8.1.5 db_file_multiblock_read_count= 8 sort_area_size = 1048576 optimizer_mode = choose star_transformation_enabled= true parallel_threads_per_cpu = 4 parallel_automatic_tuning= TRUE „„„„„„„„„„ „„„„„„„„„„„„

长沙天辰科技有限公司

30

ORACLE操作手册

„„„„„„„„„„„„

启动数据库后,所有i n i t . o r a中的初始化参数和有关后台进程已经启动的信息,就记录在警告日志文件中,实例中运行的线程和L G W R正写入的日志次序号也被记录下来。通常,警告日志文件包括所有的数据库启动和关闭、表空间创建、回滚段创建、修改语句以及关于日志切换和错误信息的记录。每个入口有一个相关的时间戳,对于非错误信息,通常有一个开始的入口及指明活动成功完成的入口。D B A定期检查这个文件发现错误是非常重要的。如果在警告日志文件有一条错误信息,可以查找专门的跟踪文件,获取更多的信息。

除了警告日志文件,还有两类跟踪文件是O r a c l e自动生成的。一类是由后台进程产生的后台跟踪文件,如D B W R和L G W R。后台跟踪文件是否能由启动创建,与后台进程在那时需要写入的信息有关。最初文件生成时,含有一些头信息,标明R D B M S和操作系统的版本号。这些文件创建于i n i t . o r a中的参数b a c k g r o u n d _ d u m p _ d e s t指定的目录下。

第二类跟踪文件是由用户与O r a c l e的连接生成的,称之为用户跟踪文件。这些文件只有当用户会话遇到一个错误状态和信息,且信息能被转储到跟踪文件时创建。而且,用户会话需要一个使用A LTER SESSION命令跟踪文件页,该文件作为用户跟踪文件创建。用户跟踪文件创建于init.ora中的参数b a c k g r o u n d _ d o m p _ d e s t指定的目录下。

跟踪文件的名称能帮助用户更加容易正确地定位文件。命名规则由操作系统指定。在U N I X环境下,后台跟踪文件名是ORA_PID_PROCESS_ID.trc,而用户跟踪文件名为PROCEDD_ID.trc。ORA_ID即Oracle进程ID, PROCESS_ID是用于创建跟踪文件的系统进程ID。在OpenVMS环境下文件名是IMAGE_NAME_SID_PROCESS_ID.TRC。I M A G E _ N A M E 是创建跟踪文件的可执行映像名, S I D是实例的系统标识符, P R O C E S S _ I D是创建跟踪文件进程的进程I D。注意,写入用户跟踪文件中的所有消息可能并不严格,但总是有利于D B A监测一定间隔内的跟踪文件。

跟踪文件含有大量便于D B A解决问题的信息。之后,我们将讨论常见错误、原因和解决方案。但在此之前我们需要检验一些诊断特征并更好地理解一些转储文件的信息。

3.3.2. 设置跟踪事件

O r a c l e提供了的用于调试R D B M S各种诊断工具。可以设置一些事件用于把各种数据库结构的诊断信息转储到跟踪文件中。i n i t . o r a文件中的一些特殊的参数,可用来诊断内存和磁盘错。这些参数在数据库正常操作时并不设置,因为这些诊断工具会影响性能。要强调的是,使用跟踪事件仅能在O r a c l e支持分析员监视之下。这一部分的目的是帮助节省时间,收集O r a c l e需要的事件信息。这里我们只介绍一些事件设置,除此以外还有很多可用事件,在需要时可被O r a c l e使用。

有两种方式可以打开事件跟踪。第一种方式是在i n i t . o r a文件中设置所需的事件,这将打开所有会话跟踪事件。第二种方式是键入A LTER SESSION SET EVENTS命令,通常由O r a c l e 服务器管理员来做,此时只打开当前会话的事

长沙天辰科技有限公司

31

ORACLE操作手册

件跟踪。

i n i t . o r a中使用的语法是:

EVENT = “event syntax | , LEVEL n |:event syntax| , LEVEL n | …” SQL中使用的语法是:

SQL> alter session set events „event syntax LEVEL n : event syntax

4

LEVEL n : ………

例如,要转储控制文件的整个内容,语法是:

SQL>ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME

2 CONTROLF LEVEL 10 ';

e v e n t语法含有多个关键字。第一个关键字可能是事件号或一个特殊的关键字,如I M M E - D I AT E。这些事件代码可能是O r a c l e错误代码或定义在Oracle RDBMS中的内部事件代码。这些事件代码是在内核中逻辑实现的,其活动与值有关。这些内部事件代码在U N I X机上的rdbms /mesg /oraus.msg文件里,或在Open VMS机O R A _ R D B M S目录下的E R R O R . M S G文件里。在一些操作系统(包括Microsoft Wi n d o w s在内)中,这个文件可能是二进制的而不是文本类型。内部事件代码范围在1 0 0 0 0 ~ 2 0 0 0 0。

如果在e v e n t语法中,关键字I M M E D I AT E被指定为第一个词,说明这是无条件事件,指定的结构应当在命令执行后被立刻转储到跟踪文件。这个关键字用在A LTER SESSION命令里(但在i n i t . o r a文件中没有任何意义)。 e v e n t语法中第二个、第三个关键字几乎总是T R A C E和N A M E。关键字T R A C E是指转储到跟踪文件的输出结果,关键字N A M E在实际事件名之前。还有一些限定词可用,不过只被O r a c l e开发组在内部使用。e v e n t过程最后一个关键字是事件名,这是用户准备转储的实际结构。

如果在e v e n t语法中,没有将I M M E D I AT E选项作为第一个关键字,则需要指出指定跟踪文件应当保持多久有效。如果使用F O R E V E R关键字,将在会话或实例的整个期间可用,取决于事件是在i n i t . o r a中设置还是在会话级设置。

L E V E L关键字可用在除转储没有级别的errorstack (errorstack在这部分后面还会讨论)之外的大部分事件中通常L E V E L需要设置为1 ~ 1 0。1 0代表转储事件的所有信息。例如若设置L E V E L为1,当转储控制文件时,就只转储控制文件头,而将L E V E L设置为1 0,就把所有控制文件内容全部转储。使用B L O C K D U M P关键字转储数据块时, L E V E L有特殊含义,这里L E V E L是数据块的实际地址,用十进制形式指定。在所有情况下, O S S都建议L E V E L值应当根据转储到跟踪文件的结构而定。

 以下是一些在i n i t . o r a中设置事件的应用实例: EVENT = “604 TRACE NAME ERRORSTACK FOREVER”

EVENT = “10210 TRACE NAME CONTEXT FOREVER ,LEVEL 10”

以上两行需在init.ora文件中正确键入。第一条语句是当每次遇到ORA-00604

长沙天辰科技有限公司

32

ORACLE操作手册

错误时转储错误栈,第二条语句是块检查事件,当从磁盘向高速缓存读取时检查每个块的完整性。当数据库的会话中有上述情况发生时,记住在i n i t . o r a文件里设置这些事件,可生成一个跟踪文件。

 下面的例子使用S Q L设置事件来实现:

SQL> ALTER SESSION SET EVENTS „ IMMEDIATE TRACE 2 NAME BLOCKDUMP LEVEL 67109037 „;

SQL> ALTER SESSION SET EVENTS „ IMMEDIATE TRACE

2

NAME CONTROLF LEVEL 10‟;

SQL> ALTER SESSION SET EVENTS „ IMMEDIATE TRACE 2 NAME SYSTEMSTATE LEVEL 10 „;

第一条语句将数据块6 7 1 0 9 0 3 7转储到一个跟踪文件。O r a c l e数据库中每个数据块都以唯一的块号和文件名组合来区分。上例中6 7 1 0 9 0 3 7是文件号和数据库号的十进制表达,这条信息与操作系统有关。第二条语句将把控制文件的全部内容转储到跟踪文件。第三条语句是转储系统状态,包括所有进程状态转储(系统状态是关于Oracle RDBMS控制的当前对象,而进程状态转储是部分进程控制的对象)。系统状态转储在诊断系统挂起问题时很有用。 事件名

可用事件名有很多。我们再次强调, O r a c l e支持机构应当在设置跟踪事件和事件名方面进行指导。这里介绍的一些事件名,可供用户体会可用的事件类型。

(1) ERRORSTACK

O r a c l e创建一个名为“ error stack(错误栈)”的栈,用于存储进程中发生的与特殊错误有关的信息。O r a c l e前台进程接收一个错误消息。而运行一些应用程序(Developer/2000 Forms)时,前台进程将得不到与错误有关的所有信息。该事件转储全部错误栈,这对调试O r a c l e错误很有用。如一个应用程序发生O R A - 6 0 4错误,用下列命令将错误栈转储到跟踪文件:

SQL> alter session set events „604 trace name errorstack forever‟; (2) SYSTEMSTATE

该事件转储整个系统状态,包括所有进程状态转储。该事件对于性能降低、进程挂起或系统挂起等问题的诊断非常有用。如: SQL>alter session set events „immediate trace name systemstate level 10‟;

转储系统状态到跟踪文件。

(3) EVENT代码1 0 0 1 3和1 0 0 1 5

这些事件代码用于诊断由坏的回滚段引起的问题。这种情况下,数据库无法启动,并显示O R A - 1 5 7 8错误信息,指出数据库中的块因某种原因出错。如果O S S确定原因出自回滚段,在i n i t . o r a文件中设置事件代码1 0 0 1 3和1 0 0 1 5,将生成一个跟踪文件,这对于确定出问题的回滚段有帮助。Init.ora文件中设置该事件的语法是: event = “10210 trace name context forever ,level 10”

长沙天辰科技有限公司

33

ORACLE操作手册

将打开每个读入S G A数据块的块检查。 (5) EVENT代码1 0 2 3 1和1 0 2 3 2

这些可能是最重要的事件代码。假设由于物理存储损耗,磁盘上的一个数据块发生零溢出,也就是数据块中的所有数据丢失,为了保存表中剩下的数据就需要卸出表。然而,当坏区被读入时,整个表扫描失效。为了解决出错,必需设置事件1 0 2 3 1。该事件在整个表扫描时,将跳过出错的块。如果事件1 0 2 3 2设置了,这些出错的块就转储到跟踪文件。要正常工作,还有必须满足如下条件:

 这个块应当是O r a c l e软错误。这意味当O r a c l e检测出错的块

时,通过设置块的某个位来标记出错的块。为此必须使用事件1 0 2 1 0,建议将事件1 0 2 3 1和事件1 0 2 1 0一起使用。  LEVEL应当正确设置。O S S可以提供有关的信息。

 通过索引存取块是不行的,只能对整个表进行扫描。注意,如果事件在

一个会话中设置,只有当会话进行整个表的扫描才能工作。如果需要导出表,该事件应在i n i t . o r a文件中设置。

下面的两个例子,第一个是用S Q L,另一个则在init.ora文件中进行设置。 SQL> alter session set events ‘10231 trace name context off’; event=’10231 trace name context forever, level 10’;

第一个语句将关掉会话的块检查,第二个语句则打开整个数据库的块检查,所有数据块通过进程读入到S G A。

3.3.3. V$监视视图

O r a c l e维护着一组称作动态性能表的表,数据库正常操作期间,这些表里的数据不断变化。大多数表包括与数据库性能有关的数据,而有一些表涉及到控制文件、数据文件、日志文件的信息和备份信息。还有一组为这些表生成的称作V _ $视图的视图集,这些视图以V $为前缀,开头具有公共同义词。一些V $对象(通常是指V $视图)在诊断日常问题并监视正常数据库活动和状态时非常有,另一些则在诊断与备份和恢复有关的问题时非常有用。下面是一些重要V $视图的列表:

长沙天辰科技有限公司

34

ORACLE操作手册

视图名 V$ACCESS V$ARCHIVE V$BACKUP V$BGPROCESS V$CIRCUIT V$DATABASE V$DBFILE 说明 正在使用的对象信息 数据库的已存档事务日志信息 数据库中所有联机表空间的备份状态信息 数据库服务器后台进程信息 一个多线程服务器配置中的所有通路信息 数据库控制文件得到的关于数据库的信息 数据库的数据库文件信息 V$DB_OBJECT_CACHE 数据库服务器的对象高速缓存中的对象的信息,包括表、视图、索引、过程、函数和包 V$DISPATCHER 一个多线程数据库服务器中当前启动了的调度器的后台服务器进程的信息 V$ENABLEDPRIVS 被启用的权限信息 V$FILESTAT 数据库文件的I/O统计信息 V$FIXED_TABLE 数据库中的所有固定表的信息 V$INSTANCE 数据库服务器当前状态信息 V$LATCH 数据库的内部锁信息 V$LATCHHOLDER 当前掌握着的内部锁的会话信息 V$LATCHNAME 数据库的内部锁名信息 V$LIBRARYCACHE V$LICENSE V$LOADCSTAC V$LOCK V$LOG V$LOGFILE V$LOG_HISTORY V$MTS V$NLS_PARAMETERS V$OPEN_CURSOR V$PARAMETER V$PROCESS V$QUEUE V$RECOVERY_LOG V$RECOVERY_FILE V$REQDIST V$RESOURCE V$ROLLNAME V$ROLLSTAT V$ROWCACHE V$SECONDARY V$SESSION

长沙天辰科技有限公司

数据库高速缓存管理情况统计信息 ORACLE许可证限制信息 以直接路径方式使用Oralce Loader编译的统计信息 数据库服务器的DML锁信息 数据库中事务日志信息 数据库中事务日志文件信息 数据库中事务日志顺序历史信息 多线程服务器配置的调整信息 当前语言参数设置信息 每个数据库中打开的游标信息 每个数据库中初始化参数信息 当前活动的进程信息 多线程服务器队列的信息 执行数据库恢复时所需的已存档事务日志组信息 执行数据库恢复时需要恢复的数据文件状态信息 请示次数统计信息 系统资源信息 所有联机回滚段信息 所有联机回滚段统计信息 数据字典活动情况统计信息 已经安装的从属数据库信息 数据库会话信息 35

ORACLE操作手册

续表:

视图名 V$SESSION_EVENTS V$SESSION_WAIT V$SESS_IO V$SGA V$SHARED_SERVER V$SQLAREA V$STATNAME V$SYSLABEL V$SYSTAT V$SYSTEM_EVENTS V$THREAD V$TIMER V$TRANSACTION V$TYDE_SIZE V$VERSION V$WAITSTAT 说明 每个会话及每个事件的等待统计信息 会话正在等待的资源信息 每个会话使用I/O情况信息 数据库服务器的SGA内存区域统计信息 多线程数据库服务器的共享前台服务器信息 共享游标信息 对V$SESSTAT中显示的会话统计码的描述 系统标签信息 对V$SESSTAT中每个统计数据的全系统范围的统计信息 按会话计算的事务统计的系统信息 数据库事务日志的线程信息 精确到百分之一秒的当前系统时间 当前数据库事务的信息 有助于空间使用估计判断的数据信息 ORACLE服务器核心软件库版本信息 事务之间数据块竞争的统计信息 3.3.4. 锁实用程序

由于有很多用户或进程共享存取一个简单对象或资源,因而加锁是动态系统的一个基本要求。根据正在使用的应用程序或在进程终止的环境下,有很多情况能引起进程挂起,而等待一个特定资源。很多D B A,需要对M O N I TOR LOCK进行细致分析,从而决定哪个进程正挂起。

Oracle RDBMS有两种类型的锁管理:内部锁和数据( D M L )锁。

内部锁分两类: latches和enqueues。latches和enqueues都保护共享内存数据结构。然而,enqueues还保护诸如存取控制文件、重做日志文件和回滚段等其他对象。latches这种内部只存在于较短的时间内。像高速缓冲存储器的缓冲区里的L R U (最近极少使用)链这样的结构是受latch保护的,这意味着修改LRU 链的进程,需要在进行前获得latch。

当一个进程必须获取一个l a t c h时,大部分时间是在等待请求。这意味着在首次请求无法获得时,该进程将要继续请求,全部消耗也在于此,因为l a t c h存在的时间非常短,也许等待一会儿再次请求就成功。e n q u e u e s也是内部锁,但不同于l a t c h e s,因为有一个内建结构,进程是排队等待资源的。e n q u e u e s能以共享或唯一模式存在,这要由给定事务被允许的共享程度来定。enqueues两种最普遍的类型是行等待( RW )和行高速缓存enqueues。 数据锁,用于保持数据的一致性,可以在行级或表级以共享或唯一模式存在。对于行级锁定,锁的分类是最普遍的关注焦点。

要诊断锁问题,或系统因锁挂起问题,Oracle提供了UTLLOCKT.SQL。这个脚本文件对于过滤掉来自MONITOR LOCK的信息相当有用,尤其当许多其他用户共享锁但对此问题并不清楚时。UTLLOCKT.SQL脚本通常位于$ORCLE_HOME/rdbms /admin

长沙天辰科技有限公司

36

ORACLE操作手册

目录下,并且其中的指令清楚地解释了如何使用该脚本文件和输出的结果。

3.4. Oracle错误分析和解决方案

这一节分三小节。3 . 4 . 1“常见O r a c l e错误”集中讨论一般性错误,通常是数据库管理员日常遇到的有关空间管理和数据库管理方面的问题。对这些常见错误产生背景,解决方案及一些预防措施进行了阐述。3 . 4 . 2“O r a c l e内部错误”讨论O r a c l e内部错误。虽然O r a c l e内部错误不常见,但会导致大型数据库或应用程序的运行中断。这样的内部错误往往是由于各种数据结构因软硬件出错而发生的,最好是从O r a c l e用户支持机构来得到帮助。3 . 4 . 3“优先权1 /优先权2的分类和诊断操作”涉及有关数据库的分类问题,并提供数据库管理员进行的一些较小诊断操作的建议。

3.4.1. 常见Oracle错误

或许你已经遇到这样一种情况,由于O r a c l e给出一条错误信息,有人告诉你不能向表内添加行记录。其实这是非常普遍的问题,与数据库管理员遇到的相比算不上什么。这一部分我们讨论数据库管理员日常遇到的一些典型的问题,如表和索引的空间管理、共享池区的内存碎片问题、快照问题,最后讨论有关回滚段管理问题。相关问题的解决方案和办法也会在适当的地方提到。

1.ORA-604

下面是出现O R A - 6 0 4错误时典型的输出信息: SQL> !oerr ora 604

00604, 00000, \"error occurred at recursive SQL level %s\"

// *Cause: An error occurred while processing a recursive SQL statement // (a statement applying to internal dictionary tables).

// *Action: If the situation described in the next error on the stack // can be corrected, do so; otherwise contact Oracle Support.

通常,O R A - 6 0 4是和另一个错误一起出现的,如O R A - 1 6 5 2。如果在跟踪文件中找不到错误源,试着在i n i t . o r a文件中设置下列的事件,并重新启动数据库。

Event = “604 trace name errorstack forever”

这样,当O R A - 6 0 4出现时,会在U S E R _ D U M P _ D E S T指定的目录下得到一个跟踪文件,这个跟踪文件将提供更多的有关出错的信息,有助于解决问题。

2. ORA-1000

当发生O R A - 1 0 0 0错误时,会看到类似下面的输出信息: 01000, 00000, \"maximum open cursors exceeded\" // *Cause: // *Action:

这种错误通常在O r a c l e调用接口( O C I )程序、P r o * C程序、Vi s u a l B a s i c、D e v e l o p e r / 2 0 0 0等应用程序中出现。这种错误也可能出现在数据库级,当使用I N S E RT、U P D AT E、D E L E T E或其他

长沙天辰科技有限公司

37

ORACLE操作手册

任意的P L / S Q L语句时。产生这种错误的原因是, O r a c l e已达到允许执行或用户会话所打开游标的设置极限。在解决问题前,先简要地讨论一下游标。 有两类打开的游标:隐式( i m p l i c i t )和显式( e x p l i c i t )。隐式游标由O r a c l e自动生成和管理。一个隐式游标为所有数据定义语句和数据操纵语句声明,而显式游标则由用户全权生成和管理,这样用户可以控制应用程序中打开的游标数量。然而,如果程序中出现错误或打开的游标不能正常关闭,将导致有大量的游标同时打开。游标存在于被称为私有S Q L区的工作区。因此,创建的游标数量是由i n i t . o r a文件中的参数决定。

有两种解决O R A - 1 0 0 0问题的办法—即在数据库级和应用程序级调整游标的使用。在数据库级,可以使用init.ora文件中的OPEN_CURSOR参数定义用户在一个会话中可以打开的游标数。大多数操作系统的缺省值是5 0,这可能并不够。因此设置的值最好高一些,如2 5 5。

注意也可以在应用级对游标做一些调整。如果用到的是预编译程序,有三种参数会在

应用级影响控制游标: R E L E A S E _ C U R S O R,H O L D _ C U R S O R,和M A X O P E N -CURSORS。

3. ORA-111 0或O R A - 11 2 2或O R A - 1 2 0 x

O R A - 111 0和O R A - 11 2 2通常伴有O R A - 1 2 0 x错误。下面是O R A - 111 0和O R A - 11 2 2及O R A -1 2 0 x错误的输出信息:

$oerr ora 1122 01122, 00000, \"database file %s failed verification check\"

// *Cause: The information in this file is inconsistent with information // from the controlfile. See accompanying message for reason. // *Action: Make certain that the db files and controlfiles are the correct // files for this database. $oerr ora 1110 01110, 00000, \"data file %s: '%s'\"

// *Cause: Reporting file name for details of another error // *Action: See associated error message

还会看到如下的O R A错误: $oerr ora 1201

01201, 00000, \"file %s header failed to write correctly\"

// *Cause: An I/O error was reported for the file header. The error was // trapped and a second attempt will be made.

// *Action: The file probably will require recovery. Further error messages // will indicate what is needed. $oerr ora 1202

01202, 00000, \"wrong incarnation of this file - wrong creation time\" // *Cause: The creation time in the file header is not the same as the // creation time in the controlfile. This is probably a copy of a // file that was dropped.

// *Action: Restore a current copy of the data file and do recovery as needed.

这些错误总是发生在数据库启动期间。在大多数情况下,这些错误产生是由于用户试图从备份文件恢复,或前面关闭数据库的工作没有完成。总之,这些错误通常指出出错的文件有一个坏的文件头不能被O r a c l e读取。通常,当文

长沙天辰科技有限公司

38

ORACLE操作手册

件已经在操作系统级由用户、另一个应用程序或U N I X命令,如d d、c p或m v等使用时,上述错误容易发生。大多数情况下的解决办法是,重新从一个备份中恢复。为了更好地理解为什么文件出错,可以使用下面的步骤。 首先,使用S TA RTUP MOUNT命令启动数据库。这样,用V $ D ATA F I L E视图可以查询数据文件的状态。 SVRMGR>connect internal SVRMGR>startup mount SVRMGR>select file#,status,enabled,name from v$datafile;

FILE# STATUS ENABLED NAME ----- ------- ---------- -----------------------------------------

1 SYSTEM READ WRITE /data2/ora_data/system01.dbf 2 ONLINE READ WRITE /data1/ora_idx_data/rbs_system01.dbf 3 ONLINE READ WRITE /data2/ora_data/data_bill01.dbf 4 ONLINE READ WRITE /data1/ora_idx_data/data_bill_idx01.dbf 5 ONLINE READ WRITE /data1/ora_data/temp01.dbf 6 ONLINE READ WRITE /data1/ora_data/tool01.dbf 7 ONLINE READ WRITE /data2/ora_data/data_bill02.dbf 8 ONLINE READ WRITE /data2/ora_data/data_bill03.dbf 9 ONLINE READ WRITE /data2/ora_data/data_bill04.dbf 10 ONLINE READ WRITE /data2/ora_data/data_bill05.dbf 11 ONLINE READ WRITE /data1/ora_idx_data/data_bill_idx02.dbf 12 13 14 15

ONLINE ONLINE ONLINE ONLINE

READ WRITE /data2/ora_data/data_bill06.dbf READ WRITE /data2/ora_data/data_bill07.dbf READ WRITE /data1/ora_idx_data/data_bill_idx03.dbf READ WRITE /data1/ora_idx_data/rbs_system02.dbf

16 ONLINE READ WRITE /data1/ora_idx_data/rbs_system03.dbf 17 ONLINE READ WRITE /data1/ora_idx_data/rbs_system04.dbf 18 SYSTEM READ WRITE /data2/ora_data/system02.dbf 19 ONLINE READ WRITE /data2/ora_data/data_bill08.dbf

已选择19行。

注意状态是O F F L I N E的所有数据文件,用户需要对这些数据文件执行恢复操作。有时出错信息中涉及的文件状态是O N L I N E。在这种情况下,可以用A LTER DATABASE DATA F I L EO F F L I N E命令将文件状态设置为O F F L I N E,并试着重新开启数据库。 如果想要进一步了解情况,可以取文件头的一个转储信息并与OOS联系。可以用命令A LTER SESSION获取文件头的转储信息,然后一个跟踪文件将在由USER_DUMP_DEST指定的目录中产生。

SVRMGR> alter session set events ‘immediate trace name FILE_HDRS

2 level 10’;

最后,用户需要决定如何恢复出错的文件。 4. ORA-1427

下面是O R A - 1 4 2 7错误的输出信息: $oerr ora 1427

01427, 00000, \"single-row subquery returns more than one row\"

长沙天辰科技有限公司

39

ORACLE操作手册

// *Cause: // *Action:

当一个子查询返回的值超出主查询所希望的值范围时,会出现ORA-1427错误信息。让我们检查下面的查询:

select * from serv where serv_id=(select serv_id from serv_acct);

如果上述子查询返回的d e p t n o的值超出主查询中d e p t n o的可查询范围时,将出现O R A - 1 4 2 7错误。解决办法是,重新改写查询语句,用I N来代替等号。

select * from serv where serv_id in (select serv_id from serv_acct); 4.ORA-1545

当出现O R A - 1 5 4 5错误时,会看到类似下面的输出信息: $oerr ora 1545

01545, 00000, \"rollback segment '%s' specified not available\" // *Cause: Either:

// 1) An attempt was made to bring a rollback segment online that is // unavailable during startup; for example, the rollback segment // is in an offline tablespace.

// 2) An attempt was made to bring a rollback segment online that is // already online. This is because the rollback segment is

// specified twice in the ROLLBACK_SEGMENTS parameter in the // initialization parameter file or the rollback segment is already // online by another instance.

// 3) An attempt was made to drop a rollback segment that is // currently online.

// 4) An attempt was made to alter a rollback segment that is // currently online to use unlimited extents. // *Action: Either:

// 1) Make the rollback segment available; for example, bring an // offline tablespace online.

// 2) Remove the name from the ROLLBACK_SEGMENTS parameter if // the name

// is a duplicate or if another instance has already acquired the // rollback segment.

// 3) Bring the rollback segment offline first. This may involve // waiting for the active transactions to finish, or, if the

// rollback segment needs recovery, discover which errors are // holding up the rolling back of the transactions and take // appropriate actions. // 4) Same as 3).

当我们看到一个NEEDS RECOVERY状态的回滚段时,这实际意味该回滚段需要恢复。下面是关于这种情况的一些有用信息和处理的方法。

O r a c l e在启动时自动执行事故恢复,这使数据库处于向前回退完成且没有更多的重做日志可用的状态。这样回滚段(包括取消上次操作信息)通过查询回滚段的事务表,来向后回滚没有提交的或只是活动的事务。如果对所有没有提

长沙天辰科技有限公司

40

ORACLE操作手册

交事务,都可完成取消上次操作(undo),回退将是成功和完整的。如果Oracle不能,无论什么原因,应用取消上次操作,回滚段都不能完全恢复,并且被置于NEEDS RECOVERY状态。最好的检测方式是设置诊断事件1 0 0 1 3和1 0 0 1 5, 本章前面已介绍。当这些事件设置完成后,对恢复前和恢复后的所有回滚段,事务表转储到跟踪文件。要完全恢复回滚段,在回滚段恢复前后都将有一个转储过程。但如果是不可恢复的回滚段,将有一个具有栈跟踪文件的映像前转储。通过在恢复前扫描事务表,用户应当能看到活动事务入口。在事务表转储后,跟踪文件中有一些地方也会有O r a c l e错误:O R A - 11 3 5。该错误表明有一个特殊数据文件脱机,信息如下: $oerr ora 1135

01135, 00000, \"file %s accessed for DML/query is offline\" // *Cause: Attempted to access a data file that is offline // *Action: Bring the data file back online

这是指一个数据文件脱机并且需要对此文件执行undo操作。如果i n i t . o r a文件指定一个实例所需要的回滚段,该回滚段标记为NEEDS RECOVERY,那么就会得到O R A - 1 5 4 5错误信息。如: $oerr ora 1545

01545, 00000, \"rollback segment '%s' specified not available\"

这条消息并没有说明不可用的原因。如果仅有一个需要恢复的回滚段,只需将init.ora中ROLLBACK_SEGMENT参数列表中那个回滚段名去掉。就可以启动数据库。的确, D B A可能发现不止一个回滚段处于NEEDS RECOVERY状态,但这种解决方法只能暂时克服问题。用户最可能问到的重要问题是:“在回滚段时为什么不能取消上次的操作?”最可能的原因是,D B A已经使用I M M E D I AT E选项将表空间脱机;或在装载数据库时,没有打开数据库便使文件脱机。这个问题能用以下两种方式完全解决:

 把包含此回滚段的表空间联机,这样,联机命令可确保取消上次操作,

并改变回滚段状态。

 删除表空间以便删除命令去掉u n d o操作,因为我们不再需要u n d o。

显然只有当表空间能够重建才可采取这个方式。

上述两种方式都是在数据库打开时进行的。如果两种方式都不能使用,则不在i n i t . o r a中指定回滚段而打开数据库,并使数据库保持一段时间(一般3 0分钟),这样将使回滚段的状态从NEEDS RECOVERY改变为AVA I L A B L E。UNERCOVER工作由S M O N完成,包括查看回滚段和拷贝尚未执行的取消操作到SAVEUNDO(一个延迟回滚段)。D B A需保证S Y S T E M表空间有足够的可用空间用于此项操作。保存的取消上次操作将一直存在,直到有问题的表空间重新可用。如果系统回滚段有一个激活的事务并且因为表空间是脱机的而不能回退,那么D B A需要重新备份。当然,这种情况是极少的,只有当数据库含有一个单一的回滚段才有可能出现。

6. ORA-1652到ORA-1655

简单地说, O R A - 1 6 5 X错误信息是指出表空间没有足够的空间可分配的信息。

$oerr ora 1652

01652, 00000, \"unable to extend temp segment by %s in tablespace %s\" // *Cause: Failed to allocate an extent for temp segment in tablespace.

长沙天辰科技有限公司

41

ORACLE操作手册

// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or //more

// files to the tablespace indicated. $oerr ora 1653

01653, 00000, \"unable to extend table %s.%s by %s in tablespace %s\" // *Cause: Failed to allocate an extent for table segment in tablespace.

// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or //more

// files to the tablespace indicated. $oerr ora 1654

01654, 00000, \"unable to extend index %s.%s by %s in tablespace %s\" // *Cause: Failed to allocate an extent for index segment in tablespace.

// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or //more

// files to the tablespace indicated. $oerr ora 1655

01655, 00000, \"unable to extend cluster %s.%s by %s in tablespace %s\" // *Cause: Failed to allocate an extent for cluster segment in tablespace.

// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or //more

// files to the tablespace indicated.

O R A - 1 6 5 X错误可能是数据库管理员( D B A )最常见的ORACLE错误信息,因此解决这些错误时需要了解问题产生的环境和条件。实际上, ORACLE将表空间作为逻辑结构——单元;而表空间的物理结构是数据文件。数据文件在磁盘上物理地创建,表空间中的所有对象也存于磁盘。为了给表空间增加空间,必须增加数据文件,当产生O R A - 1 6 5 X错误信息时,问题可能在于特定表空间缺少可分配的空间。错误信息提供两个参数: S I Z E,提示数据库管理员系统没有找到O r a c l e块的数量;而TA B L E S PA C E则提示数据库管理员需要表空间的地方。O r a c l e总是尽量分配连续空间。尽管有时表空间可能有足够的可分配空间,如果不是连续的,错误仍将发生。

要查看一个指定表空间的可用空间,用户必须使用视图

SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小,例如:

SQL> select file_id,block_id,blocks,bytes from sys.dba_free_space where 2 tablespace_name='DATA_BILL';

FILE_ID BLOCK_ID BLOCKS BYTES ---------- ---------- ---------- ---------- 4 4 4

2

20 72 25 1318

40960 147456 51200 2699264

1465 22

4 147 已选择4行。

由上面查询语句的结果可见, U S E R S表空间有4个可用空间(用块表示),并且还可以查到可用空间的大小(用字节表示),然而查询结果并不能正确反映可用空间的连续性。如果修改一下查询语句加上ORDER BY字段,输出结果就容易理解

长沙天辰科技有限公司

42

ORACLE操作手册

了:

FILE_ID BLOCK_ID BLOCKS BYTES ---------- ---------- ---------- ---------- 4 2 20 40960 4 22 25 51200 4

147

1318

2699264

4 1465 72 147456 已选择4行。 可以看到在这里实际有两个连续空间而不是四个。如果认真检查输出结果,

2号块有2 0个可用空间块。下一个可用空间开始于2 2块,可见这两个是连续的。1 4 7号块也一样。在此增加块数时,会发现它们在1 4 6 4号块处结束,它与下一个可用空间块相连。

如果试着创建一个有1 3 2 5个O r a c l e块的表(或2 6 5 0 K,设定每个区块大小为2 K ),应用上面的例子,则可用空间被合并:

SQL> create table bulletin(y number) storage (initial 2650k)

2 tablespace data_bill; Table Created.

SQL> select file_id,block_id,blocks,bytes from data_free_space 2 where tablespace_name=’DATA_BILL’ order by block_id;

FILE_ID BLOCK_ID BLOCKS BYTES ---------- ---------- ---------- ---------- 4 2 4 1472 已选择2行。

20 1318

40960 2699264

理解O r a c l e空间如何工作同样是相当重要的。最初, R D B M S试图来查找一个适当大小的范围空间,如果不存在,于是就把大范围空间分解。如果最后还不能找到可用空间,则将其合并。注意,删除对象对合并没有任何影响。请看下面的例子:

SQL>drop table bulletin; Talbe Droped.

SQL> select file_id,block_id,blocks,bytes from data_free_space 2 where tablespace_name=’DATA_BILL’ order by block_id;

FILE_ID BLOCK_ID BLOCKS BYTES ---------- ---------- ---------- ---------- 4 4

2 147

20 1325 1318

40960 2713600 2699264

4 1472 已选择3行.

一个较为简便的方法是,初步确定可用空间的最大块,看它是否小于错误信息中提到的尺寸,该方法仅适合于Oracle 8。

查询语句如下:

SQL> select max(blocks) from sys.dba_free_space where 2 tablesapce_name=‟‟;

执行结果将返回上述表空间中最大可用空间的一条记录,这个数字比错误信

长沙天辰科技有限公司

43

ORACLE操作手册

息返回的数字小。如果想比较连续空间和全部空间的大小,可使用下面的查询:

SQL> select sum(blocks) from sys.dba_free_space where 2 tablesapce_name=‟‟;

这条查询也返回一个记录。将这个值与上面的值比较,就可以看到全部空间有多少是连续的。注意,如果表空间里没有空间, S Y S . D B A _ P R E E _ S PA C E视图中也无记录可查。

有时用户可能试图对表空间进行插入,这就会得到有关另一个表空间的错误。为了便于理解,我们检查能在数据库里增加的对象。

(1) 数据字典

如果数据字典对象需要扩展但S Y S T E M表空间又没有足够空间可用, O R A _ 1 6 5 x错误就会发生。这种情况下在ORA_165x 错误前先出现O R A _ 6 0 4错误。例如,创建一个表以扩展t a b $而S Y S T E M表空间没有足够的空间,创建的表将得到错误O R A - 6 0 4和O R A _ 1 6 5 x。

(2) 表和索引

如果需要额外空间以满足一个对象的插入或更改,将发生O R A _ 1 6 5 x错误。如果这个错误产生于表或索引的创建时,指定的存储参数或表空间缺省存储参数需要修改。

(3) 回滚段

如果错误发生在回滚段, O R A - 1 6 5 0错误总是在O R A - 1 6 5 x错误之前发生。O R A - 1 6 5 0指出不能扩展回滚段,O R A - 1 6 5 x错误说明了其原因是缺少空间。O R A - 1 6 5 0错误信息如下:

ORA-1650 \"unable to extend rollback segment\" (4) 临时段

临时段是O r a c l e内核创建的,代表用户完成一个排序操作。用户根据执行的操作(如创建一个索引,执行有ORDER BY字段的查询或较长的连接语句)能够知道临时表空间正在用尽。在这种情况下,用户需要的临时表空间可用于下面的查询语句找到:

SQL> select temporary_tablespace from sys.dba_users where 2 user_name = ‘’;

如果使用的表空间看上去过多,用户可能想审查用于临时表空间的缺省存储参数,因为其原因可能是缺省值太大。要查看缺省存储参数可执行如下查询:

SQL> select initial_extent,next_extent,min_extents,pct_increase 2 from sys.dba_tablespace where tablespace_name=’’; 临时段(或任何)表空间的缺省存储值可通过下面S Q L命令修改: SQL> alter tablespace default storage 2 (initial next );

与其增加临时表空间的大小,不如修改用户,以使用户使用已知的更多的表空间,如果希望修改用户的临时表空间则执行下面的命令:

SQL> alter user temporary tablespace 2 < new_tablespace_name>;

使用A LTER TA B L E S PA C E命令,能向表空间添加空间。这个命令在磁盘上创建一个数据库文件,并将该文件添加到表空间。A LTER TA B L E S PA C E命令适用于所有表空间(包括系统)而无需退出数据库或使表空间脱机。一旦该命令完成,所增加的空间就可用了。请注意,一旦添加了数据文件,就不能再删

长沙天辰科技有限公司

44

ORACLE操作手册

除它。若要删除,就要删除表空间。

当添加一个数据文件到表空间时, D B A可能偶然添加一个超出需要大小的文件。这种情况下,一些D B A往往关闭数据库,再装载并使用A LTER DATA B A S E命令使数据文件脱机并打开数据库,接着删除刚添加的数据文件,这是一个非常危险的操作。只有O r a c l e不能从该数据文件分配任何空间时,该数据文件才可以删除。注意即使该文件脱机,只要f e t $表里有可用的空间存在,O r a c l e仍将分配该数据文件的空间。所以解决这样问题的唯一方案是导出表中的数据,删除表,以正确的文件尺寸重新创建表空间,最后导入数据。使用下面的S Q L命令可使数据文件加入表空间:

SQL> alter tablespace add datafile 2 size ;

3.4.2. ORACLE内部错误

O S S报告中大多数经常出现的问题是与内核有关。这些问题需要尽可能地诊断分析,其中一些初始的诊断测试可以由数据库管理员来操作。本节讨论O r a c l e内部错误,如O R A - 6 0 0等。下节介绍优先权1 /优先权2问题分类以及在寻求O S S帮助前,数据库管理员应能收集的诊断信息。最后,举例说明如何处理内存或块出错。

1. ORA-600

正如前面所讨论的那样,跟踪调试文件的主要目的是记录错误条件出现时的信息。所有O r a c l e标记的错误都有一个相关的代码。一些常见错误在屏幕上显示给用户,一些致命错误或内部错误在警告文件中记录,并生成一个跟踪文件。如, O R A - 1 5 7 8指的是块错误。有一个特殊的O r a c l e错误—O R A - 6 0 0,只对O S S和O r a c l e开发有用。当O r a c l e代码内清洁检查失败时,就标记为O R A - 6 0 0错误。为了说明什么是清洁检查,查看下面的代码:

/* pesudo-code to get file# f,block# b from the database */ Get(F,B) Begin

If (F > MAX_NUMBER_OF_FILES)

signal (“ora 600 [2585] [F]”); exit();

Endif; „„„„„ End;

在这个代码段中, i f语句检查所需文件号的有效性。如果所需文件号超出规定的范围,程序将标记出错并退出。注意这不是实际O R A - 6 0 0 [ 2 8 5 8 ]错误的全部含义,而是清洁检查的一个举例说明

O R A - 6 0 0错误的第一个变量用于标记代码中错误的位置,代码中的每个部分的第一变量都不一样。从第二个到第五个变量显示附加信息,如前面例子

长沙天辰科技有限公司

45

ORACLE操作手册

中的文件号。

O R A - 6 0 0错误信息告诉O S S代码在哪里出现了错误。但没指出,当进入含有错误的例程时,R D B M S正在做什么。栈跟踪(stack trace)确定错误发生时的工作状态。栈跟踪是一个进程执行栈,转储含有所有活动例程的名字和传送到例程的变量值。栈跟踪从底部向上读取,在栈顶的例程通常是打印栈跟踪的例程。O r a c l e进程的栈跟踪上的变量通常不是很有用,因为这些变量绝大部分是定位指针而不是真实数据结构的值。但例程名有助于O S S决定是哪种类型的活动引起的错误。如,如果创建一致的读取块的例程是在堆栈上,在创建期间冲突块是能够确定的。

一个栈跟踪的转储是由O r a c l e当前正运行的操作系统的一个调用来完成的,这使得在不同的平台上的栈跟踪看上去是不同的。在U N I X平台上,栈跟踪的转储将包括例程名字,而在O p e n V M S上,栈跟踪是以例程名译成地址码来转储的。为了使堆栈跟踪可读,数据库管理员应当使用t r c f m t命令,在跟踪文件所创建的机器上格式化跟踪文件,这将把地址码转换成例程名字,而且是可读格式。O R A - 6 0 0错误经常伴有跟踪文件的状态转储。状态转储有两种类型—系统状态和进程状态。系统状态转储将包括Oracle RDBMS持有的当前对象的信息,进程状态转储则将显示特殊进程持有的对象。这些转储通常较大并且很难译解,但这些栈跟踪堆包括的关键信息中有一个是每个进程持有的块数。当进程符合了某错误条件时,经常是由于一些信息取自它持有的一个块。如果我们知道这些错误进程持有的块,就容易跟踪问题的来源。通过使用系统或进 程状态转储标记的数据块,我们能看到什么对象遇到了标记的错误。如果需要更多的信息,O S S要求数据库管理员转储更多信息,涉及与错误有关(转储系统状态和进程状态的语法在前面讨论过)的块、进程状态或系统状态。

3.4.3. 优先权1/优先权2问题分类和诊断操作

下面是问题的各种分类,这些问题可能影响到数据库性能以及数据库的数据完整性。有关信息可以帮助用户准确向O S S描述出现的问题。在这些情况下有必要从用户支持分析那里得到帮助。  数据冲突。  逻辑冲突。  系统挂起。  性能问题。  系统崩溃。

 临界功能非法。  内存冲突。 3.4.3.1. 数据冲突

数据冲突包括所有块格式冲突、非法索引入口和媒介数据冲突(例如数据字典)。典型例子是选择一个表时用户得到有关系统数据文件的ORA-600[ 3 3 3 9 ]错误。引起数据冲突的原因多种多样,比如,某硬件厂商的磁盘簇会引起操作系统的问题等。诊断这些问题的标准或典型的诊断操作包括:

(1)如果冲突是一个内部错误,收集跟踪文件(并在应用时格式化)。

(2)根据冲突时间转储重做日志文件。如果无法确信究竟有多少日志文件要

长沙天辰科技有限公司

46

ORACLE操作手册

转储,请保存所有的重做日志文件并咨询O S S。

(3)如果有理由怀疑是操作系统问题,则要求系统管理员执行全面的硬件诊断。

(4)决定问题是否常见或在指定端口。 3.4.3.2. 逻辑冲突

逻辑冲突是指数据出错(包括存储数据或是查询返回的数据)。尽管错误并不必需由外部返回,将一列更新为空后还想操作表中的行,或使用不同的类型优化器时一条查询返回不同的结果等都是逻辑冲突的例子。因为很难检测出,所以逻辑冲突的危害性非常大,数据库管理员采取的标准诊断操作有:  创建可再现检测的案例。

 如果冲突是一个内部错误(如,O R A - 6 0 0 [ 1 3 0 0 4 ]错误),收集

跟踪文件(并在应用时格式化)。  决定问题的类属或确定端口。 3.4.3.3. 系统挂起

系统挂起是指用户无法注册到数据库或执行操作,也可能是指介质恢复或崩溃恢复后在数据库一直打开时数据库挂起。比如,一个进程具有某数据结构的latch,微调可能引起系统挂起。系统挂起时的标准诊断操作如下:

 在数据库打开的情况下挂起时,设置事件并诊断是在哪一恢复阶段引起了数

据库阻塞,同时转储诊断信息(如,进行事务恢复期间u n d o段段头的微调)。如果是一个系统挂起的情况,使用诸如O R A D B X的工具或者A LTER SESSION命令在适当的间隔对系统状态转储。还要监测C P U和后台、前台进程的I / O活动。

 决定问题的类属或指定端口。  创建可再现检测的案例。

 如果问题仅在某个用户处经常出现,可通过调制解调器网络拨号方式与O S S

联系寻求帮助 3.4.3.4. 性能问题

性能问题能分成两类。一类是在响应时间或批处理时间性能的恶化,另一种是并发处理活动的增加引起的性能降低。这些问题解决起来通常很费时,需要耐心。响应时间慢有时可能是由于等待库高速缓存芯片。标准诊断操作包括:  以专门指定的形式报告性能降低,如响应时间、批处理时间、支持的并发注

册数量,以及共享池管理的有效性等。

 如果可能,提供可再现检测案例,或提供导致性能变差的环境和因素的细节

内容。如,注册数量、内存的平均使用、典型的功能、I / O操作,以及对O R A C L E操作的动态统计等。

 如果问题仅在某个用户处经常出现,可通过调制解调器网络拨号方式与O S S

联系寻求帮助。

 决定问题的类属或确定端口。

长沙天辰科技有限公司

47

ORACLE操作手册

3.4.3.5. 系统崩溃

系统崩溃包括由于一后台进程死掉而引起的数据库崩溃。这类问题不常见,但如果是数据库崩溃, D B A应采取以下诊断操作:

 检查警告日志文件,查看是否有O R A - 6 0 0错误出现,如果是,需要的

话获取跟踪文件并将其格式化。

 找到用户在出现问题时正在执行的操作以及正在执行的应用程序。如果可以

找出该程序,则试着在实验机上运行,以发现问题。 决定问题的类属或确定端口。 3.4.3.6. 临界功能非法

临界功能非法是指,数据库所有功能或依赖一个大应用程序的重要特征失效。最典型的是由数据库软件中的一个b u g,或运行于O r a c l e顶层的任何第三方软件引起的。符合此类情况的一些例子有O r a c l e实用工具内核出错或应用程序的出错。在某种情况下,一个功能不可用,可能会间接影响数据库的可用性。如,一个数据库正用一个完全数据库导出文件进行恢复,并且是从几个工作不正常的磁带上导入,这就使数据库无法从产品库上重建。标准诊断操作有:  收集跟踪文件,依赖错误类转储相关的重做日志文件(在O S S指导下),并

报告产生错误的环境。

 试着创建一个可再现检测的案例。

 提供具体内容,如使用的应用工具、存取的存储结构、实施的D D L / D M L

和在错误发生期间运行的包或过程,尤其是在无法提供一个可再现检测案例时,这些信息尤其重要。  决定问题的类属或确定端口。 3.4.3.7. 内存冲突

内存冲突包括标记内存泄漏的内部错误、内存数据结构冲突和高速缓存冲突。诊断操作包括:

 收集产生的跟踪文件。

 如果可能提供一个可再现测试案例,或报告可能引起错误的环境,如下所述:  OCI 细节或O r a c l e工具/实用程序,以及应用程序使用的预编译器。  操作系统工具或用于连接应用的第三方工具。  应用程序触发的触发器。  执行的包或过程。

3.5. 常见问题

这一部分是用户的提问和解答,涵盖了数据库管理的方方面面,其中包括Oracle 8的一般性应用问题、用户管理、空间管理、备份和恢复以及装载/卸出实用程序等。

问:若想指定一组用户对某个特定应用具有相同的对象权限,是否有不通过对用户重复G r a n t命令就可以做到的一些方法?

答:确保一组用户对一组对象具有相同的权限的最便捷方法是创建适当的角色,

长沙天辰科技有限公司

48

ORACLE操作手册

并给这些角色指定新用户。下面介绍的例子实现读取用户S C O T T拥有的E M P表:

SQL> connect system/manager; Connected.

SQL> create role empread; Role Created.

SQL> connect scott/tiger; Connected.

SQL> grant select on emp to empread; Grant Succeded.

SQL> connect system/manager; Connected.

SQL> grant empread to aa; Grant Succeded.

上面的例子,创建了一个数据库管理员的角色来说明系统范围的权限。当然对用户S C O T T,也能创建和维护这个E M P R E A D角色,如下面所示:

SQL> connect scott/tiger; Connected.

SQL> create role empread; Role Created.

SQL> grant select on emp to empread; Grant succeded.

SQL> grant empread to aa; Grant Succeded.

问:试图向一个已经存在的表插入一些记录,但得到O R A - 1 6 5 3错误提示“unable to extend table t a b l e in t a b l e s p a c e _ n a m e(不能在t a b l e s p a c e _ n a m e的表空间扩展t a b l e n a m e的表)”,请问错在哪?

答:当表空间没有空间使新的区域用于增加表时,会出现这样的错误。解决这个问题就必须向表空间添加新的数据文件。认真记住错误提示中的表空间的名字,然后使用A LT E R TA B L E S PA C E命令为该表空间分配一个新的数据文件。 SQL> alter tablespace add datafile

2 size ;

确保上述命令中指定的文件包含完整的路径。或者使用命令A LTER DATABASE DATA F I L E name AUTOEXTEND ON动态分配空间。

问:由于数据库事务增加,已经用C R E ATE ROLLBACK SEGMENT命令添加了新的回滚段,但用户依旧不能正确使用D M L命令。我想是回滚段资源竞争导致的。请问错是哪儿?

答:用户需要确保加入回滚段的表空间联机。 SQL> connect system/manager; Connected.

SQL> select segment_name,status from dba_rollback_segs; SEGMENT_NAME STATUS

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

长沙天辰科技有限公司

49

ORACLE操作手册

SYSTEM ONLINE R01 OFFLINE R02 ONLINE .......................... .......................... .......................... R15 ONLINE 16行已选择.

使用A LTER ROLLBACK SEGMENT命令使回滚段联机。 SQL> alter rollback segment r01 online; Rollback Segment Altered.

也可以将最新创建的回滚段加入i n i t . o r a文件中的初始化参数R O L L B A C K _ S E G M E N T中,这样能永久保留。

rollback_segment = (r01,r02,.....,r15)

问:我已经向一个新的工作组加入了许多新用户,现在想为这些用户的对象设计一个固定的表空间和临时段。请问怎么做?

答:可以使用A LTER USER命令,为用户创建的对象赋予缺省表空间,还可为临时段赋予一个表空间。

SQL> alter user default tablespace temporary

2 ;

可以通过查询D B A _ U S E R S视图,以确定当前分配的表空间: SQL> select username,defalut_tablespace,temporary_tablespace 2 from dba_users;

USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ------------- -------------------- --------------------- BILL DATA_BILL TEMP TRANS DATA_BILL TEMP SYS SYSTEM TEMP SYSTEM TOOLS SYSTEM

问:我用C R E ATE USER命令创建了一个新的O r a c l e数据库,也分配了适当的缺省表空间和临时表空间,而用户依旧不能登录。为什么?

答:这很可能是用户无创建会话的权限,而造成登录失败。在用户连接ORACLE前,应使用G r a n t命令授予用户C R E ATE SESSION权限。 SQL> grant connect to ; Grant Succeded.

问:我不能修改数据库中的一些数据文件。当我想运行u p d a t e命令后数据库就挂起,问题在哪?

答: 可能用户试图修改一组被其他事务加锁的数据。确认没有来自尚未结束事务中的O r a c l e会话,而且在进行新事务前必须用C O M M I T或R O L L B A C K命令结束当前事务。当使用相同O r a c l e用户名而从不同窗口中打开与O r a c l e的多个会话时,或当使用S Q L语句,如L O C K和SELECT FOR UPDAT E等,以E X P L I C I T方式锁定对象时,都会出错,这种情况相当普遍。

问:我在检查警告日志文件时,注意到有很多入口都提示:“Thread 1 cannot

长沙天辰科技有限公司

50

ORACLE操作手册

allocate new log sequence number(线程1不能分配新的日志序列号)”或类似信息。应当如何做?

答:遇到的这种情况可能是用户正等待可用的重做日志组。试着增加一两个或更多的重作日志组到数据库,也可以用A LTER DATABASE ADD LOGFILE命令完成。 问:有5 0个用户的一个组准备在下午访问数据库,但我没有使用Multi-Threaded Server(多线程服务器)选项,该怎么做?

答:必须保证在i n i t . o r a文件中的参数P R O C E S S E S的设置正确,这个参数指定操作系统的用户进程可以同时连接数据库的最大数。确保在计算进程数量时加上后台进程。

问:我想访问一并行度定义成8的表,但不能完成,为什么?

答:确保i n i t . o r a文件中初始化参数PA R A L L E L _ M A X _ S E RV E R S的设置正确。

问:我有一些用户正在编写新的P L / S Q L应用程序。开始运行程序前,想增加共享池的大小,请问该怎么做?

答:增加i n i t . o r a中的初始化参数S H A R E D _ P O O L _ S I Z E,该参数是以字节为单位的共享池的大小。

问:我想添加一个新的数据文件,但一直有问题。我认为是超出了MAXDATAFILES的指定值。应当如何修改这个参数?

答:M A X D ATA F I L E S不是i n i t . o r a中的参数,数据库创建时所有M A X参数都被设置好了。要了解已创建的数据库所设置的有关参数,使用下面的命令:

SVRMGR> alter database backup controlfile to trace;

这条命令生成一个S Q L脚本文件,其中包含一些数据库命令。该文件的部分内容如下:

CREATE CONTROLFILE REUSE DATABASE “8.1.7” NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 4 MAXDATAFILES 30 MAXINSTANCES 2 MAXLOGHISTORY 100 LOGFILE

GROUP 1 ‘/home/OraHome/data/8.1.7/redo01.log SIZE 1024K, GROUP 2 ‘/home/OraHome/data/8.1.7/redo01.log SIZE 1024K, GROUP 3 ‘/home/OraHome/data/8.1.7/redo01.log SIZE 1024K DATAFILE

‘/home/OraHome/data/8.1.7/system01.dbf’ SIZE 4096K, ‘/home/OraHome/data/8.1.7/data_bill01.dbf’ SIZE 4096K, ‘/home/OraHome/data/8.1.7/ data_bill02.dbf’ SIZE 4096K, ‘/home/OraHome/data/8.1.7/rbs01.dbf’ SIZE 4096K, ‘/home/OraHome/data/8.1.7/rbs02.dbf’ SIZE 4096K, ‘/home/OraHome/data/8.1.7/temp.dbf’ SIZE 4096K ............................ ........................... ............................

长沙天辰科技有限公司

51

ORACLE操作手册

从上面的文件可以看到数据库中M A X参数值是多少。能修改这些参数的唯一方法是重新创建数据库,或重新创建控制文件。显然,前者有些不太可能,因而建议用后者。C R E AT E C O N T R O L F I L E命令用于重建控制文件,创建新的控制文件时要使用新的M A X参数值。

问:我想在A R C H I V E L O G模式下运行自己的数据库,所以我退出了自己的数据库,装载它,并将数据库设置在A R C H I V E L O G模式下。几个小时后,用户开始呼叫,说该数据库被挂起。为什么发生这种现象,该如何应付? 答:切换数据库到A R C H I V E L O G模式下需要两步。完成了第一步后,必须激活自动归档,否则,O r a c l e会以为要人工归档。激活自动归档后才能创建新的重作日志。

问:使用A LTER DATABASE CREATE DATA F I L E命令时应该采取什么措施? 答:确保当前有一个能识别正在创建的数据文件的控制文件。如果正在使用备份控制文件,确保在数据文件创建后这个控制文件被备份过。换言之,添加新数据文件后,总要备份控制文件。 问:C AT E X P. S Q L是什么?

答:E x p o r t为数据库中所有对象生成S Q L语句。为了做到这一点, E x p o r t必须查询数据字典,找到关于每个对象的所有相关信息。因为许多信息遍布于多个数据库字典中, E x p o r t使用定义在C AT E X P. S Q L中的视图获取它所需要的信息。C AT E X P. S Q L的每个类别对象至少有一个视图(如,E X U 7 T B S列出所有表空间, E X U 7 R O L列出所有角色等)。在7 . 1版之前,该文件叫做E X P V E W. S Q L。

问:当运行E x p o r t时得到一个错误O R A - 9 4 2,这是何意?

答: O R A - 9 4 2是指装载的表或视图不存在。这可能是C AT E X P. S Q L还没有运行以安装E x p o r t视图。如果C AT E X P. S Q L已经运行,则可能是使用了错误的版本。请看下面相关的问题。

问:也需要在I m p o r t中运行C AT E X P. S Q L吗?

答:是的。I m p o r t和E x p o r t共享一些视图,而且这些视图是通过运行C AT E X P. S Q L装载的。因为它们是相同的视图,所以不生成单独的C AT E X P. S Q L。至于O r a c l e 7 . 2版,几个相同的视图已被移到C AT E X P. S Q L脚本的头部,这样对于只使用I m p o r t的用户,不必在整个范围运行 C AT E X P. S Q L,就能将脚本文件中的非I m p o r t成分移到一个单独的脚本文件。

问:运行C AT E X P. S Q L前需要运行C ATA L O G . S Q L吗?

答:不用,虽然C AT E X P. S Q L在C ATA L O G . S Q L中调用,但是C AT E X P. S Q L中的视图不依

赖于定义在C ATA L O G . S Q L中的视图, C AT E X P. S Q L视图建立在S Y S所属的表基础上(这些对象主要定义在S Q L . B S Q ),因而可以独自运行。 问:谁应当拥有C AT E X P. S Q L中的视图?

答:S Y S用户应当拥有它们,这在脚本文件头中作了说明。 问:找不到可执行的E x p o r t / I m p o r t,怎么办?

答:可执行的是e x p和i m p。如果它们不存在,可以人工创建。它们应当与O r a c l e可执行程序放在同一目录里。例如,在U N I X系统,它们应当在$ O R A C L E _ H O M E / b i n目录下。请参考与系统平台有关的文档,以获取更多的信息。

长沙天辰科技有限公司

52

ORACLE操作手册

问:使用E x p o r t / I m p o r t时应考虑哪些兼容性问题系统?

答:因为E x p o r t / I m p o r t是用户端(客户端)实用工具,使用的版本可能与数据库版本不同。假设数据库版本( E x p o r t版本也是如此)是X和Y,而且Y > X,则涉及以下4个问题:

 使用X版本的E x p o r t从数据库X导出,使用X版本的I m p o r t导入数

据库X,应该是可行的。这是所有版本都相同的、最简单的一种情况,被称为基本兼容。

 使用X版本的E x p o r t从数据库X导出,使用Y版本的I m p o r t导入数

据库X,应该是可行的。这是向上兼容。

 使用Y版本的E x p o r t从数据库Y导出,使用X版本的I m p o r t导入数

据库X,应该是可行的。这是向下兼容。

 在双任务连接上(如Net 8)使用X版本的E x p o r t从数据库Y导出,并导入

数据库X或Y (使用适当的I m p o r t工具),应该是可行的。这是交叉兼容。

必须总是保持向上兼容,而且也尽量在主要版本中保持向下兼容。

交叉兼容较难保持,因为视图可能与E x p o r t代码不同步。例如,如果使用Export Y操作数据库X,则Export Y可能希望有一个新视图或一个附加列,但已经运行于数据库上的C AT E X P.S Q L脚本文件与数据库X相符,并且是较早的一个版本(该较早版本很可能是用于Export X的脚本文件)。解决办法是建立用户自己的E x p o r t应用,例如,视图的修改至少与可执行的修改相匹配。

一定要不断完善脚本文件。即使视图或视图的列是多余的,也不能删除,这样,旧的E x p o r t修改版依旧能工作。 问:装载如何处理字集约定?

答:假设导出数据库用字符集A生成,而E x p o r t会话在字符集B中。结果,就有一个从A到B的数据转换,它由双任务层来完成。导出文件中的数据现在在字符集B中。然后文件被传送到要导入该文件的另一台机器中。假设I m p o r t会话在字符集C中,注意导出文件中的数据依旧在字符集B,目的数据库在字符集D。从C到D的转换是由双任务层完成的,然而从B到C的转换必须由I m p o r t完成。

下面是一些值得注意的要点:

 字符集B和C的比率必须是1。如果B和C的比率为n,是指字符集C中的字符长

度大约是源字符集B中相同串长度的n倍。希望比率为1,是因为当前内存管理模式用于I m p o r t端,将来在这一点会发生改变。通过I m p o r t,字符串从B转换到C,并由双任务层转换到字符集D。

 并非B和C间的所有字符都可转换,这取决于数据相关,是用户的责任。  执行导出时,任何存储在数据库A中的特殊字符必须在字符集B中捕获(对于

卸出文件),否则用户会丢失信息。

 如果用户很关注这一点,请注意以下说明:

1) 当C R E ATE DATA B A S E用于源数据库时,数据库字符编码就被指定了。

2) 当插入数据时,客户端字符编码以N L S _ L A N G方式指定。

3) 当导出数据时,客户端字符编码完成,并且应当能够捕获想要的所有特殊字符。

4) 当为目标数据库执行C R E ATE DATA B A S E时,数据库字符编码被指

长沙天辰科技有限公司

53

ORACLE操作手册

定。

5) 当数据被装载时,客户端字符编码完成。 问:我不能完成字符集B到C的转换,怎么办?

答:为I m p o r t会话将N L S _ L A N G设置为字符集B,在此处,即B = C就可以了。

问:什么是C H A R S E T选项?

答:C H A R S E T选项是让用户指定导出文件的字符集。现在假设是字符集B。然而,用户有时想指定不同的字符集(如E )。因为导出文件依旧是字符集B,从理论上讲要有一个从B到E的转换,接着从E到C,在这个过程中数据可能会丢失。当前C H A R S E T只能设定成B。将来可能会有改善。

问:想在导入时以新的数据替换现存的数据,能直接进行吗?

答:不行。I m p o r t不像S Q L * L o a d e r那样具有替换的选项,必须首先人工删除所有记录(行)。

问:为什么属于S Y S的对象不能被导出?

答:用户可以S Y S身份连接数据库,并创建任何对象,同时, S Y S也拥有自己的字典表,如O B J $、U S E R $等,S Y S还拥有分类视图和其他的字典对象。导出S Y S将涉及寻找除字典对象之外的所有对象,这是因为新的数据库已经有了自己的字典表。也可以将字典表一同导出,但导出作为新的字典对象的建立所花费的代价极为巨大,因此,S Y S并不导出其字典表。此外,用户不得以SYS身份进行任何其他操作。D B A应该为其创建自己的帐户,让他们在他们自己的帐户内创建对象。D B A应当是一个功能相当强的帐户,最好不要轻易使用。 问:S Y S对象上的授权可以导出吗? 答:不行,理由同上。

问:S Y S和S Y S T E M的口令可以导出吗?其他用户的呢?

答:可以,这两个用户的口令可以修改,以与导出文件中的值相匹配。如果用户忘记了口令,D B A可以解开口令,方法是以I N T E R N A L身份连接。其他用户的口令不能修改。

问:口令能在导出文件中看到吗?

答:不能,这些口令是加密的,但这些口令可以移植,以便在其他数据库上使用。 问:在并行处理中,通过把用户导出进行捆绑,能执行一个完整的导出吗? 答:用户级的导出只包括指定用户或一组用户拥有的对象。一个完整的导出包括的信息有其他字典对象,如表空间、配置文件、角色、审核等。这些对象在用户导出中不能显现。所以,理论上说用户导出的集合不等于一个完整的导出。然而有一些可用于导出用户,因为这样做可在并行中节约时间。用户应保留一个额外的完整卸出(没有记录)以重建其他的对象.

问:其他数据库还在使用时, E x p o r t与I m p o r t能在同一时间运行吗? 答:可以。E x p o r t情况下,每个表的快照时间是不同的(除非应用了C O N S I S T E N T = Y )。I m p o r t情况下,在每个表(隐式运行下一个S Q L语句)后,都提交表数据。外部码关系直到所有表导入后才能建立。与这些关系有关的应用程序,直到导入完成时才能正常运行。 问:I m p o r t的参照完整性是什么? 答: 所有外部键关系是在所有表已经导入后建立的。其他限制如CHECK和PRIMARY

KEY在特定的表数据已经被导入后建立。

问:我正在将数据库导入到一个存在的表中。这个表有索引、触发器,为什么导

长沙天辰科技有限公司

54

ORACLE操作手册

入不能使它们加速插入的过程?

答:用户在一个表上可能有多个触发器和限制,并且用户可能出于其他原因使其中的一些选择不可用。结果,导入将必须保持与那些可用的和不可用的联络,并且在随后重建。因为限制和触发器增强商业规则,其控制方式留给用户确定。 问:I m p o r t如何压缩区域空间?如果表被压缩, N E X T区域用多大?使用C O M P R E S S选项的好处和坏处是什么?

答:实际上, I m p o r t不压缩任何区域而E x p o r t压缩。当指定C O M P R E S S = Y时,E x p o r t通过将所有分配的区域累加,决定表的当前大小,并且,在导出文件的C R E ATE TA B L E语句中设置初始区域,N E X T的值是第二个区域的实际大小,这将阻止导出后压缩表不断增长,以防失去控制。

应当指出的是,如果表在导出时间较长并且指定后C O M P R E S S = Y,则因为初始区域太大,import可能不能生成表,解决的办法是,在运行import前,以较小的初始区域预先创建表。 问:如何整理一个表?

答:整理的目的是回收由于碎片而丢失的空间。步骤如下:

1) 以C O M P R E S S = Y方式导出表,这将把初始区域设置为表的大小。 2) 删除这个表(为了安全起见最好先对数据库备份)。 3) 导入这个表,这将把表内的所有内容放入一个区域。

如果执行一个用户级的导出,则所有不属于用户的索引将不被导出。当表被删除时这些索引也将被删除。大的表可能由于删除一些大的数据而较空。这种情况下,在I m p o r t前,使用小的初始区域预先建立表。

问:当导出存储过程、包和包体时,得到的文本在哪里? 答:可从S O U R C E $中得到文本并可以卸出。

问:我有一些打包的存储过程,与其有关的文本也从S O U R C E $中得到吗? 答:是的。打包的模式是可移植的,所以没有问题。

问:导出包和过程后,有时发现有些是无效的。这是问题吗?

答:不是。因为过程可能是互相关联的,一个过程在其相关过程已经生成前可能已经生成。当这些对象被使用时就会生效。

问:我正在导出整个数据库。在导出工具还没导出前,有人删除了一个表。这可能吗?

答:可能。在会话开始时,导出工具并不对所有表加锁,导出工具是在会话开始时做一个所有表的列表,所以有可能在导出生成一个列表这段时间和表被导出这段时间之间,这个表被删除。导出将跨过这个表并继续工作。这需要用户警惕。 问:我有一个只读的表空间。一个导出/导入循环后,表空间还将是只读的吗? 答:目前不是,这个表将是可读/写的。其原因是在表数据被导入前生成了表空间。如果生成的表空间是只读的,那么表数据不能被导入。也可以选择导入数据,随后自动地使表空间只读,但也可能由用户预先生成表空间,并不希望它变成只读的。这个决定自然由用户自己决定。

问:当前有一个脱机表空间,导出工具会提取表空间里的数据吗?一个导入/导出循环后,表空间会依然脱机吗? 答:都不会。

问: 我导出了整个数据库并准备进行整个数据库的导入,是否该提前生成一组特殊对

答:是的。需要预生成表空间和回滚段,以便将其放在适当的地方。如果整个导

长沙天辰科技有限公司

55

ORACLE操作手册

出来自不同的操作系统(像O p e n V M X到U N I X ),这尤为重要。即使不需要,最好也预生成那些用户,他们的属性往往都不同,如缺省表空间、临时表空间。用S H O W = Y装载时会显示导出文件中的当前命令。

问:想产生一个S Q L脚本文件,其导出文件中含有所有D D L。能做到吗? 答:可以做到,但不是直接生成。在导入时使用S H O W = Y选项,便可提供一个将运行的所有语句的列表。使用L O G选项,该列表被放入日志文件。这个日志文件能进行人工编辑,或通过适当的操作系统工具(在U N I X上使用S E D或AW K就够了)把它重新格式化成S Q L脚本文件。将来会有一个直接的选项来完成这项工作。

问:如何决定一个导入/导出循环后哪些对象已经被分析了,哪些还没有?

答:当决定哪个A N A LY Z E语句写入输出文件时,有一个三级结构:聚簇、表、索引。

下面是导出使用的算法描述:

• 如果分析了聚簇, A N A LY Z E语句就不会产生用于聚簇中的表或索引。因为它们将自动被分析。

• 如果聚簇没被分析,而只是某些表被分析,那么只有那些A N A LYZE TA B L E语句被写入每个表的文件。用于分析表的索引将自动分析,这样就没有A N A LYZE INDEX语句写入文件。

• 可能聚簇表上有一个索引而聚簇和表都没被分析。在这种情况下,如果索引被分析,则A N A LYZE INDEX语句被写入导出文件。

 参考书籍:

1.ORACLE 8i PL/SQL高级编程 2.ORACLE 8 优化技术 3.ORACLE 8 性能优化

4.ORACLE Applications性能调整手册 5.ORACLE DBA 参考手册 6.ORACLE 备份手册

7.ORACLE 故障分析手册

长沙天辰科技有限公司

56

Top