oracle收集:常见问题解答

原创 2004年08月13日 11:32:00

ITPUB论坛 - [TIP] 收集:常见问题解答
ITPUB论坛 (http://www.itpub.net/index.php)
- Oracle认证专家 (http://www.itpub.net/forumdisplay.php?forumid=4)
-- [TIP] 收集:常见问题解答 (http://www.itpub.net/showthread.php?threadid=2407)


由 easyfree 于 01-11-06 18:03 发表:
收集:常见问题解答
我们在学习和工作中都会遇到很多问题,一些具有普遍性和典型性,同样的问题很多人需要到很多地方去询问和查找,我希望在这里进行这样一个活动,将oracle的许多常见问题收集在一起,便于大家查询,即节省时间,也触类旁通

当然Oracle的技术是浩瀚的,我一个人的力量也是很微弱的,希望能得到大家尤其是高手和经验丰富的fans们的支持

这个帖子也作为不断补充的形式进行,到一定时间,斑竹整理后可以变成一个文件供大家下载,欢迎参与

希望针对问题的说明和解答比较明确,给出适应环境、版本等,斑竹无法对所有帖子进行验证是否正确,如果网友们发现问题,欢迎指出并展开讨论

谢谢!

以下一篇是我很久以前写的一篇文章,在实际中有一定应用,正好借一个网友的要求,作为抛砖引玉


代码:
关于 SELECT N 问题

有感于一些网友多次咨询和讨论选取某些指定行数据的问题, 我写了下面这样的简单说明, 请大家指正.

这里描述的 SELECT N 包括这样几种情况:
1. 选取TOP N行记录
2. 选取N1-N2行记录
3. 选取FOOT N行记录
当然需要考虑是否有ORDER BY子句的情况, 下面试以系统视图CAT为例分别说明.
注: A. 为没有ORDER BY的情况
B. 有ORDER BY的情况

1. 选取 TOP N 行记录
A. SELECT * FROM CAT WHERE ROWNUM<=N
B. SELECT * FROM
( SELECT * FROM CAT ORDER BY TABLE_TYPE )
WHERE ROWNUM<=N

2. 选取N1-N2行记录
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ BETWEEN N1 AND N2;
或:
SELECT * FROM CAT WHERE ROWNUM<=N2
MINUS
SELECT * FROM CAT WHERE ROWNUM<N1
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY TABLE_TYPE) X)
WHERE ROWSEQ BETWEEN N1+1 AND N2;

3. 选取FOOT N行记录
这里是说明不知道记录集的记录个数的情况, 如果已知, 用上面2的方法即可
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )
B. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE)
WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT )

SELECT * FROM
( SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE DESC)
WHERE ROWNUM<=N

以上在ORACLE8.1.5 for Windows2000pro 上测试通过
-- end --

__________________

生年不满百,常怀千岁忧。
昼短苦夜长,何不秉烛游!
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。

 

由 jlandzpa 于 01-11-07 04:31 发表:
选取N1-N2行记录的补充
select * from cat where rownum < n2+1
minus
select * from cat where rownum < n1+1
__________________
任弱水三千,我独取一瓢饮!
勿以善小而不为,勿以恶小而为之!
不要以为登上了山峰,你就征服了世界!
出差[忙].

 

由 jlandzpa 于 01-11-07 04:43 发表:
 oracle FAQ(1) from chao_ping
1.快速整理破碎的表(在Oracle8i里边才可以这样使用)

ALTER TABLE table_name MOVE ( TABLESPACE XXX);

如何移动一张表所在的表空间

方法一:
1. Export 这张表
2. Drop这张表
3. Create table xxx tablespace xxx;
4. Imp Ignore=y

还要注意的一点是,所有要读取这张表的PL/SQL储存过程都会失效。需要重新编译。
1. SELECT * FROM DBA_OBJECTS WHERE STATUS = 'INVALID';
2. 对这些包,函数,过程重新编译。
方法二:
仅对Oracle8i适用。
使用下面的语句:
ALTER TABLE table_name MOVE
TABLESPACE new_tablespace;

这样的话,所有的约束、索引、触发器都不会受到影响。

但是需要rebuild这个标上的所有索引。

2.怎样直接进入sql*plus而不用输入用户名,密码:

sqlplus /nolog;

sqlplus username/password@connect_string

3.怎样快速重建索引:

alter index xxx rebuild storage();

alter index xxx coalesce;

