12
返回列表 发新帖
楼主: wisdomone1

[笔记] oracle杂烩笔记

[复制链接]
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
11#
 楼主| 发表于 2008-4-11 00:27 | 只看该作者

这个问题我没有办法,不知什么原因.

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
12#
 楼主| 发表于 2008-4-11 17:35 | 只看该作者

转学坛友rman catalog构建和备份恢复

1,rman catalog不能存在于目录数据库,是另外一人数据库,在另外一个数据库
  set oracle_sid=dupdb
  create tablespace cattbs datafile 'd:dupdbcatalog.dbf' size 15M;
   create user rman identified by system default tablespace cattbs
   temporary tablespace temp;
   grant connect,resource,recovery_catalog_owner to rman; ---recovery_catalog_owner privilege
2,connect catalog rman/rman@dupdb  ( 连接RMAN恢复管理器) ----以rman用户连接rman,set oracle_sid=dupdb

   create catalog;  ( 创建恢复目录) ---构建rman catalog

3,在恢复目录RMAN CATALOG中注册目标数据库
    rman target sys/system@oracle10g catalog rman/rman@dupdb(连接到目标数据库和恢复管理器)

    register database    (注册数据库)

4,sqlplus rman/rman  ---查找恢复目录中目标数据库的注册信息 set oracle_sid=dupdb

   select * from db;   (登陆到恢复目录管理器,这个时候可以查看到注册的数据库信息)

   至此,目标数据库和恢复目录同步完毕

[ 本帖最后由 wisdomone1 于 2008-4-11 17:37 编辑 ]

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
13#
 楼主| 发表于 2008-4-11 17:41 | 只看该作者

续转坛友rman catalog operation

3. 配置RMAN

   rman target rman/rman@test2006 catalog rman/rman@test2007

   configure default device type to disk   ( 设置默认的备份的设备为磁盘)
  
   configure device type disk parallelism 2 (设置备份的并行级别)

   configure channel 1 device type disk format 'dracleackup1ackup_%U'  (设置备份文件格式)

   configure channel 2 device type disk format 'dracleackup2ackup_%U'  (设置备份文件格式)

   configure controlfile autobackup on   (打开控制文件的自动备份)

   configure controlfile autobackup format for device type disk to 'dracleackup1ctl_%F' (设置控制文件备份格式)

   show all  (检查配置)

4. 备份测试


   备份已经存档的归档日志到第三步骤指定的BACKUP目录

   rman target rman/rman@test2006 catalog rman/rman@test2007

   backup archivelog all delete input  (执行完毕后,归档日志从归档路径转移到RMAN设置的备份路径)

   备份表空间

   backup tablespace users  

   备份全库

   backup database

5. 恢复测试

   假设备份了一个表空间users

   恢复表空间:

   rman target rman/rman@test2006 catalog rman/rman@test2007

   sql 'alter tablespace users offline immediate'  (使TEST2006的USERS表空间脱机)

   进入test2006

   select tablespace_name,status from dba_tablespaces; (检查USERS已经脱机)

   退出RMAN

   删除DracleoradataTEST2006users01.dbf

   rman target rman/rman@test2006 catalog rman/rman@test2007

   restore tablespace users

   recover tablespace users

   sql 'alter tablespace users online'  (使TEST2006的USERS表空间在线)

   进入test2006

   select tablespace_name,status from dba_tablespaces; (检查USERS已经在线)

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
14#
 楼主| 发表于 2008-4-11 17:48 | 只看该作者

随机在表中取一条记录的方法,转

select * from (select * from tab order by sys_guid()) where rownum<2   ---  来自棉花的

select *  from (select tname,rank() over(order  by rownum) as rk from tab) where rk=(select mod(abs(dbms_random.random),4) from dual)+1;  ---来自hxhy  俺要做DBA

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
15#
 楼主| 发表于 2008-4-11 22:58 | 只看该作者
rman
1,备份数据文件,表空间,控制文件,spfile,数据库,增量数据块级备份
2,利用rman来构建备用数据库
3,rman工具版本和目标数据库是同一版本
4,show all  ---查看rman中的配置信息
5,clear  ---恢复为默认策略
  none   ---备份保持策略失效
