日積月累-oracle筆記

------------------------------------------------------------------------------------------
鎖:行級排他鎖TX,表級共享鎖TM(主要防止其他事務對錶進行DDL操作)
block:修改同一條記錄的多個事務之間。一個事務修改未提交,另一個事務也修改該記錄時,處於等待狀態。行級鎖。TX。如果修改的是不同的記錄,不會產生阻塞。
DML鎖:行級鎖TX(排他鎖);表級鎖TM(共享)   X-exclude
DDL鎖:一般是排他鎖

查看自己的SID:select sid from v$mystat where rownum=1;

v$transaction --記錄當前活動的事務,提交或者回滾後記錄清除。
        select addr,xidusn from V$transaction;
v$lock
 select sid,ty,id1,id2,lmode,request from v$lock;

v$lock與v$transaction的關係:
    select sid,type,trunc(id1/power(2,16)) usn,--提取高16位
  bitand(id1,to_number('ffff','xxxx'))+0 slot,
  id2 req,lmode,requwst
         from v$lock where sid=11;
    select xidusn,xidslot,xidsqn req from v$transaction;

找到上鎖的id1,再從all_objects中找到上鎖對應的對象。
可以一步到位達到此目的:select * from v$locked_object;

lock table emp in share mode;--oracle一般是自動加鎖,也可以手動加鎖。commit後釋放鎖。

---------------------------------------------------------------------------------------
數據導入

1、直接導入:同一個數據庫中不同表之間的數據遷移
 insert /*+ append*/ into tb1 select * from tb2;
     注意:未提交或者回滾前,查詢該表會報錯ORA-12838

2、並行導入:多個分區表(各個進程在不同分區上進行操作),一個分區表(多個進程在一個分區上進行操作),非分區表(各個進程在一張表上進行操作)
   多個進行同時進行,在通過一個進程進行合併。
 insert /*+ parallel(tb1,2)*/ into tb1 select * from tb2;

3、sqlldr導入:
方法一:
 準備一個控制文件ld.ctl如下:
        load data
 infile *
 into table tb1
 fields termibated by ','
 (col1,col2,col3)
 begindata
 a,aa,aaa
 b,bb,bbb
 c,cc,ccc
   在系統中執行命令 sqlldr usserid=scott/tiger control=ld.ctl

方法二:
 準備數據文件data.dat如下:
 a,aa,aaa
 b,bb,bbb
 c,cc,ccc
 
 準備一個控制文件ld.ctl如下:
        load data
 infile data.dat
 into table tb1
 fields termibated by ','
 (col1,col2,col3)
   在系統中執行命令 sqlldr usserid=scott/tiger control=ld.ctl

數據文件類型:固定長度記錄,指定長度的變長記錄,已特定符號爲記錄分割符。
   a、數據文件data.dat如下,每條記錄固定12個字節:
 a,aaaa,aaaaa
 b,  bb,  bb
 c,cccc,  ccc
      準備一個控制文件ld.ctl如下:
        load data
 infile 'data.dat' "fix 12"  
 into table tb1
 fields termibated by ','
 (col1,col2,col3)
  
   b、數據文件data.dat如下,前三位表示長度信息:
 009aaaaa,aaaa,aaaaa
 012bb,bb,bb
 013c,cccc,ccc
      準備一個控制文件ld.ctl如下:
        load data
 infile 'data.dat' "var 3"
 into table tb1
 fields termibated by ','
 (col1,col2,col3)

   c、數據文件data.dat如下,已|和換行符爲記錄分割符:
 aaaaa,aaaa,aaaaa|
 bb,bb,bb|
 c,cccc,ccc
      準備一個控制文件ld.ctl如下:
        load data
 infile 'data.dat' "str '|\n'"
 into table tb1
 fields termibated by ','
 (col1,col2,col3)

   d、數據文件中,一條記錄中有換行(多行表示一條記錄),控制文件怎麼寫。。。。

---壓縮與壓縮--------------------------------------------------------------------------------------------------

優點:壓縮後,節省空間並在一定條件下提高查詢性能。
缺點:壓縮後,在更新操作時,性能有很大下降,MERGE/UPDATE操作應注意

--1)對錶屬性進行修改,影響以後新數據
要創建一個壓縮的表,可在CREATE TABLE語句中使用COMPRESS關鍵字。COMPRESS關鍵字指示Oracle數據庫儘可能以壓縮的格式存儲該表中的行。
或者,你可以用ALTER TABLE語句來修改已有表的壓縮屬性,如:ALTER TABLE TABLE_NAME COMPRESS

--2)對錶中以存儲數據進行壓縮解壓縮
如果你有一個已有的未壓縮/壓縮表,那麼你可以利用ALTER table XX MOVE COMPRESS/NOCOMPRESS語句對其進行壓縮/ 解壓縮。

---解鎖--------------------------------------------------------------------------------------------------
0.
通過 v$session,v$lock 查看每個用戶下有什麼鎖
select * from v$session t1,v$lock t2
where t1.SID=t2.SID
and t1.STATUS='ACTIVE'
and t1.SCHEMANAME='AICS';