4. 为什么我看不到dbms_output的结果?

SET SERVEROUTPUT ON

5. 进行一次大的事务以后,已经COMMIT了,但为什么我的回滚段还是那样大?

因为没有设置OPTIMAL的值,所以不会自动收缩。

可以用alter rollback segment shrink to Xm;来手工进行收缩。

6. 为什么要使用VARCHAR2,而不用CHAR?

A.CHAR只支持2000字节长,而VARCHAR2支持4000字节的长度,适用性更好

B. CHAR 占用更多的存储空间,定义多长,它就占用多长的空间,插入字符后面自动加空格填充;而VARCHAR2不论定义多长,都只使用实际插入的长度。

7. 为什么从不同的数据字典看,表/索引所占用的空间不一样?

SQL> select blocks , empty_blocks from dba_tables where table_name=’表名';
BLOCKS EMPTY_BLOCKS
---------- ------------
1575 1524

SQL> select bytes,blocks,extents from dba_segments where segment_name='表名';
BYTES BLOCKS EXTENTS
---------- - --------- ----------

6348800 3100 1

这是因为第一个数据库视图DBA_TABLES的BLOCKS列是指实际上使用的BLOCK数目,还有一些BLOCK虽然被占用了,但是没有数据存在,不计入里边。而在DBA_SEGMENTS这个数据库视图里边,BLOCKS列是指这个表总共占用的BLOCK的数目,包括有数据和没有数据的BLOCK总量。如果把第一个视图里边的BLOCKS和EMPTY_BLOCKS地总和加起来,正好等于第二个视图的BLOCKS列的大小。

8. 怎样把数据库的一张,多张表存为一个普通的文本文件?

可以在SQL*Plus里边用SPOOL命令把选出来的数据保存在SPOOL指定的文件里边。

9. 怎样从一张表里删除重复的记录

SQL> SELECT * FROM EMP;

EMP_ID OFFICE_ID EMPNAME

305 12 ELLISON, GEORGE

305 12 MERCURIO, JASON

128 17 SIMPSON, LINDA

305 22 JACKSON, DREW

使用下面的SQL语句来识别那些重复的记录:

SQL> SELECT COUNT(*), EMP_ID, OFFICE_ID

FROM EMP

GROUP BY EMP_ID, OFFICE_ID

HAVING COUNT(*) > 1;

结果如下:

COUNT(*) EMP_ID OFFICE_ID

2 305 12

Table Example, with duplicate values:

SQL> SELECT * FROM EMP;

EMP_ID OFFICE_ID EMPNAME

305 12 ELLISON, GEORGE

305 12 MERCURIO, JASON

128 17 SIMPSON, LINDA

305 22 JACKSON, DREW

使用下面的语句来删除重复的记录:

SQL> DELETE FROM EMP A WHERE

(EMP_ID, OFFICE_ID, 2) IN

(SELECT EMP_ID, OFFICE_ID, decode(count(*),1,1,2)

FROM EMP B

WHERE A.EMP_ID=B.EMP_ID AND

A.OFFICE_ID = B.OFFICE_ID

GROUP BY EMP_ID, OFFICE_ID);

10. 怎样在SQL*PLUS里想数据库插入特殊字符?

可以使用CHR函数。

11. 怎样删除一个列?

在Oracle8i里边,可以直接Drop一个列。语法为alter table table_name drop column_name;

但是注意要在initsid.ora里边设定compatible=8.1.0以上。

12. 怎样重命名一个列?

1 alter table "table_name" add
(new_column_name data_type);

2 update table_name set new_column_name =
old_column_name where rowid=rowid;

3 alter table table_name drop column
old_column_name;

13. 怎样快速清空一张表?

Truncate table table_name;

14. 怎样为事务指定一个大的回滚段?

Set transaction use rollback segment rbs_name;

15. 怎样知道一张表上有那些权限赋予了哪些人,给他们了什么权限?

select * from dba_tab_privs where table_name='表名';

16. 怎么发现是谁锁住了你需要的一张表?

Select object_id from v$locked_object;

Select object_name, object_type from dba_objects where object_id=’’;

每次清空一张表的时候,(使用truncate),这张表的存储参数NEXT自动复位到最后被删除的那个extent的大小。同样,如果显式地从一张表里边释放空间,NEXT参数也会自动被设置成最后被释放的那个extent的大小。