6,configure retention policy to recovery
  configure retention policy to recovery window of 5 days;--保证备份可以恢复到sysdate-5的时间点,之前备份obsolete
  configure retention policy to redundancy 5;---存在三个冗余备份,多于三个备份为冗余
7,configure channel device type disk format 'd:10gbackup\%U'; ---适用于所有通道配置
  run {allocate channel c1 type disk format='d:10gbackup\%u.bak'}   ----手工指配通道替代以上配置

  channel 的一些特性   allocate channel  rate=integer  --read rate
                       allocate channel  maxpiecesize=inter  --max backuppiece size
                       allocate channel  maxopenfile=integer --max concurrency open file (default 16)
8,controlfile autobackup
  configure controlfile autobackup on;---对于没配置recovery catalog,特有用。一般只在copy or backup,or any change to database
  configure controlfile autobackup format for type disk to '%F';---配置自动控制文件备份
  configure snapshot controlfile name to 'path/snapcf.f';---在备份期间,将产生一个控制文件的快照,用于控制文件的读一致性。
9,configure device type disk parallellism 4;---并行备份,并行数目决定通道个数(parallillism to number of channel)

10,configure default device type to disk; --配置默认io设备类型
   configure default device type to sbt;

   configure device type sbt parallelism 2;--device type 并行度

11,configure datafile backup copies for device type disk to 2;  ---配置多个备份的拷贝,其实就是怕万一一个备份集不可靠,多搞几个备用的
   configure archivelog backup copies for device type disk to 2;
   configure channel device type  disk format 'path1','path2';---为通道指定多个拷贝地点(用于多个备份拷贝),匹配上
   backup datafile n format 'path1','path2';
12,备份优化
   configure backup optimization on;---对备份数据文件或归档日志或备份集运行一个优化算法
13,备份文件的格式
    %c   backuppiece copies number
    %d   database name
    %D   same as DD,位于本月第几天,注意是大写
    %M   第几个月
    %F   基于DBID的名称,格式c-IIIIIIIIII-YYYYMMDD(date)-QQ(1-256 sequence)
    %n   database name,右填到最大8个字符
    %p   backuppiece number of backupset
    %u   一个8个字符的名称,代表备份集创建时间
    %U   一个唯一的文件名,表示%u_%p_%c
    %s   备份集的号
    %t   备份集timestamp
    %T   年月日格式(YYYYMMDD)
   

14,rman ---可以备份主或备库数据库,对备份集进行备份

15,file copy
     run {
         allocate channel d1 type disk;
         copy datafile 1 to 'path1/x.dbf';
         sql 'alter system archive log current';
         }

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
16#
 楼主| 发表于 2008-4-12 00:09 | 只看该作者
16,backup and backupset
   run {allocate channel t1 type disk;  --backup database
        allocate channel t2 type disk;
        backup
        filesperset 2
        format 'path'
        database;
        }

   run {                                ---实现多个镜像备份,可以理解是一个channel对应一个拷贝path
        allocate channel d1 type disk;
        allocate channel d2 type disk;
        set backup copies 2;
        backup datafile 7 format '/tmp/%U','/oradata/%U';
       };


   备份归档
    sql 'alter system archive log current';
    backup archivelog all delete input;
    backup archivelog from time '01-jan-00' until time '30-jun-00';---最好配置set nls_data_format
    backup archivelog like 'path/log%';
    backup archivelog all;
    backup archivelog from logseq 20 until logseq 50 thread 1;---logseq
    backup archivelog from scn 1 until scn 9999;---scn
   
    在rac中,处用一个连接实例来备份数据库,RAC下的归档日志备份有些复杂,可以连接到两个实例来备份对应的归档日志
    run {
        allocate channel node_rac1 device type disk connect 'sys/system@rac1';  ---利用通道对应不同的实例来备份归档日志
        allocate channel node_rac2 device type disk connect 'sys/system@rac2';
        sql 'alter system archive log current';
        backup archivelog all delete input format 'path' filesperset=5;
        }


