目前分類:Oracle (119)

瀏覽方式: 標題列表 簡短摘要
為了測試Oracle 9i新增的MERGE語法,建立了兩個測試表格。

歷屆選手表
create table sportsman_history (name  varchar2(30),live_area  varchar2(100)) tablespace users;
insert into sportsman_history values ('張三','台南市') ;
insert into sportsman_history values ('李四','新北市') ;
insert into sportsman_history values ('王五','宜蘭縣') ;
commit;

選手申請表
create table apply_temp (name  varchar2(30),live_area  varchar2(100))tablespace users;
insert into apply_temp values ('張三','嘉義市') ;
insert into apply_temp values ('李四','新北市') ;
insert into apply_temp values ('陳七','屏東縣') ;
commit;


SQL> column name format a20;
SQL> column live_area format a20;
SQL> select * from sportsman_history;

NAME                 LIVE_AREA
-------------------- --------------------
張三                 台南市
李四                 新北市
王五                 宜蘭縣


SQL> select * from apply_temp;

NAME                 LIVE_AREA
-------------------- --------------------
張三                 嘉義市
李四                 新北市
陳七                 屏東縣


判斷「選手申請表」中沒有「歷屆選手表」的姓名,則新增到「歷屆選手表」,否則更新「歷屆選手表」的資料
SQL> MERGE INTO sportsman_history sh USING  apply_temp at
         ON (sh.name=at.name)
         WHEN MATCHED THEN UPDATE SET sh.live_area=at.live_area
         WHEN NOT MATCHED THEN INSERT VALUES (at.name,at.live_area);


SQL> select * from sportsman_history;

NAME                 LIVE_AREA
-------------------- --------------------
陳七                 屏東縣
張三                 嘉義市
李四                 新北市
王五                 宜蘭縣


如果是以PL/SQL來寫,程式應該如下:
declare
    v_check  number;    
     cursor cur_1 is
         select * from apply_temp at ;   
     r1 cur_1%rowtype;    
begin
    for r1 in cur_1 loop
         select count(1) into v_check from sportsman_history sh
            where sh.name=r1.name;
         if v_check >0 then
              update sportsman_history sh set sh.name=r1.name;
          else
              insert into sportsman_history sh values (r1.name,r1.live_area);
          end if;    
     end loop;
end;
   
由上述可知,利用Oracle 9i新增的語法MERGE來完成Insert與update的動作,
只需要對Table進行一次Full Scan就可以完成,執行效率較高。

keven 發表在 痞客邦 留言(0) 人氣()

在Oracle 11g新建一個帳號test01,登入時出現ORA-01045錯誤
SQL> connect test01/oracle;
ERROR:
ORA-01045: user TEST01 lacks CREATE SESSION privilege; logon denied

keven 發表在 痞客邦 留言(0) 人氣()

在啟用Oracle listener時,出現了下列的錯誤,
$ lsnrctl start
TNS-12537: TNS:connection closed
TNS-12560: TNS:protocol adapter error
  TNS-00507: Connection closed
   Linux Error: 29: Illegal seek
  
檢查了listener.ora,似乎沒有什麼錯誤,改了幾個參數後,仍然出現錯誤。
檢查了Listener Log File也看不出來什麼訊息,最後在網路上一個外國的論譠,有人提到是hosts設定的問題。
於是到/etc下去看hosts的設定,就是127.0.0.1設定的問題。
把127.0.0.1 test01 test01改回127.0.0.1 localhost.localdomain localhost就正常啟動linstener
可能是listener在啟動時會使用localhost,而不是使用127.0.0.1

keven 發表在 痞客邦 留言(0) 人氣()

昨天上課時聽到10g以後的Archive Log的預設位置在USE_DB_RECOVERY_FILE_DEST,保存在Flash recovery area,
但是Flash recovery area的預設大小為2G,有可能會導致Archive Log空間不足。

所以今天就拿虛擬機來測試看看,查詢目前Flash Recovery Area內Archive Log的使用量
SQL> select percent_space_used from v$flash_recovery_area_usage where file_type='ARCHIVED LOG';

PERCENT_SPACE_USED
------------------
                0
                 
                 
將LOG_ARCHIVE_DEST_1清空。
SQL> alter system Set LOG_ARCHIVE_DEST_1='' scope=spfile;