在SQL*Plus里边可以为一个事务指定一个回滚段:这在有大的事务将要发生的话时候还是很有用的。使用下面的语句可以为这个事务指定一个回滚段:

SQL>SET TRANSACTION USE ROLLABCK SEGMENT 回滚段名称;

还可以在PL/SQL里边为一个事务指定一个回滚段(不使用动态sql语句)。这个需要使用Oracle提供的包:DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT(‘回滚段名称’);

在有些平台上的Oracle,在启动的时候会自动生成一个sgadefSID.dbf,用这个文件是否存在就可以判断一个实例是否在运行。这个文件包含了SGA在内存中的地址。在数据库关闭的时候,Oracle会自动删除这个文件。但是在Oracle8i里边,这个文件不再存在了。需要使用新的判断方式来断定究竟某个实例是否在运行。比如PS命令。

在Oracle7里边,想要知道数据文件是否可以自动扩展,必须从sys.filext$这张表里边查取,但是在Oracle8里边,从dba_data_files里边就可以知道数据文件是否可以自动扩展了。

从Oracle8i开始,可以创建另一类数据库一级的触发器,比如数据库启动、关闭,用户登录、注销等事务,都可以触发这个事件的发生,从而作某些记录。在数据库一级定义的触发器会在所有用户相应事件发生的时候触发,而在Schema一级定义的触发器只有在某个特定用户的相应事件发生的时候才会触发。

从Oracle8i开始,多了一种关闭数据库的方式:SHUTDOWN
TRANSACTIONAL。这种方式允许所有的用户提交它们的工作。但是一旦提交之后就马上被切断联接,等所有用户都完成了各自的事务,shutdown就开始了。

从Oracle8开始,可以创建临时表,这些表的定义对于所有该用户的会话都是可以看到的,但是每个会话查询、插入、删除的数据和别的会话查询、插入、删除的数据都是不相关的。就像每个会话都分别有这样一份表一样。

从Oracle8i开始,对于那些没有进行分区的表,可以不用IMP/EXP就可以快速重组。但是这需要两倍于该表容量的表空间。这个语句就是:

ALTER TABLE TB_NAME MOVE TABLESPACE TS_NAME;

在Oracle8i里边可以创建反序索引。(CREATE INDEX i ON t (a,b,c)
REVERSE;)。由于反序索引的相邻键值不是存放在物理相邻的位置,因此只有全索引扫描或者通过单个列这一类语句才能够有效利用这些索引。这类反序索引在Oracle并行服务器上能够较好地协调不同实例对数据库的修改,可以在一定程度上提高系统性能。

从Oracle8开始,$instance视图可以查获许多有用的信息:比如主机名称,实例名,启动时间,版本号等。

临时表空间里边创建的临时段只有在shutdown地时候才会被释放。

但是在permanent表空间里边创建的临时段在一个事务结束之后就会被释放,有Smon进程来完成这个任务。
__________________
任弱水三千,我独取一瓢饮!
勿以善小而不为,勿以恶小而为之!
不要以为登上了山峰,你就征服了世界!
出差[忙].

 

由 jlandzpa 于 01-11-07 04:44 发表:
oracle FAQ(2) from chao_ping
关于OPTIMAL参数

optimal是用于限制回滚段大小的一个存储参数。在执行一个长的事务之后,那个事务所使用的回滚段会比较大,而设置了Optimal这个参数以后,一旦事务提交结束,回滚段自动收缩到Optimal所指定的大小。

如果你的系统中有许多长时间运行的事务的话,那么应该把回滚段的Optimal参数设置的比较大一点。这样有利于保持回滚段表空间的连续性。否则不断的扩张、收缩会使表空间更加破碎。

如果系统中主要的事务都是短时间的,那么应该把回滚段设置的比较小一些,这样有利于让回滚段里面的信息可以存储在SGA里边,以利于提高系统性能。

回滚段的Optimal参数可以在创建回滚段的时候指定,也可以用

ALTER ROLLBACK SEGMENT SEGMENT_NAME OPTIMAL XX M;这样来重新设定。

Oracle8i 里边的

ALTER SESSION SET CURRENT_SCHEMA=

可以用来更改当前的用户模式。


Oracle公司已经宣称,不再支持server manager,这个工具自从Oracle
6.0开始,就一直是管理Oracle数据库的主要工具。现在,SQL*Plus替代了Server Manager的地位,因此,Server
Manager中相应的功能也都集成到了SQL*Plus之中。

