ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE操作手册 2

ORACLE操作手册 2

原创 Linux操作系统 作者:@oracle@_cu 时间:2009-03-07 13:06:43 0 删除 编辑

解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 2 20 40960
4 147 1325 2713600
4 1472 1318 2699264
已选择3行.
一个较为简便的方法是,初步确定可用空间的最大块,看它是否小于错误信息中提到的尺寸,该方法仅适合于Oracle 8。
查询语句如下:
SQL> select max(blocks) from sys.dba_free_space where
2 tablesapce_name=’’;
执行结果将返回上述表空间中最大可用空间的一条记录,这个数字比错误信息返回的数字小。如果想比较连续空间和全部空间的大小,可使用下面的查询:
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命令适用于所有表空间(包括系统)而无需退出数据库或使表空间脱机。一旦该命令完成,所增加的空间就可用了。请注意,一旦添加了数据文件,就不能再删除它。若要删除,就要删除表空间。
当添加一个数据文件到表空间时, 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错误的第一个变量用于标记代码中错误的位置,代码中的每个部分的第一变量都不一样。从第二个到第五个变量显示附加信息,如前面例子中的文件号。
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)根据冲突时间转储重做日志文件。如果无法确信究竟有多少日志文件要转储,请保存所有的重做日志文件并咨询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联系寻求帮助。
 决定问题的类属或确定端口。
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命令就可以做到的一些方法?
答:确保一组用户对一组对象具有相同的权限的最便捷方法是创建适当的角色,并给这些角色指定新用户。下面介绍的例子实现读取用户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
-------------- ------------
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 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
............................
...........................
............................
从上面的文件可以看到数据库中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目录下。请参考与系统平台有关的文档,以获取更多的信息。
问:使用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时,数据库字符编码被指定。
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在特定的表数据已经被导入后建立。
问:我正在将数据库导入到一个存在的表中。这个表有索引、触发器,为什么导入不能使它们加速插入的过程?
答:用户在一个表上可能有多个触发器和限制,并且用户可能出于其他原因使其中的一些选择不可用。结果,导入将必须保持与那些可用的和不可用的联络,并且在随后重建。因为限制和触发器增强商业规则,其控制方式留给用户确定。
问: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 $中得到吗?
答:是的。打包的模式是可移植的,所以没有问题。
问:导出包和过程后,有时发现有些是无效的。这是问题吗?
答:不是。因为过程可能是互相关联的,一个过程在其相关过程已经生成前可能已经生成。当这些对象被使用时就会生效。
问:我正在导出整个数据库。在导出工具还没导出前,有人删除了一个表。这可能吗?
答:可能。在会话开始时,导出工具并不对所有表加锁,导出工具是在会话开始时做一个所有表的列表,所以有可能在导出生成一个列表这段时间和表被导出这段时间之间,这个表被删除。导出将跨过这个表并继续工作。这需要用户警惕。
问:我有一个只读的表空间。一个导出/导入循环后,表空间还将是只读的吗?
答:目前不是,这个表将是可读/写的。其原因是在表数据被导入前生成了表空间。如果生成的表空间是只读的,那么表数据不能被导入。也可以选择导入数据,随后自动地使表空间只读,但也可能由用户预先生成表空间,并不希望它变成只读的。这个决定自然由用户自己决定。
问:当前有一个脱机表空间,导出工具会提取表空间里的数据吗?一个导入/导出循环后,表空间会依然脱机吗?
答:都不会。
问: 我导出了整个数据库并准备进行整个数据库的导入,是否该提前生成一组特殊对
答:是的。需要预生成表空间和回滚段,以便将其放在适当的地方。如果整个导出来自不同的操作系统(像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 故障分析手册

http://www.cublog.cn/u/27852/showart_215777.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20570073/viewspace-563177/,如需转载,请注明出处,否则将追究法律责任。

下一篇: SPFILE 和 PFILE
请登录后发表评论 登录
全部评论

注册时间:2009-03-03

  • 博文量
    10
  • 访问量
    16846