2008年6月30日星期一

IMPORT & EXPORT

1. 什么是import/export? 我们为什么需要它?
oracle的import(imp)和export(exp)功能用来执行oracle数据库的逻辑备份与恢复. 导出的时候, 数据库对象被存储在一个二进制文件中, 并且能够被导入到另外一个oracle数据库中. 这个功能能够用来在不同的机器, 数据库, schema之间转移数据, 但是因为是二进制文件, 所以不能用在非oracle的数据库上面.
imp & exp 通常被用来执行以下任务:
1) 备份与恢复 (仅针对小型数据库 < 50G, 更大的, 则使用RMAN)
2) 在不同平台的oracle数据库之间转移数据
3) 重组数据, 消除数据碎片 (export, drop, re-import)
4) 从古老的oracle版本升级数据库
5) 检测数据库崩溃 (保证数据可读)
6) 在数据库之间转移tablespace
从oralce 10g开始, 用户可以选择使用新的数据泵功能(expdp & impdp)
2. 怎样使用import/export功能
在$ORACLE_HOME/bin目录下找到相应的可执行文件. 它们可以被交互运行, 使用命令行参数或者参数文件, 相应的参数可以使用exp help=yes(imp help=yes)
下面是几个使用exp/imp的例子:
exp scott/tiger file=emp.dmp log=emp.log tables=emp rows=yes indexes=no
exp scott/tiger file=emp.dmp tables=(emp,dept)
imp scott/tiger file=emp.dmp full=yes
imp scott/tiger file=emp.dmp fromuser=scott touser=scott tables=dept
使用参数文件
exp userid=scott/tiger@orcl parfile=export.txt
export.txt :
BUFFER=100000
FILE=account.dmp
FULL=n
OWNER=scott
GRANTS=y
COMPRESS=y
还可以使用OEM中的schema manager GUI工具.
3. 是否可以导出一个table的子集?
从oracle 8i开始, 就可以使用query = export来导出一个table的一部分数据, 你可能需要处理特殊字符的问题, 例如: query=\"where deptno=10\".
exp scott/tiger tables=emp query="where deptno=10"
exp scott/tiger file=abc.dmp tables=abc query=\"where sex=\'f\'\" rows=yes
4. 可以监控一个table导入的速度吗?
如果你需要监控一个正在执行的imp任务的执行速度, 有以下方法可供选择:
1)
select substr(sql_text,instr(sql_text,'INTO "'),30) table_name,
rows_processed,
round((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60,1) minutes,
trunc(rows_processed/((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60)) rows_per_min
from sys.v_$sqlarea
where sql_text like 'INSERT %INTO "%'
and command_type = 2
and open_versions > 0;
如果当前有多个table在导入, 这个语句不会显示正在被导入table的信息
2) 使用FEEDBACK = n参数, 这个参数会告诉imp在每导入N行以后显示一个度号.
5. 可以将table导入到一个不同的tablespace吗?
oracle没有提供参数来指定将数据导入到一个不同的tablespace, 默认情况下, 数据库对象需要在导出的tablespace中重建, 但是我们也可以使用以下方法来改变这一行为:
1) 在相应的tablespace种预先创建好table(s)
使用参数INDEXFILE=option
编辑indexfile, 移出注释, 指定正确的tablespace
在你的数据库中运行这个index文件, 这将会在相应的tablespace中创建需要的table
使用IGNORE=Y来导入文件
2) 改变user的default space
revoke user的"UNLIMITED TABLESPACE"权限
revoke user在导出tablespace上的磁盘限额, 这将强制imp功能在user默认
tablespace上创建相应的table
将相应的tablespace设为user的默认tablespace
导入文件
6. 在导入之前需要DROP/TRUNCATE对象吗?
如果在一个已经存在的table上导入数据, 我们需要truncate或者drop掉这个table, 以清除老的数据. 如果不这样做, 新的数据会附加在老的数据后面. 在导入之前, 必须drop已经存在的sequense, 否则会产生数据的冲突. 同样也建议将index drop掉以加快import速度, 在导入以后再重建index
7. 可以在不同版本之间导入导出数据吗?
oracle的import是向上兼容的, 也就是说, 老板本export产生的数据可以使用新版本的import来导入, 这在升级数据库的时候经常用到.
oracle同事还提供了一些catexpX.sql的脚本, 使用sys执行这些脚本可以使老板本的imp/exp运行在新版本的数据库上. 脚本位置$ORACLE_HOME/rdbms/admin/
8. 可以export到多个文件吗? 可以打破Unix下2G文件的限制吗?
从oracle8i开始, export功能就支持多个文件的导出, 这个功能使大的export能够被拆分为几个小的文件, 这样就不会超过操作系统的文件限制了(使用FILESIZE参数). 当导入这种导出为多文件的数据的时候, 必须使用使用FILE参数来提供使用同一个sequence的文件名.
示例:
exp SCOTT/TIGER FILE=D:F1.dmp,E:F2.dmp FILESIZE=10m LOG=scott.log
在oracle8i之前的版本, 可以通过gzip压缩文件来达到export大数据量文件的目的, 最大可以导出高10G的文件,这取决于数据的类型.
export:
# create a named pipe
mknod exp.pipe p
# read the pipe - output to zip file in the background
gzip < exp.pipe > scott.exp.gz &
# feed the pipe
exp userid=scott/tiger file=exp.pipe ...[/code]
import:
# create a name pipe
mknod imp_pipe p
# read the zip file and output to pipe
gunzip < exp_file.dmp.gz > imp_pipe &
# feed the pipe
imp system/pwd@sid file=imp_pipe log=imp_pipe.log ...
9. 怎样增进import/export的performance
export:
1) 将BUFFER参数设大(2M: 2000000)
2) 将RECORDLENGTH参数设大(64K: 64000)
3) 使用DIRECT=yes
4) 停止不必要的程序释放资源
5) 如果使用多个export session, 确保它们写的是不同的物理磁盘
6) 不要export到NFS文件系统
import:
1) 创建一个indexfile, 这样你可以在import数据以后创建index(import的时候指定
INDEXFILE参数), 这样你导入的时候不会导入人和数据, 仅仅创建index. 你必须预先编辑这个]
文件, 在connect语句中提供密码
2) 将需要导入的文件放置在与ORACLE数据不同的磁盘上
3) 增加DB_CACHE_SIZE(9i以前为DB_BLOCK_BUFFER)
4) 将LOG_BUFFER设到比较大的值, 重启oracle
5) 停止redo log archiving(ALTER DATABASE NOARCHIVELOG)
6) 创建一个拥有大回滚段的大table space. 将其他所有的回滚段offline(当然不包含SYSTEM的
回滚段), 回滚段最好与你最大的table一样大.
7) 使用COMMIT=N(如果你可以承受得起的话)
8) 使用ANALYZE=N
9) 别忘了run之前创建的index file.
10. IMP/EXP的普遍问题
ORA-00001: Unique constraint (...) violated
你在导入重复行,使用IGNORE=NO来跳过那些重复的table(如果object重复创建会报错)
ORA-01555: Snapshot too old
当你在导入数据的时候,通知你的user停止手头工作, 或者使用CONSISTENT=YES
ORA-01562: Failed to extend rollback segment
创建大的回滚段或者设置参数COMMIT=Y
IMP-00015: Statement failed ... object already exists...
使用IGNORE=Y来忽略这些错误, 但要小心产生重复的行