SQL*Plus新增加的主要命令是startup, shutdown, archive
log,和recover。当然,标准的SQL语法仍然是支持的了,比如一系列的CREATE,
ALTER等语句。但是也对其中的一些有了一些改变,比如原来不支持的ALTER DATABASE OPEN,ALTER DATABASE MOUNT,ALTER
DATABASE BACKUP 等句子。

对于SET命令,也多了一些新的选项,用来包含一些如自动恢复等。SHOW命令也开始可以用来直接显示参数SHOW PARAMETER ,SHOW
SGA等。而这些,原来都只是在Server Manager里面才有的功能。

 

Oracle8i仍旧保留了尽人皆知的INTERNAL账户,但是要记住,这主要是为了向后兼容。INTERNAL账户的功能现在开始有SYSDBA,SYSOPER这两个角色来支持了。INTERNAL/SYS的口令可以用下面这个方法来进行修改:

O/S Prompt> orapwd password=<some password>

当数据库刚刚创建的时候,SYS的密码默认为change_on_install,而SYSTEM的密码是manager,而INTERNAL则根本就没有密码。因此,创建完数据库之后,第一件要做的事情就是改变以上三个用户的口令。INTERNAL的口令可以用前面提到过的方法来改变,而SYSTEM,SYS则可以直接用ALTER
USER username IDENTIFIED BY password;来更改。注意,在Oracle8i开始,ALTER USER SYS
IDENTIFIED BY
password;同时也会更改INTERNAL的密码,如果你为INTERNAL设置了密码的话,同时,马上把SYSDBA,SYSOPER这两个角色授予负责管理这个数据库的用户。对于那些使用INTERNAL来连接数据库的脚本,也要相应的作一些修改。

启动和关闭数据库:

要从SQL*Plus里边启动数据库,请按照以下的步骤进行:

O/S Prompt>sqlplus /nolog

SQL> connect scott/tiger as SYSDBA

SQL> startup

如果希望用不同于默认得参数来启动数据库,可以使用下面代参数的启动命令:

SQL> startup PFILE=<init.ora file to be used>

有时候需要启动数据库,但是不让普通用户进入,比如为了平衡IO,需要移动一个数据文件的位置,这时候就需要改变默认得启动选项:

SQL> startup mount

当完成了维护任务之后,可以选择关闭数据库然后再重新按照正常方式打开,或者直接在SQL*Plus里边输入下面的命令,Oracle就可以开始正常运行了:

SQL> alter database open

有时候需要创建一个新的数据库,或者需要重建控制文件,就需要用下面的语句:

SQL> startup nomount

有时候,数据库难以正常启动,就可以考虑使用下面的办法来强迫启动:使用FORCE选项,STARTUP FORCE实际上相当于一个SHUTDOWN
ABORT然后再STARTUP这样一个过程。

SQL> startup force

SHUTDOWN这个命令也有好几种参数可以选择:

正常关闭是等待所有用户都从系统退出以后,再正常关闭系统。这是一种最最理想的关闭数据库的方式。一般都应该使用这种方式来正常关闭数据库。

SQL> shutdown

在Oracle8i开始,新加了一个关闭选项:SHUTDOWN
TRANSACTIONAL。这允许所有用户都完成它们的事务,一旦事务提交,马上被断开连接。这样既保证了用户不会丢失它们的事务,也保证了数据库可以及时关闭,进行必要的维护操作。这种方式关闭的话,下次系统启动之后,也不用进行实例一级的恢复。比下面提到的另外两种方式都要理想。

SQL> shutdown transactional

SHUTDOWN
IMMEDIATE是马上中止用户的当前事务,并不等这些事务完成,回滚这些用户的当前事务。但是如果有一些事务很久没有提交的话,那么SHUTDOWN
IMMEDIATE或许就不像说得那样IMMEDIATE了。可能也要花很多时间来回滚这些事务。

SQL> shutdown immediate

在Oracle8i里边最后一种关闭方式是SHUTDOWN
ABORT。这种关闭方式和直接关闭计算机的电源其实没有太多的区别。任何当前连接的用户都被马上断开联接,在下次实例再次启动的时候,必须进行实例一级的恢复,用以回滚没有提交的事务。

SQL> shutdown abort

ALTER TABLE table_name MOVE之后,表上的索引标志为UNUSABLE?

