Oracle数据库罕有标题答疑

 根源:网海拾贝




Oracle数据库以其强大的效用和稳固性而著称,但同时,在开辟和管理方面也存在很多难题,笔者在此总结了一些Oracle数据库开辟和管理的罕有标题,希望能对大家有所赞助。

问:如果缔造表中有坏块,若何检索别的未坏的数据?

答:首先需求找到坏块的ID(可以运转dbverify完成),假定为1234。运转下面的究诘查找段名:

select segment_name, segment_type, block_id, blocks

from dba_extents

where (1234 between block_id and (block_id blocks - 1));

一旦找到坏段称谓,若段是一个表,则最好创建一个临时表,寄存好的数据。若段是索引,则删除它,再重修。

create table good_table

as

select  from bad_table where rowid not in

( select / index(bad_table, any_index)/ rowid

from bad_table where substr( rowid, 1, 8 ) = 1234)

问:如叨教若何干闭FORM挪用REPORT时的小窗口?

答:在应用Oracle数据库的Develop 2000希图开辟界面的进程中,当FORM挪用REPORT时,会显示一个背景窗口REPORT BACKGROUD ENGINE,等待FORM对REPORT的挪用,当FORM挪用别的REPORT时,也运用这个背景效力器,不管挪用多少个REPORT,这个背景效力器存在且只需一个。但当FORM与REPORT全部到场后,该窗口仍处于等待状况,不会关闭,这时,我们需求手工将其关闭。

我们可以运用以下参数在FORM挪用REPORT时不显示这个小窗口:

Add_Parameter( pl_id, 'ORACLE_SHUTDOWN',TEXT_Parameter, 'Yes' );

需求留意的是,该参数必须加在全部参数的后面,即它必须为第一个参数。

问:叨教若何依据究诘条件在REPORT中静态显示记载?

答:1. 在REPORT的“数据模型”下面的“用户参数”中,创建用户自界说参数W_CLAUSE,W_CLAUSE为从FORM转达曩昔的究诘条件,数据典范榜样为字符型,缺省值为NULL。

2. 点窜究诘Q_1,将SQL究诘语句点窜为select  from dept &&w_clause。

3. 在运转报表时,报表会自动将契合&&w_clause的究诘条件记载显示出来。

如果从FORM转达曩昔的w_clause为where dept=1,本报表的SQL究诘自动转换为select  from dept where dept=1,并在报表运转成效中显示契合该究诘条件的记载,如果从FORM转达曩昔的w_cluase为where to_char(年度,'YYYY.MM')='2000.03',则在报表运转成效中自动显示2000年3月份的记载。

问:在Oracle中,我们若何反省某表上的束厄局促?

答:我们可以运用下面语句从all_constraints视图中反省某表上的束厄局促:

SELECT constraint_name, table_name, r_owner, r_constraint_name

FROM all_constraints

WHERE table_name = 'table_name' and owner = 'owner_name';

另一个视图ALL_CONS_COLUMNS也包括组成表上束厄局促列的信息。

问:若何将数据库从noarchivelog方式改动为archivelog方式?

答:首先翻开Init.ora文件,确糊口档日记方针指向一有用目录。

然后启动Server Manager

svrmgrl〉 shutdown immediate

svrmgrl〉 startup mount

svrmgrl〉 alter database archivelog;

svrmgrl〉 alter database open;

svrmgrl〉 archive log list;

在init.ora中设置参数archive_log_start=TRUE,它设置存档日记为自动启动。在Oracle 8i中撑持多个存档日记的方针,因此参数点窜为log_archive_dest[n],其中n为1到5。

问:在Oracle数据库中,我们若何添加表空间的大年夜小?

答: 在开辟Oracle数据库中,我们有两种方式添加表空间的大年夜小:

1.添加额定的数据文件到表空间中

比方:alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;

2.点窜表空间以后的数据文件

比方:alter database datafile

