??xml version="1.0" encoding="utf-8" standalone="yes"?> 诊断查询 NAME TYPE VALUE 重要的是?OPEN_CURSORS 的D|得_大,以避免应用程序用所有打开的游标。应用程序不同,该g不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(卌|的值高于实际需要的|Q也不会增加pȝ开销?/font> h意,v$open_cursor 可以跟踪会话?PARSED ?NOT CLOSED 的动态游标(使用 dbms_sql.open_cursor() 打开的游标)。它不会跟踪未经分析Q但已打开Q的动态游标。在应用E序中用动态游标ƈ不常见。本模式的前提是未用动态游标? SQL_TEXT l果显C正在连接上执行的查询。它提供了一个入手点Q让(zhn)可以反向跟t到打开游标的来源?/font>q回首 常见成因及解军_?/strong> try { try { try{ for(int i = 0; i < NUM_STMT; i++) { h意,各版?WebLogic Server 的缺省语句缓存大是有差异的。示例: 要确?#8220;出最多允许打开的游标数”问题是否与语句缓存有养I可以通过语句缓存大设|ؓ 0 此功能关闭或减缓存大,再确认是否仍会出现错误。如果在减少~存大小后问题没有发生,则说明连接池原有的语句缓存过大或 DBMS 中打开游标数的上限q低。可能需要考虑调整其中的一个倹{如果发现连接上打开的游标数持箋增加Q但在将语句~存大小讄?0 后没有出现这U现象,则可能说明存在游标泄漏问题。这可能是由使用?JDBC 驱动E序所_也可能是 WebLogic Server 本n的一个错误。请试使用其它 JDBC 驱动E序。如果用其?JDBC 驱动E序后仍发生同样的问题,请将此问题报告给 BEAQ这h持工E师可以寚w题做q一步探查,以确定该问题是否?WebLogic Server 自n的一个错误? 数据库驱动程?/strong> 1. 直接从驱动程序获取连接?/strong> 3. XA 驱动E序错误?br />
如果使用的是 Oracle XA 驱动E序Qƈ且数据库中出C大量cM“SELECT count (*) FROM SYS.DBA_PENDING_TRANSACTIONS”的查询,则可能是 Oracle XA 驱动E序存在游标泄漏问题。在有关 MetaLink 的案?3151681 中有Ҏ(gu)问题的描qͼq且版本 10.1.0.2 中已修正了该问题?br />
此外Q在使用 XA 驱动E序ӞL保按?http://e-docs.bea.com/wls/docs81/jta/thirdpartytx.html#1075181 (English) 中所qͼ?Database Server 上启?XAQ例如,grant select on dba_pending_transactions to publicQ? 如果问题?JDBC 驱动E序问题Q但又不得不使用该驱动程序,一U以变通方式解x标泄漏问题的Ҏ(gu)是不旉?WebLogic q接池,或收~连接池。有关重设或收羃q接池的Ҏ(gu)Q请参阅 WebLogic 文档Q如果是 8.1 版本Q该文档位于 http://e-docs.bea.com/wls/docs81/ConsoleHelp/domain_jdbcconnectionpool_control.html (Enlish)Q?
以下 SQL 查询有助于诊?ORA-01000 问题。要执行q些查询Q需要以理员n份登录数据库Q或获得数据库管理员从那?v$ 视图中进行选择的授权?/font>
Oracle 使用 init.ora 中的初始化参?OPEN_CURSORS 指定一个会话一ơ最多可以拥有的游标数。缺省gؓ 50。遗憄是,此缺省值通常?WebLogic Server q样的系l来说过。要获得数据库中 OPEN_CURSORS 参数的|可以使用以下查询Q?/font>
SQL> show parameter open_cursors;
------------------------------------ ----------- ---------------
open_cursors integer 1000
SQL> select o.sid, osuser, machine, count(*) num_curs
2 from v$open_cursor o, v$session s
3 where user_name = 'SCOTT' and o.sid=s.sid
4 group by o.sid, osuser, machine
5 order by num_curs desc;
SID OSUSER MACHINE NUM_CURS
-----------------------------------------------------
217 m1 1000
96 m2 10
411 m3 10
50 test 9
?WebLogic Server 中用连接池Ӟ此查询中?user_name 应ؓ用于创徏q接池的 user_nameQ假定是从连接池得到q接Q。该查询l果q给Z计算机名U。请在查询结果中扑և打开游标数量大的 SID 和运?WebLogic Server 的计机的名U?
SQL> select q.sql_text
2 from v$open_cursor o, v$sql q
3 where q.hash_value=o.hash_value and o.sid = 217;
------------------------------------------------------------------------------------------------------------------------
select * from empdemo where empid='212'
select * from empdemo where empid='321'
select * from empdemo where empid='947'
select * from empdemo where empid='527'
...
下面是查N题成因及可能的解军_法的步骤?/font>
此问题的最常见成因是未正常关闭 JDBC 对象。?/font>诊断查询中第三个查询的结果在应用E序代码中反向跟t,保所?JDBC 对象都正常关闭。BEA ?finally 块中昑ּ关闭 Connection、Statement ?ResultSet {?JDBC 对象Q以保无论是在正常q是异常情况下都所?JDBC 对象关闭。下面是一个常规示例:
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
conn = getConnection(); //Method getConnection will return a JDBC Connection
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from empdemo");
// do work
} catch (Exception e) {
// handle any exceptions
} finally {
try {
if(rs != null)
rs.close();
} catch (SQLException rse) {}
try {
if(stmt != null)
stmt.close();
} catch (SQLException sse) {}
try {
if(conn != null)
conn.close();
} catch (SQLException cse) {}
}
请避免采用Q何放?JDBC 对象的代码惯例。下面的代码惯例在每个@环P代中都获得一个新?Connection、Statement ?ResultSetQ但它没有关闭每个P代的 JDBC 对象。因此,它会D JDBC 对象泄漏?/font>
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String[] queries = new String[10];
//Define queries
for(int i = 0; i < 10; i++) {
conn = getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(queries[i]);
// do work
}
} catch (Exception e) {
// handle any exceptions
} finally {
try {
if(rs != null)
rs.close();
} catch (SQLException rse) {}
try {
if(stmt != null)
stmt.close();
} catch (SQLException sse) {}
try {
if(conn != null)
conn.close();
} catch (SQLException cse) {}
}
管Ҏ(gu) JDBC 规范的规定,关闭 Connection 时正常情况下也会?Statement ?ResultSet 关闭Q但好的做法是:如果在一?Connection 对象上创Z多个 StatementQ则在用完 Statement ?ResultSet 后立x式将它们关闭。如果未立即昑ּ关闭 Statement ?ResultSetQ游标可能会U聚q在关闭 Connection 前超q数据库允许的最大数量。例如,在以下代码片断中Q正常情况下通过 finally 块关?Connection Ӟ也会?ResultSet ?Statement 关闭。不q,此代码片断在一个连接上创徏了多?Statement ?ResultSet。因此在循环完成前,可能已发?#8220;出最多允许打开的游标数”问题?/font>
Connection conn = null;
conn = getConnection();
Statement stmt = null;
ResultSet rs = null;
stmt = conn.createStatement();
rs = stmt.executeQuery(/*some query*/);
//do work
}
} catch(SQLException e) {
// handle any exceptions
} finally {
try{
if(conn != null)
conn.close();
} catch(SQLException ignor) {}
}
q回首
语句~存
为提高性能QWebLogic Server 提供了一U功能,让?zhn)可以在用连接池时将预处理语句和可调用语句蝲入缓存。当 WebLogic Server 预处理语句或可调用语句载入~存Ӟ在许多情况下QDBMS ؓ每个打开的语句都保留游标。因此,语句~存可能?#8220;出最多允许打开的游标数”问题的成因?#8220;语句~存大小”属性决定在每个q接池实例中为每个连接缓存的预处理和可调用语句的L。如果缓存的语句q多Q可能会D过数据库服务器上打开游标数的上限?
“出最多允许打开的游标数”问题的另一个可能成因是 JDBC 驱动E序有问题。ؓ分清问题是驱动程序问题还?WebLogic q接池问题,如果有可重现的测试案例,可以试执行以下步骤?/font>
在测试案例中Q绕q?WebLogic q接池直接从驱动E序获取 JDBC q接。但请不要关闭连接,只需让它们以数组或某U其它结构Ş式保持打开状态,然后认游标泄漏是否仍然存在。不关闭q接是因模拟使用q接池时的行为。用连接池Ӟconnection.close() q未真正地关闭物理连接,而是连接返回到池中?/font>
可以试使用其它供应商的 JDBC 驱动E序或升U版的驱动程序,然后认问题是否仍然存在。可以用元数据来验证所使用的驱动程序是否正。示例代码与下面的类|
Connection conn = getConnection();
DatabaseMetaData dmd = conn.getMetaData();
System.out.println("JDBC Driver Name is " + dmd.getDriverName());
System.out.println("JDBC Driver Version is " + dmd.getDriverVersion());
]]>
imp help=y
2. 导入一个完整数据库
imp system/manager file=bible_db log=dible_db full=y ignore=y
3. 导入一个或一l指定用h属的全部表、烦引和其他对象
imp system/manager file=seapark log=seapark fromuser=seapark imp
system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
4. 一个用h属的数据导入另一个用?/font>
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
imp system/manager file=tank log=tank fromuser=(seapark,amy)
touser=(seapark1, amy1)
5. 导入一个表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
6. 从多个文件导?/font>
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y
7. 使用参数文g
imp system/manager parfile=bible_tables.par
bible_tables.par参数文gQ?/font>
#Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
8. 增量导入
imp system./manager inctype= RECTORE FULL=Y FILE=A
Oracle imp/exp
C:Documents and Settingsadministrator>exp help=y
Export: Release 9.2.0.1.0 - Production on 星期?7?28 17:04:43 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
通过输入 EXP 命o和用户名/口oQ?zhn)可?br /> 后接用户?口o的命?
例程: EXP SCOTT/TIGER
或者,(zhn)也可以通过输入跟有各种参数?EXP 命o来控?#8220;导出”
按照不同参数。要指定参数Q?zhn)可以使用关键?格式: EXP KEYWORD=value ?KEYWORD=(value1,value2,...,valueN)
例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
?TABLES=(T1: P1,T1: P2)Q如?T1 是分USERID 必须是命令行中的W一个参数?/font>
关键? 说明(默认) 关键? 说明(默认)
--------------------------------------------------------------------------
USERID 用户?口o FULL 导出整个文g (N)
BUFFER 数据~冲区大? OWNER 所有者用户名列表
FILE 输出文g (EXPDAT.DMP) TABLES 表名U列?br /> COMPRESS 导入C个区 (Y) RECORDLENGTH IO 记录的长?br /> GRANTS 导出权限 (Y) INCTYPE 增量导出cd
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
DIRECT 直接路径 (N) TRIGGERS 导出触发?(Y)
LOG 屏幕输出的日志文? STATISTICS 分析对象 (ESTIMATE)
ROWS 导出数据?(Y) PARFILE 参数文g?br /> CONSISTENT 交叉表的一致?(N) CONSTRAINTS 导出的约束条?(Y)OBJECT_CONSISTENT 只在对象导出期间讄的事务处?(N)
FEEDBACK ?x 行的昄q度 (0)
FILESIZE 每个转储文g的最大大?br /> FLASHBACK_SCN 用于会话快照设|回以前状态的 SCN
FLASHBACK_TIME 用于获取最接近指定旉?SCN 的时?br /> QUERY 用于导出表的子集?select 子句
RESUMABLE 遇到与空格相关的错误时挂?(N)
RESUMABLE_NAME 用于标识可恢复语句的文本字符?br /> RESUMABLE_TIMEOUT RESUMABLE 的等待时?br /> TTS_FULL_CHECK ?TTS 执行完整的或部分相关性检?br /> TABLESPACES 要导出的表空间列?br /> TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TEMPLATE 调用 iAS 模式导出的模板名在没有警告的情况下成功终止导出?br /> ==================================================
C:Documents and Settingsadministrator>imp help=y
Import: Release 9.2.0.1.0 - Production on 星期?7?28 17:06:54 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
可以通过输入 IMP 命o和?zhn)的用户?口o
后接用户?口o的命?例程: IMP SCOTT/TIGER
或? 可以通过输入 IMP 命o和各U参数来控制“导入”
按照不同参数。要指定参数Q?zhn)可以使用关键?格式: IMP KEYWORD=value ?KEYWORD=(value1,value2,...,vlaueN)
例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
?TABLES=(T1: P1,T1: P2)Q如?T1 是分USERID 必须是命令行中的W一个参数?/font>
关键? 说明Q默认) 关键? 说明Q默认)
--------------------------------------------------------------------------
USERID 用户?口o FULL 导入整个文g (N)
BUFFER 数据~冲区大? FROMUSER 所有h用户名列?br /> FILE 输入文g (EXPDAT.DMP) TOUSER 用户名列?br /> SHOW 只列出文件内?(N) TABLES 表名列表
IGNORE 忽略创徏错误 (N) RECORDLENGTH IO 记录的长?br /> GRANTS 导入权限 (Y) INCTYPE 增量导入cd
INDEXES 导入索引 (Y) COMMIT 提交数组插入 (N)
ROWS 导入数据?(Y) PARFILE 参数文g?br /> LOG 屏幕输出的日志文? CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文?(N)
INDEXFILE 表/索引信息写入指定的文?br /> SKIP_UNUSABLE_INDEXES 跌不可用烦引的l护 (N)
FEEDBACK ?x 行显C?(0)
TOID_NOVALIDATE 跌指定cd ID 的验?br /> FILESIZE 每个转储文g的最大大?br /> STATISTICS 始终导入预计的l计信息
RESUMABLE 在遇到有关空间的错误时挂?(N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符?br /> RESUMABLE_TIMEOUT RESUMABLE 的等待时?br /> COMPILE ~译q程, E序包和函数 (Y)
STREAMS_CONFIGURATION 导入 Streams 的一般元数据 (Y)
STREAMS_INSTANITATION 导入 Streams 的实例化元数?(N)下列关键字仅用于可传输的表空?br /> TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 要传输到数据库的表I间
DATAFILES 要传输到数据库的数据文?br /> TTS_OWNERS 拥有可传输表I间集中数据的用?/font>成功l止导入Q但出现警告?/font>
oracle的imp和exp的一些用? -
Oracle8i/9i EXP/IMP使用l验
一?i EXP常用选项1、FULLQ这个用于导出整个数据库Q在ROWS=N一起用时Q可以导出整个数据库的结构。例如:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2、BUFFER和FEEDBACKQ在导出比较多的数据Ӟ我会考虑讄q两个参数。例如:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
3、FILL和LOGQ这两个参数分别指定备䆾的DMP名称和LOG名称Q包括文件名和目录,例子见上面?
需要说明的是,EXP可以直接备䆾到磁带中Q即使用FILE=/dev/rmt0(带讑֤?Q但是一般我们都不这么做Q原因有二:一、这样做的速度会慢很多Q二、现在一般都是用磁带库的,不徏议直接对带q行操作。至于没有用磁带库的朋友可以考虑和UNIX的TARl合使用?
如果你真想用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”Q文档号Q?0428.1Q,该文中有详细解释?
4、COMPRESS参数在导出的同时合q碎块,量把数据压~到initial的EXTENT里,默认是NQ一般徏议用。DIRECT参数告诉EXP直接d数据Q而不像传l的EXP那样Q用SELECT来读取表中的数据Q这样就减少了SQL语句处理q程。一般也使用。不q有些情况下DIRECT参数是无法用的?
5、如何用SYSDBA执行EXP/IMPQ?
q是一个很现实的问题,有时候我们需要用SYSDBA来执行EXP/IMPQ如q行传输表空间的EXP/IMPQ以及在9i下用SYS用户来执行EXP/IMPӞ都需要用SYSDBA才可。我们可以用下面方式连入EXP/IMPQ?
exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n
6、QUERY参数后面跟的是where条gQ值得注意的是Q整个where子句需要?"括v来,where子句的写法和SELECT中相同,如果是UNIXq_所??都需要用u26469屏蔽它们的特D含义:
exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"
如果是windowsq_Q则使用下面的格式:
exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""
二?i IMP常用选项
1、FROMUSER和TOUSERQ用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中?
2、IGNORE、GRANTS和INDEXESQ其中IGNORE参数忽略表的存在,l箋导入Q这个对于需要调整表的存储参数时很有用,我们可以先根据实际情는合理的存储参数徏好表Q然后直接导入数据。而GRANTS和INDEXES则表C是否导入授权和索引Q如果想使用新的存储参数重徏索引Q或者ؓ了加快到入速度Q我们可以考虑INDEXES设ؓNQ而GRANTS一般都是Y?
另外一个EXP/IMP都有的参数是PARFILEQ它是用来定义EXP/IMP的参数文Ӟ也就是说Q上面的参数都可以写在一个参数文件中Q但我们一般很用?
三、Oracle9i EXP功能描述
Oracle9i EXP在原有的基础上新增了部分新的参数Q按功能主要分ؓ以下几个部分Q?
1、OBJECT_CONSISTENT - 用于讄EXP对象为只M保持对象的一致性。默认是N?
2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增?
3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLEI间分配而新增?
4、TTS_FULL_CHECK - 用于在传输表I间时用依赖性检查?
5、TEMPLATE - 用于支持iAS?
6、TABLESPACES - 讄表空间导出模式。个得对于一般用戯言Q这个才是新增参C最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基上多了一U选择Q得EXP更加灉|?
四、不同版本的EXP/IMP问题Q?
一般来_从低版本导入到高版本问题不大Q麻烦的是将高版本的数据导入C版本中,在Oracle9i之前Q不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决Q?
1、在高版本数据库上运行底版本的catexp.sqlQ?
2、用低版本的EXP来导出高版本的数据;
3、用低版本的IMP数据库导入到底版本数据库中Q?
4、在高版本数据库上重新运行高版本的catexp.sql脚本?
但在9i中,上面的方法ƈ不能解决问题。如果直接用底版本EXP/IMP会出现如下错误:
EXP-00008: ORACLE error %lu encountered
ORA-00904: invalid column name
q已l是一个公布的BUGQ需要等到Oracle10.0才能解决QBUG号ؓ2261Q你可以到METALINK上去查看有关此BUG的详l信息?
BUG归BUGQ我们的工作q是要做Q在没有Oracle的支持之前,我们pp冟뀂在Oracle9i中执行下面的SQL重徏exu81rls视图卛_?
CREATE OR REPLACE view exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,
decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')
|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')
|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')
|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),
r.check_opt, r.enable_flag,
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)
from user$ u, obj$ o, rls$ r
where u.user# = o.owner#
and r.obj# = o.obj#
and (uid = 0 or
uid = o.owner# or
exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')
)
/
grant select on sys.exu81rls to public;
/
五、其他问?
本文只讨ZOracle8i?i中的EXP/IMP的一些情况,对于之前的版本,?.0.X中,除了QUERY参数不能用外Q其它差别不大。针Ҏ(gu)有QUERY的情况,我们可以先在数据库中使用查询条g建立临时中间表,然后使用EXP导出q个中间表即可。至于Oracle7因ؓ目前使用的h较少Qgototop不打在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档Q?#8220;Overview of Export and Import in Oracle7”Q文档号Q?1949.1Q。关于EXP/IMP的详l参C息你可以通过EXP/IMP HELP=Y来获得?
另外关于传输表空间的更多信息可以参考下面的Metelink文档Q本文不再详q?
[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.
[NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.
在进行ƈ行EXP/IMP的时候,如果IMPq程建烦引的话不同时q行5个以上的IMPQ如果你惛_快速度
1、FULLQ这个用于导出整个数据库Q在ROWS=N一起用时Q可以导出整个数据库的结构。例如:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2、BUFFER和FEEDBACKQ在导出比较多的数据Ӟ考虑讄q两个参数。例如:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
3、FILL和LOGQ这两个参数分别指定备䆾的DMP名称和LOG名称Q包括文件名和目录,例子见上面?/p>
4. exp没有indexfileq个参数
5.使用direct=y参数限制是库里有大字D?LOBcd的数?׃能用,使用了QUERY时也不能用DIRECT
需要说明的是,EXP可以直接备䆾到磁带中Q即使用FILE=/dev/rmt0(带讑֤?Q但是一般我们都不这么做Q原因有二:一、这样做的速度会慢很多Q二、现在一般都是用磁带库的,不徏议直接对带q行操作。至于没有用磁带库的朋友可以考虑和UNIX的TARl合使用?/p>
如果你真想用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”Q文档号Q?0428.1Q,该文中有详细解释?/p>
4、COMPRESS参数在导出的同时合q碎块,量把数据压~到initial的EXTENT里,默认是NQ一般徏议用。DIRECT参数告诉EXP直接d数据Q而不像传l的EXP那样Q用SELECT来读取表中的数据Q这样就减少了SQL语句处理q程。一般也使用。不q有些情况下DIRECT参数是无法用的?/p>
?导入工具 imp
可以通过输入 IMP 命o和?zhn)的用户?口o后接用户?口o的命?
例程: IMP SCOTT/TIGER
或? 可以通过输入 IMP 命o和各U参数来控制“导入”按照不同参数。要指定参数Q?zhn)可以使用关键?
格式: IMP KEYWORD=value ?KEYWORD=(value1,value2,...,vlaueN)例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N?TABLES=(T1: P1,T1: P2)Q如?T1 是分
USERID 必须是命令行中的W一个参数?br />
关键?nbsp; 说明Q默认)
USERID 用户?口o
FULL 导入整个文g (N)
BUFFER 数据~冲区大?nbsp;
FROMUSER 所有h用户名列?br />
FILE 输入文g (EXPDAT.DMP)
TOUSER 用户名列?br />
SHOW 只列出文件内?(N)
TABLES 表名列表
IGNORE 忽略创徏错误 (N)
RECORDLENGTH IO 记录的长?br />
GRANTS 导入权限 (Y)
INCTYPE 增量导入cd
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据?(Y)
PARFILE 参数文g?br />
LOG 屏幕输出的日志文?nbsp;
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文?(N)
INDEXFILE 表/索引信息写入指定的文?br />
SKIP_UNUSABLE_INDEXES 跌不可用烦引的l护 (N)
FEEDBACK ?x 行显C?(0)
TOID_NOVALIDATE 跌指定cd ID 的验?br />
FILESIZE 每个转储文g的最大大?br />
STATISTICS 始终导入预计的l计信息
RESUMABLE 在遇到有关空间的错误时挂?(N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符?br />
RESUMABLE_TIMEOUT RESUMABLE 的等待时间COMPILE ~译q程, E序包和函数 (Y)
STREAMS_CONFIGURATION 导入 Streams 的一般元数据 (Y)
STREAMS_INSTANITATION 导入 Streams 的实例化元数?(N)
下列关键字仅用于可传输的表空?br />
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 要传输到数据库的表I间
DATAFILES 要传输到数据库的数据文?br />
TTS_OWNERS 拥有可传输表I间集中数据的用?/p>
1、FROMUSER和TOUSERQ用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中?/p>
2、IGNORE、GRANTS和INDEXESQ其中IGNORE参数忽略表的存在,l箋导入Q这个对于需要调整表的存储参数时很有用,我们可以先根据实际情는合理的存储参数徏好表Q然后直接导入数据。而GRANTS和INDEXES则表C是否导入授权和索引Q如果想使用新的存储参数重徏索引Q或者ؓ了加快到入速度Q我们可以考虑INDEXES设ؓNQ而GRANTS一般都是Y?/p>
另外一个EXP/IMP都有的参数是PARFILEQ它是用来定义EXP/IMP的参数文Ӟ也就是说Q上面的参数都可以写在一个参数文件中Q但我们一般很用?/p>
三、Oracle9i EXP功能描述
Oracle9i EXP在原有的基础上新增了部分新的参数Q按功能主要分ؓ以下几个部分Q?/p>
1、OBJECT_CONSISTENT - 用于讄EXP对象为只M保持对象的一致性。默认是N?/p>
2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增?/p>
3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLEI间分配而新增?/p>
4、TTS_FULL_CHECK - 用于在传输表I间时用依赖性检查?/p>
5、TEMPLATE - 用于支持iAS?/p>
6、TABLESPACES - 讄表空间导出模式。个得对于一般用戯言Q这个才是新增参C最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基上多了一U选择Q得EXP更加灉|?/p>
FAQ:
如何使用SYSDBA执行EXP/IMPQ?/p>
q是一个很现实的问题,有时候我们需要用SYSDBA来执行EXP/IMPQ如q行传输表空间的EXP/IMPQ以及在9i下用SYS用户来执行EXP/IMPӞ都需要用SYSDBA才可。我们可以用下面方式连入EXP/IMPQ?/p>
exp USERID=/@10.249.2.18/<SID> file=1.dmp tables=gototop.t rows=n
然后?nbsp; Username: / as sysdba
6、QUERY参数后面跟的是where条gQ值得注意的是Q整个where子句需要?"括v来,where子句的写法和SELECT中相同,如果是UNIXq_所??都需要用\u26469屏蔽它们的特D含义:
exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"
如果是windowsq_Q则使用下面的格式:
exp c/c@ncn file=c.dmp log=c.log tables=t query="""where and """
不同版本的EXP/IMP问题Q?/p>
一般来_从低版本导入到高版本问题不大Q麻烦的是将高版本的数据导入C版本中,在Oracle9i之前Q不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决Q?/p>
1、在高版本数据库上运行底版本的catexp.sqlQ?/p>
2、用低版本的EXP来导出高版本的数据;
3、用低版本的IMP数据库导入到底版本数据库中Q?/p>
4、在高版本数据库上重新运行高版本的catexp.sql脚本?/p>
但在9i中,上面的方法ƈ不能解决问题。如果直接用底版本EXP/IMP会出现如下错误:
EXP-00008: ORACLE error %lu encountered
ORA-00904: invalid column name
q已l是一个公布的BUGQ需要等到Oracle10.0才能解决QBUG号ؓ2261Q你可以到METALINK上去查看有关此BUG的详l信息?/p>
BUG归BUGQ我们的工作q是要做Q在没有Oracle的支持之前,我们pp冟뀂在Oracle9i中执行下面的SQL重徏exu81rls视图卛_?/p>
CREATE OR REPLACE view exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,
decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')
|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')
|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')
|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),
r.check_opt, r.enable_flag,
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)
from user$ u, obj$ o, rls$ r
where u.user# = o.owner#
and r.obj# = o.obj#
and (uid = 0 or
uid = o.owner# or
exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')
)
/
grant select on sys.exu81rls to public;
/
导入工具imp可能出现的问?/p>
(1) 数据库对象已l存?br />
一般情? 导入数据前应该彻底删除目标数据下的表, 序列, 函数/q程,触发器等;
数据库对象已l存? 按缺省的imp参数, 则会导入p|
如果用了参数ignore=y, 会把exp文g内的数据内容导入
如果表有唯一关键字的U束条g, 不合条g不被导?br />
如果表没有唯一关键字的U束条g, 引赯录重?br />
(2) 数据库对象有d键约?br />
不符合主外键U束? 数据会导入失?nbsp;
解决办法: 先导入主? 再导入依存表
disable目标导入对象的主外键U束, 导入数据? 再enable它们
(3) 权限不够
如果要把A用户的数据导入B用户? A用户需要有imp_full_database权限
(4) 导入大表( 大于80M ) ? 存储分配p|
默认的EXP? compress = Y, 也就是把所有的数据压羃在一个数据块?
导入? 如果不存在连l一个大数据? 则会导入p|.
导出80M以上的大表时, 记得compress= N, 则不会引赯U错?
(5) imp和exp使用的字W集不同
如果字符集不? 导入会失? 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.
导入完成后再改回?
(6) imp和exp版本不能往上兼?br />
imp可以成功导入低版本exp生成的文? 不能导入高版本exp生成的文?br />
Ҏ(gu)情况我们可以?br />
$ imp username/password@connect_string
说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora
定义的本地或者远端数据库的名U?br />
其他问题
本文只讨ZOracle8i?i中的EXP/IMP的一些情况,对于之前的版本,?.0.X中,除了QUERY参数不能用外Q其它差别不大。针Ҏ(gu)有QUERY的情况,我们可以先在数据库中使用查询条g建立临时中间表,然后使用EXP导出q个中间表即可。至于Oracle7因ؓ目前使用的h较少Qgototop不打在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档Q?#8220;Overview of Export and Import in Oracle7”Q文档号Q?1949.1Q。关于EXP/IMP的详l参C息你可以通过EXP/IMP HELP=Y来获得?/p>
另外关于传输表空间的更多信息可以参考下面的Metelink文档Q本文不再详q?/p>
[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.
[NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.
在进行ƈ行EXP/IMP的时候,如果IMPq程建烦引的话不同时q行5个以上的IMPQ如果你惛_快速度Q可以在IMP的时候不建烦引,q样只要内存允许Q可以多跑几个,然后是SQL脚本创徏需要的索引?br />
oracle 10g
[oracle@standby oracle]$ rman target /
启动归档
SQL>alter database archivelog;
System altered.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Current log sequence 9
SQL>
重启数据库,归档׃自动启动?/p>
启动自动备䆾控制文g
RMAN> configure controlfile autobackup on;
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters are successfully stored
RMAN> configure channel device type disk format 'F:\backup\%U';
new RMAN configuration parameters:
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'F:\backup\%U';
new RMAN configuration parameters are successfully stored
SQL> select name from v$datafile;
NAME
---------------------------------------------------
F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\SYSTEM01.DBF
F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\UNDOTBS01.DBF
F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\SYSAUX01.DBF
F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\USERS01.DBF
定原控制文件的路径
SQL> select name from v$controlfile;
查看log位置
SQL>select name from V$ARCHIVED_LOGQ?/p>
查看log的信?br />SQL>select * from v$log_history;
插入数据
SQL> select * from ttt;
NAME EMAIL
---------- ----------
aa aa@abc.com
bb bb@abc.com
cc cc@abc.com
RMAN备䆾Q?/p>
RMAN>backup database;
再插入数?br />SQL> select * from ttt;
NAME EMAIL
---------- ----------
aa aa@abc.com
bb bb@abc.com
cc cc@abc.com
dd dd@abc.com
用DBCA删除 数据库和相关数据文g?br />再重新徏个相同实例名的SIDQ再开始恢复?/p>
配置RMAN
RMAN> configure channel device type disk format 'F:\backup\%U'; //注意和原来的格式一栗?/p>
new RMAN configuration parameters:
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'F:\backup\%U';
new RMAN configuration parameters are successfully stored
先需要从自动备䆾中恢复控制文?br />RMAN> startup nomount;
RMAN> restore controlfile to '/opt/oracle/oradata/control01.ctl' from autobackup;
重徏本地认证文g
C:\>orapwd file=F:\oracle\product.1.0\Db_1\DATABASE\PWDtest.ORA password=123456 entries=2;
RMAN>shutdown immediate
RMAN> startup mount
database is already started
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 08/03/2005 20:00:30
RMAN-06189: current DBID 1863531774 does not match target mounted database (1862908416)
RMAN>
重新讄DBID
RMAN> set DBID=1862908416
executing command: SET DBID
你可能需要修改spfile文g,如果文g位置改变?/p>
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> create spfile from pfile;
File created.
SQL> startup mount;
ORACLE instance started.
RMAN> restore database;
转入SQLPLUSQsys登陆sqlplus
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 356534 generated at 08/02/2005 19:14:40 needed for thread 1
ORA-00289: suggestion :
F:\ORACLE\PRODUCT.1.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG05_08_03\O1_MF_1_
2_%U_.ARC
ORA-00280: change 356534 for thread 1 is in sequence #2
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel //因ؓlog丢失Q此步选cancel
Media recovery cancelled.
SQL> alter database open resetlogs;
Database altered.
SQL> select * from ttt;
NAME EMAIL
---------- ----------
aa aa@abc.com
bb bb@abc.com
cc cc@abc.com
SQL>
数据回来了,但是׃归档和redo log丢了Q丢׃部分数据?/p>
情况?数据库崩溃,但是q剩下归档和redo log是好的?/p>
启动归档
SQL>alter database archivelog;
System altered.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Current log sequence 9
SQL>
重启数据库,归档׃自动启动?/p>
启动自动备䆾控制文g
RMAN> configure controlfile autobackup on;
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters are successfully stored
配置RMAN的格式和存储位置?br />RMAN> configure channel device type disk format 'F:\backup\%U';
new RMAN configuration parameters:
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'F:\backup\%U';
new RMAN configuration parameters are successfully stored
查看数据文g的位|?br />SQL> select name from v$datafile;
定原控制文件的路径
SQL> select name from v$controlfile;
查看log位置
SQL>select name from V$ARCHIVED_LOGQ?/p>
查看log的信?br />SQL>select * from v$log_history;
插入数据
SQL> select * from sss;
AA BB CC
---------- ---------- ---
aa bb cc
aa jj mm
vv ss tt
完全备䆾数据?br />RMAN>backup data
再插入数?/p>
SQL> select * from sss;
AA BB CC
---------- ---------- ---
aa bb cc
aa jj mm
vv ss tt
mm mm mm
用DBCA删除数据库,删除相关的数据文Ӟ保留redo log和归档日志?/p>
再用DBCA重徏一个SID一L数据库?/p>
RMAN>startup
配置RMAN
RMAN> configure channel device type disk format 'F:\backup\%U'; //注意和原来的格式一栗?/p>
new RMAN configuration parameters:
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'F:\backup\%U';
new RMAN configuration parameters are successfully stored
RMAN>startup nomount
RMAN>restore controlfile to '/opt/oracle/oradata/control01.ctl' from autobackup;
再copy几䆾和原来一L路径文g名?/p>
RMAN>shutdown immediate
RMAN> startup mount
connected to target database (not started)
Oracle instance started
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 08/03/2005 19:55:46
ORA-01991: invalid password file 'F:\oracle\product.1.0\Db_1\DATABASE\PWDtest.ORA'
重徏本地认证文g
C:\>orapwd file=F:\oracle\product.1.0\Db_1\DATABASE\PWDtest.ORA password=123456 entries=2;
RMAN>shutdown immediate
RMAN> startup mount
database is already started
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 08/03/2005 20:00:30
RMAN-06189: current DBID 1863531774 does not match target mounted database (1862908416)
RMAN>
重新讄DBID
RMAN> set DBID=1862908416
executing command: SET DBID
RMAN> startup mount
database is already started
RMAN> restore database;
RMAN> recover database;
Starting recover at 03-8?-05
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 1 is already on disk as file F:\ORACLE\PRODUCT.1.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\
2005_08_03\O1_MF_1_1_1H2D39KL_.ARC
archive log thread 1 sequence 2 is already on disk as file F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO02.LOG
archive log thread 1 sequence 3 is already on disk as file F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO03.LOG
archive log thread 1 sequence 4 is already on disk as file F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO01.LOG
archive log filename=F:\ORACLE\PRODUCT.1.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG05_08_03\O1_MF_1_1_1H2D39KL_.ARC thr
ead=1 sequence=1
archive log filename=F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO02.LOG thread=1 sequence=2
archive log filename=F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO03.LOG thread=1 sequence=3
archive log filename=F:\ORACLE\PRODUCT.1.0\ORADATA\TEST\REDO01.LOG thread=1 sequence=4
media recovery complete
Finished recover at 03-8?-05
RMAN>
׃控制文g是用备䆾q原的需要resetlogs打开?br />SQL> alter database open resetlogs;
SQL> select * from sss;
AA BB CC
---------- ---------- ---
aa bb cc
aa jj mm
vv ss tt
mm mm mm //此行数据回来?说明没有丢数?
User => FOO has been granted the following privileges ==================================================================== ROLE => CONNECT which contains => SYS PRIV => ALTER SESSION grantable => NO SYS PRIV => CREATE CLUSTER grantable => NO SYS PRIV => CREATE DATABASE LINK grantable => NO SYS PRIV => CREATE SEQUENCE grantable => NO SYS PRIV => CREATE SESSION grantable => NO SYS PRIV => CREATE SYNONYM grantable => NO SYS PRIV => CREATE TABLE grantable => NO SYS PRIV => CREATE VIEW grantable => NO
q里面的 ALTER SESSION 是一个问? 恶意的用户很Ҏ(gu)利用q个权限l系l带来麻?举两个例?一个是 修改当前 Session ?cursor_sharing 参数gؓ FORCE ,然后提交可触?Oracle Bug 的查?cursor_sharing ?FORCE 模式?Bug 很多) , 很容易让数据库崩? 或者恶意用h?alter session set hash_area_size ... 的修改语? l自p定一个超大的 HASH_AREA_SIZE , 再提交一定的查询,也会l系l性能造成很糟p的影响.
q个 CONNECT 角色?Oracle 10g 中已l修改了,只有 create session 的权?
再来一个角色的问题. 比如 REOURCE 角色, 包含的权限如下所C?
User => FOO has been granted the following privileges ==================================================================== ROLE => RESOURCE which contains => SYS PRIV => CREATE CLUSTER grantable => NO SYS PRIV => CREATE INDEXTYPE grantable => NO SYS PRIV => CREATE OPERATOR grantable => NO SYS PRIV => CREATE PROCEDURE grantable => NO SYS PRIV => CREATE SEQUENCE grantable => NO SYS PRIV => CREATE TABLE grantable => NO SYS PRIV => CREATE TRIGGER grantable => NO SYS PRIV => CREATE TYPE grantable => NO SYS PRIV => UNLIMITED TABLESPACE grantable => NO
注意是包?UNLIMITED TABLESPACE 权限?实际上是隐含的一个权?OracleZ么这样做,没有明确的文档说??10g 中ؓ了向后兼?也是q样?), 恶意用户利用q个造成ȝ很容??SYSTEM 建立一个够大的表卛_让数据库宕机.
alter session set user_dump_dest="c:\kflosstrace"; |
alter session set tracefile_identifier ="kfloss_test"; |
SQL> exec dbms_monitor.serv_mod_act_trace_enable (service_name=>'testenv', module_name=>'product_update'); |
SQL> exec dbms_monitor.client_id_trace_enable (client_id=>'kimberly'); |
SQL> select sid, serial#, username from v$session; SID SERIAL# USERNAME ------ ------- ------------ 133 4152 SYS 137 2418 SYSMAN 139 53 KIMBERLY 140 561 DBSNMP 141 4 DBSNMP . . . 168 1 169 1 170 1 28 rows selected. |
SQL> exec dbms_monitor.session_trace_enable (session_id=>139, serial_num=>53, waits=>true, binds=>false); |
C:\...\udump> trcsess output="kfloss.trc" service="testenv" module="product update" action="batch insert" |
C:\...\udump> tkprof kfloss.trc output=kfloss_trace_report SORT=(EXEELA, PRSELA, FCHELA) |
decode()函数使用技?/p>
·软g环境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径?C:\ORANT
·含义解释:
decode(条g,?,译?,?,译?,...值n,译值n,~省?
该函数的含义如下:
IF 条g=? THEN
RETURN(译?)
ELSIF 条g=? THEN
RETURN(译?)
......
ELSIF 条g=值n THEN
RETURN(译值n)
ELSE
RETURN(~省?
END IF
· 使用Ҏ(gu):
1、比较大?/p>
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较?yu)?/p>
sign()函数Ҏ(gu)某个值是0、正数还是负敎ͼ分别q回0??1
例如:
变量1=10Q变?=20
则sign(变量1-变量2)q回-1Qdecode解码l果为“变?”,辑ֈ了取较小值的目的?/p>
2、表?a class="bluekey" target="_blank">视图l构转化
现有一个商品销售表saleQ表l构?
month char(6) --月䆾
sell number(10,2) --月销售金?/p>
现有数据?
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
惌转化Z下结构的数据:
year char(4) --q䆾
month1 number(10,2) --1月销售金?/p>
month2 number(10,2) --2月销售金?/p>
month3 number(10,2) --3月销售金?/p>
month4 number(10,2) --4月销售金?/p>
month5 number(10,2) --5月销售金?/p>
month6 number(10,2) --6月销售金?/p>
month7 number(10,2) --7月销售金?/p>
month8 number(10,2) --8月销售金?/p>
month9 number(10,2) --9月销售金?/p>
month10 number(10,2) --10月销售金?/p>
month11 number(10,2) --11月销售金?/p>
month12 number(10,2) --12月销售金?/p>
l构转化的SQL语句?
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
as
select
substrb(month,1,4),
sum(decode(substrb(month,5,2),'01',sell,0)),
sum(decode(substrb(month,5,2),'02',sell,0)),
sum(decode(substrb(month,5,2),'03',sell,0)),
sum(decode(substrb(month,5,2),'04',sell,0)),