通過alter system kill session 'sid, serial#'把session kill掉
alter system kill session '10,34'

1.通過v$session,v$process得出後臺進程ID,在用系統命令殺系統進程
select * from v$session s, v$process p
where s.PADDR=p.ADDR
and s.SCHEMANAME='AICS'
and s.STATUS='ACTIVE';

直接在os下殺進程:KILL -9 剛纔查出的SPID

2.通過 v$session,v$locked_object 查看誰鎖定了資源
select t1.sid, t1.serial#, t1.username, t1.logon_time from v$session t1 , v$locked_object t2
where t1.sid = t2.session_id order by t1.logon_time;

通過alter system kill session 'sid, serial#'把session kill掉
alter system kill session '10,34'  
 
3.查詢得到當前數據庫中鎖的等級,鎖的用戶,以及解鎖:

查鎖
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL;

解鎖
$sqlplus /"as sysdba"

SQL>alter system kill session 'sid,serial';
如果解不了。直接倒os下kill進程kill -9 spid

--------------------------------------------------------------------------------------------------------
---閃回-------------------------------------------------------------------------------------------------------


閃回表:
flashback table test to before drop

閃回數據:
create table monthincall_syatem_agentnumold as
select * from monthincall_syatem_agentnum as of timestamp to_timestamp('2012-01-31 11:30','yyyy-mm-dd hh24:mi');

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

--閃回不可以在事務中使用,否則會報錯;
--dbms_flashback包不能在sys中使用(sys不支持閃回),可通過grant execute on dbms_flashback to 用戶名,這樣就可以在其他的用戶使用;
--基於時間的閃回:dbms_flashback.enable_at_time(date);
--基於系統改變號來恢復:1.獲取系統改變號:select dbms_flashback.get_system_change_number scn from dual;
                        2.execute dbms_flashback.enable_at_system_chage_number(scn);
--退出閃回狀態:execute dbms_flashback.disable;
1.insert into tablename select * from tableame as of timestamp thetime/1440;
  或者insert into tablename select * from tablename as of timestamp_to_scn scn;
2.declare  
    cursor my_value is select * from hr.my_test_table where age=20;
    value_row my_test_table%rowtype;
begin
    dbms_flashback.enable_at_time(sysdate-25/1440);
    open my_value;
    dbms_flashback.disable;
    loop
        fetch my_value into value_row;
            exit when my_value%notfound;
            insert into hr.my_test_table values(value_row.name,value_row.age,value_row.birth);
    end loop;
    close my_value;
    commit;
end;
/
----------------------------------------------------------------------
oracle 並行執行
select /*+ full(e) parallel(e,10)*/ e.create_date from ecr_log e where e.description like '%Session%';

1、看看並行選件是否安裝
Select * FROM V$OPTION where parameter like 'Parallel%';
 看看Parallel execution是不是TRUE

2、如果是TRUE,執行語句後查看
select * from V$pq_sesstat where name like '%Parallelized';
如果Queries Parallelized>0就說明是執行了並行

3.當前時刻有那些並行查詢在跑?
 SQL> desc v$px_session

4.爲什麼本該並行執行的查詢沒有並行執行呢?
系統的並行度由parallel_max_servers 決定,如果它的並行度爲5.如果有一個並行度爲5的查詢在跑,那麼系統在這條查詢運行完成前
是不能再跑並行查詢的,該並行查詢將會以非並行方式運行.

5.怎麼才能讓查詢有並行執行?
如果建表時指定了並行度,例:
Create TABLE tt(a VARCHAR2 (5))  PARALLEL 5;

alter table tt parallel 7;

----------------------------------------------------------------------
刪除分區:
alter table XXXXX truncate partition part_XXX;
-----------------------------------------------------------

Oracle自定義異常:

RAISE_APPLICATION_ERROR ( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
      error_number: 自定義的錯誤編號。允許自定義的錯誤代碼的範圍爲-20000 -- -20999
      error_msg:自定義的錯誤內容。
如:RAISE_APPLICATION_ERROR (-20999, '開始時間未傳入');

-----------------------------------------------------------
更新表中多個字段值
update  tagentoprinfo_bak t
set t.mediatype=5,
  t.agenttype=0,
  t.calltype=0,
  t.locationid=571


設置session日期顯示格式
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'

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

oemapp dbastudio,Enterprise Management console,從https://localhost:1158/em/登入,實現配置資料庫Enterprise Manager Configuration Assistant。

Oracle11g手工創建EM
1. 清除em相關配置
--刪除db配置
emca -deconfig dbcontrol db
--清除repository
emca -repos drop
2. 配置em
--創建db control
emca -config dbcontrol db -repos create
3.啓動em
emctl start dbconsole
em控制檯地址:
https://hostname:1158/em/console
em中文問題解決:
打開IE, 工具-》Internet選項-》常規, 選擇語言,添加中文和英文,並且吧英文放在上面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章