Oracel常见问题

发布时间:2012-09-26 22:18:51

Oracel 使用小结

调用脚本

sqlplus /NOLOG @ITSTDDB2SqlJj.sql "SYSTEM" "SYSTEM" "ITSTDDB2"

将索引建到特定的表空间

CREATE TABLE TAB_BK(

I_INDEX INTEGER NOT NULL ,

C_NUM VARCHAR(20) ,

C_COLOR CHAR(4) ,

I_ALARMTYPE INTEGER DEFAULT 0,

C_DESCRIPTION VARCHAR(200) ,

DT_TIMESTAMP DATE ,

C_BKFLAG INTEGER ,

CLPP CHAR(3) ,

CLWX CHAR(3) ,

CSYS VARCHAR(5) ,

CLLX CHAR(4) ,

HPZL CHAR(2) ,

BKDW VARCHAR(12) ,

BKR VARCHAR(16) ,

BKSZ CHAR(1) ,

BKFW VARCHAR(16) ,

BKJB CHAR(3) ,

BKFKSK DATE ,

BKLEN DATE ,

AJMS VARCHAR(2000) ,

YADM CHAR(4) ,

CKDW VARCHAR(12) ,

CKR VARCHAR(16) ,

CKSJ DATE ,

CKYY VARCHAR(200) ,

BKDWBH VARCHAR(12) ,

BZ VARCHAR(400) ,

BYZD VARCHAR(50) ,

I_OPERATER INTEGER DEFAULT 0,

MHBKBS INTEGER DEFAULT 0,

DXTZBS INTEGER DEFAULT 0,

CONSTRAINT INDEX_NAME PRIMARY KEY (I_INDEX) USING INDEX TABLESPACE INDEX_SPACE

);

修改oracle最大连接数

Oracle的连接数相关参数:processessessions

Oraclesessions是个派生值,由processes的值决定,sessionsprocesses的关系是:

sessions=1.1*processes + 5

1.通过SQLPlus修改

使用sys,以sysdba权限登录:

C:\Documents and Settings\Administrator>sqlplus "sys/admin@test151 as sysdba" sysdba登录test151服务)

查看数据库连接数

SQL> show parameter processes;

NAME TYPE VALUE

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 10

log_archive_max_processes integer 1

processes integer 150

SQL> alter system set processes=300 scope = spfile;

系统已更改。

SQL> show parameter processes;

NAME TYPE VALUE

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 10

log_archive_max_processes integer 1

processes integer 150

SQL> create pfile from spfile;

文件已创建。

重启数据库。

SQL> show parameter processes;

NAME TYPE VALUE

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 10

log_archive_max_processes integer 1

processes integer 300

2.通过修改oracle配置文件进行修改

修改SPFILEORCL.ORA文件中的processes的值。8.1.5中是init.ora文件,在9i中修改init.ora文件是无效的,这个文件由于是一个二进制的文件,不能直接使用notepad此类的编辑器打开。

否则会报错误ORA-27101 Shared memory realm does not exist。使用UltraEdit或者EditPlus之类的可以编辑二进制文件的编辑器打开此文件(直接编辑二进制文件),然后在Windows服务中重新启动Oracle服务器即可。

注意:此种方法修改processes值过大可能导致数据库启动失败。

3.通过Oracle Enterprise Manager Console在图形化管理器中修改

a.以系统管理员的身份登入

b.进入数据库的例程-配置-一般信息-所有初始化参数

c.修改processes的值

OERR: ORA-12519 TNS:no appropriate service handler found

Oracle超过最大连接数解决办法

客户端连接间歇性失败,报错ORA-12519



Cause: the listener could not find any available service handlers that are

       appropriate for the client connection.

Action: run "lsnrctl services" to ensure that the instance(s) have registered

        with the listener, and are accepting connections. 检查lsnrctl service instance已经注册,

状态显示ready时,可以连接。

When the listener believes the current number of connections has reached maximum load,

it may set the state of the service handler for an instance to "blocked" and begin refusing

incoming client connections with either of the following errors: ora-12519 or ora-12516

采用服务动态注册的方式,由PMON 通过SERVICE_UPDATE 来得到目前连接情况,但SERVICE_UPDATE 有时间间隔,

所以,listener显示的连接数和当前实际的连接数可能不同。



查询解决方法:

查看一下数据库现有的进程数,是否已经达到参数processes的大小。

