如何进行 Oracle 数据库维护

1. ORACLE 数据库启动与关闭

1.1 打开和关闭数据库 (手工)

1.1.1 sqlplus 连接

#su - oracle

#sqlplus /nolog

1.1.2 打开数据库

sql> connect sys/oracle as sysdba;

sql> startup [nomount|mount]

等待十几秒左右,当看到

oracle instances started,

database mounted,

database opened 的时候,oracle 数据库打开成功

备注:打开数据库 startup 可带三个参数,分别是

SQL > startup nomount 仅启动 instances

SQL > startup mount 启动 instances,连上(mount)数据库

SQL > startup normal 启动 instances,连上(mount)数据库(推荐)

打开(open)数据库

startup 缺省参数是 normal

1.1.3 启动 oracle listener

#su - oracle

#lsnrctl start

如果出错检查环境变量是否设好,及 lsnrctl 文件的内容和执行属性。

1.1.4 关闭 oracle listener

#su - oracle

#lsnrctl stop

1.1.5 关闭数据库

sql> connect sys/oracle as sysdba;

sql> shutdown 关闭数据库(推荐)

等待几秒左右,当看到

database closed

database dismounted

oracle instances shut down 的时候,oracle 数据库关闭成功

备注:关闭数据库 shutdown可带三个参数,分别是

shutdown 缺省参数是 normal

2. 数据库备份

2.1 冷备份

关闭数据库时作的备份称为冷备份。

关闭数据库,将所有和本实例有关的文件,包括datafile,controlfile,redolog,archived redolog,initora.ora 等全部备份。恢复时只要将这些文件放回从前的目录,startup数据库即可。

数据库处于归档非归档状态均可。

2.2 用 exp、imp 命令做逻辑备份

EXP:

有三种主要的方式(完全、用户、表)

1、完全:

exp system/manager buffer=64000 file=/backup/full.dmp full=y

如果要执行完全导出,必须具有角色 EXP_FULL_DATABASE 。

2、用户模式:

exp system/manager buffer=64000 file=/backup/bill.dmp owner=bill

这样用户 bill 的所有对象被输出到文件中。

3、表模式:

exp system/manager buffer=64000 file=/backup/area.dmp owner=bill tables=area

这样用户 bill 的表 area 就被导出到文件中。

需要注意的参数是 Inctype,这个参数可以取一下三个值:

Complete(全备份):把数据库中所有数据对象导出到 dump 文件中,只有具有 Exp_full_database 的用户有使用这个参数的权限。

Incremental(增量备份):把数据库中所有上次备份后修改的表备份出来。

Cumulative(累计备份):把数据库中所有全备份或者累计备份以后修改的表备份出来。

IMP:

具有三种模式(完全、用户、表)

1、完全:

imp system/manager buffer=64000 file=/backup/full.dmp full=y

如果要执行完全导入,必须具有角色 IMP_FULL_DATABASE 。

2、用户模式:

imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill

touser=billbak

文件中用户 bill 的所有对象被导入到用户billbakK 中。必须指定 fromuser、touser 参数。

3、表模式:

imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill

touser=billbak tables=area

文件中用户 bill 的表 area 就被导入到用户 billbak 中。

2.3 用 tar 命令做物理备份

1、#su - oracle

2、% tar cvf /dev/rmt0 .

把 oracle 路径下所有文件备份到磁带机上

3、% tar xvf /dev/rmt0

把备份磁带上所有文件恢复进 oracle 当前路径

4、% tar tvf /dev/rmt/0

查看磁带上有些什么文件

2.4 备份控制文件

控制文件是 Oracle 数据库中非常重要的文件。它记录着 oracle 数据库的物理结构信息,比如数据文件,日值文件的数量和位置等。在数据库启动过程中,需要读取控制文件。如果控制文件损坏或丢失,数据库就无法启动。因此,做好控制文件的备份十分重要。一般的数据库配置都会有多个控制文件。这些控制文件是完全相同的,分别存放在不同的位置(最好在不同的磁盘上),他们之间互为备份。数据库启动过程中,必须保证所有控制文件都是一致的,否则数据库不能启动。在 oracle 数据库的参数文件(initSid.ora)中指定控制文件的位置。如果部分控制文件损坏,可以在参数文件中去掉相应的控制文件,即可启动数据库。

每次数据库物理结构发生改变时,必须及时备份控制文件。

$sqlplus

SQL>connect internal

SQL>alter database backup controlfile to /…/test.ctl ;

也可以把控制文件备份成脚本,在必要的时候重建控制文件

SQL>alter database backup controlfile to trace;

2.5 联机全备份+日志备份

2.5.1 设置

ORACLE 数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复所有已提交的事物;二是不归档方式(NOARCHIVELOG),恢复数据库到最近的回收点。这两种方式将对备份方法产生较大的影响。

1.改变不归档方式为为归档方式

2.关闭数据库,备份已有的数据

3.改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。