在Oracle8i开始,可以直接使用alter table table_name move [tablespace tablespace_name];

来为一张表移动到另一个表空间,或者重新组织表的存储方式,以减少碎片。但是,这样使用过之后,所有这张表上的索引都将被标志为unusable。这是因为MOVE一张表之后,表中列对应的物理位置都改变了,就是所有行的ROWID都变化了,而这张表的索引就用到了其中行的ROWID。由于Oracle不会自动更新索引对应的ROWID,这时候,索引上的ROWID就指向了错误的地方。因此,索引被标志为UNUSABLE。这时候,你就需要手工重建索引。可以使用下面的语法来重建索引:

ALTER INDEX index_name
REBUILD;当然,还可以为索引指定特定的合适的存储参数,来优化索引的存储。或许Oracle之所以没有自动维护索引,就是为了让你可以为索引指定合适的存储参数。

如何远程安装Oracle:

如果需要从PC机上的X-window客户端安装Unix上的Oracle系统,要注意下面这一点:Oracle8i使用的是Universal
Installer,使用了Java技术,必须在图形界面下安装。如果是远程安装,必须设置一下什么地方来显示Universal Installer的图形界面:使用

$DISPLAY=workstation_name:0.0

$export DISPLAY

举一个例子,你的PC机的IP地址是150.150.4.128,机器名字叫做test,那么就可以使用下面的语法来进行为安装作准备工作:

$DSIPLAY=150.150.4.128:0.0

$export DISPLAY

或者使用下面的语法,但是必须这个test机器的信息写在hosts文件里边:

DSIPLAY=test:0.0

$export DISPLAY
__________________
任弱水三千,我独取一瓢饮!
勿以善小而不为,勿以恶小而为之!
不要以为登上了山峰,你就征服了世界!
出差[忙].

 

由 easyfree 于 01-11-07 17:27 发表:
呵呵,你怎么把我兄弟的个人网站上的东东搬过来了?
人家可是有版权的

下次如果有其他网站上的, 给个链接, 谢谢

不过还是很感谢你的支持, 再接再厉
__________________

生年不满百,常怀千岁忧。
昼短苦夜长,何不秉烛游!
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。

 

由 jlandzpa 于 01-11-07 18:17 发表:
sorry,是我疏忽了.
chao_ping的网站:
http://chaoping.home.chinaren.com/
__________________
任弱水三千,我独取一瓢饮!
勿以善小而不为,勿以恶小而为之!
不要以为登上了山峰,你就征服了世界!
出差[忙].

 

由 allanliao 于 01-11-08 04:22 发表:
 FOOT N问题的简化
换一个思路,
其实很多情况下,FOOT N问题很容易处理的:
从数字逻辑看,
FOOT N <==> [反 TOP ] N

所以,FOOT N 就是TOP N,无非排序方式用降序就可以了
如:
SELECT * FROM
( SELECT * FROM emp ORDER BY empno DESC)
WHERE ROWNUM<=N
__________________
【单骑】
万水千山独行
找我登天路径


由 easyfree 于 01-11-08 21:32 发表:
Re: FOOT N问题的简化
  quote:

  最初由 allanliao 发布
  换一个思路,
  其实很多情况下,FOOT N问题很容易处理的:
  从数字逻辑看,
  FOOT N <==> [反 TOP ] N

  所以,FOOT N 就是TOP N,无非排序方式用降序就可以了
  如:
  SELECT * FROM
  ( SELECT * FROM emp ORDER BY empno DESC)
  WHERE ROWNUM<=N

 


好思路,谢谢
__________________

生年不满百,常怀千岁忧。
昼短苦夜长,何不秉烛游!
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。

 

由 sun 于 01-11-10 00:23 发表:
thanks a lot


由 yh2ygy 于 01-11-10 04:49 发表:
收到
不错不错,欧留下了


由 rich3 于 01-11-13 06:11 发表:
受益菲浅
多谢多谢


由 ykliu_ora 于 01-11-17 03:00 发表:
非常感谢


由 fergio 于 01-11-17 20:04 发表:
i have a question
Max number of Prespanwned server process are defined by --------

Prespawn_Max or prespawn_max_servers?
__________________
让西北象我的精神一样朝气蓬勃!
让西北的经济象我的思想一样快速发展!

 


由 tonyxucanada 于 01-11-28 12:03 发表:
Re: FOOT N问题的简化
remember: whenever you want use ROWNUM , you may not want to use ORDER BY
clause, otherwise you won't get any correct result. so the first script is
correct, your's is incorrect.


