sqlldr使用
sqlldr 使用:sqlldr是oracle提供的一个比较好用的平面文件数据倒入工具,可以倒入带有格式的数据等比较规范的文本文件。加载方式有:传统路径(conventional path),利用sql插入为我们加载的数据和直接路径(direct path)。必需要有一个 数据文件和一个控制文件,日志文件可选(不指定的话,会自动生成的)。数据文件的分隔符需要指定合适,否则会出现混乱。控制文件是告诉sqlldr数据文件和表的对应关系以及一些处理规则命令:Sqlldr userid=user/password@SID control=loader.ctl log=loade.log bad=loader.badSqlldr 这个是应用程序
oracle 优化经验总结
晚上下班,和oracle优化高手一起坐下来聊聊。1、关注访问频繁的表,现在的存储已经可以非常分散的存储数据,所以可以对访问频繁的表以及涉及到的sql进行特别关注。statspack的sql排序要根据执行次数、逻辑读等等多个纬度去衡量,这部分sql要是能够处理好,数据库的load会得以控制。2、oltp系统的sql的业务范围界定,他不是做报表的用途,特点是每次处理的数据量比较小,能够比较快的处理完毕,这是一个原则。统计类型的如果非要必须,尽量减小其访问数据的范围,或者是将这样的大量数据的统计工作放到业务比较闲的时候做,这一点要推动业务
表约束的研究
CREATE TABLE zsq_t (a NUMBER CONSTRAINT apk PRIMARY KEY DISABLE,b NUMBER NOT NULL);CREATE TABLE zsq_x (c NUMBER CONSTRAINT afk REFERENCES zsq_t DISABLE);执行上面的语句之后约束不生效CREATE UNIQUE INDEX tai ON zsq_t (a);CREATE INDEX tci ON zsq_x (c);执行上面的语句后 zsq_t表增加一个唯一索引约束,该约束生效ALTER TABLE zsq_t MODIFY CONSTRAINT apk ENABLE NOVALIDATE;ALTER TABLE zsq_x MODIFY CONSTRAINT afk ENABLE NOVALIDATE;执行上面的语句后 两张表上的约束都生效,但是不对旧数据进行约束检查,新数据会不能插
lock (1)
Lock DescriptionDML locks (data locks) DML locks protect data. For example, table locks lockentire tables, rowlocks lock selected rows.DDL locks (dictionarylocks)DDL locks protect the structure of schema objects—forexample, the definitions of tables and views.Internal locks and latches Internal locks and latches protect internal databasestructures such as datafiles. Internal locks and latchesare entirely automatic.DML锁就是保证当数据被多个用户同时修改时的完整性,保证不同时发生DML或者DDL。例如ta
oracle 外部表 external table
第一步:建立路径,并且要保证这个路径可以被oracle读写权限(因为oracle会在这个路径下写外部表的日志和错误的数据) mkdir /home/oracle/ 将需要做外部表的数据(test.txt,test2.txt)放到该目录下,可以放多个 --copy test.txt,test2.txt to /home/oracle/第二步:dba用户执行,创建directory并且授权给oracle的schema。create directory test as '/home/oracle/';grant read on directory test to test1;grant write on directory test to test1;--登录teset1,执行用户创建external tablecreate table resources_ext( GMT_CREATE
dump 解决问题
使用外部表搞了一些数据到数据库中去,结果有一列原本可以转化为number的却出现了ORA-01722: invalid number。trim了半天也没有效果,想起dump:select">SQL>select dump(id) from test_re_2 where rownum<10;DUMP(ID)------------------------------------------------------------------------------------------------------------------------------------------------------Typ=1 Len=11: 9,49,48,48,48,48,50,50,52,54,9Typ=1 Len=11: 9,49,48,48,48,48,50,50,52,55,9Typ=1 Len=11: 9,49,48,48,48,48,50,50,52,56,9Typ=1 L
clob 字段查询
刚刚有个同事问我clob字段如何查出来看看,看了一下dbms_lob包,先是用dbms_lob.GETLENGTH(),查看了一下这个clob字段有多少字符,然后直接设置set long 99999然后直接查询clob字段,没有问题,结果出来了。[@more@]
index 和 index_desc hints的一点有意思的区别
2 - access("T1"."OBJECT_ID">=6361 AND "T1"."OBJECT_ID"<=6400)和 2 - access("T1"."OBJECT_ID">=6361 AND "T1"."OBJECT_ID"<=6400) filter("T1"."OBJECT_ID"<=6400 AND "T1"."OBJECT_ID">=6361)SQL>create table t1 as select * from user_objects; SQL>create index t1_object_id_ind on t1(object_id) tablespace users; SQL>explain plan for 2 dele
oracle 20468 0.0 19.9 1582016 1535864 ? S Apr15 0:11 ora_qmn0_xxxx
察看进程看到ps -aux | grep oracle oracle 20468 0.0 19.9 1582016 1535864 ? S Apr15 0:11 ora_qmn0_xxxx然后找到了其对应的sql:select q_name, state, delay, expiration, rowid, msgid,dequeue_msgid, chain_no, local_order_no, enq_time, enq_tid, step_no, priority, exception_qschema, exception_queue, retry_count, corrid, time_manager_info, sender_name, sender_address, sender_protocol from SYS.AQ_SRVNTFN_TABLE where time_manager_info <= :1 and state != :2 for update skip locked不知道到底这个进程是干什么
oracle connect by
declare maxl number;idnew number;beginfor t in (select id from t2) loopselect max(level) ll into maxl from t1 start with id=t.id connect by prior pid=id;select id into idnew from (select level ll, id,pid from t1 start with id=t.id connect by prior pid=id) where ll=maxl-1;update t2 set id=idnew where id=t.id;end loop;commit;end;[@more@]
SGA系统全局区内存结构了解
System global area(SGA) 是一组共享的内存结构,它里面存储了oracle数据库实例(instance)的数据和控制文件信息。如果有多个用户同时连接到数据库,他们会共享这一区域,因此SGA也称之为shared global area。SGA和oracle的进程组成了oracle的实例(instance)。在实例启动的时候内存会自动分配,当实例shutdown的时候操作系统会将内存回收的。没一个实例(instance)拥有自己的SGA。SGA是可以读写的,每一个用户连到数据库实例时都是可以读实例的SGA的内容,oracle通过服务器进程执行一个命令去写SGA的数据。SGA包含以下的数据结构:l
oracle archive log 归档日志
查看和归档相关的参数:SQL> show parameter archiveNAME TYPE VALUE------------------------------------ ----------- ------------------------------archive_lag_target integer 0log_archive_dest stringlog_archive_dest_1 string LOCATION=D:oracleoradataarclog_archive_dest_10 stringlog_archive_dest_2 stringlog_archive_dest_3 stringlog_archive_dest_
使用prebuilt table 方式迁移数据
使用物化视图的 ON PREBUILT TABLE 这样的一种方式进行同步迁移数据。SQL>desc T1 Name Null? Type ------------------------------------------- -------- -------------------------------------------------------- A NOT NULL VARCHAR2(10) B VARCHAR2(5)SQL>select index_name from user_indexes where table_name='T1';INDEX_NAME------------------------------T1_A_IND1 row selected.SQL>SQL>create table T2 as select * from T1 where 1=2;Table created.SQL>create materialized v
v$session的一点认知
字段 大致解释-------------------------------------------SADDR 会话在内存的地址------------------------------------------SID 唯一标示一个会话SERIAL# -------------------------------------------PADDR $process.addr-------------------------------------------USER# user$.user#USERNAME -------------------------------------------COMMAND OWNERID -------------------------
new_value
column some_field_name new_value some_var_nameselect some_field_name from new_value_test;prompt "The variable is: &some_var_name"此时可以将some_var_name的值显示出来,即在查询的时候赋的值,并且只显示最后一条。[@more@]
&变量符
&&sch..&&tabn=schema.tablename 在&&的时候 需要两个点。[@more@]
Oracle 9I dataguard(standby)
Oracle 9I dataguard一个主数据库可以有物理standby或逻辑的standby,也可以有两者都有。数据的同步主要是主库将archive log 传送到standby系统上面,然后standby上将archive log恢复(即物理的standby)或者使用logmnr生成sql语句写到standby库上(即逻辑的standby),这样的机制数据是不会立即从主库上到standby上面,不能提供实时性要求高的查询。逻辑standby的数据库可以提供查询功能,物理的standby需要先切换到readonly模式下才能提供查询功能。物理standby物理standby在read only状态下不能够恢复redo log,但是可以继续从主库上接
logmnr使用
开始启动logminer,加入一个日志:execute dbms_logmnr.add_logfile(logfilename => '/redo/testdb/redo04.log', options => dbms_logmnr.new);在启动后,继续添加日志:execute dbms_logmnr.add_logfile(logfilename => '/redo/testdb/redo05.log', options => dbms_logmnr.addfile);分析日志(直接在线上环境,字典信息在log中的情况下使用):execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog + dbms_logmnr.committe
索引的tree dump
实验表:desc test Name Null? Type ---------- -------- ---------------------------------------------- A VARCHAR2(30) B NUMBER C VARCHAR2(40)Declare Num number; Begin For num in 1..500000 loop If mod(num,2)=0 then Insert into test values('t'||num,num,'M'); Else Insert into test values('t'||num,num,'F'); End if; If mod(num,1000)=0 then Commit; End if; End loop; Commit; End; /sql&g