4.启动 Instance ,Mount 数据库但不打开数据库,来改变归档方式

#sqlplus

sql>connect internal

sql>startup mount

sql>alter database archivelog;

5.使能自动存档

在初始化文件 init*.ora(一般放 ORACLE 根目录的下层目录 dbs 下)加参数:

log_archive_start=true

6.指定存档的重做登录文件名和存放的位置

同样是在初始化文件 init*.ora 中加入下面的参数:

log_archive_format=%S.arc

log_archive_dest=/arch12/arch (arch12 是日志文件存放的目录)

7.关闭数据库,重新启动数据库,归档方式转换完成。

8.可用 archive log list 查看状态,去除归档日志功能的命令为 alter database

noarchivelog。

2.5.2 步骤

联机全备份:

数据库处于 open 状态,依次对各个表空间备份

sqlplus "/ as sysdba"

SQL>alter tablespace system begin backup;

复制此 tablespace 各个 datafile

SQL>alter tablespace system end backup;

注意:begin backup 是对 tablespace 冻结写入,end backup 是解除冻结,因此复制 datafile 的过程不宜过长

备份 controlfile

SQL>alter database backup controlfile to ……. ;

日志备份:

sqlplus "/ as sysdba"

SQL>alter system archive log stop;

移去日志目录下的所有 archived redolog

SQL>alter system archive log start;

2.5.3 恢复

数据库处于 shutdown 状态

2.5.3.1 磁盘全部损坏,仅保存上次联机全备份和每天日志备份

这是最坏情况

解决硬件故障,配置系统软件及环境

oracle 用户,将全备份和日志备份转移至相应目录,根据 initSid.ora中 controlfile 的配置,将备份控制文件复制到响应目录下

sqlplus "/ as sysdba"

SQL>startup mount

SQL>recover database until cancel using backup controlfile;

逐个确认待恢复的 archived redolog,待最后一个完成后,键入 cancel,使恢复结束

SQL>alter database open resetlogs;

注意:由于日志已经重置,所以应尽快做一次联机全备份

2.5.3.2 丢失某数据文件

只要将此文件从上次联机全备份中复制至其目录,并将自上次联机全备份以来所有日志备份移至归档目录

sqlplus "/ as sysdba"

SQL>startup mount

SQL>alter database recover datafile path/file ;或者简单些 recover database;

SQL>alter database open;

2.5.3.3 文件损坏或丢失,又无备份,

这种情况只能将此文件脱机,将数据 exp 出来,重建表空间,再 imp 进去

sqlplus "/ as sysdba"

SQL>connect internal

SQL>startup mount

SQL>alter database datafile path/file offline;

SQL>alter database open;

2.5.4 注意要点

无论有多少把握,恢复前先做冷备份,此为第一原则。不这样做,便是无路可退,一旦失误,后果十分严重。

1.rollback 段损坏

这是非常严重的问题,可在 initora.ora 中写入_corrupted_rollback_segments=(rxx),启动时避开损坏的 rollback段,这只是权宜之计。如数据库处于 archivelog,应从上一次全备份起利用备份的日志进行恢复;如数据库处于 noarchivelog,应尽快将全部数据 export 出来,重建数据库,再 import 进去。所有操作之前,应做冷备份。

2.数据库异常中止处理

通过手工 shutdown abort 操作中止数据库,不会产生大的问题,通常直接 startup无需使用介质恢复命令

如果由于机器崩溃引起的中止,则情况严重得多,有可能要使用到上面提到的恢复方法,不过这种现象并不多见。一般需要显式使用介质恢复命令,如下:

sqlplus "/ as sysdba"

SQL>startup mount;

SQL>recover database;

SQL>alter database open;

3. 数据库的扩充

3.1 增加一个表空间

3.1.1 创建表空间

命令示例:

针对具体情况增加回滚和临时表空间

命令示例:

回滚和临时表空间用完后,可删除或使它 offline

SQL>drop tablespace rbs8;

SQL>drop tablespaces billtemp;

SQL>alter tablespace rbs offline;

SQL>alter tablespace billtemp offline;

3.1.2 增加某个表空间的大小

当一个表空间的大小不能满足工作需要时,应该扩充表空间。

举例:

SQL>alter tablespace system

add datafile /usr/oracle/dbs/sys338.dbf size 3M;

3.2 增加 oracle 的用户,并给用户授权

3.2.1 增加 oracle 的用户,并给用户授权

举例:

SQL>create user newuser identified by userpasswd

default tablespace application

temporary tablespace billtemp;

SQL>grant connect to newuser;

SQL>grant resource to newuser;

SQL>grant update on emp to newuser;

3.2.2 增加 oracle 的角色

oracle 的缺省角色有 connect、resource、dba。它是一组可以分配给其它 role 或用户的权限总和,connect 有 8 个权限,resource 有 5 个权限,dba 有 77 个权限。给一般连接用户赋 connect,给一般编程人员赋 connect加 resource,只有数据库管理员才有 dba的权限。