'/u01/oradata/orcl/users01.dbf' resize 50M;

问:叨教若安在REPORT中设置静态显示域?

答:在REPORT中设置静态显示域的方式如下:

1. 在REPORT的“数据模型”下面的“用户参数”中,创建用户自界说参数,如RQ,RQ是从FORM转达曩昔的显示日期,数据典范榜样为字符型。

2. 在结构模型中,创建一个显示域F_1,在属性选项板中点窜该显示域的源为用户自界说参数RQ,并且设为“弗偏见的”。

3. 在静态预览中,创建一个文本域D_1,调整该文本域的地位和宽度,在该域的内容中输出&&F_1,则该域会静态显示用户界说参数RQ的值。

问:有关口令

我在Solaris琐细上运转 Oracle8i 8.1.7企业版。我创建了两个数据库:SUGAR和TestDb。将两者的remote_login_passwordfile都设置为 “独有(exclusive)”。我试图以SYSDBA身份毗连到TestDb,但未能乐成。下面是我的做法:

$sqlplus /nolog

SQL> conn sys/change_on_install@testdb

Connected.(已毗连)

SQL> select * from v$pwfile_users;

username sysdb sysop

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

internal true true

sys true true

SQL> conn sys/change_on_install@testdb as

sysdba

ERROR(错误)

ORA-01017: invalid username/password; logon

denied(有用的用户名/口令,登录被拒绝)

Warning: You are on longer connected to

ORACLE(警告:你已经与ORACLE断开毗连)

我为什么不能以SYSDBA身份毗连到TestDb?

答:凡是Oracle中的SYS口令与INTERNAL口令是同步的,SYS口令存储于口令文件中。在上述情形下你创建了包括有一个口令的口令文件,而不是运用缺省的 “change_on_install,”这便是标题之所在。

希望下面的方式对你有所赞助。首先,创建一个口令文件,其中包括一个口令,这个口令不要与琐细口令结婚:

$ orapwd file=orapw password=foobar

entries=40

然后,进入效力器,启动数据库:

$ svrmgr

SVRMGR> connect internal

Connected.(已毗连)

SVRMGR> startup

ORACLE instance started.(ORACLE 实例已启动)

Total System Global Area (琐细全局地区大年夜小)

193073136 bytes

Fixed Size (巩固大年夜小)

69616 bytes

Variable Size (可变大年夜小)

141639680 bytes

Database Buffers (数据库缓冲区)

45056000 bytes

Redo Buffers (重做缓冲区)

6307840 bytes

Database mounted. (数据库已加载)

Database opened.数据库已翻开。

眼前目今当今运用SYS用户的口令,以SYS身份毗连:

SVRMGR> connect sys/change_on_install@ora81

Connected.(已毗连)

乐成了。眼前目今当今试着以SYSDBA身份毗连:

SVRMGR> connect sys/change_on_install@ora81

as sysdba;

ORA-01017: invalid username/password; logon

denied(有用的用户名/口令;登录被拒绝)

这里出现了你所说的错误。你的SYS口令为:change_on_install,但口令文件中的口令却是foobar。SYS用户是公用的,以SYSDBA身份毗连就像因此INTERNAL毗连,你必须运用口令文件中的口令。尝尝如许做:

SVRMGR— connect sys/foobar@ora81 as sysdba;

Connected.(已毗连)

并不是每小我都需求运用口令文件中的口令;用户需求运用他们自身的口令。经由进程受权SYSDBA给SCOTT,你就可以明晰这一点:

SVRMGR> grant sysdba to scott;

Statement processed.(已措置惩罚)

这个下令将SCOTT以SCOTT的凭证到场到口令文件中。如果你改动了SCOTT的口令,口令文件也会自动同步改动。眼前目今当今,你可以尝尝以SYSDBA身份毗连SCOTT了:

SVRMGR> connect scott/tiger@ora81 as sysdba;

Connected.(已毗连)