17,备份参数
   backup database keep until time "to_date('31-mar-2002','dd-mm-yyyy')" nologs;---nologs表示不保持备份以来的归档日志
   backup tablespace sample keeep forever nologs;---让备份集永远有效,加forever
   backup device type disk database 1 tag "weekly_backup";---TAG可以达到30个字符长度
                                                              利用TAG,可以方便恢复restore database from tag='tagname'
   
18,增量备份  a,差异增量备份    --- 增量备份必须要有0级备份,backup incremental level 0; database backup incremental level 1 database;backup incremental level 1 cumulative database;
             b,累计增量备份    ---增量备份一般用于大量数据系统,另外它形成多个备份集,恢复增加难度,0级备份不同于全备份。               
             累计增量增加了备份时间,但恢复快,多采用它。
             差异增量:备份上级或同级备份以来变化的块,
             累计增量:备份上级备份以来变化的块

19,备份检查:
             backup validate database;---用validate检查是否可以备份,如检查数据文件是否存在,或坏块等。
             backup validate database archivelog all;
20,重新继续备份,用于在备份中途中止,接着备份
             backup not backed up since time 'sysdate-14' database plus archivelog;

21,rman 备份视图
   v$archived_log
   v$backup_corruption
   v$copy_corruption
   v$backup_datafile
   v$backup_redolog
   v$backup_set
   v$backup_piece
   v$backup_device
   v$controlfile_record_section
   
select sid,serial#,context,sofar,totalwork,round(sofar/totalwork*100,2) "%_complete"
from  v$session_longops
where opname  like 'RMAN%' and opname not like '%aggregate%' and totalwork!=0 and sofar!=totalwork;



22,还原与恢复  ---恢复可在RMAN OR SQLPLUS,recover take more time than restore
  restore database;
  recover database;

  sql 'alter tablespace users offline immediate';
  restore tablespace users;
  recover tablespace users;
  sql 'alter tablespace users online';

  restore datafile 1 from tag='tag name'


  run {allocate channel c1 type disk;         --时间点恢复,不完全恢复
       set until time='2004-12-03:11:44:00';
       restore database;
       recover database;
       alter database open resetlogs;}

  

run {allocate channel c1 type disk;         --时间点恢复,不完全恢复
       set until sequence 120 thread 1;
       alter database mount;
       restore database;
       recover database;
       alter database open resetlogs;}

把数据文件恢复到一个新的位置
set newname for datafile path|n;
restore datafile path|n;
switch datafile all;


恢复控制文件  --nomount
restore controlfile from 'file name';
restore controlfile from autobackup;
restore controlfile from tag='tag name';

一般,不用恢复归档日志,因为恢复进程会自动恢复,你也可以指定恢复到哪里。
set archivelog destination to 'path';
restore archivelog all;