原文地址: http://www.orafaq.com/wiki/Import_Export_FAQ

2008年6月26日星期四

ORA-02068 & ORA-03113错误

最近公司的一台serveralert log频繁报出一个错误:

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

Errors in file /disk/benqdw/9.2.0/admin/BENQDW/bdump/benqdw_reco_5258.trc:
ORA-28546: connection initialization failed, probable Net8 admin error
ORA-02068: following severe error from ORAPROD
ORA-03113: end-of-file on communication channel

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

目前trace下来原因大致如下:

我们这台server上的Monitor Job, 就是每天我们发check mailJob是每天0:20开始, 但因为这个Job checkserver以及每个server check的信息比较多,

所以会跑的很久, 每天要将近2:00才能够完成, 实际上这个session要将近2:30才结束.

但是我们目前ERP开发环境每周一到周五2:00会进行分别进行DEVDEV5的全备, 这个全备每天1:45左右会shutdown 环境.

这个时候我们的Monitor Job还没有完成, 因为有check多个session, 尽管只是select数据,但也算一个分布式事务, 事务还没有完成, 其中一个节点已经shutdown,

于是这个事务处于in doubt状态.

而这个状态的分布式事务会引发另外一个bug, 这个情况在meta link: Note:214851.1中有描述:

通过DB Link连接到8.1.7版本的Oracle DB, 如果在logon trigger enable的情况下,