重開DB到open階段
SQL> shutdown immedite;
SQL> startup;

查詢Archivelog狀態,可以發現Archive destination預設是USE_DB_RECOVERY_FILE_DEST
SQL> archive log list;
Database log mode            Archive Mode
Automatic archival            Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     396
Next log sequence to archive   398
Current log sequence            398

強制切換Redolog,產生archive log
SQL> alter system switch logfile;

再次查詢Flash Recovery Area內Archive Log的使用量
SQL> select percent_space_used from v$flash_recovery_area_usage where file_type='ARCHIVED LOG';

PERCENT_SPACE_USED
------------------
            .02

keven 發表在 痞客邦 留言(0) 人氣()

原本的db_name為orcl,測試將改為testdb

直接用nid來更改db_name、db_id,可免去許多步驟,參數help='Y'可以看到說明
$ nid help='Y'
DBNEWID: Release 11.2.0.2.0 - Production on Mon Jun 17 01:26:21 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

keven 發表在 痞客邦 留言(0) 人氣()

我從Oracle下載Pre-Built Developer VMs,內建11gR2的Database,但是並沒有啟用Archive Log Mode

SQL> archive log list;
Database log mode            No Archive Mode
Automatic archival            Disabled
Archive destination           

keven 發表在 痞客邦 留言(0) 人氣()

v$db_object_cache常用的欄位:
TYPE:類型(如,sequence、procedure、function、package、package body、trigger)
KEPT:(yes/no),可以知道物件是否以DBMS_SHARED_POOL.KEEP永久固定在記憶體中
SHARABLE_MEM:佔用的記憶體空間
PINS:目前執行該物件的session數量

keven 發表在 痞客邦 留言(0) 人氣()


因為裝了11g的Clinet後發現沒有OEM管理工具,所以想要將它移除。
用Universal Installer來移除時,它告訴我使用命令deinstall來反安裝,
於是我就開啟cmd,並且進入指定的目錄內執行deinstall,結果因為找不到某一個元件而失敗。
此時只好求google,找到可以手動移除的方法,測試的結果是成功的。

keven 發表在 痞客邦 留言(0) 人氣()

使用Xmanager 4 來讓HP-UX可以Remote GUI,但是在執行Oracle的dbca、netca時,出現類似無回應的結果,如下圖在取消勾選後,一直沒有回應。


keven 發表在 痞客邦 留言(0) 人氣()


在一次要縮小undo的空間時,用Oracle Enterprise Manager來offline Undo File,結果出現錯誤,因為有segments仍在使用中。
但是忘了做了什麼動作,以致它最後還是將undo file離線,並且在後續操作中出現了undo file需要做recovery的訊息。

ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/testdb/oradata/undo01.dbf'

先找出有哪些segment還在使用。
SQL> select tablespace_name,segment_name,status from dba_rollback_segs where status='NEEDS RECOVERY';
TABLESPACE_NAME             SEGMENT_NAME                STATUS
------------------------------ ------------------------------ ----------------
APPS_UNDOTS1                 _SYSSMU1$                NEEDS RECOVERY
APPS_UNDOTS1                 _SYSSMU2$                NEEDS RECOVERY
APPS_UNDOTS1                 _SYSSMU3$                NEEDS RECOVERY
APPS_UNDOTS1                 _SYSSMU4$                NEEDS RECOVERY

將資料庫關閉,備份init.ora,編輯init.ora,修改兩個參數值如下:
undo_management='MANUAL'
rollback_segments='SYSTEM'

在init.ora加上一個隱藏的參數,值為SQL找到的SEGMENT_NAME,收回segment如下:
*._offline_rollback_segments='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$'

用pfile來開啟資料庫:
SQL> startup  pfile=/testdb/db/9.2.0/dbs/init.ora ;

資料庫成功開啟之後,就可以新增新的Undo Tablespace:
SQL> create undo tablespace APPS_UNDOTS2 datafile '/testdb/oradata/UNDOTBS01.DBF' size 10000m;

刪除舊的Undo Tablespace;
DROP TABLESPACE APPS_UNDOTS1 INCLUDING CONTENTS  AND DATAFILES CASCADE CONSTRAINTS ;

關閉資料庫,將備份的init.ora還原,並且修改init.ora
將undo_tablespace=APPS_UNDOTS1改為APPS_UNDOTS2