1.select count(*) from v$process;                         取得数据库目前的进程数。

2.select value from v$parameter where name = 'processes'; 取得进程数的上限。

3.如已达到上限,修改initSID.ora中的processes的大小。

4.重新启动数据库到nomount状态下,执行create spfile from pfile; startup open



查询数据库自启动以来最大的并发数量

select * from v$license

------ end -------



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wyzxg/archive/2008/03/06/2154274.aspx

ORA-12519: TNS:no appropriate service handler found 的解决

有时候连得上数据库,有时候又连不上.

可能是数据库上当前的连接数目已经超过了它能够处理的最大值.

SQL> select count(*) from v$process;--当前连接数

     COUNT(*)

     63

SQL> select value from v$parameter where name = 'processes' --数据库允许的最大连接数

VALUE

500



修改最大连接数:

SQL> alter system set processes = 2000 scope = spfile;



重启数据库:

SQL> shutdown immediate;

SQL> startup;



--查看当前有哪些用户正在使用数据

SELECT osuser, a.username,cpu_time/executions/1000000||'s', sql_fulltext,machine

from v$session a, v$sqlarea b

where a.sql_address =b.address order by cpu_time/executions desc;

--快速删除不活动进程

set heading off

spool on

select p.SPID from v$session s,v$process p where s.paddr= p.addr and s.machine='woogle';

spool off

set serveroutput on ;

declare

v_sid number;

v_serial number;

v_sql varchar2(200) ;

CURSOR cur_session is

   select sid, serial# from v$session where machine='woogle';

begin

open cur_session ;

fetch cur_session into v_sid , v_serial ;

while cur_session%found

loop

dbms_output.put_line(v_sid||' killed!') ;

v_sql:= 'alter system kill session '||''''||v_sid||','||v_serial||'''';

execute immediate v_sql ;

fetch cur_session into v_sid , v_serial ;

end loop ;

close cur_session ;

end ;

/



Linux 下快速删除不活动进程

#!/bin/bash



tmpfile=/tmp/tmp.$$



sqlplus ' / as sysdba' << EOF



set heading off

spool on

spool $tmpfile

select p.SPID from v$session s,v$process p where s.paddr= p.addr and s.STATUS='SNIPED';

spool off

set serveroutput on ;

declare

v_sid number;

v_serial number;

v_sql varchar2(200) ;

CURSOR cur_session is

   select sid, serial# from v$session where STATUS='SNIPED';

begin

open cur_session ;

fetch cur_session into v_sid , v_serial ;

while cur_session%found

loop

dbms_output.put_line(v_sid||' killed!') ;

v_sql:= 'alter system kill session '||''''||v_sid||','||v_serial||'''';

execute immediate v_sql ;

fetch cur_session into v_sid , v_serial ;

end loop ;

close cur_session ;

end ;

/

完全删除oracle 数据库

因为之安装Oracle 10G的时候出了点问题,后来叫舍友重新发了一份Oralce 10g 客户端安装包过来装上去了。

当初使用PL/SQL是可以的,后来在因为工作需要,在一次导入同事发来的一份Oracle数据库备份,在命令符下使

IMP 语句进行导入出现 6550错误,经上网查原因有是因为服务端与客户端使用的版本不匹配的一种说法。于是

不得已决定重装Oracle,发现卸载Oralce还是比较麻烦的,需要不少的步骤才能完全卸载,下面总结了一些步骤:

1.停止所有与ORACLE相关的服务。

2. 使用OUIOracle Universal Installer)卸载Oracle软件。

 “开始”->“程序”->Oracle-OraDb110g_home1|Oracle installation product|Universal installer.

3.删除注册表内容。

 

  运行regedit命令,删除下面内容:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE注册表键,删除此键。

 

  HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services,删除Services键下所有以oracle为首的键。

 

  HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services|Eventlog|Application 删除此键下所有以oracle为首的键。

 

  HKEY_CLASSES_ROOT,删除此键下所有以OraOracleOrclEnumOra 为前缀的键。

 

  HKEY_CURRENT_USER|Software| Microsoft|Windows|CurrentVersion|Explorer|MenuOrder|Start Menu|Programs 删除此键下所有以oracle为首的键。

 

  HKEY_LOCAL_MACHINE|SOFTWARE|ODBC|ODBCINST.INI注册表键,删除了Microsoft ODBC FOR ORACLE注册表键以外的所有有Oracle字样的键值。

 

  HKEY_我的系统上没找到相关的项

LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services,删除以OracleOraWeb为前缀的键。

 

4. 删除环境变量。

  删除环境变量CLASSPATHPATH中含有Oracle字样的值。

5.最后在文件系统内删除ORACLE相关的文件及目录:删除系统盘符:\Progrm Files\Oracle目录;删除ORACLE_BASE目录。

 我无法删除D\oracle目录,重新启动机器之后才删除。

toad导入报错the oracle import utility executable must be specified

解决:

toad的设置问题,从提示上看toad也是调用exp来执行的,需要指定exp的位置。

需要到view->toad options->Executables->export中指定exp路径,如:

D:\oracle\ora10g\BIN\EXP.EXE

Oracle 索引重建相关

重建索引有多种方式,如drop and re-createrebuildrebuild online等。

下面简单比较这几种方式异同以及优缺点:

  首先建立测试表及数据:

  SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;

  Table created

  SQL> ALTER TABLE TEST MODIFY C1 NOT NULL;

  Table altered

  SQL> SELECT COUNT(1) FROM TEST;

  COUNT(1)

  ----------

  16000000

  一、drop and re-createrebuild

  首先看看正常建立索引时,对表的加锁情况。

  suk@ORACLE9I> @show_sid

  SID

  ----------

  14

  suk@ORACLE9I> CREATE INDEX IDX_TEST_C1 ON TEST(C1);

  索引已创建。

  SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;

  OBJECT_NAME LMODE

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

  OBJ$ 3

  TEST 4

  可见,普通情况下建立索引时,oracle会对基表加share锁,由于share锁和 row-X是不兼容的,也就是说,在建立索引期间,无法对基表进行DML操作。

  对于删除重建索引的方法就不介绍了,它与上面的描述是一样的,下面我们看看用rebuild的方式建立索引有什么特别。

  suk@ORACLE9I> ALTER INDEX IDX_TEST_C1 REBUILD;

  索引已更改。

  另开一个会话,查询此时test的加锁情况:

  SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;

  OBJECT_NAME LMODE

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

  TEST 4

  可见,rebuild的方式对基表的加锁方式与CREATE时是一样的。

  另开一个会话,在索引正在rebuild时,执行如下SQL

  suk@ORACLE9I> SET AUTOTRACE TRACE

  suk@ORACLE9I> SELECT /*+ INDEX(TEST) */ COUNT(1) FROM TEST WHERE ROWNUM<10;

  执行计划

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

  0 SELECT STATEMENT ptimizer=CHOOSE (Cost=26 Card=1)

  1 0 SORT (AGGREGATE)

  2 1 COUNT (STOPKEY)

  3 2 INDEX (FULL SCAN) OF 'IDX_TEST_C1' (NON-UNIQUE) (Cost=

  26 Card=1986621)

  可以看到索引在重建时,查询仍然可以使用旧索引。实际上,oraclerebuild时,在创建新索引过程中,并不会删除旧索引,直到新索引rebuild成功。

  从这点可以知道rebuild比删除重建的一个好处是不会影响原有的SQL查询,但也正由于此,用rebuild方式建立索引需要相应表空间的空闲空间是删除重建方式的2倍。