RECO进程在处理in-doubt 的分布式事务的时候, 会报我们看到的这个错误.

而我们这个事务所有节点中, 唯有ORAPROD8.1.7版本, 于是错误显示的节点也就是ORAPROD.

Solution: 将开发环境的backup时间推迟一点, 推迟半个小时就可以了.

2008年6月24日星期二

APPLSYSD&APPLSYSX表空间爆掉

今天早上过来, 开发环境的监控mail中发现, APPLSYSD表空间已经99%, APPLSYSX更是已经爆掉了, 并且alert log中充满了如下错误:

ORA-1654: unable to extend index APPLSYS.FND_CRM_HISTORY_U1 by 20 in tablespace APPLSYSX

于是使用下面的脚本查看下相关table占用空间的大小

SELECT segment_name, BYTES, (BYTES / 1024 / 1024) object_size

FROM dba_segments

WHERE tablespace_name = 'APPLSYSD'

ORDER BY BYTES DESC

发现以下table占用空间奇大:

TABLE NAME

RECORDS

SIZE

FND_CONCURRENT_PROCESSES

507909

237.73M

FND_CONCURRENT_REQUESTS

38122

243.83M

FND_ENV_CONTEXT

8432267

429.41M

WF_ITEM_ACTIVITY_STATUSES

1529055

366.21M

WF_ITEM_ATTRIBUTE_VALUES

1795278

332.19M

刚来DBA没多久, 不太了解状况.

但是因为以前做RD, 所以知道ALERT LOG中讯息的严重性, 所以先不管其它, 直接将APPLSYSX表空间加了200M进去,

然后重启concurrent manager, request先能够跑起来再说.

然后细看各table, 大概知道各table存的request的历史记录以及work flow的历史记录, 而这些历史记录都是能够清除的, 而且production环境下应该是有定期清楚的.

询问之下, 知道了大概的清除步骤: 先跑request, move table (需要rebuild index).

于是首先提交了两个request:

Purge Obsolete Workflow Runtime Data(, , 0, TEMP, N, ,)

Purge Concurrent Request and/or Manager Data(ALL, Age, 3, , , , , , , , , Y, Y)

第一个用来清楚work flow历史记录, 第二个清楚request记录.

花了n几个小时跑完后, 发现table记录数已经降下来, 接下来就是怎样将空间降下来, 询问得到的以前的做法是move table, 但我嫌麻烦, 于是采用了另外一种CTAS的方法:

CREATE TABLE XX_FND_CONCURRENT_PROCESSES AS SELECT * FROM FND_CONCURRENT_PROCESSES;

TRUNCATE TABLE applsys.FND_CONCURRENT_PROCESSES;

INSERT INTO FND_CONCURRENT_PROCESSES SELECT * FROM XX_FND_CONCURRENT_PROCESSES;

DROP TABLE XX_FND_CONCURRENT_PROCESSES;

前面几个table都进行的很顺利, 但是进行到FND_ENV_CONTEXT这个表的时候, 老是报错:

ORA-1630: max # of extents 505 reached in temp segment in tablespace APPLSYSD

但是我在APPLSYSD中却怎么也找不到叫tempsegment, 脑袋又犯晕了.

因为报错的步骤是在执行第一句SQL的时候报的, 于是想会不会因为FND_CONCURRENT_PROCESSES中数据量还是过大, 在创建XX_FND_CONCURRENT_PROCESSES的时候默认的505 segment装不下了呢?

于是改为:

CREATE TABLE XX_FND_ENV_CONTEXT AS SELECT * FROM FND_ENV_CONTEXT WHERE 1 = 2;

ALTER TABLE XX_FND_ENV_CONTEXT STORAGE(MAXEXTENTS 2147483645);

INSERT INTO XX_FND_ENV_CONTEXT SELECT * FROM FND_ENV_CONTEXT;

TRUNCATE TABLE APPLSYS.FND_ENV_CONTEXT;

INSERT INTO FND_ENV_CONTEXT SELECT * FROM XX_FND_ENV_CONTEXT;