①创建一个角色

SQL>create role newrole identified by rolepasswd;

②给角色赋权限

SQL>grant select on all table to newrolle;

SQL>grant connect to newrole with admin option;

3.2.3 中断用户同 oracle 的连接

当 oracle 数据库要关机或某个用户占有的大量的资源需要被释放时,dba 需中断用户同 oracle 的连接。

①、SQL>select sid,serial#,username from v$session;

②、SQL>alter system kill session interger1,interger2 ;

interger1,interger2 分别对应于 sid 和 serial#

3.3 表、视图、索引、约束

Oracle 数据库数据对象中最基本的是表和视图,其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作。

3.3.1 表和视图

Oracle 中表是数据存储的基本结构。ORACLE8 引入了分区表和对象表,ORACLE8i 引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。

3.3.1.1 管理表

3.3.1.1.1 建立表

表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用 CREATE TABLE 语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如:

这样我们就建立了一个名为 products 的表, 关键词 CREATE TABLE 后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。

在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是 NOT NULL,关于约束的讨论我们在以后进行。

在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为 null 时,oracle 即认为该值为缺省值。

下列数据字典视图提供表和表的列的信息:

. DBA_TABLES

. DBA_ALL_TABLES

. USER_TABLES

. USER_ALL_TABLES

. ALL_TABLES

. ALL_ALL_TABLES

. DBA_TAB_COLUMNS

. USER_TAB_COLUMNS

. ALL_TAB_COLUMNS

3.3.1.1.2 表的命名规则

表名标识一个表,所以应尽可能在表名中描述表,oracle 中表名或列名最长可以达 30 个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。

3.3.1.1.3 从其它表中建立表

可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在 CREATE TABLE 语句中使用关键字 AS,例如:

SQL>CREATE TABLE emp AS SELECT * FROM employee

TABLE CREATED

SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2

需要注意的是如果查询涉及 LONG 数据类型,那么 CREATE TABLE....AS SELECT....将不会工作。

3.3.1.1.4 更改表定义

在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE 使用ALTER TABLE 语句来更改表的定义

3.3.1.1.4.1 增加列

语法:ALTER TABLE [schema.] table_name ADD column_definition

例:

ALTER TABLE orders ADD order_date DATE;

对于已经存在的数据行,新列的值将是 NULL.

3.3.1.1.4.2 更改列

语法:

ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;

例:

ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));

这个例子中我们修改了表 orders, 将 STATUS 列的长度增加到 15,将 QUANTITY 列减小到 10,3;

修改列的规则如下:

可以增加字符串数据类型的列的长度,数字数据类型列的精度。

减少列的长度时,该列应该不包含任何值,所有数据行都为 NULL

改变数据类型时,该列的值必须是 NULL.

对于十进制数字,可以增加或减少但不能降低他的精度。

3.3.1.1.4.3 删除数据列

优化 ORACLE 数据库,唯一的方法是删除列,重新建立数据库。在 ORACLE8i 中有很多方法删除列,你可以删除未用数据列或者可以标示该列为未用数据列然后删除。

删除数据列的语法是:

ALTER TABLE [schema.] table_name DROP [CASCADE CONSTRAINS]

要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字 CASCADE CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同时删除。

如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,标记未用数据列的语法如下:

这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都将被删除。

删除未用数据列的语句是:

ALTER TABLE [schema.] table_name DROP

3.3.1.1.4.4 删除表和更改表名

删除表非常简单,但它是一个不可逆转的行为。

语法:

DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS]

删除表后,表上的索引、触发器、权限、完整性约束也同时删除。ORACLE 不能删除视图,或其他程序单元,但 oracle 将标示他们无效。如果删除的表涉及引用主键或唯一关键字的完整性约束时,那么 DROP TABLE 语句就必须包含 CASCADE CONSTRAINTS 子串。

更改表名

RENAME 命令用于给表和其他数据库对象改名。ORACLE 系统自动将基于旧表的完整性约束、索引、权限转移到新表中。ORACLE 同时使所有基于旧表的数据库对象,比如视图、程序、函数等,为不合法。

语法:RENAME old_name TO new_name;

例:SQL> RENAME orders TO purchase_orders;

3.3.1.1.4.5 截短表

TRUNCATE 命令与 DROP 命令相似, 但他不是删除整个数据表,所以索引、完整性约束、触发器、权限等都不会被删除。缺省情况下将释放部分表和视图空间,如果用户不希望释放表空间,TRUNCATE 语句中要包含 REUSE STORAGE 子串。TRUNCATE 命令语法如下:

TRUNCATE [schema.] name

例:SQL> TRUNCATE TABLE t1;

3.3.1.2 管理视图

视图是一个或多个表中的数据的简化描述,用户可以将视图看成一个存储查询(stored query)或一个虚拟表(virtual table).查询仅仅存储在 oracle 数据字典中,实际的数据没有存放在任何其它地方,所以建立视图不用消耗其他的空间。视图也可以隐藏复杂查询,比如多表查询,但用户只能看见视图。视图可以有与他所基于表的列名不同的列名。用户可以建立限制其他用户访问的视图。