重新開啟資料庫,ok

keven 發表在 痞客邦 留言(0) 人氣()


與縮小temp tablespace 一樣,都可以先建立一個較小的新unod tablespace,再刪除舊的

建立新的undo tablespace

keven 發表在 痞客邦 留言(0) 人氣()


找指定的表格被哪些Session鎖住,type='TM'時,ID1等於OBJECT ID
select  obj.object_name,vs.sid,vs.serial#,vp.spid,vs.action,vs.sql_address,vl.ctime,vl.block
    from dba_objects obj,v$lock vl,v$session vs,v$process vp
    where obj.object_id=vl.id1

keven 發表在 痞客邦 留言(0) 人氣()


先建立一個新的temp file到tablespace
alter tablespace temp add tempfile '/erptest/clonedata/temp03.dbf' size 1000m;

將指定的temp file離線
alter database tempfile '/erptest/clonedata/temp02.dbf' offline;

刪除temp file
alter database tempfile '/erptest/clonedata/temp02.dbf' drop including datafiles;

alter database tempfile '/erptest/clonedata/temp02.dbf';

如果出現下列錯誤,表示仍有人在使用指定的temp file
ERROR at line 1:
ORA-25152: TEMPFILE cannot be dropped at this time

找出temp file的id
select file_id from dba_temp_files where file_name ='/erptest/clonedata/temp02.dbf';

   FILE_ID
----------
         2
         
但是這個file_id=2並不是temp file真正的id,必須要再加上參數db_files的值才是真正的file id。
SQL> show parameter db_files

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_files                             integer                          200

所以temp02.dbf真正的id是200+2=202

找出誰在使用
select c.spid,
         b.tablespace,
         b.segfile#,
         b.segblk#,
         round(((b.blocks * d.VALUE) / 1024 / 1024), 2) size_mb,
         a.SID,
         a.serial#,
         a.username,
         a.osuser,
         a.program,
         a.status
    from v$session a, v$sort_usage b, v$process c, v$parameter d
    where b.segfile# = &seg_temp_file_id
      and d.name = 'db_block_size'
      and a.saddr = b.session_addr
      and a.paddr = c.addr
    order by b.tablespace, b.segfile#, b.segblk#, b.blocks;
會提示輸入seg_temp_file_id的值,輸入202就可以找出session,再將這些session刪除就可以drop temp file了。

keven 發表在 痞客邦 留言(0) 人氣()


在新增一個欄位到Table時,出現一個錯誤的訊息:

ERROR at line 1:
ORA-14450: attempt to access a transactional temp table already in use 

keven 發表在 痞客邦 留言(0) 人氣()


從RMAN備份集中還原Archive log

1、Rman的restore與recover是不同的概念:
   restore:指從已產生的備份集中,找出一個或多個物件(檔案),還原檔案到指定的位置。

keven 發表在 痞客邦 留言(0) 人氣()


在DB要建立pfile時出現錯誤:

SQL> show parameter spfile
NAME                         TYPE     VALUE

keven 發表在 痞客邦 留言(0) 人氣()


方式一,以dba_segments來查詢:
SELECT owner,segment_name,SUM(bytes)/1024/1024 MB
FROM dba_segments
WHERE owner not in ('SYS','SYSTEM')

keven 發表在 痞客邦 留言(0) 人氣()


因為系統是直接以HP Data Protector,用RMAM直接備份到磁帶上,
檔案因為已經過期而刪掉。
所以想把RMAN的記錄也刪掉,但是卻發生無法刪除的狀況。

登入RMAN

keven 發表在 痞客邦 留言(0) 人氣()


Clear_Record可以刪除Block上指定的記錄,但是如果已經是最後一筆資料時,使用Clear_record會出現錯誤的訊息。
以下是以Clear_Block來解決刪除最後一記錄的方法:

keven 發表在 痞客邦 留言(0) 人氣()


因為在v$bh中發現一些很奇怪的數字,例如:4294967295,在dba_objects上根本就查不到,
剛好在網路上搜尋到下面一篇文章(http://www.hellodba.com/reader.php?ID=132&lang=cn
,說明Global Temporary Table也會被載入Buffer Cache,
而且因為Global Temporary Table會針對不同的Session,讓彼此之間的資料獨立,不被其他

keven 發表在 痞客邦 留言(0) 人氣()