重建索引有多种方式,如drop and re-createrebuildrebuild online等。下面简单比较这几种方式异同以及优缺点:

  相关文章:

  oracle重建索引(一)

  二、rebuild rebuild online

  首先我们跟踪一下rebuild online的过程。

  另开一个会话查看锁的信息:

  SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;

  OBJECT_NAME LMODE

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

  SYS_JOURNAL_10499 4

  TEST 2

  SQL> INSERT INTO TEST VALUES(11);

  1 row inserted

  SQL> COMMIT;

  Commit complete

  可以看到,在rebuild online期间,oracle对基表加的是RS锁,此时我们可以对基表进行DML操作。但奇怪的话在相同的session中有一个SYS_JOURNAL_10499表被加SHARE锁,这个表是干什么用的呢?

  我们看看trace文件,有这样的信息:

  create table "SUK"."SYS_JOURNAL_10499" (C0 NUMBER(6,0), opcode char(1),

  partno number, rid rowid, primary key( C0 , rid )) organization index

  TABLESPACE "TEST"

  CREATE UNIQUE INDEX "SUK"."SYS_IOT_TOP_10605" on

  "SUK"."SYS_JOURNAL_10499"("C0","RID") INDEX ONLY TOPLEVEL TABLESPACE "TEST"

  NOPARALLEL

  drop table "SUK"."SYS_JOURNAL_10499"

  我们在查查10499是什么东西:

  SQL> SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_ID=10499;

  OBJECT_NAME OBJECT_TYPE

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

  IDX_TEST_C1 INDEX

  从这些信息可以推测:表SYS_JOURNAL_10499就是实现在重建索引时不阻塞DML操作而设计的,它存储的是在索引重建期间发生在基表的数据变化。可以推测,CREATE INDEX .... ONLINE应该也有一张类似的表。

  实际上,oracle之所以在创建索引时锁表阻止DML操作就是为了防止不能索引新变化的数据,在online方式重建时,有了临时表SYS_JOURNAL_XXXXoracle就可以放心大胆地让用户操作了,因为所有重建索引期间的数据变化信息都会保留在SYS_JOURNAL_XXX表中,当索引重建完后再加上SYS_JOURNAL_XXX记录的数据,就不会漏索引数据了。(XXX是被重建的索引对应的OBJECT_ID) 

       导读:

  重建索引有多种方式,如drop and re-createrebuildrebuild online等。下面简单比较这几种方式异同以及优缺点:

  相关文章:

  oracle重建索引(一)

  oracle重建索引(二)

  三、rebuildrebuild online的数据源

  网上一直有这样一个说法:重建索引是以原索引作为数据源的。那么,这种说法是否准确呢?我们做实验来验证一下:

  suk@ORACLE9I> COL SEGMENT_NAME FORMAT A30

  --首先看看表和索引的大小

  suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C1');

  SEGMENT_NAME BYTES

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

  TEST 201326592

  IDX_TEST_C1 293601280

  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;

  已解释。

  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

  PLAN_TABLE_OUTPUT

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

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

  | Id | Operation | Name | Rows | Bytes | Cost |

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

  | 0 | ALTER INDEX STATEMENT | | | | |

  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |

  | 2 | SORT CREATE INDEX | | | | |

  | 3 | TABLE ACCESS FULL | TEST | | | |

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

  Note: rule based optimization

  已选择11行。

  --从执行计划可以看出,当索引比表大时,rebuild索引用的数据源是基表。

  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;

  已解释。

  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

  PLAN_TABLE_OUTPUT

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

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

  | Id | Operation | Name | Rows | Bytes | Cost |

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

  | 0 | ALTER INDEX STATEMENT | | | | |

  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |

  | 2 | SORT CREATE INDEX | | | | |

  | 3 | TABLE ACCESS FULL | TEST | | | |

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

  Note: rule based optimization

  已选择11行。

  --从执行计划可以看出,当索引比表大时,rebuild online索引用的数据源是基表。

  --我们为TEST添加一列,使得表比索引大

  suk@ORACLE9I> ALTER TABLE TEST ADD(C2 CHAR(30) DEFAULT '1');

  表已更改。

  suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C

  1');

  SEGMENT_NAME BYTES

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

  TEST 1476395008

  IDX_TEST_C1 293601280

  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;

  已解释。

  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

  PLAN_TABLE_OUTPUT

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

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

  | Id | Operation | Name | Rows | Bytes | Cost |

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

  | 0 | ALTER INDEX STATEMENT | | | | |

  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |

  | 2 | SORT CREATE INDEX | | | | |

  | 3 | INDEX FAST FULL SCAN| IDX_TEST_C1 | | | |

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

  Note: rule based optimization

  已选择11行。

  --从执行计划可以看出,当表比索引大时,执行计划已经改变,rebuild索引是以索引作为数据源的。

  suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;

  已解释。

  suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());

  PLAN_TABLE_OUTPUT

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

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

  | Id | Operation | Name | Rows | Bytes | Cost |

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

  | 0 | ALTER INDEX STATEMENT | | | | |

  | 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |

  | 2 | SORT CREATE INDEX | | | | |

  | 3 | TABLE ACCESS FULL | TEST | | | |

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

  Note: rule based optimization

  已选择11行。

  --从执行计划可以看出,当表比索引大时,rebuild online仍然以基表作为数据源。

  rebuild模式下,因为表数据不会产生变化,oracle主要考虑性能问题,把更快扫描完成的段作为数据源。在上面的例子中,我们并没有对表进行分析,故oracle应该根据数据段的大小来决定那个作为数据源的。一般索引字段比较多,或者对索引字段的DML操作较多,可能会导致索引比表大,这时oracle就会使用基表作为新索引的数据源进行rebuild了。

  而在rebuild online模式下,因为允许DML操作,而表数据变化的同时索引也会跟着变化,为了索引与基表数据的一致性,必须采用基表数据作为数据源,而不能用原索引数据作为数据源。

  我们用反证法证明不能用原索引作为新索引的数据源。

  例如:

  T1发出rebuild online命令

  T2删除某条数据,删数据的同时,oracle会自动维护了旧索引

  T3扫描经过T2数据所在索引节点

  T4插入一条记录,新记录对应的索引节点刚好重用了T2删除的数据对应的索引节点空间

  如果是这样的话,新建的索引将不包含T4插入的记录的信息。所以,rebuild online情况下新索引的数据源不能是原索引。

  rebuild online情况下,如果非用原索引作为新索引的数据源的话,用中间表记录索引变化的方法应该是可以实现的,但由于数据变化会同时引起索引变化的特定决定了这种方法将异常复杂及效率底下,所以oracle不考虑旧索引作为新索引的数据源是有道理的。

  结论:

  1rebuild会阻塞对基表的DML操作,但不会影响rebuild期间查询对原有索引的使用。

  2rebuild的数据源可能是基表,也可能是原索引。取决于基表和原索引的大小,哪个小,rebuild时就会用那个作为数据源。这也说明了网上盛传的rebuild以原索引作为数据库的说法是不完全正确的。

  3rebuild online运行用户在索引重建期间执行DML操作。

  4rebuild online的数据源是基表。