由 lgw 于 01-11-29 21:30 发表:
fergio
初级会员

注册日期: 2001 Nov
来自: 兰州
发帖数量: 14
论坛积分:420
i have a question
Max number of Prespanwned server process are defined by --------

Prespawn_Max or prespawn_max_servers?


__________________
fergio loo

the succ answer is prespawn_max_servers


由 freebob 于 01-12-13 19:26 发表:
这是俺在linuxforum上看的一文章,很棒,于大家共享(1)
完整的手工建立ORACLE数据库步骤
作者:Winder(杭州)
E_MAIL: lswandlm@163.net
URL: http://www.qyhhschool.com

数据库: Oracle 8i R2 (8.1.6)
安装路径:/data/ora816
数据库实例:web
数据库全局名称:web.edi.com

1、手工创建相关目录
/data/ora816/admin/web
/data/ora816/admin/web/adhoc
/data/ora816/admin/web/bdump
/data/ora816/admin/web/cdump
/data/ora816/admin/web/create
/data/ora816/admin/web/exp
/data/ora816/admin/web/pfile
/data/ora816/admin/web/udump

/data/ora816/oradata/web
/data/ora816/oradata/web/archive

2、手工创建初始化启动参数文件:/data/ora816/admin/web/pfile/initweb.ora
检查$ORACLE_HOME/dbs目录下是否有初始化文件,比如如果您的sid是web,则在此目录下应该有一个initweb.ora的文件,如果没有,您可以将init.ora文件复制成initweb.ora文件:cp
init.ora
initweb.ora.如果您的sid是web,则在此目录下应该有一个initweb.ora的文件,如果没有,您可以将init.ora文件复制成initweb.ora文件:cp
init.ora initweb.ora.
ln -s /data/ora816/admin/web/initweb.ora /data/ora816/dbs/initweb.ora

附:initweb.ora内容(见后)

3、使用orapwde命令,创建/data/ora816/dbs/orapwweb
命令:orapwd file=/data/ora816/dbs/orapwweb password=ORACLE entries=5

4、检查环境变量是否设置:ORACLE_HOME,ORACLE_SID,检查方法:输入命令echo $ORACLE_HOME,或者echo
$ORACLE_SID,如果这两个环境变量没有设置,您将会发现输出一个空行,这时您可以通过以root权限登录,修改/etc/profile文件,在末尾填上:ORACLE_HOME=您安装ORACLE时的主路径,如/data/ora816
ORACLE_SID=您安装时所定的sid,如orcl,我在上面的文件中是web
export ORACLE_HOME ORACLE_SID
同时您还应该修改PATH环境变量,以便于使用工具svrmgrl,sqlplus等。将bin目录加入到PATH中。

5、分别检查是否存在下列文件$ORACLE_HOME/rdbms/admin/catdbsyn.sql,$ORACLE_HOME/rdbms/admin/catproc.sql,$ORACLE_HOME/sqlplus/admin/pupbld.sql,如果不存在,请重新安装您的oracle系统。


6、准备创建脚本:create_db.sql

rem 脚本开始
connect internal
startup nomount pfile="$ORACLE_HOME/admin/web/pfile/initweb.ora"
set echo on
spool makedb.log
create database web
datafile '$ORACLE_HOME/oradata/web/web_syst_01.dbf' size 500M reuse
logfile
'$ORACLE_HOME/oradata/web/web_redo_01.dbf' size 10M reuse,
'$ORACLE_HOME/oradata/web/web_redo_02.dbf' size 10M reuse,
'$ORACLE_HOME/oradata/web/web_redo_03.dbf' size 10M reuse
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
MAXDATAFILES 254
MAXINSTANCES 1
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET ZHS16GBK;

connect INTERNAL/oracle
rem --修改系统表空间
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1
MAXEXTENTS UNLIMITED PCTINCREASE 50);
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K;
connect INTERNAL/oracle

rem --修改系统表空间
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1
MAXEXTENTS UNLIMITED PCTINCREASE 50);
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K;

rem --创建回滚表空间
CREATE TABLESPACE RBS DATAFILE '/data/ora816/oradata/web/rbs01.dbf' SIZE 256M
REUSE
AUTOEXTEND ON NEXT 5120K
MINIMUM EXTENT 512K
DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096);