特殊情况恢复---恢复目录或控制文件没有了,只有备份集和备份片,这时,只有从文件恢复了
declare
devtype varchar2(100);
done boolean;
recid number;
stamp number;
fullname varchar2(80);
begin
devtype:=
dbms_backup_restore.deviceallocate(



23,还原验证
restore database validate;
validate backupset 218;
recover tablespace users test;
recover database until cancel test;  ---查看alert是否可以完成


24,块恢复,一是快,减少恢复时间,二是数据文件可以在线
  blockrecover datafile 6 block 3;---确定坏块,从alert,trace file,dbv,表或索引分析.
  select * from v$database_block_corruption;---查坏块

  blockrecover corruption list
  restore until time 'sysdate-10';

  备份的坏块信息在v$backup_corruption和v$copy_corruption

  blockrecover datafile 2 block 12,13
  blockrecover tablespace users dba 4194404,4194405 from tag "weekly_backup";
  blockrecover tablespace users dba 4194404,4194405 restore until time 'sysdate-2';


25,report  ---查找哪些文件要备份,哪些备份可以删除,
    report schema
    report schema at time 'sysdate-14';
    report schema at scn 1000;
    report scheme at sequence 100 thread 1;

    report need backup [redundancy|days|incremental n];
    report obsolete [orphan]  ---查过期或不可能的备份或拷贝
    report unrecoverable [database] ---


26,list  ---查找备份与拷贝信息
    list backup
    list backup summmary
    list copy
    list backup of datafile 'file name'
    list incarnation of database
     
27,crosscheck  ---检查备份拷贝是否正确,且更新备份与拷贝状态
   crosscheck backup
   crosscheck archivelog all
   delete [noprompt] expired backup   ---delete expired backup
   list expired backup
   list expired backup summary

28,delete  ---delete 指定备份或删除不要或过期的备份集
   delete backuppiece 101;
   delete controlfilecopy 'path';
   delete backup of tablespace users device type disk;

   delete expired backup;
   delete noprompt obsolete;
   delete obsolete redundancy=3;
   delete obsolete recovery window of 7 days;
   
   delete noprompt archivelog until sequence=300;


29,recovery catalog
    create catalog;
    register database;
    upgrade catalog;
    drop catalog;
30,恢复目录视图 --存储目标数据库与备份信息
    rc_database
    rc_datafile
    rc_stored_script
    rc_stored_script_line
    rc_tablespace


40,存储脚本
create script level0backup {backup incremental level 0 format 'path/%U' filesperset 5 database plus archivelog delete input;
                             sql 'alter database archive log current';}

run {execute script level0backup;}

replace script level0backup {}

delete script level0backup;

print script level0backup;

使用道具 举报

回复
论坛徽章:
63
版主7段
日期:2012-05-15 15:24:11itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-10 14:34:59马上加薪
日期:2015-01-08 15:39:192015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
17#
发表于 2008-4-12 00:57 | 只看该作者
不错,都是很常用的.

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
18#
 楼主| 发表于 2008-4-12 02:16 | 只看该作者

实验总结

1,path加上具体%U.bak
2,configure datafile backup copies for device type disk to 2;---实验得知,在指定目录总会两个镜像文件
3,%F在10G中无效
4,format='/path/%d_%T.bak'
5,configure channel device type disk format='i:ackup\%U.bak';---以后直接backup
6,数据文件或表空间发生故障时,数据库mount,no open

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
19#
 楼主| 发表于 2008-4-13 20:56 | 只看该作者

sql loader学习指南,转Angel.John坛友

Oracle SQL*Loader 使用指南

整理:Angel.John

SQL*Loader是Oracle数据库导入外部数据的一个工具.它和DB2的Load工具相似,但有更多的选择,它支持变化的加载模式,可选的加载及多表加载.

如何使用 SQL*Loader 工具
我们可以用Oracle的sqlldr工具来导入数据。例如:
sqlldr scott/tiger control=loader.ctl
控制文件(loader.ctl) 将加载一个外部数据文件(含分隔符). loader.ctl如下:
load data
infile 'c:datamydata.csv'
into table emp
fields terminated by "," optionally enclosed by '"'
( empno, empname, sal, deptno )

mydata.csv 如下:
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20
下面是一个指定记录长度的示例控制文件。"*" 代表数据文件与此文件同名,即在后面使用BEGINDATA段来标识数据。
load data
infile *
replace
into table departments
( dept position (02:05) char(4),
deptname position (08:27) char(20)
)
begindata
COSC COMPUTER SCIENCE
ENGL ENGLISH LITERATURE
MATH MATHEMATICS
POLY POLITICAL SCIENCE
Unloader这样的工具
Oracle 没有提供将数据导出到一个文件的工具。但是,我们可以用SQL*Plus的select 及 format 数据来输出到一个文件:
set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on
spool oradata.txt
select col1 || ',' || col2 || ',' || col3
from tab1
where col2 = 'XYZ';
spool off

另外,也可以使用使用 UTL_FILE PL/SQL 包处理:
rem Remember to update initSID.ora, utl_file_dir='cradata' parameter
declare
fp utl_file.file_type;
begin
fp := utl_file.fopen('cradata','tab1.txt','w');
utl_file.putf(fp, '%s, %s
', 'TextField', 55);
utl_file.fclose(fp);
end;
/

当然你也可以使用第三方工具,如SQLWays ,TOAD for Quest等。

加载可变长度或指定长度的记录
如:
LOAD DATA
INFILE *
INTO TABLE load_delimited_data
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
( data1,
data2
)
BEGINDATA
11111,AAAAAAAAAA
22222,"A,B,C,D,"

下面是导入固定位置(固定长度)数据示例:
LOAD DATA
INFILE *
INTO TABLE load_positional_data
( data1 POSITION(1:5),
data2 POSITION(6:15)
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB

跳过数据行:
可以用 "SKIP n" 关键字来指定导入时可以跳过多少行数据。如:
LOAD DATA
INFILE *
INTO TABLE load_positional_data
SKIP 5
( data1 POSITION(1:5),
data2 POSITION(6:15)
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB

导入数据时修改数据:
在导入数据到数据库时,可以修改数据。注意,这仅适合于常规导入,并不适合 direct导入方式.如:
LOAD DATA
INFILE *
INTO TABLE modified_data
( rec_no "my_db_sequence.nextval",
region CONSTANT '31',
time_loaded "to_char(SYSDATE, 'HH24:MI')",
data1 POSITION(1:5) ":data1/100",
data2 POSITION(6:15) "upper(:data2)",
data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')"
)
BEGINDATA
11111AAAAAAAAAA991201
22222BBBBBBBBBB990112

LOAD DATA
INFILE 'mail_orders.txt'
BADFILE 'bad_orders.txt'
APPEND
INTO TABLE mailing_list
FIELDS TERMINATED BY ","
( addr,
city,
state,
zipcode,
mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)",
mailing_city "decode(:mailing_city, null, :city, :mailing_city)",
mailing_state
)

将数据导入多个表:
如:
LOAD DATA
INFILE *
REPLACE
INTO TABLE emp
WHEN empno != ' '
( empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER EXTERNAL
)
INTO TABLE proj
WHEN projno != ' '
( projno POSITION(25:27) INTEGER EXTERNAL,
empno POSITION(1:4) INTEGER EXTERNAL
)

导入选定的记录:
如下例: (01) 代表第一个字符, (30:37) 代表30到37之间的字符:
LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '19991217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)

导入时跳过某些字段:
可用 POSTION(x:y) 来分隔数据. 在Oracle8i中可以通过指定 FILLER 字段实现。FILLER 字段用来跳过、忽略导入数据文件中的字段.如:
LOAD DATA
TRUNCATE INTO TABLE T1
FIELDS TERMINATED BY ','
( field1,
field2 FILLER,
field3
)

导入多行记录:
可以使用下面两个选项之一来实现将多行数据导入为一个记录:

CONCATENATE: - use when SQL*Loader should combine the same number of physical records together to form one logical record.

CONTINUEIF - use if a condition indicates that multiple records should be treated as one. Eg. by having a '#' character in column 1.

SQL*Loader 数据的提交:
一般情况下是在导入数据文件数据后提交的。
也可以通过指定 ROWS= 参数来指定每次提交记录数。

提高 SQL*Loader 的性能:
1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。
2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。
4) 可以同时运行多个导入任务.

常规导入与direct导入方式的区别:
常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。

使用道具 举报

回复
论坛徽章:
36
数据库板块每日发贴之星
日期:2008-06-23 01:01:58奥运会纪念徽章:足球
日期:2012-08-21 19:26:212013年新春福章
日期:2013-02-25 14:51:24蜘蛛蛋
日期:2013-05-03 17:38:25一汽
日期:2013-08-19 16:12:56保时捷
日期:2013-10-18 23:41:21阿斯顿马丁
日期:2013-11-11 14:17:47大众
日期:2013-11-17 16:50:19问答徽章
日期:2014-01-13 00:25:10马上有车
日期:2014-08-03 11:06:20
20#
 楼主| 发表于 2008-4-13 21:13 | 只看该作者

再转坛友一例总结

sql load的一点小总结
===========================================================
sql load的一点小总结
作者: lastwinner(http://lastwinner.itpub.net)
发表于: 2005.10.10 13:35
分类: Oracle
出处: http://lastwinner.itpub.net/post/7102/42692
---------------------------------------------------------------

sqlldr userid=lgone/tiger control=a.ctl
LOAD DATA
INFILE 't.dat' // 要导入的文件
// INFILE 'tt.date' // 导入多个文件
// INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容

INTO TABLE table_name // 指定装入的表
BADFILE 'c:bad.txt' // 指定坏文件地址

************* 以下是4种装入表的方式
APPEND // 原先的表有数据 就加在后面
// INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值
// REPLACE // 原先的表有数据 原先的数据会全部删除
// TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据

************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
// 装载这种数据: 10,lg,"""lg""","lg,lg"
// 在表中结果: 10 lg "lg" lg,lg
// TERMINATED BY X '09' // 以十六进制格式 '09' 表示的
// TERMINATED BY WRITESPACE // 装载这种数据: 10 lg lg

TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空

************* 下面是表的字段
(
col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
// 如: lg,lg,not 结果 lg lg
)
// 当没声明FIELDS TERMINATED BY ',' 时
// (
// col_1 [interger external] TERMINATED BY ',' ,
// col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
// col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
// )
// 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据
// (
// col_1 position(1:2),
// col_2 position(3:10),
// col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
// col_4 position(1:16),
// col_5 position(3:10) char(8) // 指定字段的类型
// )

BEGINDATA // 对应开始的 INFILE * 要导入的内容就在control文件里
10,Sql,what
20,lg,show

=====================================================================================
//////////// 注意begindata后的数值前面不能有空格

1 ***** 普通装载
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO,
DNAME,
LOC
)
BEGINDATA
10,Sales,"""USA"""
20,Accounting,"Virginia,USA"
30,Consulting,Virginia
40,Finance,Virginia
50,"Finance","",Virginia // loc 列将为空
60,"Finance",,Virginia // loc 列将为空

2 ***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情况
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
-- FIELDS TERMINATED BY x'09'
(DEPTNO,
DNAME,
LOC
)
BEGINDATA
10 Sales Virginia

3 ***** 指定不装载那一列
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
( DEPTNO,
FILLER_1 FILLER, // 下面的 "Something Not To Be Loaded" 将不会被装载
DNAME,
LOC
)
BEGINDATA
20,Something Not To Be Loaded,Accounting,"Virginia,USA"

4 ***** position的列子
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
( DEPTNO position(1:2),
DNAME position(*:16), // 这个字段的开始位置在前一字段的结束位置
LOC position(*:29),
ENTIRE_LINE position(1:29)
)
BEGINDATA
10Accounting Virginia,USA

5 ***** 使用函数 日期的一种表达 TRAILING NULLCOLS的使用
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应
// 的列的值的 如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了
(DEPTNO,
DNAME "upper(:dname)", // 使用函数
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等
ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"
)
BEGINDATA
10,Sales,Virginia,1/5/2000
20,Accounting,Virginia,21/6/1999
30,Consulting,Virginia,5/1/2000
40,Finance,Virginia,15/3/2001

6 ***** 使用自定义的函数 // 解决的时间问题
create or replace
function my_to_date( p_string in varchar2 ) return date
as
type fmtArray is table of varchar2(25);

l_fmts fmtArray := fmtArray( 'dd-mon-yyyy', 'dd-month-yyyy',
'dd/mm/yyyy',
'dd/mm/yyyy hh24:mi:ss' );
l_return date;
begin
for i in 1 .. l_fmts.count
loop
begin
l_return := to_date( p_string, l_fmts(i) );
exception
when others then null;
end;
EXIT when l_return is not null;
end loop;

if ( l_return is null )
then
l_return :=
new_time( to_date('01011970','ddmmyyyy') + 1/24/60/60 *
p_string, 'GMT', 'EST' );
end if;

return l_return;
end;
/

LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )" // 使用自定义的函数
)
BEGINDATA
10,Sales,Virginia,01-april-2001
20,Accounting,Virginia,13/04/2001
30,Consulting,Virginia,14/04/2001 12:02:02
40,Finance,Virginia,987268297
50,Finance,Virginia,02-apr-2001
60,Finance,Virginia,Not a date

