2014年2月24日 星期一

Oracle 開啟/關閉archivelog mode

首先檢查一下archivelog mode是否開啟

archive log list

若要開啟/關閉Archivelog mode,必須要先將資料庫關閉再進入mount模式,

Shutdown immediate;
startup mount;
alter database archivelog/noarchivelog;
alter database open;

這時進入資料庫,再檢查一次,

archive log list

會看見archivelog mode已經開啟/關閉。

ORA-28002錯誤解決

測試資料庫出現ORA-28002問題,

ERROR:
ORA-28002 : the password will expire within 7 days

記錄從網路上找到的解法如下:
這個原因是因為11g在default profile 設定了 180 days.

SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';


最快的方法就是更改該user的密碼,不過還是換成同一個 ^^

另一個一勞永逸的方法就是更改profile的設定.

1、檢查該用戶的profile是哪個, 一般是DEFAULT:
     sql>SELECT username,PROFILE FROM dba_users;

2、確認該Profile(ex. DEFAULT)的密碼有效期配置:
     sql>SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

3、將密碼有效期由預設180天改成無限制:
     sql>ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

4、修改之後, 還沒有出現ORA-28002的user不會再碰到相同的Error:
     已有出現這個Error的帳號需再修改一次密碼如下,
    
     $sqlplus / as sysdba
     sql> alter user username identified by  原來的密碼;

資料來源:http://dba.tw/index.php?topic=524.0

2014年2月19日 星期三

Oracle解鎖

當有lock發生時,檢查 v$session 觀察哪個session卡住其他人。
select username, sid, serial#, program, machine, status, blocking_session from v$session where blocking_session is not null;

其中blocking_session的值就是顯示該session被哪個session block。
若是沒顯示資料時,表示沒有session被lock住。
這時候若可以的話,查一下那個session的使用者在做甚麼,是否可以先關掉。
select username, sid, serial#, program, machine, status, blocking_session from v$session where sid=[blocking_session中的數值];

檢查確認該session是可以關閉的程式時,便把他關閉。
若不行關閉,還是必須等他跑完。

可以關的話,輸入指令kill掉那個session
alter system kill session '[sid],[serial#]';

2014年2月17日 星期一

RedHat 檢查 port 被甚麼程式使用

使用

lsof -i:[port號]

即可查到有哪些程式在使用那個port。

若是要停止某個程式,
使用kill來關閉他。

kill -9 [PID]

Oracle LOGMNR使用方法

Oracle LogMiner,
是設計來解密資料庫log檔用的,
可以用來解讀l redo log檔和archive log檔。

假設讀取檔案為D:\example.ARC,
1.讀取archivelog
execute dbms_logmnr.add_logfile(LogFileName => 'D:\example.ARC',Options => dbms_logmnr.NEW);

2.翻譯archivelog
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

3.資料會紀錄在v$logmnr_contents
select * from v$logmnr_contents where sql_redo like '%你想要找的關鍵字%';


v$logmnr_contents的欄位說明
http://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_2033.htm#REFRN30132

2014年2月12日 星期三

ORA-12528錯誤解決

今早windows7環境下的Oracle測試資料庫報錯,
ORA-12528: TNS: listener: all appropriate instances are blocking new connections。


以下紀錄歷程和解決方法:

一開始以為是Lisener有問題,後來左看右看Lisener的狀態都是正常的,於是嘗試將資料庫重開。
在資料庫mount的時候,報出了另一個錯誤
ORA-00214: 'D:\APP\WJWEI\ORADATA\ORCLTEST\CONTROL01.CTL' version 10232896 inconsistent with file
'D:\APP\WJWEI\ORADATA\ORCLTEST\CONTROL02.CTL' version 9190433。


檢查該路徑下的CONTROL檔案,發現只有CONTROL01.CTL沒有CONTROL02.CTL檔案

因為這時候sqldeveloper是不能使用的,
所以進入sqlplus檢查control file狀態。

使用SYSTEM或更高管理者權限登入,
(如果不能登入的話,試試用nolog的方式登入)。

SQL> select * from v$controlfile;
沒有任何資料列被選取

似乎是controlfile的設定跑掉了,於是重新進行設定。
SQL> alter system set control_files='D:\app\wjwei\oradata\orclTEST\CONTROL01.CTL' scope=spfile;

關掉資料庫在重新進入
SQL> shutdown
SQL> startup

就可以正常使用了

2014年2月11日 星期二

Oracle SQLLOADER

今天有收到一個需求,
要將excel資料存回Oracle資料庫。

環境是windows 7,Oracle版本11g。

一開始馬上想到的是PowerPivot
但因為公司的excel版本只到2003,
PowerPivot只能用excel 2010以上版本。
所以只好用別的方式存回去。

在這邊將excel資料抓出來存到txt,
然後使用oracle sqlldr將資料存回去。

oracle sqlldr的使用流程如下:
1. 確認要輸入的txt檔案內容,並修改成輸入的格式。
2. 在目標資料庫先創建好接應的資料表。
3. 建立好輸入資料的 control 檔。
4. 執行sqlldr 讀取 control 檔,寫入資料庫。
5. 確認資料進入資料庫。


先準備好內含資料的 txt 檔,
每個資料以 "," 分隔,
每筆資料要要分行,如下

aaa.txt
----------------------------------
1, aaa, 5555
2, bbb, 6666
3, ccc, 7777
----------------------------------

確認格式正確後,
進入資料庫create相應的table。(原本就有相應的table也可以,不過操作要更注意)

Create table TEST(
A int,
B varchar(20),
C varchar(20)
);

接著寫入ctl檔案,

test.ctl
----------------------------------
load data
infile "aaa.txt" 
badfile "aaa.bad" 
discardfile "aaa.discard" 
into table TEST
fields terminated by ','
 ( A, B, C)
----------------------------------

load data     (說明要幹嘛)
infile "aaa.txt"     (匯入資料檔案位址)
badfile "aaa.bad"    (放資料格式不符合的)
discardfile "aaa.discard"    (放不符合過濾條件的)
into table TEST    (資料存放的table)
fields terminated by ','     (資料用甚麼分隔)

接著進入cmd,找到oracle安裝位址的bin資料夾
D:\app\Q\product\11.2.0\dbhome_1\BIN>set ORACLE_SID=YourDbName
D:\app\Q\product\11.2.0\dbhome_1\BIN>sqlldr Account/Password control=test.ctl

資料就會進入資料庫了。
請在進入資料庫檢查是否正確。

sqlldr會自動幫你生出一個 test.log 檔案,(檔案名稱會與你的ctl檔相同)
也有bad檔案和discard檔案,若是資料有問題可以去找這幾個檔案檢視。



參考資料:
http://blog.roodo.com/mywork/archives/2015107.html

深入閱讀:
http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm
http://www.dedecms.com/knowledge/data-base/sql-server/2012/0821/11767.html