Dmp从高版本导入到低版本

一、

oracle 11g导出的dmp文件导入到oracle10g 

1.进行导入表操作,提示:

IMP-00010: 不是有效的导出文件, 头部验证失败

IMP-00000: 未成功终止导入

 

2.从网上查阅,oracle数据11g10g是有问题的,一般由oracle10g客户端去连oracle11g进行导出数据操作然后导入到oracle10g,如果手中只有oracle11gdmp文件,怎么办

3.从网上查阅,头部验证失败是由于版本号不同所致,经试验可以通过如下方法进行修改:

       notepad++工具打开dmp文件,可以看到头部信息 --TEXPORT:V11.01.00,即为源数据库的版本号,将其修改为目的数据库的版本号,如本机为10.02.01

4.再次进行导入操作,导入成功

二、

oracle 导入dmp IMP-00010:不是有效的导出文件,头部验证失败

这是由于导出的dmp文件与导入的数据库的版本不同造成的

Notepad++查看了dmp文件,在头部具修改成你将导入目标数据库的版本号

以下对应的版本号:

  11g R2V11.02.00

  11g R1V11.01.00

  10gV10.02.01

  

删除oracle服务

删除服务 sc delete 服务名

Oracle10G卸载时弹出位置错误

删除服务 sc delete 服务名

Oracle 管理页面无法进入

具体操作如下:

1、使用emca -deconfig dbcontrol db命令删除配置

2、使用emca -repos drop删除repository

3、使用emca -config dbcontrol db -repos create 创建Database Control

Oracle 10g java.lang.Exception: Exception in sending Request :: null

刚装完 Oracle 10g,然后,进行em后,界面出来了,但报了一个错:

java.lang.Exception: Exception in sending Request :: null

很多功能不能用,提示重新登录

解决方案:找到下面的文件

$ORACLE_HOME\db_1\$HOSTNAME\sysman\config\emd.properties

其中的agentTZRegion缺省是GMT,改为你所在的时区即可,例如:

agentTZRegion=Asia/Chungking

关于时区的列表参考:10.2.0\db_1\sysman\admin\supportedtzs.lst

然后先停止 dbconsole 使时区设置生效并重启OracleDBConsole

stop dbconsole

emctl resetTZ agent

emctl config agent getTZ

start dbconsole

如以下截图:

重新登陆,搞定!

oracle11R2 导出表报错

简介:这是[]oracle11g R2 出现新增的表在导出的时候报EXP-00011: xx does not exist的详细页面,介绍了和数据库,oracle []oracle11g R2 出现新增的表在导出的时候报EXP-00011: xx does not exist有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处