rem --创建用户表空间
CREATE TABLESPACE USERS DATAFILE '/data/ora816/oradata/web/users01.dbf' SIZE
128M REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096
PCTINCREASE 0);

rem --创建临时表空间
CREATE TABLESPACE TEMP DATAFILE '/data/ora816/oradata/web/temp01.dbf' SIZE 32M
REUSE
AUTOEXTEND ON NEXT 640K
MINIMUM EXTENT 64K
DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED
PCTINCREASE 0) TEMPORARY;

rem --创建工具表空间
CREATE TABLESPACE TOOLS DATAFILE '/data/ora816/oradata/web/tools01.dbf' SIZE 64M
REUSE
AUTOEXTEND ON NEXT 320K
MINIMUM EXTENT 32K
DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE
0);

rem --创建索引表空间
CREATE TABLESPACE INDX DATAFILE '/data/ora816/oradata/web/indx01.dbf' SIZE 32M
REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096
PCTINCREASE 0);


由 freebob 于 01-12-13 19:28 发表:
这是俺在linuxforum上看的一文章,很棒,于大家共享(2),太长,分两部分,我可不是为了增加茄子数量
rem --创建回滚段
CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );

rem --使回滚段在线
ALTER ROLLBACK SEGMENT "RBS0" ONLINE;
ALTER ROLLBACK SEGMENT "RBS1" ONLINE;
ALTER ROLLBACK SEGMENT "RBS2" ONLINE;
ALTER ROLLBACK SEGMENT "RBS3" ONLINE;
ALTER ROLLBACK SEGMENT "RBS4" ONLINE;
ALTER ROLLBACK SEGMENT "RBS5" ONLINE;
ALTER ROLLBACK SEGMENT "RBS6" ONLINE;
ALTER ROLLBACK SEGMENT "RBS7" ONLINE;
ALTER ROLLBACK SEGMENT "RBS8" ONLINE;
ALTER ROLLBACK SEGMENT "RBS9" ONLINE;
ALTER ROLLBACK SEGMENT "RBS10" ONLINE;
ALTER ROLLBACK SEGMENT "RBS11" ONLINE;
ALTER ROLLBACK SEGMENT "RBS12" ONLINE;
ALTER ROLLBACK SEGMENT "RBS13" ONLINE;
ALTER ROLLBACK SEGMENT "RBS14" ONLINE;
ALTER ROLLBACK SEGMENT "RBS15" ONLINE;
ALTER ROLLBACK SEGMENT "RBS16" ONLINE;
ALTER ROLLBACK SEGMENT "RBS17" ONLINE;
ALTER ROLLBACK SEGMENT "RBS18" ONLINE;
ALTER ROLLBACK SEGMENT "RBS19" ONLINE;
ALTER ROLLBACK SEGMENT "RBS20" ONLINE;
ALTER ROLLBACK SEGMENT "RBS21" ONLINE;
ALTER ROLLBACK SEGMENT "RBS22" ONLINE;
ALTER ROLLBACK SEGMENT "RBS23" ONLINE;
ALTER ROLLBACK SEGMENT "RBS24" ONLINE;

rem --修改sys用户的临时表空间为TEMP
alter user sys temporary tablespace TEMP;

rem --创建数据字典表
connect system/manager
@$ORACLE_HOME/rdbms/admin/catdbsyn.sql

connect internal
@/data/ora816/rdbms/admin/catalog.sql;
@/data/ora816/rdbms/admin/catexp7.sql
@/data/ora816/rdbms/admin/catproc.sql
@/data/ora816/rdbms/admin/caths.sql

connect system/manager
@/data/ora816/sqlplus/admin/pupbld.sql

connect internal/oracle
@/data/ora816/rdbms/admin/catrep.sql

rem --修改system用户默认表空间和临时表空间
alter user system default tablespace SYSTEM;
alter user system temporary tablespace TEMP;

spool off
rem 脚本结束


7、执行脚本
您可以进行执行脚本了,转到目录:$ORACLE_HOME/dbs中去,并且将上面的create_db.sql也放到此目录中,下面开始了:

键入命令:svrmgrl回车
SVRMGR>connect internal
connected.
SVRMGR>startup回车
SVRMGR>@create_db.sql回车(ok,下面您就可以看到屏幕在不断的显时操作过程,大概需要半个多小时的时间或许还要长一点点)。
执行完毕之后您可能需要退出去
SVRMGR>exit
没有错误的话,现在您的数据库已经生成了。