DROP TABLE XX_FND_ENV_CONTEXT;

果然OK.

再看这几个TABLE的占用空间:

TABLE NAME

RECORDS

SIZE

FND_CONCURRENT_PROCESSES

3518

1.60M

FND_CONCURRENT_REQUESTS

90

2.11M

FND_ENV_CONTEXT

475842

24.06M

WF_ITEM_ACTIVITY_STATUSES

309429

20.20M

WF_ITEM_ATTRIBUTE_VALUES

315120

15.31M

几个TABLEindex占用空间也是剧减, 合起来减了将近4G的空间, 果然成就不小.

dump block

今天在看《oracle 10g数据库管理艺术》这本书,读到关于extent management以及segment space management的时候, 很想看看oracle在底层到底是怎样实现的, 相关信息是怎样存储在data file中的。为了方便的dump datafile block, 写了个脚本, 运行脚本, 输入fileid,blocknumber, 然后将文件重命名到某一文件夹下, 方便查看。

dump_block.sh:
#!/bin/bash
sqlplus system/system@DEV @./dump_block.sql

dump_block.sql:
alter system dump datafile &&data_file block &&data_block;
define trace_file_name = '';
column trc_file_name new_value trace_file_name;
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc' trc_file_name
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d;
define new_file_name = blk_&&data_file'_'&&data_block'.trc';
!mv &trace_file_name ./blk/&new_file_name;
!echo &new_file_name;
exit;

其中获取trace name的SQL借用了eygle的SQL:
http://www.eygle.com/archives/2007/05/script_gettrcname.html

2008年6月23日星期一

Oracle iDS Forms Build Internet Application I (Reading Note) (一)

1. Introduction to Oracle Form Developer and Oracle Form service

Oracle Internet平台: iDS工具(Form Developer, Designer, Reports, JDeveloper, Portal, Discover)9iAS (基于Oracle8i)

Oracle Form Developer, iDS工具的一个组建, 功能强大.

Oracle Form Service, 9iAS的一个组件, web环境中将form程序发布给Java客户端.

Oracle Form Service使用三层架构来发布数据库程序: 客户端为浏览器, 中间层为Application server, 底层为数据库

9iAS的主要元素:

1) 信息交换 (HTTP)

2) UI呈现 (HTML)

3) 业务逻辑 (JAVA, BC4J, FORM, REPORTS)

4) 数据管理(Oracle8i cache)

5) 系统服务

Form Service组成:

1) Java客户端

2) Form Listener

3) Forms CGI or Servlet

4) Forms Runtime Engine

Forms Developer的主要特性:

1) 全面的GUI支持

2) 支持分布式程序 (可以有多个数据库链接, 除了ORACLE7i, 8i, 以外, 能够通过ODBC访问其它SQL数据库

3) 快速开发

4) 应用分离(PL/SQL既可以放在Server, 也可以放在client)

5) 源代码控制, Form模块可以存为平面文件, 方便版本控制

6) 可扩展性

7) 代码重用

Form Builder组成:

1) 对象浏览器

2) 属性面板

3) 界面编辑器

4) PL/SQL编辑器

Oracle工具包和Oracle多媒体, 二者帮助沟通Form与操作系统本地环境

Oracle Form自定义设置, Oracle FormOracle Reports共享一个设置文件, 但二者的设置条目是不同的, 修改的时候只是修改当前session, 只有退出Oracle Form

或者Oracle Reports的时候才会将设置写到文件.

配置文件不同平台文件名是不一样的:

Windows: cauprefs.ora

其它: prefs.ora

Oracle Form Builder环境变量(Windows下存储在注册表中):

FORMS60_PATH: 文件搜索路径

UI_ICON: 图标搜索路径

ORACLE_PATH: 这是一个附件路径, 当在指定路径下找不到文件的时候, 则到此路径下寻找

环境变量与Y2K

NLS_DATE_FORMAT: 数据库链接session的日期格式

FORMS60_USER_DATE_FORMAT: 用户输入日期格式, 使用该格式将user输入的字符串转换为日期

Oracle Form帮助:

Form Builder Help Topics: 最全面的帮助手册

Quick Tour: 简要介绍

Cue Cards: Demo step by step

Manuals: HTML形式的额外帮助