7 ***** 合并多行记录为一行记录
LOAD DATA
INFILE *
concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录
INTO TABLE DEPT
replace
FIELDS TERMINATED BY ','
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy'
)
BEGINDATA
10,Sales, // 其实这3行看成一行 10,Sales,Virginia,1/5/2000
Virginia,
1/5/2000
// 这列子用 continueif list="," 也可以
告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行

LOAD DATA
INFILE *
continueif this(1:1) = '-' // 找每行的开始是否有连接字符 - 有就把下一行连接为一行
// 如 -10,Sales,Virginia,
// 1/5/2000 就是一行 10,Sales,Virginia,1/5/2000
// 其中1:1 表示从第一行开始 并在第一行结束 还有continueif next 但continueif list最理想
INTO TABLE DEPT
replace
FIELDS TERMINATED BY ','
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy'
)
BEGINDATA // 但是好象不能象右面的那样使用
-10,Sales,Virginia, -10,Sales,Virginia,
1/5/2000 1/5/2000
-40, 40,Finance,Virginia,13/04/2001
Finance,Virginia,13/04/2001

8 ***** 载入每行的行号

load data
infile *
into table t
replace
( seqno RECNUM //载入每行的行号
text Position(1:1024))
BEGINDATA
fsdfasj //自动分配一行号给载入 表t 的seqno字段 此行为 1
fasdjfasdfl // 此行为 2 ...