先来看一下例子。我们创建一张表T2



SQL> create table t2 (n number); 

Table created. 

SQL> desc t2 

Name                                      Null?    Type 

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

N                                                  NUMBER







尝试使用exp将此表导出。





D:\Temp>exp kamus/oracle tables=t2



Export: Release 11.2.0.1.0 - Production on Fri Apr 16 18:11:51 2010



Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.





Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production



With the Partitioning, Oracle Label Security, Data Mining and Real Application Testing opt

ions

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set



About to export specified tables via Conventional Path ...

EXP-00011: KAMUS.T2 does not exist

Export terminated successfully with warnings.





报错说这张表并不存在。这是让很多客户费解的地方,在测试库中创建应用的表结构,然后再将表结构exp到产品库中去,这是很多客户常用的方法,但是在11gR2中如果这些表是新创建的没有插入过任何一条记录,那么将会碰到上面这样的错误。



原因在于11gR2中的新功能 – Deferred Segment Creation(延迟段创建),默认情况下这个功能是启用的。





SQL> show parameter DEFERRED_SEGMENT_CREATION 

NAME                                 TYPE                 VALUE 



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



deferred_segment_creation            boolean              TRUE





SQL>

延迟段创建的含义是当此新创建一个可能会有Segment的对象时(比如表、索引、物化视图等),如果这个对象中还没有任何记录需要消耗一个Extent,那么将不会在创建对象时自动创建Segment,这样做的好处无疑是在创建对象时大大提高了速度。



对于上例中的T2表,我们在创建结束就立刻检查DBA_SEGMENTS视图,会发现没有任何记录。





  SQL> select segment_name from user_segments where segment_name='T2'; 

no rows selected





而对于exp程序而言,当仅仅存在Object的定义而没有相应的Segment时,就会报出EXP-00011对象不存在的错误。



解决方法就很简单了,以下方法任选其一。



1. 设置DEFERRED_SEGMENT_CREATIONFALSE,这样创建对象时就会自动创建Segment



2. 在创建对象时,明确指定立刻创建Segment



create table t2 (n number) SEGMENT CREATION IMMEDIATE;



3. 使用expdp替代expDatapump本身就是Oracle10g以后的推荐工具)





    D:\Temp>expdp kamus/oracle tables=t2



Export: Release 11.2.0.1.0 - Production on Fri Apr 16 18:14:41 2010



Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.



Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production



With the Partitioning, Oracle Label Security, Data Mining and Real Application Testing opt

ions

Starting "KAMUS"."SYS_EXPORT_TABLE_01":  kamus/******** tables=t2

Estimate in progress using BLOCKS method...

Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 0 KB

Processing object type TABLE_EXPORT/TABLE/TABLE

. . exported "KAMUS"."T2"                                    0 KB       0 rows

Master table "KAMUS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded

******************************************************************************

Dump file set for KAMUS.SYS_EXPORT_TABLE_01 is:

  D:\ORACLE\ADMIN\ORCL\DPDUMP\EXPDAT.DMP

Job "KAMUS"."SYS_EXPORT_TABLE_01" successfully completed at 18:15:10

通过EM进行数据库表空间,用户的创建和导入dmp

1. 登录em

2. 建立表空间

3. 创建用户并制定用户权限,表空间

可以操作非本用户对应的表空间。

4. 导入备份的数据库

一般数据库工具导出的dmp默认采用的是10g以下版本的方式导出。

注意:需要把dmp文件copy到服务器上。

建立前需要输入服务器用户名,密码。

设置调度

执行时会报

错误信息



ORA-20446: The owner of the job is not registered ORA-06512: "SYSMAN.MGMT_JOBS", line 168 ORA-06512: "SYSMAN.MGMT_JOBS", line 86 ORA-06512: line 1



解决方法



Login as sysman user to the database and execute the following :

使用plus命令行工具,使用sysman 登录系统,执行以下语句

execute MGMT_USER.MAKE_EM_USER('所导出导入使用的用户名');

返回上一步,然后再次创建调度。

点击查看结果,完成导入。

手动导入dmp

Cmd控制台直接输入

IMP JTFA/JTFA FILE=D:/soft/JTFADataBase.DMP full=y

Oracel常见问题

相关推荐