ORACLE数据库维护
时间:2014-05-14 14:00:13
收藏:0
阅读:631
ORACLE数据库维护(转)----一篇关于oracle的不错的文章
1.
ORACLE数据库启动与关闭
1.1 打开和关闭数据库 (手工)
1.1.1 sqlplus连接
1.1.2 打开数据库
1.1.3 启动oracle listener
1.1.4 关闭oracle listener
1.1.5 关闭数据库
2. 数据库备份
2.1 冷备份
2.2 用exp、imp命令做逻辑备份
2.3 用tar命令做物理备份
2.4 备份控制文件
2.5 联机全备份+日志备份
2.5.1 设置
2.5.2 步骤
2.5.3 恢复
2.5.3.1 磁盘全部损坏,仅保存上次联机全备份和每天日志备份
2.5.3.2 丢失某数据文件
2.5.3.3 文件损坏或丢失,又无备份
2.5.4 注意要点
3. 数据库的扩充
3.1 增加一个表空间
3.1.1 创建表空间
3.1.2 增加某个表空间的大小
3.2 增加oracle的用户,并给用户授权
3.2.1 增加oracle的用户, 并给用户授权
3.2.2 增加oracle的角色
3.2.3 中断用户同oracle的连接
3.3 表、视图、索引、约束
3.3.1 表和视图
3.3.1.1 管理表
3.3.1.1.1 建立表
3.3.1.1.2 表的命名规则
3.3.1.1.3 从其它表中建立表
3.3.1.1.4 更改表定义
3.3.1.2 管理视图
3.3.1.2.1 建立视图
3.3.1.2.2 从视图中获得数据
3.3.1.2.3 插入、更新、删除数据
3.3.1.2.4 删除视图
3.3.2 索引
3.3.2.1 B-Tree索引
3.3.2.2 位图索引
3.3.2.3 修改索引
3.3.2.4 重建索引
3.3.3 序列(Sequences)
3.3.3.1 创建序列
3.3.3.2 删除序列
3.4 网络管理
3.4.1 Net8 server端配置
3.4.1.1 listener.ora文件的样本:
3.4.1.2 启动listener
3.4.2 Net 8 client端配置
3.4.3 sqlnet.ora
3.4.4 网络连通性测试
3.4.5 常见NET8 错误
3.4.5.1 服务器端诊断
3.4.5.2 客户端诊断
3.4.5.3 常见错误
4. ORACLE8i与系统管理有关的新特性
4.1 本地化管理表空间
4.2 FBI索引
4.3 在线索引创建和重建
4.4 使用可传输的表空间实现数据在数据库间的移动
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可带三个参数,分别是
SQL > shutdown abort 非正常立刻关机。等于忽然停电
SQL > shutdown immediate 做回滚*作,立刻关机。
SQL > shutdown normal 正常关机 (推荐)
shutdown缺省参数是normal
2. 数据库备份
2.1 冷备份
关闭数据库时作的备份称为冷备份。
关闭数据库,将所有和本实例有关的文件,包括datafile,controlfile,redolog,archiv
ed 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_fu
ll_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.o
ra)中指定控制文件的位置。如果部分控制文件损坏,可以在参数文件中去掉相应的控
制文件,即可启动数据库。
每次数据库物理结构发生改变时,必须及时备份控制文件。
$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是解除冻结,因此复制dataf
ile的过程不宜过长
备份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,应尽快将全部数据e
xport出来,重建数据库,再import进去。所有*作之前,应做冷备份。
2.数据库异常中止处理
通过手工shutdown abort*作中止数据库,不会产生大的问题,通常直接startup无需使
用介质恢复命令
如果由于机器崩溃引起的中止,则情况严重得多,有可能要使用到上面提到的恢复方法
,不过这种现象并不多见。一般需要显式使用介质恢复命令,如下:
sqlplus "/ as sysdba"
SQL>startup mount;
SQL>recover database;
SQL>alter database open;
3. 数据库的扩充
3.1 增加一个表空间
3.1.1 创建表空间
命令示例:
SQL>create tablespace application datafile
/usr/oracle/dbs/application.dbf size 3M
针对具体情况增加回滚和临时表空间
命令示例:
SQL>create rollback segment rbs8 tablespace rbs storage(initial 1m next 4m)
SQL>CREATE TABLESPACE TEMP
DATAFILE "/usr/oracle/dbs/temp.dbf " SIZE 32M REUSE
AUTOEXTEND ON NEXT 640K MINIMUM EXTENT 64K
DEFAULT STORAGE (
INITIAL 64K
NEXT 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0)
TEMPORARY;
回滚和临时表空间用完后,可删除或使它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 需中断用户同o
racle的连接。
①、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语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例
如:
CREATE TABLE products
( PROD_ID NUMBER(4),
PROD_NAME VAECHAR2(20),
STOCK_QTY NUMBER(5,3)
);
这样我们就建立了一个名为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 {COLUM column_names |
(column_names)}[CASCADE CONSTRAINS]
要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE
CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同
时删除。
如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,
标记未用数据列的语法如下:
ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names |
(column_names)}[CASCADE CONSTRAINS]
这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释
放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的
名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都
将被删除。
删除未用数据列的语句是:
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
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 {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE}
例: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子串。
例:
SQL> CREATE VIEW TOP_EMP AS
SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary
FROM emp
WHERE salary >2000
用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新
定义视图需要包含OR REPLACE子串。
SQL> CREATE VIEW TOP_EMP
(EMPLOYEE_ID,EMPLOYEE_NAME,SALARY) AS
SELECT empno ,ename ,salary
FROM emp
WHERE salary >2000
如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个
带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如:CREATE FORCE VIEW
ORDER_STATUS AS
SELECT * FROM PURCHASE_ORDERS
WHERE STATUS= APPPOVE ;
SQL>/
warning :View create with compilation errors
这样将创建了一个名为ORDER_STATUS的视图,但这样的视图的状态是不合法的,如果以
后状态发生变化则可以重新编译,其状态也变成合法的。
3.3.1.2.2 从视图中获得数据
从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,
也可以使用SQL函数,以及所有SELECT语句的字串。
3.3.1.2.3 插入、更新、删除数据
用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,
那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETA
BLE_COLUMNS中查到。
用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个
只读视图,不能进行更新、插入、删除*作。WITH CHECK OPTION表示可以进行插入和更
新*作,但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件,比如
在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于200
0的数据行。
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。
CREATE UNIQUE INDEX scott.ord_ord_no_idx
ON scott.ord(ord_no) REVERSE
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
3.3.2.2 位图索引
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引可以是简单的
(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。位图索引最好用于
低到中群集(cardinality)列,在这些列上多位图索引可以与AND或OR*作符结合使用。
位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)
、或NULL值。位图索引的位图存放在B-Tree结构的页节点中。B-Tree结构使查找位图非
常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要
小得多。
CREATE BITMAP INDEX scott.ord_region_id_idx
ON scott.ord(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
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文件的样本:
CONNECT_TIMEOUT_LISTENER = 0
LOGGING_LISTENER = OFF
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION = # Local connections.
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = icache))
)
)
(DESCRIPTION = # General TCP connections.
(ADDRESS =
(PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521)
)
)
# For secure connections over SSL, uncomment the following lines.
#
# (DESCRIPTION = # Secure TCP connections.
# (ADDRESS =
# (PROTOCOL = TCPS)(HOST = dbsvr)(PORT = 2484)
# )
# )
(DESCRIPTION = # IIOP Connections.
(PROTOCOL_STACK =
(PRESENTATION = GIOP)
(SESSION = RAW)
)
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 2481))
)
# For secure IIOP connections over SSL, uncomment the following lines.
#
# (DESCRIPTION = # Secure IIOP Connections.
# (PROTOCOL_STACK =
# (PRESENTATION = GIOP)
# (SESSION = RAW)
# )
# (ADDRESS = (PROTOCOL = TCPS)(HOST = dbsvr)(PORT = 2482))
# )
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = s450 )
(ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2)
(SID_NAME = s450 )
)
(SID_DESC =
(ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2)
(SID_NAME = iCache_extproc)
(PROGRAM = extproc)
)
)
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. 保存文件
nttest = (DESCRIPTION=
(ADDRESS=
(PROTOCOL=tcp)
(HOST=localserver)
(PORT=1521)
)
(CONNECT_DATA=(sid=oradb)
)
)
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/listen
er.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进行绕弯测试:
1. 启动Net8 Assistant:
在 UNIX, 从 $ORACLE_HOME/bin. 目录来运行netasst
在NT, choose Start > Programs > Oracle - HOME_NAME >Network
Administration > Net8 Assistant.
2. 在导航器扩展 Directory或 Local > Service Naming.
3. 选择net service name 或 database service.
4. 选命令 > Test Net Service.
3.4.5.2 客户端诊断
当服务器已经通过一般的SQL*PLUS测试和绕弯测试后,可以进行客户端的测试,步骤如
下:
1. 检查所安装的协议是否与服务器端一致;
在UNIX, 可以运行$ORACLE_HOME/bin目录下的 adapters 来确认。结果显示:
Installed Net8 Tranport Protocols are:
IPC
TCP/IP
BEQueath
SSL
RAW
...
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
可能提示:
TNS Ping Utility for SunOS:
Copyright (c) Oracle Corporation 1998. All rights reserved.
Attempting to contact
(ADDRESS=(PROTOCOL=TCP)(HOST=spot)(PORT=1521))
OK (50msec)
例2:用TNSPING测试10次:
tnsping stprd 10
可能提示:
TNS Ping Utility for SunOS:
Copyright (c) Oracle Corporation 1998. All rights reserved.
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=spot)(PORT=1521))
OK (290 msec)
OK (100 msec)
OK (70 msec)
OK (70 msec)
OK (60 msec)
OK (70 msec)
OK (70 msec)
OK (80 msec)
OK (180 msec
OK (340 msec)
5. 如果连接失败,可以进行下面*作:
查找原因
用下面站点与Oracle联系:
[url]http://support.oracle.com[/url]
与 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推出以前,这一直都是唯一的表空间管理方式。自从O
racle8I以后,Oracle又增加了一种新的表空间管理方式:Locally Managed
Tablespace(本地化管理的表空间)。
在传统的数据字典管理的表空间里,Oracle在数据字典的表里面记录了每个表空间
的每个区的使用状况:每当一个区被使用或被释放时,Oracle都在数据字典里面更新相
应的信息,并产生相应的redo 信息。在Oracle8I里,这仍然是默认的表空间管理方式。
在Oracle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表
空间。所谓本地化管理,就是指Oracle不再利用数据字典的表来记录Oracle表空间里面
的区的使用状况,而是在每个表空间的数据文件的头部加入了一个记录块,在其中记录
每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新
数据文件头部的这个记录,反映这个变化。
本地化管理的表空间的创建过程:
语法:CREATE TABLESPACE 表空间名字
DATAFILE 数据文件详细信息
[EXTENT MANAGEMENT { DICTIONARY | LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
解释: 关键字EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间。对于
系统表空间,只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL,因为它是数据库
创建时建立的第一个表空间。
若为DICTIONARY,则表明这是一个传统的数据字典管理的表空间,这是个默认选项。
当选择了LOCAL关键字,即表明这是这是一个本地化管理的表空间后,还可以继续选择更
细的管理方式:是AUTOALLOCATE 还是 UNIFORM.。若为AUTOALLOCATE,则表明让Oracle来
决定区块的使用办法;若选择了UNIFORM,则还可以详细指定每个区块的大小,若不加指
定,则为每个区使用1M大小。
是本地化管理的表空间还是创建数据字典管理的表空间只能在创建表空间的时候指
定。在表空间已经创建以后,则不能再把本地化管理的表空间和数据字典管理的表空间
再相互转换。在创建临时表空间时,也可以在CREATE TEMPORARY TABLESPACE 中指定EXT
ENT 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>create index non_fbi on sale_contacts (surname);
SQL>analyze index non_fbi compute statistics;
SQL>:analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts
WHERE UPPER(surname) = ELLISON ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF SALES_CONTACTS (Cost=3 Card=16
Bytes=272)
从SQL*PLUS的autotrace产生的执行路径可以看到,虽然我们在WHERE子句中用到的S
URNAME列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗
大量的时间。
现在我们试着建立一个FBI索引:
SQL>create index fbi on sale_contacts (UPPER(surname));
SQL>analyze index fbi compute statistics;
SQL>analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts WHERE UPPER(surname) =
ELLISON ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 INDEX (RANGE SCAN) OF FBI (NON-UNIQUE) (Cost=2 Card=381
Bytes=6477)
从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和QUERY
REWRITE,或者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_UNUS
ABLE_INDEXES为TRUE。
一些例子:
SQL>CREATE INDEX expression_ndx
ON mytable ((mycola + mycolc) * mycolb);
SQL>SELECT mycolc FROM mytable
WHERE (mycola + mycolc) * mycolb <= 256;
复合索引的例子:
SQL>CREATE INDEX example_ndx
ON myexample (mycola, UPPER(mycolb), mycolc);
SQL>SELECT mycolc FROM myexample
WHERE mycola = 55 AND UPPER(mycolb) = JONES ;
限制和规则总结:
对于下面这些限制,不能创建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*作。
在线创建索引:
CREATE INDEX EMP_NO ON EMP (EMPNO)
TABLESPACE INDEX1
PCTFREE 10
STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0)
ONLINE;
在线重建索引:
ALTER INDEX EMP_NO REBUILD ONLINE;
注:在线索引构建期间,尽管能UPDATE(更新)基表,但根据Oracle的建议,最好不要
采取会影响到大部分数据行的*作。
4.4 使用可传输的表空间实现数据在数据库间的移动
对于可传输的表空间这一特性来说,允许我们把一个或多个表空间从一个数据库移
动或复制到另一个数据库。
可传输的表空间有下面几点限制:
源和目标数据库必须处于同一个硬件平台。
源和目标数据库的数据库块大小必须一样,而且必须采用同一个字符集。
如果表空间名和目标数据库上的表空间名雷同,这个表空间就不能被传输到目标数
据库。
数据库表空间迁移的基本过程是:令表空间为只读,并复制相应的数据文件,然后利用E
XP/IMP,从数据字典中卸载元数据,并把它装载到目标数据库。
表空间迁移前首先要检测待迁移的表空间是否自包含。我们可以通过执行内置的PL/SQL
过程DBMS_TTS.TRANSPORT_SET_CHECK判断表空间是否自包含:
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK( SALEDAT,SALESIDX ,TRUE);
SELECT * FROM TRANSPORT_SET_VOILATIONS;
其中, SALEDAT,SALESIDX是表空间名。若TRANSPORT_SET_VOILATIONS没有记录,则说明
待迁移的表空间是自包含。
以下是表空间迁移的*作步骤,1-5步*作在源数据库表空间*作完成,6、7、8步
在目的数据库表空间*作完成。
1.用数据库管理员(INTERNAL)身份登录ORACLE,(CONNECT INTERNAL/******)。
2.将源tablsspace_name表空间置为READ ONLY,使得表空间下的数据文件置为READ
ONLY状态,可以进行*作系统级的拷贝,(ALTER TABLESPACE tablsspace_name READ
ONLY)。如果是生产系统请注意选择好进行此*作的时间。
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 TABLE
1.1 打开和关闭数据库 (手工)
1.1.1 sqlplus连接
1.1.2 打开数据库
1.1.3 启动oracle listener
1.1.4 关闭oracle listener
1.1.5 关闭数据库
2. 数据库备份
2.1 冷备份
2.2 用exp、imp命令做逻辑备份
2.3 用tar命令做物理备份
2.4 备份控制文件
2.5 联机全备份+日志备份
2.5.1 设置
2.5.2 步骤
2.5.3 恢复
2.5.3.1 磁盘全部损坏,仅保存上次联机全备份和每天日志备份
2.5.3.2 丢失某数据文件
2.5.3.3 文件损坏或丢失,又无备份
2.5.4 注意要点
3. 数据库的扩充
3.1 增加一个表空间
3.1.1 创建表空间
3.1.2 增加某个表空间的大小
3.2 增加oracle的用户,并给用户授权
3.2.1 增加oracle的用户, 并给用户授权
3.2.2 增加oracle的角色
3.2.3 中断用户同oracle的连接
3.3 表、视图、索引、约束
3.3.1 表和视图
3.3.1.1 管理表
3.3.1.1.1 建立表
3.3.1.1.2 表的命名规则
3.3.1.1.3 从其它表中建立表
3.3.1.1.4 更改表定义
3.3.1.2 管理视图
3.3.1.2.1 建立视图
3.3.1.2.2 从视图中获得数据
3.3.1.2.3 插入、更新、删除数据
3.3.1.2.4 删除视图
3.3.2 索引
3.3.2.1 B-Tree索引
3.3.2.2 位图索引
3.3.2.3 修改索引
3.3.2.4 重建索引
3.3.3 序列(Sequences)
3.3.3.1 创建序列
3.3.3.2 删除序列
3.4 网络管理
3.4.1 Net8 server端配置
3.4.1.1 listener.ora文件的样本:
3.4.1.2 启动listener
3.4.2 Net 8 client端配置
3.4.3 sqlnet.ora
3.4.4 网络连通性测试
3.4.5 常见NET8 错误
3.4.5.1 服务器端诊断
3.4.5.2 客户端诊断
3.4.5.3 常见错误
4. ORACLE8i与系统管理有关的新特性
4.1 本地化管理表空间
4.2 FBI索引
4.3 在线索引创建和重建
4.4 使用可传输的表空间实现数据在数据库间的移动
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可带三个参数,分别是
SQL > shutdown abort 非正常立刻关机。等于忽然停电
SQL > shutdown immediate 做回滚*作,立刻关机。
SQL > shutdown normal 正常关机 (推荐)
shutdown缺省参数是normal
2. 数据库备份
2.1 冷备份
关闭数据库时作的备份称为冷备份。
关闭数据库,将所有和本实例有关的文件,包括datafile,controlfile,redolog,archiv
ed 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_fu
ll_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.o
ra)中指定控制文件的位置。如果部分控制文件损坏,可以在参数文件中去掉相应的控
制文件,即可启动数据库。
每次数据库物理结构发生改变时,必须及时备份控制文件。
$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是解除冻结,因此复制dataf
ile的过程不宜过长
备份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,应尽快将全部数据e
xport出来,重建数据库,再import进去。所有*作之前,应做冷备份。
2.数据库异常中止处理
通过手工shutdown abort*作中止数据库,不会产生大的问题,通常直接startup无需使
用介质恢复命令
如果由于机器崩溃引起的中止,则情况严重得多,有可能要使用到上面提到的恢复方法
,不过这种现象并不多见。一般需要显式使用介质恢复命令,如下:
sqlplus "/ as sysdba"
SQL>startup mount;
SQL>recover database;
SQL>alter database open;
3. 数据库的扩充
3.1 增加一个表空间
3.1.1 创建表空间
命令示例:
SQL>create tablespace application datafile
/usr/oracle/dbs/application.dbf size 3M
针对具体情况增加回滚和临时表空间
命令示例:
SQL>create rollback segment rbs8 tablespace rbs storage(initial 1m next 4m)
SQL>CREATE TABLESPACE TEMP
DATAFILE "/usr/oracle/dbs/temp.dbf " SIZE 32M REUSE
AUTOEXTEND ON NEXT 640K MINIMUM EXTENT 64K
DEFAULT STORAGE (
INITIAL 64K
NEXT 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0)
TEMPORARY;
回滚和临时表空间用完后,可删除或使它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 需中断用户同o
racle的连接。
①、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语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例
如:
CREATE TABLE products
( PROD_ID NUMBER(4),
PROD_NAME VAECHAR2(20),
STOCK_QTY NUMBER(5,3)
);
这样我们就建立了一个名为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 {COLUM column_names |
(column_names)}[CASCADE CONSTRAINS]
要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE
CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同
时删除。
如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,
标记未用数据列的语法如下:
ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names |
(column_names)}[CASCADE CONSTRAINS]
这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释
放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的
名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都
将被删除。
删除未用数据列的语句是:
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
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 {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE}
例: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子串。
例:
SQL> CREATE VIEW TOP_EMP AS
SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary
FROM emp
WHERE salary >2000
用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新
定义视图需要包含OR REPLACE子串。
SQL> CREATE VIEW TOP_EMP
(EMPLOYEE_ID,EMPLOYEE_NAME,SALARY) AS
SELECT empno ,ename ,salary
FROM emp
WHERE salary >2000
如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个
带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如:CREATE FORCE VIEW
ORDER_STATUS AS
SELECT * FROM PURCHASE_ORDERS
WHERE STATUS= APPPOVE ;
SQL>/
warning :View create with compilation errors
这样将创建了一个名为ORDER_STATUS的视图,但这样的视图的状态是不合法的,如果以
后状态发生变化则可以重新编译,其状态也变成合法的。
3.3.1.2.2 从视图中获得数据
从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,
也可以使用SQL函数,以及所有SELECT语句的字串。
3.3.1.2.3 插入、更新、删除数据
用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,
那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETA
BLE_COLUMNS中查到。
用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个
只读视图,不能进行更新、插入、删除*作。WITH CHECK OPTION表示可以进行插入和更
新*作,但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件,比如
在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于200
0的数据行。
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。
CREATE UNIQUE INDEX scott.ord_ord_no_idx
ON scott.ord(ord_no) REVERSE
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
3.3.2.2 位图索引
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引可以是简单的
(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。位图索引最好用于
低到中群集(cardinality)列,在这些列上多位图索引可以与AND或OR*作符结合使用。
位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)
、或NULL值。位图索引的位图存放在B-Tree结构的页节点中。B-Tree结构使查找位图非
常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要
小得多。
CREATE BITMAP INDEX scott.ord_region_id_idx
ON scott.ord(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx01;
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文件的样本:
CONNECT_TIMEOUT_LISTENER = 0
LOGGING_LISTENER = OFF
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION = # Local connections.
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = icache))
)
)
(DESCRIPTION = # General TCP connections.
(ADDRESS =
(PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521)
)
)
# For secure connections over SSL, uncomment the following lines.
#
# (DESCRIPTION = # Secure TCP connections.
# (ADDRESS =
# (PROTOCOL = TCPS)(HOST = dbsvr)(PORT = 2484)
# )
# )
(DESCRIPTION = # IIOP Connections.
(PROTOCOL_STACK =
(PRESENTATION = GIOP)
(SESSION = RAW)
)
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 2481))
)
# For secure IIOP connections over SSL, uncomment the following lines.
#
# (DESCRIPTION = # Secure IIOP Connections.
# (PROTOCOL_STACK =
# (PRESENTATION = GIOP)
# (SESSION = RAW)
# )
# (ADDRESS = (PROTOCOL = TCPS)(HOST = dbsvr)(PORT = 2482))
# )
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = s450 )
(ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2)
(SID_NAME = s450 )
)
(SID_DESC =
(ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2)
(SID_NAME = iCache_extproc)
(PROGRAM = extproc)
)
)
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. 保存文件
nttest = (DESCRIPTION=
(ADDRESS=
(PROTOCOL=tcp)
(HOST=localserver)
(PORT=1521)
)
(CONNECT_DATA=(sid=oradb)
)
)
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/listen
er.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进行绕弯测试:
1. 启动Net8 Assistant:
在 UNIX, 从 $ORACLE_HOME/bin. 目录来运行netasst
在NT, choose Start > Programs > Oracle - HOME_NAME >Network
Administration > Net8 Assistant.
2. 在导航器扩展 Directory或 Local > Service Naming.
3. 选择net service name 或 database service.
4. 选命令 > Test Net Service.
3.4.5.2 客户端诊断
当服务器已经通过一般的SQL*PLUS测试和绕弯测试后,可以进行客户端的测试,步骤如
下:
1. 检查所安装的协议是否与服务器端一致;
在UNIX, 可以运行$ORACLE_HOME/bin目录下的 adapters 来确认。结果显示:
Installed Net8 Tranport Protocols are:
IPC
TCP/IP
BEQueath
SSL
RAW
...
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
可能提示:
TNS Ping Utility for SunOS:
Copyright (c) Oracle Corporation 1998. All rights reserved.
Attempting to contact
(ADDRESS=(PROTOCOL=TCP)(HOST=spot)(PORT=1521))
OK (50msec)
例2:用TNSPING测试10次:
tnsping stprd 10
可能提示:
TNS Ping Utility for SunOS:
Copyright (c) Oracle Corporation 1998. All rights reserved.
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=spot)(PORT=1521))
OK (290 msec)
OK (100 msec)
OK (70 msec)
OK (70 msec)
OK (60 msec)
OK (70 msec)
OK (70 msec)
OK (80 msec)
OK (180 msec
OK (340 msec)
5. 如果连接失败,可以进行下面*作:
查找原因
用下面站点与Oracle联系:
[url]http://support.oracle.com[/url]
与 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推出以前,这一直都是唯一的表空间管理方式。自从O
racle8I以后,Oracle又增加了一种新的表空间管理方式:Locally Managed
Tablespace(本地化管理的表空间)。
在传统的数据字典管理的表空间里,Oracle在数据字典的表里面记录了每个表空间
的每个区的使用状况:每当一个区被使用或被释放时,Oracle都在数据字典里面更新相
应的信息,并产生相应的redo 信息。在Oracle8I里,这仍然是默认的表空间管理方式。
在Oracle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表
空间。所谓本地化管理,就是指Oracle不再利用数据字典的表来记录Oracle表空间里面
的区的使用状况,而是在每个表空间的数据文件的头部加入了一个记录块,在其中记录
每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新
数据文件头部的这个记录,反映这个变化。
本地化管理的表空间的创建过程:
语法:CREATE TABLESPACE 表空间名字
DATAFILE 数据文件详细信息
[EXTENT MANAGEMENT { DICTIONARY | LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
解释: 关键字EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间。对于
系统表空间,只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL,因为它是数据库
创建时建立的第一个表空间。
若为DICTIONARY,则表明这是一个传统的数据字典管理的表空间,这是个默认选项。
当选择了LOCAL关键字,即表明这是这是一个本地化管理的表空间后,还可以继续选择更
细的管理方式:是AUTOALLOCATE 还是 UNIFORM.。若为AUTOALLOCATE,则表明让Oracle来
决定区块的使用办法;若选择了UNIFORM,则还可以详细指定每个区块的大小,若不加指
定,则为每个区使用1M大小。
是本地化管理的表空间还是创建数据字典管理的表空间只能在创建表空间的时候指
定。在表空间已经创建以后,则不能再把本地化管理的表空间和数据字典管理的表空间
再相互转换。在创建临时表空间时,也可以在CREATE TEMPORARY TABLESPACE 中指定EXT
ENT 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>create index non_fbi on sale_contacts (surname);
SQL>analyze index non_fbi compute statistics;
SQL>:analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts
WHERE UPPER(surname) = ELLISON ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF SALES_CONTACTS (Cost=3 Card=16
Bytes=272)
从SQL*PLUS的autotrace产生的执行路径可以看到,虽然我们在WHERE子句中用到的S
URNAME列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗
大量的时间。
现在我们试着建立一个FBI索引:
SQL>create index fbi on sale_contacts (UPPER(surname));
SQL>analyze index fbi compute statistics;
SQL>analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts WHERE UPPER(surname) =
ELLISON ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=17)
1 0 SORT (AGGREGATE)
2 1 INDEX (RANGE SCAN) OF FBI (NON-UNIQUE) (Cost=2 Card=381
Bytes=6477)
从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和QUERY
REWRITE,或者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_UNUS
ABLE_INDEXES为TRUE。
一些例子:
SQL>CREATE INDEX expression_ndx
ON mytable ((mycola + mycolc) * mycolb);
SQL>SELECT mycolc FROM mytable
WHERE (mycola + mycolc) * mycolb <= 256;
复合索引的例子:
SQL>CREATE INDEX example_ndx
ON myexample (mycola, UPPER(mycolb), mycolc);
SQL>SELECT mycolc FROM myexample
WHERE mycola = 55 AND UPPER(mycolb) = JONES ;
限制和规则总结:
对于下面这些限制,不能创建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*作。
在线创建索引:
CREATE INDEX EMP_NO ON EMP (EMPNO)
TABLESPACE INDEX1
PCTFREE 10
STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0)
ONLINE;
在线重建索引:
ALTER INDEX EMP_NO REBUILD ONLINE;
注:在线索引构建期间,尽管能UPDATE(更新)基表,但根据Oracle的建议,最好不要
采取会影响到大部分数据行的*作。
4.4 使用可传输的表空间实现数据在数据库间的移动
对于可传输的表空间这一特性来说,允许我们把一个或多个表空间从一个数据库移
动或复制到另一个数据库。
可传输的表空间有下面几点限制:
源和目标数据库必须处于同一个硬件平台。
源和目标数据库的数据库块大小必须一样,而且必须采用同一个字符集。
如果表空间名和目标数据库上的表空间名雷同,这个表空间就不能被传输到目标数
据库。
数据库表空间迁移的基本过程是:令表空间为只读,并复制相应的数据文件,然后利用E
XP/IMP,从数据字典中卸载元数据,并把它装载到目标数据库。
表空间迁移前首先要检测待迁移的表空间是否自包含。我们可以通过执行内置的PL/SQL
过程DBMS_TTS.TRANSPORT_SET_CHECK判断表空间是否自包含:
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK( SALEDAT,SALESIDX ,TRUE);
SELECT * FROM TRANSPORT_SET_VOILATIONS;
其中, SALEDAT,SALESIDX是表空间名。若TRANSPORT_SET_VOILATIONS没有记录,则说明
待迁移的表空间是自包含。
以下是表空间迁移的*作步骤,1-5步*作在源数据库表空间*作完成,6、7、8步
在目的数据库表空间*作完成。
1.用数据库管理员(INTERNAL)身份登录ORACLE,(CONNECT INTERNAL/******)。
2.将源tablsspace_name表空间置为READ ONLY,使得表空间下的数据文件置为READ
ONLY状态,可以进行*作系统级的拷贝,(ALTER TABLESPACE tablsspace_name READ
ONLY)。如果是生产系统请注意选择好进行此*作的时间。
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 TABLE
评论(0)