9 ***** 载入有换行符的数据
注意: unix 和 windows 不同 n & /n
&lt; 1 > 使用一个非换行符的字符
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS "replace(:comments,'n',chr(10))" // replace 的使用帮助转换换行符
)
BEGINDATA
10,Sales,Virginia,01-april-2001,This is the SalesnOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the AccountingnOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the ConsultingnOffice in Virginia
40,Finance,Virginia,987268297,This is the FinancenOffice in Virginia

&lt; 2 > 使用fix属性
LOAD DATA
INFILE demo17.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo17.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia

// 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同

LOAD DATA
INFILE demo18.dat "fix 101"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo18.dat
10,Sales,Virginia,01-april-2001,"This is the Sales
Office in Virginia"
20,Accounting,Virginia,13/04/2001,"This is the Accounting
Office in Virginia"
30,Consulting,Virginia,14/04/2001 12:02:02,"This is the Consulting
Office in Virginia"
40,Finance,Virginia,987268297,"This is the Finance
Office in Virginia"

&lt; 3 > 使用var属性
LOAD DATA
INFILE demo19.dat "var 3"
// 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 071 表示此记录有 71 个字节
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo19.dat
07110,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
07820,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
07140,Finance,Virginia,987268297,This is the Finance
Office in Virginia

&lt; 4 > 使用str属性
// 最灵活的一中 可定义一个新的行结尾符 win 回车换行 : chr(13)||chr(10)

此列中记录是以 a|rn 结束的
select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;
结果 7C0D0A

LOAD DATA
INFILE demo20.dat "str X'7C0D0A'"
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(DEPTNO,
DNAME "upper(:dname)",
LOC "upper(:loc)",
LAST_UPDATED "my_to_date( :last_updated )",
COMMENTS
)
demo20.dat
10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia|
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia|
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia|
40,Finance,Virginia,987268297,This is the Finance
Office in Virginia|

==============================================================================
象这样的数据 用 nullif 子句

10-jan-200002350Flipper seemed unusually hungry today.
10510-jan-200009945Spread over three meals.

id position(1:3) nullif id=blanks // 这里可以是blanks 或者别的表达式
// 下面是另一个列子 第一行的 1 在数据库中将成为 null
LOAD DATA
INFILE *
INTO TABLE T
REPLACE
(n position(1:2) integer external nullif n='1',
v position(3:8)
)
BEGINDATA
1 10
20lg

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表