通通正常。眼前目今当今可以运用ALTER USER 下令来改动SYS用户的口令。

SVRMGR> alter user sys identified by

change_on_install;

Statement processed.(已乐成更动)

SVRMGR≫ connect sys/change_on_install@ora81

as sysdba;

Connected.(已毗连)

你还可以用change_on_install,因为改动SYS用户口令将同时改动口令文件中的口令。当你创建了口令文件后,Oracle数据库在其中放入两个账号:SYS和INTERNAL,并将你鄙人令行中供应的口令作为这两个账户的口令。当你改动数据库中的SYS用户口令时,数据库将冲失口令文件中的SYS和INTERNAL口令。下面操纵将显示口令foobar已经是有用的了:

SVRMGR> connect sys/foobar@ora81 as sysdba;

ORA-01017: invalid username/password; logon

denied(有用的用户名/口令,登录被拒绝)

问:应用QUERY选项输出数据

我知道在Oracle8i中,可以运用QUERY有选择地输出表数据。我想用EXP下令来完成,但没有乐成。下面是我所写的下令,以及失失的错误信息:

exp ddd/ddd file=/dbf/u11/customer.dmp

tables=AASC.AST_CUSTOMER_KEEP

query='where CUA_TRANS_DTS <

add_months(sysdate, -6)'

table_export[2]: CUA_TRANS_DTS: not found.(没有找到)

答:操纵琐细差别,用来指定QUERY=参数的方式也差别。WHERE 语句内里每每有很多不凡的字符,如=.>.<和空格等等。而UNIX和Windows操纵琐细中的外壳下令提示是不欢送这些字符的,这些字符将被忽略。你应该依据差别的操纵琐细采用不必的方式。我普通运用带有QUERY选项的参数文件(PARFILE),应用PARFILE,可以不思虑操纵琐细平台而运用完全相通的方式。

下面给出一个例子。我用select * from all_objects创建了一个表T,我希望输出全部object_id 小于5000的行。在Windows中,必须如许做:

C:exp>exp userid=tkyte/tkyte tables=t

query="""where object_id < 5000"""

留意:在windows中,需求在WHERE语句的两头运用三个双引号。在UNIX中,必须如许做:

$ exp userid=/ tables=t query="where

object_id < 5000"

exp userid=/ tables=t parfile=exp.par

如果运用包括query="where object_id < 5000"的PARFILE文件,我可以在两个琐细中运用相通的一个下令:

exp userid=/ tables=t parfile=exp.par

在两种操纵琐细中,完全相通。这相关于在差别的平台中运用差别的QUERY字符串任意多了。

问:DBMS_RANDOM

您可否呈报我写一个能孕育爆发大年夜于0小于1的随机数的随机数孕育爆发器的最好方式?

答:Oracle8 8.0版介绍了DBMS_RANDOM包,Oracle8i 8.1.6版介绍了DBMS_RANDOM包的新效用,但Oracle8i 文档中没有留意片面介绍其效用。侥幸的是:有一个新的DBMS_RANDOM包函数可曩昔去0-1之间的随机数。这个新函数是:

FUNCTION value RETURN NUMBER;

FUNCTION value (low IN NUMBER, high IN

NUMBER) RETURN NUMBER;

FUNCTION normal RETURN NUMBER;

FUNCTION string (opt char, len NUMBER)

RETURN VARCHAR2;

VALUE函数的第一种方式前往一个大年夜于或便是0且小于1的随机数;第二种方式前往一个大年夜于或便是LOW,小于HIGH的随机数。下面是其用法的一个示例:

SQL> select dbms_random.value,

dbms_random.value(55,100)

2 from dual;

VALUE DBMS_RANDOM.VALUE(55,100)

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

.782821936 79.6367038

NORMAL函数前往听命正态漫衍的一组数。此正态漫衍尺度流毒为1,盼望值为0。这个函数前往的数值中有68%是介于-1与 1之间,95%介于-2与 2之间,99%介于-3与 3之间。幻想上,这便是你在清单1中所看到的。