3.3.1.2.1 建立视图

CREATE VIEW 命令创建视图,定义视图的查询可以建立在一个或多个表,或其他视图上。

查询不能有 FOR UPDATE 子串,在早期的 ORACLE8i 版本中不支持 ORDER BY 子串,现在的版本中CREATE VIEW 可以拥有 ORDER BY 子串。

例:

用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新定义视图需要包含 OR REPLACE 子串。

如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个带错误的视图必须在 CREATE VIEW 语句中带上 FORCE 选项。如:CREATE FORCE VIEW

ORDER_STATUS AS

SELECT * FROM PURCHASE_ORDERS

WHERE STATUS= APPPOVE ;

warning :View create with compilation errors

这样将创建了一个名为 ORDER_STATUS 的视图,但这样的视图的状态是不合法的,如果以后状态发生变化则可以重新编译,其状态也变成合法的。

3.3.1.2.2 从视图中获得数据

从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,也可以使用 SQL 函数,以及所有 SELECT 语句的字串。

3.3.1.2.3 插入、更新、删除数据

用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典 USER_UPDATETABLE_COLUMNS 中查到。

用户在 CREATE VIEW 中可以使用了 WITH 子串。WITH READ ONLY 子串表示创建的视图是一个只读视图,不能进行更新、插入、删除操作。WITH CHECK OPTION 表示可以进行插入和更新操作,但应该满足 WHERE 子串的条件。这个条件就是创建视图 WHERE 子句的条件,比如在上面的例子中用户创建了一个视图 TOP_EMP,在这个视图中用户不能插入 salary 小于 2000 的数据行。

3.3.1.2.4 删除视图

删除视图使用DROP VIEW 命令。同时将视图定义从数据字典中删除,基于视图的权限也同时被删除,其他涉及到该视图的函数、视图、程序等都将被视为非法。

例:DROP VIEW TOP_EMP;

3.3.2 索引

索引是一种可以提高查询性能的数据结构,在这一部分我们将讨论索引如何提高查询性能的。ORACLE提供了以下几种索引:

B-Tree、哈希(hash)、位图(bitmap)等索引类型

基于原始表的索引

基于函数的索引

域(Domain)索引

实际应用中主要是 B-Tree 索引和位图索引,所以我们将集中讨论这两种索引类型。

3.3.2.1 B-Tree 索引

B-Tree 索引是最普通的索引,缺省条件下建立的索引就是这种类型的索引。B-Tree 索引可以是唯一或非唯一的,可以是单一的(基于一列)或连接的(多列)。B-Tree 索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。对于取出较小的数据 B-Tree 索引比全表检索提供了更有效的方法。但当检查的范围超过表的 10%时就不能提高取回数据的性能。正如名字所暗示的那样,B-Tree 索引是基于二元树的,由枝干块(branch block)和树叶块(leaf block)组成,枝干块包含了索引列(关键字)和另一索引的地址。树叶块包含了关键字和给表中每个匹配行的 ROWID。

3.3.2.2 位图索引