8、生成SQL*Plus帮助系统
sqlplus SYSTEM/manager
@/data/ora816/sqlplus/admin/help/helpbld.sql helpus.sql

9、部分说明

1)、create database web
datafile '$ORACLE_HOME/oradata/web/web_syst_01.dbf' size 500M reuse
logfile
'$ORACLE_HOME/oradata/web/web_redo_01.dbf' size 10M reuse,
'$ORACLE_HOME/oradata/web/web_redo_02.dbf' size 10M reuse,
'$ORACLE_HOME/oradata/web/web_redo_03.dbf' size 10M reuse

请注意看一下生成的文件名字:web_syst_01.dbf,web_redo_01.dbf,web_redo_02.dbf,web_redo_03.dbf,请注意将您的sid换成相应的部分,在我的例子中我的sid是web。


另外还有生成表空间时的几个文件:
create tablespace rollback
datafile '$ORACLE_HOME/dbs/web_roll_01.dbf' size 8M reuse;

create tablespace temp
datafile '$ORACLE_HOME/dbs/web_temp_01.dbf' size 5M reuse
temporary;

create tablespace users
datafile '$ORACLE_HOME/dbs/web_user_01.dbf' size 10M reuse;

最好也要改成相应的名字

2)、connect system/manager
@$ORACLE_HOME/rdbms/admin/catdbsyn.sql
connect internal
@$ORACLE_HOME/rdbms/admin/catproc.sql
connect system/manager
@$ORACLE_HOME/sqlplus/admin/pupbld.sql

其中的connect system/manager 是假设您的system账号的密码就是manager(系统默认的),如果您通过alter user
system identified by 修改了密码,请换成正确的密码登录。

3)、initweb.ora文件内容:
db_name = "web"
instance_name = web
service_names = web.edi.com
db_files = 1024
control_files = ("/data/ora816/oradata/web/control01.ctl",
"/data/ora816/oradata/web/control02.ctl", "/d
ata/ora816/oradata/web/control03.ctl")
open_cursors = 200
max_enabled_roles = 30
db_file_multiblock_read_count = 8
db_block_buffers = 4096
shared_pool_size = 52428800
large_pool_size = 78643200
java_pool_size = 20971520
log_checkpoint_interval = 10000
log_checkpoint_timeout = 1800
processes = 115
parallel_max_servers = 5
log_buffer = 32768
max_dump_file_size = 10240
global_names = true
oracle_trace_collection_name = ""
background_dump_dest = /data/ora816/admin/web/bdump
user_dump_dest = /data/ora816/admin/web/udump
db_block_size = 16384
remote_login_passwordfile = exclusive
os_authent_prefix = ""
job_queue_processes = 4
job_queue_interval = 60
open_links = 4
distributed_transactions = 10
mts_dispatchers = "(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)"
mts_dispatchers = "(protocol=TCP)"
compatible = 8.1.0
sort_area_size = 65536
sort_area_retained_size = 65536

# log_archive_start = true
# log_archive_dest_1 = "location=/data/ora816/oradata/oradb/archive"
# log_archive_format = %%ORACLE_SID%%T%TS%S.ARC

-------------
Excellent work!

Some additions:
7. after connect as internal, you should run your creat_db.sql. (delete that
part: startup).
9- 3). In the initweb.ora, you should add rollback_segments = ( RBS0, RBS1, RBS2
...) in order for them to be online next time the database is started.
Otherwise, you have to bring them online again (you have 24 RBS!).
db_block_size is a important parameter, you should includ it here.

Normally, you don't need to change defaul tablespace for sys and system, they
are SYSTEM by default if you create one. If you do want to change them, you
should do so before you run those catXX.sql.

Thanks for your hard work.


由 cghlily 于 02-01-09 16:39 发表:
请教:我在一个大型数据库(有1200万记录)的某些字段上无法创建位图索引,但创建了B_TREE索引时却可以,不知道是怎么回事?

 

所有时间均为 +8 hours . 现在时间是 01:28.
Powered by: vBulletin Version 2.0.1
Translated and hacked by:Ztbbs.
Copyright &copy; Jelsoft Enterprises Limited 2000, 2001.
Copyright by itpub.net

收藏助手
不良信息举报
您举报文章:oracle收集:常见问题解答
举报原因:
原因补充:

(最多只允许输入30个字)