最后,是STRING函数。它前往一个长度达60个字符的随机字符串。参数OPT可以是清单2显示的值中的任何一个单个字符。

关于这些函数及DBMS_RANDOM包的文件都包括在SQLPlus中:

select text

from all_source

where name = 'DBMS_RANDOM'

and type = 'PACKAGE' order by line;

问:毗连递次与谓词求值

鄙人面的究诘中,WHERE 语句的哪一部分先实验?

Select field names from emp, dept

where emp.dept_num = dept.num and

emp.name Like 'S%' and dept.name='IT';

答:实验递次随已有的索引、统计、和session/init.ora参数的差别而改变。

假定已有一个创建在DEPT(name)和EMP(dept_num)上的索引。假定优化器以为DEPT是唯一的,它或许按下面的递次避免操纵:

应用创建在DEPT(name)上的索引查找dept列

应用创建在EMP(dept_num)上的索引查找结婚的emp列(即毗连emp.dept_num = dept.num)

依据创建在emp.ename like 'S%'避免过滤

眼前目今当今,我们假定没有创建在EMP(dept_num)上的索引,也没有创建在DEPT(name)上的索引,而存在创建在EMP(name)和DEPT(num)上的索引。优化器或许按下面的递次避免操纵:

应用创建在EMP(name)上的索引找到带有S的EMPS

应用创建在DEPT(num)上的索引找到结婚项

依据dept.name = 'IT'过滤成效

谓词求值的递次是不确定的,可以随时分的改动而改动,并由优化器决定。不要假定任何工作会按肯定的递次孕育爆发。如果你那么做,跟着时分的推移,你的运用递次或许会出现一些看起来非常奇怪的错误。看以下的例子:创建一个表,输出一些数据。当X='a’时,第二列的数据“Y”是一个数值,当X='b’时,“Y”不是数字。

SQL> create table t ( x varchar2(1), y varchar2(1) );

Table created.

SQL> insert into t values ( 'a', '1' );

1 row created.

SQL> insert into t values ( 'b', 'x' );

1 row created.

眼前目今当今依据这个表运转一个究诘:查找快意x='a',y=1的行。

SQL> select * from t where x = 'a' and

y = 1;

ERROR:

ORA-01722: invalid number

no rows selected(错误,有用的数字,没有选择任何行)

呦,没有乐成。在这种情形下,数据库首先实验Y=1,当找到Y='X'的行后,很显然,它不能将'X'转换为一个数字,以是失败了。而下面的递次将给出差别的成效:

SQL> analyze table t compute statistics;

Table analyzed.(表已经阐明过)

SQL> select * from t where x = 'a' and

y = 1;

X Y

- -

a 1

运用差别的优化器方式,乐成了!为什么?优化器说:“嘿,搜检x= 'a'要比搜检y=1来得快,因为在y=1中有一个将y从字符变为数字的转换。以是,我先搜检x= 'a',然后再搜检y=1。”

这个例子阐明');谓词实验的递次或许是不确定的,你不能指望有一种特定的实验递次。也便是说,当你寄托一个隐含的转换时,必须非常严谨。

问:显示SGA--fixed size(巩固大年夜小)与variable size(可变大年夜小)

当在svrmgr提示符下运转 “show SGA”时,fixed size和variable size是什么意思?

答:fixed size便是SGA中巩固组件(它在编译oracle 数据库自身时就巩固于其中)的大年夜小。它是巩固大年夜小的内存,用来指向SGA的别的部分。SGA这一部分的大年夜小是不能改动的。

variable size指分配的内存块大年夜小可变。SGA的可变块,分为共享池、大年夜池、JAVA池、游标区和其他机关。





版权声明: 原创作品,答应转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。否则将清查法律责任。

posted @ 2011-03-07 20:07  蓝色的天空III  阅读(179)  评论(0编辑  收藏  举报