位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引可以是简单的(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。位图索引最好用于低到中群集(cardinality)列,在这些列上多位图索引可以与 AND 或 OR 操作符结合使用。

位图索引使用位图作为键值,对于表中的每一数据行位图包含了 TRUE(1)、FALSE(0)、或 NULL 值。位图索引的位图存放在 B-Tree 结构的页节点中。B-Tree结构使查找位图非常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比 B-Tree 索引要小得多。

3.3.2.3 修改索引

ALTER INDEX scott.ord_region_id_idx

ALLOCATE EXTENT (SIZE 200K

DATAFILE DISK6/indx01.dbf );重建索引对于频繁更新的表,索引会变得层次很深,效率变低。这时需要重建索引。

ALTER INDEX scott.ord_region_id_idx REBUILD

TABLESPACE indx02;

3.3.3 序列(Sequences)

Oracle 序列是一个连续的数字生成器。序列常用于人为的关键字,或给数据行排序否则数据行是无序的。像约束一样,序列只存在于数据字典中。序列号可以被设置为上升、下降,可以没有限制或重复使用直到一个限制值。

3.3.3.1 创建序列

创建序列使用SET SEQUENCE语句。

CREATE SEQUENCE [schema] sequence KEYWORD

KEYWORD 包括下面的值:

KEYWORD 描述

START WITH 定义序列生成的第一个数字,缺省为 1

INCREMENT BY 定义序列号是上升还是下降,对于一个降序的序列 INCREMENT BY 为负值

MINVALUE 定义序列可以生成的最小值,这是降序序列中的限制值。缺省情况下该值为NOMINVALUE,NOMINVALUE,对于升序为 1,对于降序为-10E26.

MAXVALUE 序列能生成的最大数字。这是升序序列中的限制值,缺省的 MAXVALUE 为NOMAXVALUE,NOMAXVALUE,对于升序为 10E26,对于降序为-1。

CYCLE 设置序列值在达到限制值以后可以重复NOCYCLE 设置序列值在达到限制值以后不能重复,这是缺省设置。当试图产MAXVALUE+1 的值时,将会产生一个异常CACHE 定义序列值占据的内存块的大小,缺省值为 20

NOCACHE 在每次序列号产生时强制数据字典更新,保证在序列值之间没有间隔当创建序列时,START WITH 值必须等于或大于 MINVALUE。

3.3.3.2 删除序列

删除序列使用DROP SEQUENCE 语句

DROP SEQUENCE sequence_name

3.4 网络管理

3.4.1 Net8 server 端配置

3.4.1.1 listener.ora 文件的样本:

3.4.1.2 启动listener

在响应的端口上设置并启动 listener

手工启动 listener:

1. >lsnrctl start

查看状态

2. >lsnrctl status

3.4.2 Net 8 client 端配置

¢Net 8 client 端常用的配置方法为 tns 方式

¢使用图形配置工具进行配置

开始->程序->Oracle->

Network Administration->Net8 Assistant.

1、选本地 -> 概要文件 加入 tnsnames

2、选本地 ->服务命名 新建一个连接串,包括主机名、端口,协议

3、选文件->保存网络配置

¢直接配置$ORACLE_HOME/network/admin/tnsnames.ora

1. 备份 tnsnames.ora

2. 按照示例对连接串做拷贝

3. 改变连接串的名字,主机名,端口,协议,SID 等参数

4. 保存文件

3.4.3 sqlnet.ora

3.4.4 网络连通性测试

sqlplus

tnsping

ping ,netstat

1. sqlplus system/manager @gis

注意:gis 是刚才设置的新的连接串

2.在客户端 >Tnsping gis,

并且检查 tnsnames.ora 中的配置是否与 server 端的$ORACLE_HOME/network/admin/listener.ora 中的配置是否一致。

1. Ping server IP 地址,查看网络连通性

3.4.5 常见 NET8 错误

故障排除是每个系统管理人员必要面对的工作。下面给出几种故障分析和排除方法。

3.4.5.1 服务器端诊断

任务 1: 数据库系统是否启动

确定数据库系统是否已启动,只要用 SQL*PLUS 登录即可:

SQLPLUS system/manager

如果收到下面信息,则数据库还不能用。

ORA-1017: invalid U/P

ORA-1034: Oracle not available

任务 2: 执行绕弯测试

为了确认 listener.ora, tnsnames.ora sqlnet.ora 文件的存在,

有效。要在服务器端

UNIX 在: $ORACLE_HOME/network/admin

Windows NT 在:ORACLE_HOME\network\admin

a. 这些文件是否在工作。

b. TNS_ADMIN 变量有效性。

使用 Net8 Assistant 进行绕弯测试:

3.4.5.2 客户端诊断

当服务器已经通过一般的 SQL*PLUS 测试和绕弯测试后,可以进行客户端的测试,步骤如下:

1. 检查所安装的协议是否与服务器端一致;

在 UNIX, 可以运行$ORACLE_HOME/bin 目录下的 adapters 来确认。结果显示:

2. 检查所有 Net8 软件在客户端已经安装。

3. 确认客户端机器$ORACLE_HOME/network/admin 目录下的 tnsnames.ora 和sqlnet.ora 文件的内容:

a. 当前的工作目录

b. TNS_ADMIN 环境变量

在 NT 中,如果 TNS_ADMIN 环境变量没有注册,就要进行注册。

c. 用 FTP, TELNET 及 PING 检查网络的连接情况。

4. 用 TNSPING 、TRCROUTE 实用程序或 Net8 Assistant进行测试 TNSPING:

tnsping net_service_name [count]

net service name: 在tnsnames.ora 或名字服务上得使用。如: NIS 或 DCE 的CDS.

count (可选): 实验次数

例 1:使用 spotdb 服务名进行测试:

tnsping spotdb

可能提示:

例 2:用 TNSPING 测试 10 次:

tnsping stprd 10

可能提示:

5. 如果连接失败,可以进行下面操作:

查找原因

用下面站点与 Oracle 联系:

与 Oracle Worldwide Support 联系

3.4.5.3 常见错误

ORA-12154: TNS:could not resolve service name

原因: 在 tnsnames.ora ,Net8 不能定位到服务器上

措施:

1. 确定 tnsnames.ora 文件存在

2. 确定不要有多个 tnsnames.ora

3.确认 tnsnames.ora 文件的服务名的正确性。

4. 确认不要有多个 sqlnet.ora

5. 如果使用域名,确认 sqlnet.ora 包含NAMES.DEFAULT_DOMAIN 参数。如果该参数不存在,必须在连接字串中指定域名。

如果没有使用域名,而 NAMES.DEFAULT_DOMAIN 参数存在,则删掉它或注释掉。

6. 如果从对话框进行连接,要带@号。

7. 启动客户端的跟踪功能,再连接。

ORA-12198: TNS:could not find path to destination

ORA-12203:TNS:unable to connect to destination

原因: 在客户端找不到目标数据库

措施:

1. 所输入的网络服务名是否正确

2. 确认 tnsnames.ora 文件中的 ADDRESS 参数是否正确

3. 确认 tnsnames.ora 文件是否在正确的目录上。

4. 确认远程监听器是否启动:输入:

lsnrctl

lsnrctl> status listener_name

listener_name 缺省 LISTENER.

如果没有启动,则启动:

lsnrctl> start listener_name

5.如果从对话框连接,不要忘记加@号

ORA-12203:

TNS:unable to connect to destination

ORA-12203 是一般的错误,可以检查$ORACLE_HOME/network/log 目录的 sqlnet.log 文件。

原因: 所安装的协议不正确。可能与下面原因一样:

ORA-12203

ORA-12538

ORA-00508

措施: 检查安装的 Oracle 协议。

在 UNIX 下,运行$ORACLE_HOME/bin 目录下的 adapters 程序。

应该输出:

Installed Net8 Tranport Protocols are:

IPC

TCP/IP

BEQueath

SSL

RAW

...

ORA-12203 原因: 不正确的服务名。

HOST 或 SERVICE 正确?

PORT 正确?

ORA-12203

另外原因: Net8 在 tnsnames.ora 文件中没有找到服务描述符。

措施: 用下面命令确认数据库是否在运行:

lsnrctl

lsnrctl> status listener_name

listener_name 不是必须的,缺省 LISTENER

如果系统提示没有运行,则用下面命令启动:

lsnrctl> start listener_name

2. 确认 tnsnames.ora 文件的正确位置。

ORA-12203 另外原因: 目标系统的监听没有工作。

措施: 确包远程系统的监听在工作,输入:

lsnrctl

lsnrctl> status listener_name

如果确实没有工作,则输入:

lsnrctl> start listener_name

ORA-12203 另外原因: 存在潜在的事务问题。

措施: 确保实用程序支持目前的网络协议,如 TCP/IP。用 PING 试。

ORA-12203 另外原因: tnsnames.ora 文件没有放对地方(目录)。

Action:确保 tnsnames.ora文件在正确的位置。

ORA-12203 另外原因: TCP/IP 地址 (HOST=server_name) 参数 TCP/IP 或 SPX 地址参数(SERVICE=tns_application) 与客户端不一致。

措施: 确认这些参数使用相同的名字。

对于 TCP/IP ,确保 listener.ora 文件的 HOST 和 tnsnames.ora 文件指到相同的名字。或名字转换到相同的 IP地址。

对于 SPX ,在客户端的名字必须相同。

ORA-12224: TNS:no listener

原因:由于监听没有工作而连接请求不能完成。

措施:

1. 确认支持的目标地址与数据库之一匹配。

2.检查版本问题

ORA-12533:

TNS:illegal ADDRESS parameters

原因: 在 tnsnames.ora 文件的 ADDRESS 节指定不 正确。

措施:根据 ADDRESS 语法进行改正。

ORA-12545: TNS:name lookup failure

原因: 远程节点不能连接。

措施:

1. tnsnames.ora 文件的 ADDRESS 和 listener.ora 文件的正确性。

2. 确认远程节点已经启动。输入:

lsnrctl

lsnrctl> status listener_name

如果没有启动,则输入:

lsnrctl> start listener_name

ORA-12560:

TNS:protocol adapter error

原因: 监听不能启动。

措施:

1. 调整后再运行。

2. 分析跟踪文件的内容。

ORA-3113: TNS:End of file on communication channel

原因:一个无法预料文件结束在通信通道里被处理。可能是通信连接被临时地停止了。

措施:需要修改发射次数等。

ORA-3121: No interface driver connection -function not performed

原因:SQL*NET 版本引起。

措施: 不要使用下面前缀进行连接:

T:

X:

P:

4. ORACLE8i 与系统管理有关的新特性

Oracle8i 引入了几项崭新的特性,可简化对 ORDBMS 的管理,并使其更易操作和使用。

4.1 本地化管理表空间

在 Oracle8I 以前,表空间的使用状况都是通过数据字典来完成的,称为 Dictionary-Managed Tablespace. 在 Oracle8I 推出以前,这一直都是唯一的表空间管理方式。自从 Oracle8I 以后,Oracle 又增加了一种新的表空间管理方式:Locally Managed Tablespace(本地化管理的表空间)。

在传统的数据字典管理的表空间里,Oracle 在数据字典的表里面记录了每个表空间的每个区的使用状况:每当一个区被使用或被释放时,Oracle 都在数据字典里面更新相应的信息,并产生相应的 redo 信息。在 Oracle8I 里,这仍然是默认的表空间管理方式。

在 Oracle8I 的版本中,Oracle 推出了一种全新的表空间管理方式:本地化管理的表空间。所谓本地化管理,就是指 Oracle 不再利用数据字典的表来记录 Oracle 表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个记录块,在其中记录每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle 都会更新数据文件头部的这个记录,反映这个变化。

本地化管理的表空间的创建过程:

解释: 关键字 EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定 EXTENT MANGEMENT LOCAL,因为它是数据库创建时建立的第一个表空间。

若为 DICTIONARY,则表明这是一个传统的数据字典管理的表空间,这是个默认选项。

当选择了 LOCAL 关键字,即表明这是这是一个本地化管理的表空间后,还可以继续选择更细的管理方式:是 AUTOALLOCATE 还是 UNIFORM.。若为 AUTOALLOCATE,则表明让 Oracle 来决定区块的使用办法;若选择了 UNIFORM,则还可以详细指定每个区块的大小,若不加指定,则为每个区使用 1M 大小。

是本地化管理的表空间还是创建数据字典管理的表空间只能在创建表空间的时候指定。在表空间已经创建以后,则不能再把本地化管理的表空间和数据字典管理的表空间再相互转换。在创建临时表空间时,也可以在 CREATE TEMPORARY TABLESPACE 中指定EXTENT MANAGEMENT LOCAL 来指定这是一个本地化管理的表空间。

本地化管理表空间的优点:

1. 本地化管理的表空间避免了递归的空间管理操作。而这种情况在数据字典管理的表空间是经常出现的,当表空间里的区的使用状况发生改变时,数据字典的表的信息发生改变,从而同时也使用了在系统表空间里的回滚段。

2. 本地化管理的表空间避免了在数据字典相应表里面写入空闲块、已使用块的信息,从而减少了数据字典表的竞争。

3. 区的本地化管理自动跟踪表空间里的空闲块,减少了手工合并自由空间的需要。

4. 表空间里的区的大小可以选择由 Oracle 系统来决定,或者由数据库管理员指定一个统一的大小。

5. 从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生回滚信息,不再使用系统表空间里的回滚段。因为由数据字典来管理的话,它会把相关信息记在数据字典的表里,从而产生回滚信息。由于这种表空间的以上特性,所以它支持在一个表空间里边进行更多的并发操作,并减少了对数据字典的依赖。

当然本地化管理的表空间也不是对所有的数据库和数据库对象都是适用的。首先,它不能指定存储特性,无 STORAGE 子句可供使用。其次,它不适用于存储较小的数据库对象。

总的来说,oracle8I 提供了这种全新的表空间管理方式,给了我们更多的选择。对于用来存储大对象的表空间和临时表空间来说,用本地化管理的表空间组织方式不失为一个较好的选择。

4.2 FBI 索引

Oracle8i的很重要的一个新特性就是增加了 function-based index 这种索引类型(后面简称为 FBI)。有了这个特性后,Oracle DBA 就可以在索引中使用函数或者表达式了。这些函数可以使 Oracle 自己的函数,也可以使用户自己的 PL/SQL 函数等。

DBA 在 SQL 语句调优的过程中遇到的一个很常见的问题就是,如何优化那些在 WHERE子句中使用了函数的语句。因为在以前,在 WHERE 子句中使用函数会使在这个表上创建的索引没法利用,从而难以提高这个语句的性能。

例子:

使用基于成本的优化器,索引为标准的 B 树索引,建立在 SURNAME 列上。

从 SQL*PLUS 的 autotrace 产生的执行路径可以看到,虽然我们在 WHERE 子句中用到的SURNAME 列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗大量的时间。

现在我们试着建立一个 FBI 索引:

SQL*Plus 返回的执行计划我们可以看到,这次,Oracle 对表不再全表扫描,而是先扫描索引,因为优化器可以知道 FBI 索引得存在使用 FBI 索引所能够带来的性能提升取决于表的大小、表中重复记录的量、在 WHERE子句中使用的列等因素。

有一点需要清楚,FBI 索引并不真正在索引里边存储了表达式的结果,而是使用了一个"表达树"(expression tree)。

由优化器来对 SQL 语句中的表达式进行解析,并且和 FBI 索引上面的表达式进行对比。这里,SQL 函数的大小写时敏感的。因此要求 SQL 语句中使用的函数和创建 FBI 索引得时候的那个 SQL 函数的大小写一致,否则无法利用这个 FBI索引。因此,在编程的时候要有一个良好的编程风格。

Init.ora里边需要修改的参数

下面这几个参数必须在 init.ora 里边指定:

QUERY_REWRITE_INTEGRITY = TRUSTED

QUERY_REWRITE_ENABLED = TRUE

COMPATIBLE = 8.1.0.0.0 (or higher)

授权:

要使一个用户能够创建 FBI 索引,他必须被授予以下权限:CREATE INDEX 和 QUERYREWRITE,或者CREATE ANY INDEX 和 GLOBAL QUERY REWRITE 这两个权限。

索引的使用者必须能够有那个 FBI 索引上使用的那个函数的执行权限。如果没有相应

的权限,那么这个 FBI 索引得状态将变成 DISABLED(DBA_INDEXES)。

如果那个FBI 索引得状态是 DISABLED,那么 DBA 可以这样来处理:

A:删除并重建

B:ALTER INDEX index_name ENABLED。这个 Enabled 只能对 FBI 索引使用。

C:ALTER INDEX UNUSABLE;

注意:如果一个查询中使用到了这个索引,但是这个 FBI 索引的状态是 DISABLED,但是优化器选择了使用这个索引,那么将会返回一个 Oracle 错误。

例子:

ORA error:

ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled.

而且,一旦这个 FBI 索引的状态是 Disabled,那么这张表上所有涉及索引列的 DML 操作也将失败。除非这个索引得状态变成 UNUSABLE,而且在初始化参数里边指定 SKIP_UNUSABLE_INDEXES为 TRUE。

一些例子:

复合索引的例子:

限制和规则总结:

对于下面这些限制,不能创建 FBI 索引:

a) LOB 列

b) REF

c) Nested table 列

d) 包含上面数据类型的对象

FBI 索引必须遵守下面的规则:

a) 必须使用基于成本的优化器,而且创建后必须对索引进行分析

b) 不能存储 NULL 值。因为任何函数在任何情况下都不能返回 NULL 值。

c)如果一个用户定义的 PL/SQL 例程失效了,而且这个例程被 FBI 索引用到了,那么相应的这个 FBI 索引会变成 DISABLED

d)创建 FBI 索引得函数必须是确定性的。即,对于指定的输入,总是会返回确定的结果。

e) 索引的属主如果没有了在 FBI 索引里面使用的函数的执行权限,那么这个 FBI 索引会变成 DISABLED.

f) 在创建索引得函数里面不能使用 SUM 等总计函数。

g)要把一个 DISABLED 了的索引重新变成 ENABLED,这个函数必须首先是 ENABLED 的才可以。

4.3 在线索引创建和重建

索引创建与重建在 Oracle8i中可联机实现,而不必中断对基表可能实施插入、更新或删除操作。创建与重建索引是一件非常耗时的工作,尤其当基表很大时。在 Oracle8i 之前,在索引创建与重建期间,不允许对其基表进行任何 DML操作。

在线创建索引:

在线重建索引:

注:在线索引构建期间,尽管能 UPDATE(更新)基表,但根据 Oracle 的建议,最好不要采取会影响到大部分数据行的操作。

4.4 使用可传输的表空间实现数据在数据库间的移动

对于可传输的表空间这一特性来说,允许我们把一个或多个表空间从一个数据库移动或复制到另一个数据库。

可传输的表空间有下面几点限制:

源和目标数据库必须处于同一个硬件平台。

源和目标数据库的数据库块大小必须一样,而且必须采用同一个字符集。

如果表空间名和目标数据库上的表空间名雷同,这个表空间就不能被传输到目标数据库。

数据库表空间迁移的基本过程是:令表空间为只读,并复制相应的数据文件,然后利用 EXP/IMP,从数据字典中卸载元数据,并把它装载到目标数据库。

表空间迁移前首先要检测待迁移的表空间是否自包含。我们可以通过执行内置的 PL/SQL过程 DBMS_TTS.TRANSPORT_SET_CHECK 判断表空间是否自包含:

其中, SALEDAT,SALESIDX 是表空间名。若TRANSPORT_SET_VOILATIONS 没有记录,则说明待迁移的表空间是自包含。

以下是表空间迁移的操作步骤,1-5 步操作在源数据库表空间操作完成,6、7、8步在目的数据库表空间操作完成。

1.用数据库管理员(INTERNAL)身份登录 ORACLE,(CONNECT INTERNAL/******)。

2.将源 tablsspace_name 表空间置为 READ ONLY,使得表空间下的数据文件置为 READONLY 状态,可以进行操作系统级的拷贝,(ALTER TABLESPACE tablsspace_name READONLY)。如果是生产系统请注意选择好进行此操作的时间。

3.利用 EXP 工具进行数据库表空间的迁移,(EXP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name BUFFER=1024000 )。

4.将待迁移的表空间下的所有数据文件进行操作系统级的拷贝,复制到目的数据库操作系统硬盘下。

5.将源 tablsspace_name 表空间置为 READ WRITE,使得表空间下的数据文件置为 READ WRITE 状态,(ALTER TABLESPACE tablsspace_name READ WRITE)。

6.在目的数据库上建立相应的用户 user_name 并赋予 CREATE SESSION 权限。

7.在目的数据库上利用 IMP 工具进行数据库表空间的迁移,(IMP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name DATAFILES=datafile_name1,datafile_name2)。

8.在目的数据库上将目的 tablsspace_name 表空间置为 READ WRITE,使得表空间下的数据文件置为 READ WRITE 状态,(ALTER TABLESPACE tablsspace_name READ WRITE)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181124B0AUVK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券