久久久99国产精品免费,青青九九免费视频在线,精品国产乱码久久久久久1区2匹http://www.aygfsteel.com/wangxinsh55/category/33868.htmlzh-cnThu, 21 Jul 2011 07:40:43 GMTThu, 21 Jul 2011 07:40:43 GMT60Oracle 10g備份時主機身份證明驗證不通過http://www.aygfsteel.com/wangxinsh55/archive/2011/07/21/354786.htmlSIMONESIMONEThu, 21 Jul 2011 07:10:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/07/21/354786.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/354786.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/07/21/354786.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/354786.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/354786.html在Oracle EM中執行備份操作時,需要提供主機身份證明以用于訪問目標數據庫的操作系統。但是我們在保證用戶名密碼爭取的情況下,可能仍然報錯。這個錯誤可能是:以用戶Administrator 的身份連接主機失敗。Error:Wrong password for user.



這個錯誤會很讓人費解,因為我們已經確保用戶名密碼輸入正確了。產生這個問題的原因是需要在Windows系統中將該用戶設置為作為批處理作業登錄。即打開【本地安全策略】,在【本地策略】-【用戶權限分配】下,將連接主機的用戶添加到“作為批處理作業登錄”中。


SIMONE 2011-07-21 15:10 發表評論
]]>
詳解:數據庫名、實例名、ORACLE_SID、數據庫域名、全局數據庫名、服務名 http://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348311.htmlSIMONESIMONEThu, 14 Apr 2011 11:16:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348311.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/348311.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348311.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/348311.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/348311.html數據庫名、實例名、數據庫域名、全局數據庫名、服務名,
這是幾個令很多初學者容易混淆的概念。相信很多初學者都與我一樣被標題上這些個概念搞得一頭霧水。我們現在就來把它們弄個明白。

一、數據庫名
什么是數據庫名?

數據庫名就是一個數據庫的標識,就像人的身份證號一樣。他用參數DB_NAME表示,如果一臺機器上裝了多全數據庫,那么每一個數據庫都有一個數據庫名。在數據庫安裝或創建完成之后,參數DB_NAME被寫入參數文件之中。格式如下:
DB_NAME=myorcl
...
在創建數據庫時就應考慮好數據庫名,并且在創建完數據庫之后,數據庫名不宜修改,即使要修改也會很麻煩。因為,數據庫名還被寫入控制文件中,控制文件是以二進制型式存儲的,用戶無法修改控制文件的內容。假設用戶修改了參數文件中的數據庫名,即修改DB_NAME的值。但是在Oracle啟動時,由于參數文件中的DB_NAME與控制文件中的數據庫名不一致,導致數據庫啟動失敗,將返回ORA-01103錯誤。

數據庫名的作用
數據庫名是在安裝數據庫、創建新的數據庫、創建數據庫控制文件、修改數據結構、備份與恢復數據庫時都需要使用到的。
有很多Oracle安裝文件目錄是與數據庫名相關的,如:
winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
跟蹤文件目錄:
winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在創建數據時,careate database命令中的數據庫名也要與參數文件中DB_NAME參數的值一致,否則將產生錯誤。
同樣,修改數據庫結構的語句alter database,當然也要指出要修改的數據庫的名稱。
如果控制文件損壞或丟失,數據庫將不能加載,這時要重新創建控制文件,方法是以nomount方式啟動實例,然后以create controlfile命令創建控制文件,當然這個命令中也是指指DB_NAME。
還有在備份或恢復數據庫時,都需要用到數據庫名。
總之,數據庫名很重要,要準確理解它的作用。

查詢當前數據名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看參數文件。

修改數據庫名
前面建議:應在創建數據庫時就確定好數據庫名,數據庫名不應作修改,因為修改數據庫名是一件比較復雜的事情。那么現在就來說明一下,如何在已創建數據之后,修改數據庫名。步驟如下:
1.關閉數據庫。
2.修改數據庫參數文件中的DB_NAME參數的值為新的數據庫名。
3.以NOMOUNT方式啟動實例,修建控制文件(有關創建控制文件的命令語法,請參考oracle文檔)

二、數據庫實例名
什么是數據庫實例名?
數據庫實例名是用于和操作系統進行聯系的標識,就是說數據庫和操作系統之間的交互用的是數據庫實例名。實例名也被寫入參數文件中,該參數為instance_name,在winnt平臺中,實例名同時也被寫入注冊表。
數據庫名和實例名可以相同也可以不同。
在一般情況下,數據庫名和實例名是一對一的關系,但如果在oracle并行服務器架構(即oracle實時應用集群)中,數據庫名和實例名是一對多的關系。這一點在第一篇中已有圖例說明。

查詢當前數據庫實例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在參數文件中查詢。

數據庫實例名ORACLE_SID
雖然兩者都表是oracle實例,但兩者是有區別的。instance_name是oracle數據庫參數。而ORACLE_SID是操作系統的環境變量。ORACLD_SID用于與操作系統交互,也就是說,從操作系統的角度訪問實例名,必須通過ORACLE_SID。在winnt不臺,ORACLE_SID還需存在于注冊表中。
ORACLE_SID必須與instance_name的值一致,否則,你將會收到一個錯誤,在unix平臺,是“ORACLE not available”,在winnt平臺,是“TNS:協議適配器錯誤”。

數據庫實例名與網絡連接
數據庫實例名除了與操作系統交互外,還用于網絡連接的oracle服務器標識。當你配置oracle主機連接串的時候,就需要指定實例名。當然8i以后版本的網絡組件要求使用的是服務名SERVICE_NAME。這個概念接下來說明。

三、數據庫域名
什么是數據庫域名?

在分布工數據庫系統中,不同版本的數據庫服務器之間,不論運行的操作系統是unix或是windows,各服務器之間都可以通過數據庫鏈路進行遠程復制,數據庫域名主要用于oracle分布式環境中的復制。舉例說明如:
全國交通運政系統的分布式數據庫,其中:
福建節點: fj.jtyz
福建廈門節點: xm.fj.jtyz
江西: jx.jtyz
江西上饒:sr.jx.jtyz
這就是數據庫域名。
數據庫域名在存在于參數文件中,他的參數是db_domain.

查詢數據庫域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在參數文件中查詢。

全局數據庫名
全局數據庫名=數據庫名+數據庫域名,如前述福建節點的全局數據庫名是:oradb.fj.jtyz

四、數據庫服務名
什么是數據庫服務名?
oracle9i版本開始,引入了一個新的參數,即數據庫服務名。參數名是SERVICE_NAME。
如果數據庫有域名,則數據庫服務名就是全局數據庫名;否則,數據庫服務名與數據庫名相同。

查詢數據庫服務名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在參數文件中查詢。

數據庫服務名與網絡連接
oracle8i開如的oracle網絡組件,數據庫與客戶端的連接主機串使用數據庫服務名。之前用的是ORACLE_SID,即數據庫實例名。



SIMONE 2011-04-14 19:16 發表評論
]]>
ORA-01033: ORACLE 正在初始化或關閉http://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348310.htmlSIMONESIMONEThu, 14 Apr 2011 11:15:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348310.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/348310.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/14/348310.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/348310.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/348310.htmlC:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 7月 5 09:50:36 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn /as sysdba
已連接。
SQL> shutdown normal
ORA-01109: 數據庫未打開


已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size              83886784 bytes
Database Buffers          197132288 bytes
Redo Buffers                7139328 bytes
數據庫裝載完畢。
SQL> alter database open
  2  ;
alter database open
*
第 1 行出現錯誤:
ORA-00600: 內部錯誤代碼, 參數: [kcratr1_lastbwr], [], [], [], [], [], [], []


SQL> alter database noarchivelog;

數據庫已更改。

SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-00600: 內部錯誤代碼, 參數: [kcratr1_lastbwr], [], [], [], [], [], [], []


SQL> shutdown immediate
ORA-01109: 數據庫未打開


已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size              83886784 bytes
Database Buffers          197132288 bytes
Redo Buffers                7139328 bytes
數據庫裝載完畢。
SQL> recover database;
完成介質恢復。
SQL> alter database open;

數據庫已更改。

SQL> exit



SIMONE 2011-04-14 19:15 發表評論
]]>
Oracle如何附加數據庫http://www.aygfsteel.com/wangxinsh55/archive/2011/04/11/348072.htmlSIMONESIMONEMon, 11 Apr 2011 08:28:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/11/348072.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/348072.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/11/348072.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/348072.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/348072.html 目的:把數據庫里面的數據附加到本地數據庫,從而可以查看數據庫中的數據,取之應用.
必須了解信息:
原數據庫全局數據庫名稱:oracle,SID:ORCL.
原數據庫存放路徑:E:\oracle\oracdata\
本地數據庫的安裝路徑是D:\oracle\

實現步驟:
一、把數據庫相關文件copy到本地E:\oracle\oracdata\下面,(確保文件不能缺少).

二、修改初始化文件init.ora,路徑在D:\oracle\admin\oracle\pfile\init.ora
查找control_files = ("D:\oracle\oradata\oracle\control01.ctl", "D:\oracle\oradata\oracle\control02.ctl", "D:\oracle\oradata\oracle\control03.ctl")

修改為:
control_files = ("E:\oracle\oradata\oracle\control01.ctl", "E:\oracle\oradata\oracle\control02.ctl", "E:\oracle\oradata\oracle\control03.ctl")

三、重新啟動實例.觀察E:\oracle\oradata\oracle\下面的控制文件時間是否改變,如如果改變,說明控制文件已經附加成功.

四、修改字符集.
打開注冊表查找: [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]修改
"NLS_LANG"="AMERICAN_AMERICA.US7ASCII",原來"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK",
目的是為了避免中文在數據庫里面出現亂碼的現象.

五、啟動svrmgrl.
Svrmgrl>shutdown immediate;
重新啟動實例.

六、改變數據庫文件.
 引用內容
SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\INDX01.DBF' to 'E:\oracle\oradata\oracle\INDX01.DBF’;
SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\DR01.DBF' to 'E:\oracle\oradata\oracle\ DR01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\RBS01.DBF' to 'E:\oracle\oradata\oracle\ RBS01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\SYSTEM01.DBF' to 'E:\oracle\oradata\oracle\ SYSTEM01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\TEMP01.DBF' to 'E:\oracle\oradata\oracle\ TEMP01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\USERS01.DBF' to 'E:\oracle\oradata\oracle\ USERS01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\TOOLS01.DBF' to 'E:\oracle\oradata\oracle\ TOOLS01.DBF’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\REDO01.LOGF' to 'E:\oracle\oradata\oracle\ REDO01.LOG’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\REDO02.LOGF' to 'E:\oracle\oradata\oracle\ REDO02.LOG’;

SVRMGR> alter database rename file 'D:\oracle\oradata\oracle\REDO02.LOGF' to 'E:\oracle\oradata\oracle\ REDO02.LOG’;


七、重新啟動數據庫實例.
八、修改密碼文件.pwdorcl.ora(文件名根據SID名稱改變),路徑D:\oracle\ora81\database.
一般先備份一下密碼文件.然后把改文件刪除.
然后用orapwd命令重新生成密碼文件.
C:\>orapwd file= D:\oracle\ora81\database\pwdorcl.ora password=oracle entries=5;
說明:file是生成的密碼文件的完整的路徑名稱.password是新密碼.

九、重新啟動數據庫.檢查是否可以正常運行,如果運行失敗,檢查步驟是否全部符合.

SIMONE 2011-04-11 16:28 發表評論
]]>
Oracle的幾種啟動方式 http://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347812.htmlSIMONESIMONEThu, 07 Apr 2011 09:08:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347812.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/347812.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347812.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/347812.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/347812.html
1、startup nomount

  非安裝啟動,這種方式啟動下可執行:重建控制文件、重建數據庫。

  讀取init.ora文件,啟動instance,即啟動SGA和后臺進程,這種啟動只需要init.ora文件。

2、startup mount dbname

  安裝啟動,這種方式啟動下可執行:數據庫日志歸檔、數據庫介質恢復、使數據文件聯機或脫機、重新定位數據文件、重做日志文件。

  執行“nomount”,然后打開控制文件,確認數據文件和聯機日志文件的位置,但此時不對數據文件和日志文件進行校驗檢查。

3、startup open dbname

  先執行“nomount”,然后執行“mount”,再打開包括Redo log文件在內的所有數據庫文件,這種方式下可訪問數據庫中的數據。

4、startup,等于以下三個命令

  startup nomount

  alter database mount

  alter database open

SIMONE 2011-04-07 17:08 發表評論
]]>
ALTER DATABASE 與 ALTER TABLESPACE OFFLINE的區別 http://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347792.htmlSIMONESIMONEThu, 07 Apr 2011 07:35:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347792.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/347792.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347792.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/347792.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/347792.html閱讀全文

SIMONE 2011-04-07 15:35 發表評論
]]>
Oracle 移動數據文件的操作方法 http://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347791.htmlSIMONESIMONEThu, 07 Apr 2011 07:34:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347791.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/347791.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/04/07/347791.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/347791.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/347791.html

將表空間和數據文件從一個位置移動到另一個位置的操作方法

一. OFFLINE

OFFLINE 分為ALTER DATABASE 與 ALTER TABLESPACE OFFLINE,

他們的區別參看bloghttp://blog.csdn.net/tianlesoftware/archive/2009/11/29/4898800.aspx

按數據文件來:

1.先將相應的數據文件 offline  

ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\DBA\TEST01.DBF' OFFLINE;
2.把數據文件 copy 到新位置
3. alter database rename file 'D:\ORACLE\ORADATA\DBA\TEST01.DBF' to 'D:\TEST01.DBF';

4. 介質恢復(offline 數據文件必須要介質恢復)

recover datafile 'D:\TEST01.DBF'
5. 將相應的數據文件 online 

SQL>ALTER DATABASE DATAFILE 'D:\TEST01.DBF' ONLINE;

按表空間來:

1.先將相應的表空間 offline  

SQL>alter tablespace test offline;  

2.把數據文件 copy 到新位置
3. alter tablespace TEST  rename datafile 'D:\TEST01.DBF' to 'D:\ORACLE\ORADATA\DBA\TEST01.DBF'

4. 將表空間 online 

SQL>alter tablespace test online;   

 

二. Shutdown 數據庫

1. 關閉數據庫 

C:>set ORACLE_SID=DBA

C:>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 11月 29 11:14:02 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/admin as sysdba

已連接。

SQL> shutdown immediate

數據庫已經關閉。

已經卸載數據庫。

ORACLE 例程已經關閉。

SQL>


2. 把數據文件 copy 到新位置

3. rename datafile

SQL> startup mount

ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes

Fixed Size                  1248576 bytes

Variable Size              71303872 bytes

Database Buffers          209715200 bytes

Redo Buffers                7139328 bytes

數據庫裝載完畢。

SQL> alter database rename file 'D:\ORACLE\ORADATA\DBA\TEST01.DBF' to 'D:\TEST01

.DBF';

數據庫已更改。

SQL> alter database open;

數據庫已更改。

SQL> select file#,name,status from v$datafile;

 FILE# NAME                                STATUS

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

   1  D:\ORACLE\ORADATA\DBA\SYSTEM01  SYSTEM

   2  D:\ORACLE\ORADATA\DBA\UNDOTBS0  ONLINE

   3  D:\ORACLE\ORADATA\DBA\SYSAUX01  ONLINE

   4  D:\ORACLE\ORADATA\DBA\USERS01.   ONLINE

   5  D:\TEST01.DBF                              ONLINE



SIMONE 2011-04-07 15:34 發表評論
]]>
oracle數據庫備份刪除操作http://www.aygfsteel.com/wangxinsh55/archive/2010/11/05/337300.htmlSIMONESIMONEFri, 05 Nov 2010 03:08:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/05/337300.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/337300.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/05/337300.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/337300.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/337300.html 

1、刪除多余的歸檔日志

在ORACLE10G中,默認的歸檔路徑為$ORACLE_BASE/flash_recovery_area。對于這個路徑,ORACLE有一個限制,就是默認只能有2G的空間給歸檔日志使用,可以使用下面兩個SQL語句去查看它的限制:
1. select * from v$recovery_file_dest;
2. show parameter db_recovery_file_dest(這個更友好直觀一些)
當歸檔日志數量大于2G時,那么就會由于沒有更多的空間去容納更多的歸檔日志會報無法繼續歸檔的錯誤。
如:“RA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 10017792 bytes disk space from 2147483648 limit
ARC0: Error 19809 Creating archive log file to '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2007_04_30/o1_mf_1_220_0_.arc' ”這時我們可以修改它的默認限制,比如說將它增加到5G或更多,也可以將歸檔路徑重新置到別的路徑,就不會有這個限制了。

  更改限制語句如下:
alter system set db_recovery_file_dest_size=5368709102  (這里為5G 5x1024x1024x1024=5G)
alter system set db_recovery_file_dest_size=10737418240



進入

rman target username/password@database

 

執行下邊的交叉校驗

crosscheck archivelog all;

此時可能會提示校驗失敗,類似下邊的提示:

RMAN> crosscheck archivelog all;

釋放的通道: ORA_DISK_1

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=14 devtype=DISK

對歸檔日志的驗證失敗

…………….

這時,需要執行exit退出rman

在命令提示符窗口下執行下邊的字符集設置

C:>set nls_lang=american_america.zhs16gbk

然后再進入rman  ,再執行crosscheck archivelog all;一般不會再出現這樣的問題了。

 

在命令窗口里面執行

DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

說明

SYSDATA-7,表明當前的系統時間7天前,before關鍵字表示在7天前的歸檔日志,如果使用了閃回功能,也會刪除閃回的數據。

同樣道理,也可以刪除從7天前到現在的全部日志,不過這個命令要考慮清楚,做完這個刪除,最好馬上進行全備份數據庫

DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';

 

UNIX/LINUX下也可以通過FIND找到7天前的歸檔數據,使用EXEC子操作刪除

find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;

這樣做仍然會在RMAN里留下未管理的歸檔文件

仍需要在RMAN里執行下面2條命令

crosscheck archivelog all;

delete expired archivelog all;

所以還不如上面的方法好用,不過用FIND的好處就是,可以在條件上,和EXEC子項上做很多操作,實現更復雜的功能

 

2、report obsoletedelete obsolete刪除過期備份命令

使用report obsolete命令報告過期備份

RMAN> report obsolete;

RMAN retention policy will be applied to the command

RMAN retention policy is set to redundancy 1

Report of obsolete backups and copies

Type                 Key    Completion Time    Filename/Handle

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

Backup Set           125    01-NOV-04

Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

Backup Set           131    04-NOV-04

Backup Piece       131    04-NOV-04          /data1/oracle/orabak/full_AVATAR2_20041104_131

....

 

使用delete obsolete命令刪除過期備份:

RMAN> delete obsolete;

RMAN retention policy will be applied to the command

RMAN retention policy is set to redundancy 1

using channel ORA_DISK_1

Deleting the following obsolete backups and copies:

Type                 Key    Completion Time    Filename/Handle

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

Backup Set           125    01-NOV-04

Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

....

Archive Log          2704   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

Archive Log          2703   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

Archive Log          2702   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf

Do you really want to delete the above objects (enter YES or NO)? yes

deleted backup piece

backup piece handle=/data1/oracle/orabak/full_AVATAR2_20041206_173 recid=173 stamp=544156241

.....

 

注:在執行刪除的時候,可能會提示下邊的報錯信息:

ORA-19554: 配置設備時出錯, 設備類型: SBT_TAPE, 設備名稱:

ORA-27211: 未能加載介質管理庫

 

解決方法,運行下邊的命令:

RMAN> allocate channel for maintenance type disk;

RMAN> crosscheck archivelog all;

RMAN> delete obsolete;

 

 

3、Oracle RMANshow,list,crosscheck,delete

 

Oracle RMANshow,list,crosscheck,delete 命令整理

1SHOW命令:

   顯示rman配置: RMAN> show all;

2、REPORT命令:

   2.1RMAN> report schema                        報告目標數據庫的物理結構;

   2.2、RMAN>report need backup days=3;            報告最近3天沒有被備份的數據文件;

   2.3RMAN> report need backup days 3 tablespace users;   USERS表空間上3天未備份的數據文件;

   2.4RMAN> report need backup incremental 3;    報告恢復數據文件需要的增量備份個數超過3次的數據文件;

   2.5、RMAN> report need backup redundancy 2 database;           報告備份文件低于2份的所有數據文件;

        RMAN>report need backup redundancy=2;

   2.6、RMAN> report need backup recovery window of 6 days;    報告文件報表的恢復需要超過6天的歸檔日志的數據文件;

   2.7RMAN> report unrecoverable;      報告數據庫所有不可恢復的數據文件;

   2.8、RMAN> report obsolete redunndancy 2; 報告備份次數超過2次的陳舊備份;

   2.9、RMAN>report obsolete;          報告多余的備份;

3LIST命令:列出備份信息

   3.1、列出數據文件備份集

        RMAN>list backup         列出詳細備份;

        RMAN>list expired backup     列出過期備份;

        RMAN> list backup of database;     列出所有數據文件的備份集;

        RMAN> list backup of tablespace user01; 列出特定表空間的所有數據文件備份集;

   3.2、RMAN> list backup of controlfile     列出控制文件備份集;

   3.3、RMAN> list backup of archivelog all      列出歸檔日志備份集詳細信息;

        RMAN>list archivelog all;      列出歸檔日志備份集簡要信息

   3.4RMAN> list backup of spfile              列出SPFILE備份集;

   3.5、RMAN> list copy of datafile 5        列出數據文件映像副本;

   3.6、RMAN> list copy of controlfile           列出控制文件映像副本;

   3.7RMAN> list copy of archivelog all    列出歸檔日志映像副本;

   3.8RMAN> list incarnation of database       列出對應物/列出數據庫副本;

   3.9、RMAN>list backup summary;    概述可用的備份;

                B表示backup

                F表示FULL

                A表示archive log

                0 1表示incremental backup

                S說明備份狀態(A AVAILABLE   X EXPIRED )

    

   3.10RMAN>list backup by file    按備份類型列出備份;

                    按照數據文件備份,歸檔日志備份,控制文件備份,服務器參數文件備份 列出

4、CROSSCHECK命令:校驗備份信息

   4.1、RMAN> crosscheck backup             核對所有備份集;  

   4.2、RMAN> crosscheck backup of database      核對所有數據文件的備份集;  

   4.3、RMAN> crosscheck backup of tablespace users      核對特定表空間的備份集;  

   4.4、RMAN> crosscheck backup of datafile 4    核對特定數據文件的備份集;  

   4.5RMAN> crosscheck backup of controlfile   核對控制文件的備份集;  

   4.6、RMAN> crosscheck backup of spfile    核對SPFILE的備份集;  

   4.7、RMAN> crosscheck backup of archivelog sequence 3 核對歸檔日志的備份集;  

   4.8RMAN> crosscheck copy               核對所有映像副本;  

   4.9、RMAN> crosscheck copy of database       核對所有數據文件的映像副本;  

   4.10、RMAN> crosscheck copy of tablespace users       核對特定表空間的映像副本;  

   4.11RMAN> crosscheck copy of datafile 6        核對特定數據文件的映像副本;  

   4.12RMAN> crosscheck copy of archivelog sequence 4  核對歸檔日志的映像副本;  

   4.13、RMAN> crosscheck copy of controlfile       核對控制文件的映像副本; 

   4.14、RMAN> crosscheck backup tag='SAT_BACKUP';

   4.15RMAN> crosscheck backup completed after 'sysdate - 2'

   4.16RMAN> crosscheck backup completed between 'sysdate - 5' and 'sysdate -2 '

   4.17、RMAN> crosscheck backup device type sBT;

   4.18、RMAN> crosscheck archivelog all;

   4.19、RMAN> crosscheck archivelog like '%ARC00012.001'

   4.20RMAN> crosscheck archivelog from sequence 12;

   4.21RMAN> crosscheck archivelog until sequence 522;

5DELETE:刪除備份

   5.1、RMAN> delete obsolete;      刪除陳舊備份;

   5.2、RMAN> delete expired backup; 刪除EXPIRED備份    

   5.3、RMAN> delete expired copy;   刪除EXPIRED副本;

   5.4RMAN> delete backupset 19;   刪除特定備份集;

   5.5RMAN> delete backuppiece ''d:\backup\DEMO_19.bak''   刪除特定備份片;

   5.6、RMAN> delete backup      刪除所有備份集;

   5.7、RMAN> delete datafilecopy ''d:\backup\DEMO_19.bak''  刪除特定映像副本;

   5.8、RMAN> delete copy   刪除所有映像副本;

   5.9RMAN> delete archivelog all delete input;

        RMAN> delete backupset 22 format = ''d:\backup\%u.bak'' delete input

                       在備份后刪除輸入對象;

   5.10、RMAN> delete backupset id;

 

 

4、em控制臺對備份的操作

使用sys用戶的sysdba權限進入em控制臺

在“維護”模塊下,點擊進入到“管理當前備份”操作選項。

 在“管理當前備份”選項中可以列出所有的備份集

如果要刪除備份,可以在下邊的列表中選中要刪除的備份集,執行“刪除”命令,這時會有一個確認提示的頁面:

點擊“是”按鈕,進行刪除操作。如果提示操作“刪除”失敗,可以將上一步要執行的命令在命令提示符下使用rman命令來執行。

 

5、小結

像歸檔日志之類的備份,備份的文件夾是在一個叫flash_recovery_area的目錄下邊。

1、歸檔日志備份在ARCHIVELOG 這個文件夾下邊,上邊對歸檔日志的操作基本上是對這個文件夾下的文件進行操作。

2、obsolete刪除操作基本上是對AUTOBACKUP這個文件夾下的文件進行操作。(不是十分的確定)

3、delete backup操作基本上是對BACKUPSET文件夾和DATAFILE文件夾的內容進行操作的。

4、在em管理后臺,最下邊有一個“相關鏈接”模塊,下有“作業”選項鏈接,可以看到所有數據庫備份操作歷史作業記錄,在此可以對相應的備份作業進行修改操作。

另外如果要添加備份操作作業時,需要在“維護”模塊下找到“調試備份”鏈接,推薦使用“Oracle 建議的備份”來添加備份操作作業。


Linux下查看文件夾大小的命令du -sh docname

 



SIMONE 2010-11-05 11:08 發表評論
]]>
修改計算機名稱導致Oracle的em不能用http://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337225.htmlSIMONESIMONEThu, 04 Nov 2010 06:19:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337225.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/337225.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337225.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/337225.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/337225.html 




我是因為修改計算機名稱導致Oracle不能用,進行了以下的配置,之后就好了。希望對你有用




Oracle 安裝好后 hostname是不能亂改的.

How to change the Hostname of the Windows when the10Gwith ASM being used  
Solution  
When changing the Hostname, 4 files would be affected.  
1) Tnsnames.ora  
2) listener.ora  
3) Oraclecsservice  
4) Enterprise Manager 





1、D:\oracle\product\10.2.0\db_1目錄下的 原計算機名.orcl------>修改后的計算機名.orcl

2、D:\oracle\product\10.2.0\db_1\oc4j\j2ee目錄下的 OC4J_DBConsole_原計算機名_orcl----->OC4J_DBConsole_修改后的計算機名_orcl

3、D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN目錄下的 listener.ora、sqlnet.ora、tnsnames.ora文件中的local名稱

4、配置em


/*重新配置dbcosole
emca -repos drop
emca -repos create
emca -config dbcontrol db
emctl start dbconsole
*/   基本上是刪不干凈的,所以使用下面的方法

當安裝oracle的機器變了機器名,或者變了ip地址。那么原來的dbconsole就起不來了。當在dos下運行:emctl start dbconsole 的時候報錯。
解決辦法
 
同樣適用于windows,unix,linux其他原因導致DBCONSOLE無法正常啟動。

1,修改DBSNMP密碼:
重新配置DBCONSOLE,需要輸入DBSNMP密碼,但任何密碼都會顯示錯誤,需要預先修改。
sql>alter user dbsnmp identified by xxx;

2,刪除早期DBCONSOLE創建的用戶:

sql>drop role MGMT_USER;
sql>drop user MGMT_VIEW cascade;
sql>drop user sysman cascade;

3,刪除早期DBCONSOLE創建的對象:
sql>drop PUBLIC SYNONYM MGMT_TARGET_BLACKOUTS;
sql>drop public synonym SETEMVIEWUSERCONTEXT;
4.C:Documents and SettingsAdministrator>emca -config dbcontrol db -repos recreat
e -HOST wanglibo
 
具體步驟如下:
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:Documents and SettingsAdministrator>emca -config dbcontrol db -repos recreat
e -HOST wanglibo
EMCA 開始于 2009-11-28 12:21:41
EM Configuration Assistant 10.2.0.1.0 正式版
版權所有 (c) 2003, 2005, Oracle。保留所有權利。
輸入以下信息:
數據庫 SID: breezyOr
監聽程序端口號: 1521
SYS 用戶的口令:
DBSNMP 用戶的口令:
SYSMAN 用戶的口令:
通知的電子郵件地址 (可選):
通知的發件 (SMTP) 服務器 (可選):
-----------------------------------------------------------------
已指定以下設置
數據庫 ORACLE_HOME . D:oracleproduct10.2.0db_2
數據庫主機名 . WANGLIBO
監聽程序端口號 . 1521
數據庫 SID . breezyOr
通知的電子郵件地址 
通知的發件 (SMTP) 服務器 
-----------------------------------------------------------------
是否繼續? [yes(Y)/no(N)]: y
2009-11-28 12:26:21 oracle.sysman.emcp.EMConfig perform
信息: 正在將此操作記錄到 D:oracleproduct10.2.0db_2cfgtoollogsemcabreezyOr
acleemca_2009-11-28_12-21-41-下午.log。
2009-11-28 12:28:00 oracle.sysman.emcp.EMReposConfig dropRepository
信息: 正在刪除 EM 資料檔案庫 (此操作可能需要一段時間)
2009-11-28 12:28:02 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功刪除資料檔案庫
2009-11-28 12:28:02 oracle.sysman.emcp.EMReposConfig createRepository
信息: 正在創建 EM 資料檔案庫 (此操作可能需要一段時間)
2009-11-28 12:29:59 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功創建資料檔案庫
2009-11-28 12:32:40 oracle.sysman.emcp.util.DBControlUtil startOMS
信息: 正在啟動 Database Control (此操作可能需要一段時間)
2009-11-28 12:34:40 oracle.sysman.emcp.EMDBPostConfig performConfiguration
信息: 已成功啟動 Database Control
2009-11-28 12:35:08 oracle.sysman.emcp.EMDBPostConfig performConfiguration
警告: 無法創建 Database Control 快捷方式
2009-11-28 12:35:22 oracle.sysman.emcp.EMDBPostConfig performConfiguration
信息: >>>>>>>>>>> Database Control URL 為 http://WANGLIBO:1158/em 
<<<<<<<<<<<
已成功完成 Enterprise 
Manager 的配置
EMCA 結束于 2009-11-28 12:35:22
C:Documents and SettingsAdministrator
>





SIMONE 2010-11-04 14:19 發表評論
]]>
oracle數據庫遷移http://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337214.htmlSIMONESIMONEThu, 04 Nov 2010 04:09:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337214.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/337214.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/11/04/337214.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/337214.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/337214.html之前做了一個項目,使用的是oracle數據庫,數據庫是建在本地測試服務器上的;現需要將整個數據庫數據結構及數據放到正式服務器上,現將整個移動過程做一下記錄,以做備用。
1、首先需要在正式數據庫上創建和測試數據庫相同名稱的庫名CSSP,創建之后可以到$ORACLE_HOME$\product\10.2.0\db_1\network\admin\tnsnames.ora這個文件下看到CSSP庫的端口號。
2、打開瀏覽器進入http://localhost:1158/em 此處的端口可以到$ORACLE_HOME$\product\10.2.0\db_1\install\portlist.ini 下邊查看。使用sys用戶的超級管理員權限進入em管理,在“管理”模塊下的“表空間”處創建測試服務器上相同的表空間名稱,這里創建了 CSSPSPACE。
3、在客戶端機器上使用oracle的客戶端工具“Net Configuration Assistant”創建CSSP連接。
4、安裝PL/SQL工具。
5、通過PL/SQL工具使用sys用戶的sysdba權限連接CSSP數據庫,找到user模塊,創建用戶duxiu,并給予connect和resource權限,退出PL/SQL程序。
6、使用PL/SQL連接測試服務器的數據庫,在“Tools”-》“export user objects ”選項中,導出所有創建表,索引,主鍵,自增長序列,函數,存儲過程,作業等sql命令。
7、使用PL/SQL連接正式數據庫,在“file”-》“open”-》“command file”中將上一步導出的腳本導入,并執行;這樣數據庫的結構都已創建成功了。接下來需要導一些數據進來。
8、使用PL/SQL連接測試服務器的數據庫,在“Tools”-》“export tables”下,選中要導出數據的表,下邊導出選項中選擇“PL/SQL Developer”(“Oracle Export”導出選項試過不知道為什么導出之后,無法將導出的數據再導入進去,也沒報任何錯誤提示;“SQL Inserts”只是生了插入的sql語句,導出效率等操作太差不推薦使用)。“compress file”,“include storage”,“include privileges”也都選中,在“Output file”中選中要導出的文件,點擊“Export”進行導出。
9、使用PL/SQL連接正式服務器的數據庫,在“Tools”-》“Import tables”選項中找到“PL/SQL Developer”選項,在這里只用勾選“Disable triggers”和“Disable foreign key constraints”,在“Import file”選項中找到剛才導出的數據文件,點擊“Import”按鈕將數據導入。

到此整個遷移過程已完成。


SIMONE 2010-11-04 12:09 發表評論
]]>
查看oracle 用戶執行的sql語句歷史記錄http://www.aygfsteel.com/wangxinsh55/archive/2010/10/18/335420.htmlSIMONESIMONEMon, 18 Oct 2010 02:50:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/10/18/335420.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/335420.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/10/18/335420.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/335420.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/335420.html

select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc

注意 :執行此語句等等一些相關的語句 必須具有DBA 的權限 雖然這條語句很普通 但是需要的時候很管用 能夠及時查出一個人執行sql語句情況

-------oracle 查看已經執行過的sql 這些是存在共享池中的 --------->
select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc

-----------查看oracle會話----------------------------》

select * from v$session   t order by t.LAST_ACTIVE_TIME desc

-------------查看oracle的權限角色------------------------------>
select   *   from   dba_role_privs;    授予用戶和其他角色的角色  
select   *   from   dba_sys_privs;     授予用戶和其他角色的系統權限  
select   *   from   dba_tab_privs;     數據庫中對象的所有授權
select * from user_role_privs;         查看當前用戶的角色



SIMONE 2010-10-18 10:50 發表評論
]]>
Oracle數據庫熱備份文件過大收縮方法http://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/319007.htmlSIMONESIMONEWed, 21 Apr 2010 09:36:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/319007.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/319007.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/319007.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/319007.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/319007.html

http://hi.baidu.com/taojia/blog/item/7d5656b5af5165c637d3ca55.html

ORA-00257: archiver error. Connect internal only, until freed.

Oracle 10g數據庫物理空間管理方式與以前Oracle發生了變化,對歸檔日志所在的Flash_Recovery_Area空間進行了另外限制

Flash_Recovery_Area空間缺省安裝時比較小,只有2GB,容易用完

解決過程

  根據數據庫目前可用存儲空間情況、FLASH_RECOVERY_AREA空間為2GB的實際情況,把FLASH_RECOVERY_AREA的空間修改為20GB()。

SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;

系統已更改。

(其實問題的本質是歸檔日志的使用已經達到了spfile等啟動參數文件中指定的最大值。oracle 10g中歸檔日志默認的存放地是閃回目錄,即%ORACLE_BASE%/flash_recovery_area的相應實例名下面,這個位置的大小在參數文件中有個限制,解決空間不足的問題可以通過兩種方式來實現,一個修改這個大小限制,還有一個就是修改歸檔日志存放位置。)

如果不要這些archivelog的話,可以刪除一些

rman>DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-3'; 直接運行這條 這樣會只保留三天的歸檔

sql> select * from v$flash_recovery_area_usage;

FILE_TYPE                PERCENT_SPACE_USED    PERCENT_SPACE_RECLAIMABLE   NUMBER_OF_FILES

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

CONTROLFILE                    0                                                           0                                        0

ONLINELOG                        0                                                          0                                        0

ARCHIVELOG                 6.11                                                          0                                        3

BACKUPPIECE                   0                                                          0                                        0

IMAGECOPY                     0                                                         0                                         0

FLASHBACKLOG                0                                                        0                                         0

還可參考:http://www.eygle.com/archives/2004/12/rman_crosscheck.html

Rman Crosscheck刪除失效歸檔

當手工刪除了歸檔日志以后,Rman備份會檢測到日志缺失,從而無法進一步繼續執行。

所以此時需要手工執行crosscheck過程,之后Rman備份可以恢復正常。

1.Crosscheck日志

    $ rman target /

    Recovery Manager: Release 9.2.0.4.0 - 64bit Production

    Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

    connected to target database: AVATAR2 (DBID=2480694409)

    RMAN> crosscheck archivelog all;

    using target database controlfile instead of recovery catalog

    allocated channel: ORA_DISK_1

    channel ORA_DISK_1: sid=25 devtype=DISK

    validation failed for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659

    validation failed for archived log

   archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268

    ...........

    validation failed for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2985.dbf recid=2973 stamp=545399327

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2986.dbf recid=2974 stamp=545400820

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2987.dbf recid=2975 stamp=545401757

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2988.dbf recid=2976 stamp=545402716

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2989.dbf recid=2977 stamp=545403661

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2990.dbf recid=2978 stamp=545404946

    validation succeeded for archived log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2991.dbf recid=2979 stamp=545406220

    Crosschecked 278 objects

    RMAN>

2.使用delete expired archivelog all 命令刪除所有過期歸檔日志:

    RMAN> delete expired archivelog all;

    released channel: ORA_DISK_1

    allocated channel: ORA_DISK_1

    channel ORA_DISK_1: sid=12 devtype=DISK

    List of Archived Log Copies

    Key    Thrd Seq    S Low Time Name

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

   376    1    2714    X 23-NOV-04 =/opt/oracle/oradata/avatar2/archive/1_2714.dbf

    .....

3.簡要介紹一下report obsolete命令

使用report obsolete命令報告過期備份

    RMAN> report obsolete;

    RMAN retention policy will be applied to the command

    RMAN retention policy is set to redundancy 1

    Report of obsolete backups and copies

    Type                Key    Completion Time    Filename/Handle

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

    Backup Set          125    01-NOV-04      

      Backup Piece      125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

    Backup Set          131    04-NOV-04      

      Backup Piece      131    04-NOV-04          /data1/oracle/orabak/full_AVATAR2_20041104_131

   ....

    Backup Set          173    06-DEC-04      

      Backup Piece      173    06-DEC-04          /data1/oracle/orabak/full_AVATAR2_20041206_173

    Backup Set          179    11-DEC-04      

      Backup Piece      179    11-DEC-04          /data1/oracle/orabak/arch544588206.arc

    .....

      Backup Piece      189    17-DEC-04          /data1/oracle/orabak/arch545106606.arc

    Backup Set          190    17-DEC-04      

      Backup Piece      190    17-DEC-04          /data1/oracle/orabak/arch545106665.arc

    Backup Set          191    20-DEC-04      

      Backup Piece      191    20-DEC-04          /data1/oracle/orabak/arch_AVATAR2_20041220_194

    Archive Log          2973 20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2985.dbf

    Archive Log          2971 20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2984.dbf

    .....

    Archive Log          2705 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2717.dbf

    Archive Log          2704 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

    Archive Log          2703 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

    Archive Log          2702 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf

4.使用delete obsolete命令刪除過期備份:

    RMAN> delete obsolete;

    RMAN retention policy will be applied to the command

    RMAN retention policy is set to redundancy 1

    using channel ORA_DISK_1

    Deleting the following obsolete backups and copies:

    Type                Key    Completion Time    Filename/Handle

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

    Backup Set          125    01-NOV-04      

      Backup Piece      125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

    ....

    Archive Log          2704 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

    Archive Log          2703 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

    Archive Log          2702 17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf

    Do you really want to delete the above objects (enter YES or NO)? yes

    deleted backup piece

    backup piece handle=/data1/oracle/orabak/full_AVATAR2_20041206_173 recid=173 stamp=544156241

    .....

    deleted archive log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268

    deleted archive log

    archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659

    Deleted 286 objects

    RMAN> crosscheck archivelog all;

    released channel: ORA_DISK_1

    allocated channel: ORA_DISK_1

    channel ORA_DISK_1: sid=19 devtype=DISK

    specification does not match any archive log in the recovery catalog

-The End-



SIMONE 2010-04-21 17:36 發表評論
]]>
Oracle歸檔日志刪除http://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/318986.htmlSIMONESIMONEWed, 21 Apr 2010 07:14:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/318986.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/318986.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/04/21/318986.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/318986.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/318986.html
我們都都知道在controlfile中記錄著每一個archivelog的相關信息,當然們在OS下把這些物理文件delete掉后,在我們的

controlfile中仍然記錄著這些archivelog的信息,在oracle的OEM管理器中有可視化的日志展現出,當我們手工清除 archive目錄下的文件后,這些記錄并沒有被我們從controlfile中清除掉,也就是oracle并不知道這些文件已經不存在了!這時候我們要 做手工的清除的話,下面我經過實驗,可以嘗試這種方法:

1. 進入rman 

2. connect target /

3. crosscheck archivelog all;

4. delete expired archivelog all;

這時候我們再去OEM中看就一定看不到,如果你的從來沒有做過這個動作的話,我們可以比較從這個動作前的controlfile后動作后的 controlfile的大小!

ORACLE正確刪除歸檔并回收空間的方法

ORACLE正確刪除歸檔并回收空間的方法

一個ORACLE歸檔日志經常滿,表現為/oraarchive 這個文件空間占用100%大家一定抱怨ORACLE為何沒有歸檔維護工具,很多人直接刪除了事,錯了,ORACLE有,而且很智能,可以正確的刪除歸檔和 FLASHBACK,不過切記,ORACLE歸檔日志對于ORACLE的數據恢復和備份非常重要,不到萬不得已不要刪除歸檔日志。

刪除歸檔日志的過程

以ORACLE用戶身份登錄到數據庫服務器主機或通過網絡連接

進入ORACLE數據備份工具

rman target/

或rman target/@orcl

在命令窗口里面執行

DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

說明

SYSDATA-7,表明當前的系統時間7天前,before關鍵字表示在7天前的歸檔日志,如果使用了閃回功能,也會刪除閃回的數據。

同樣道理,也可以刪除從7天前到現在的全部日志,不過這個命令要考慮清楚,做完這個刪除,最好馬上進行全備份數據庫

DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';



UNIX/LINUX下也可以通過FIND找到7天前的歸檔數據,使用EXEC子操作刪除



find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;

這樣做仍然會在RMAN里留下未管理的歸檔文件

仍需要在RMAN里執行下面2條命令

crosscheck archivelog all;

delete expired archivelog all;

所以還不如上面的方法好用,不過用FIND的好處就是,可以在條件上,和EXEC子項上做很多操作,實現更復雜的功能

3.簡要介紹一下report obsolete命令



使用report obsolete命令報告過期備份

RMAN> report obsolete;

RMAN retention policy will be applied to the command

RMAN retention policy is set to redundancy 1

Report of obsolete backups and copies

Type                 Key    Completion Time    Filename/Handle

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

Backup Set           125    01-NOV-04

Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

Backup Set           131    04-NOV-04

Backup Piece       131    04-NOV-04          /data1/oracle/orabak/full_AVATAR2_20041104_131

....

Backup Set           173    06-DEC-04

Backup Piece       173    06-DEC-04          /data1/oracle/orabak/full_AVATAR2_20041206_173

Backup Set           179    11-DEC-04

Backup Piece       179    11-DEC-04          /data1/oracle/orabak/arch544588206.arc

.....

Backup Piece       189    17-DEC-04          /data1/oracle/orabak/arch545106606.arc

Backup Set           190    17-DEC-04

Backup Piece       190    17-DEC-04          /data1/oracle/orabak/arch545106665.arc

Backup Set           191    20-DEC-04

Backup Piece       191    20-DEC-04          /data1/oracle/orabak/arch_AVATAR2_20041220_194

Archive Log          2973   20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2985.dbf

Archive Log          2971   20-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2984.dbf

.....

Archive Log          2705   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2717.dbf

Archive Log          2704   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

Archive Log          2703   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

Archive Log          2702   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf



4.使用delete obsolete命令刪除過期備份:



RMAN> delete obsolete;



RMAN retention policy will be applied to the command

RMAN retention policy is set to redundancy 1

using channel ORA_DISK_1

Deleting the following obsolete backups and copies:

Type                 Key    Completion Time    Filename/Handle

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

Backup Set           125    01-NOV-04

Backup Piece       125    01-NOV-04          /data1/oracle/orabak/full_1_541045804

....

Archive Log          2704   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2716.dbf

Archive Log          2703   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2715.dbf

Archive Log          2702   17-DEC-04          /opt/oracle/oradata/avatar2/archive/1_2714.dbf



Do you really want to delete the above objects (enter YES or NO)? yes

deleted backup piece

backup piece handle=/data1/oracle/orabak/full_AVATAR2_20041206_173 recid=173 stamp=544156241

.....

deleted archive log

archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268

deleted archive log

archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659

Deleted 286 objects





RMAN> crosscheck archivelog all;



released channel: ORA_DISK_1

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=19 devtype=DISK

specification does not match any archive log in the recovery catalog





5 在rman中用crosscheck檢查歸檔日志,2個歸檔日志都是失敗的:

RMAN> crosscheck archivelog all;



釋放的通道: ORA_DISK_1

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=14 devtype=DISK

對歸檔日志的驗證失敗

存檔日志文件名 =D:ORACLEORADATATESTARCHIVE1_47.DBF 記錄 ID=1 時間戳 =572866

683

對歸檔日志的驗證失敗

存檔日志文件名 =D:ORACLEORADATATESTARCHIVE11_48.DBF 記錄 ID=2 時間戳 =57286

6931

已交叉檢驗的 2 對象



6 試著同步一下,看行不行,結果不行,crosscheck還是失敗:

RMAN> resync catalog;



正在啟動全部恢復目錄的 resync

完成全部 resync



RMAN> crosscheck archivelog all;



釋放的通道: ORA_DISK_1

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=14 devtype=DISK

對歸檔日志的驗證失敗

存檔日志文件名 =D:ORACLEORADATATESTARCHIVE1_47.DBF 記錄 ID=1 時間戳 =572866

683

對歸檔日志的驗證失敗

存檔日志文件名 =D:ORACLEORADATATESTARCHIVE11_48.DBF 記錄 ID=2 時間戳 =57286

6931

已交叉檢驗的 2 對象



7 用list expired看看是否有失效的archive log,證明沒有失效的archive log:

RMAN> list expired archivelog all;



說明與恢復目錄中的任何存檔日志均不匹配



8 更改語言環境試試,結果再次crosscheck,2個archive log 都成功了:

RMAN> exit





恢復管理器完成。



C:>set nls_lang=american_america.zhs16gbk



C:>rman catalogrman/rman@safetarget /



Recovery Manager: Release 9.2.0.1.0 - Production



Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.



connected to target database: TEST (DBID=1870953724)

connected to recovery catalog database



RMAN> crosscheck archivelog all;



allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=9 devtype=DISK

validation succeeded for archived log

archive log filename=D:ORACLEORADATATESTARCHIVE1_47.DBF recid=1 stamp=57286

6683

validation succeeded for archived log

archive log filename=D:ORACLEORADATATESTARCHIVE11_48.DBF recid=2 stamp=5728

66931

Crosschecked 2 objects


====================================
oracle隱藏參數字典 x$ksppi x$ksppstvl 
oracle的隱藏參數字典是 x$ksppi,x$ksppstvl基表中,有關隱含參數說明,可以查詢這個基表

SQL> desc x$ksppi
名稱 是否為空? 類型
------    -----
ADDR      RAW(4)
INDX      NUMBER
INST_ID   NUMBER
KSPPINM   VARCHAR2(64)
KSPPITY   NUMBER
KSPPDESC  VARCHAR2(64)
KSPPIFLG  NUMBER

SQL>

SQL> desc x$ksppcv
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------

ADDR RAW(4)
INDX NUMBER
INST_ID NUMBER
KSPPSTVL VARCHAR2(512)
KSPPSTDF VARCHAR2(9)
KSPPSTVF NUMBER
KSPPSTCMNT VARCHAR2(255)

SQL>

比如我現在要查詢隱含參數
_allow_resetlogs_corruption /// 這個參數說明允許數據庫在不一致的條件下,進行數據庫打開


查看隱含參數的值,方式是


SQL> col ksppinm format a30
SQL> col ksppstvl format a30
SQL> select ksppinm,ksppstvl from x$ksppcv cv,x$ksppi pi where cv.indx=pi.indx a
nd pi.ksppinm like '_allow%';

KSPPINM KSPPSTVL
------------------------------ ------------------------------
_allow_error_simulation FALSE
_allow_resetlogs_corruption FALSE
_allow_terminal_recovery_corru FALSE
ption

_allow_read_only_corruption FALSE

SQL>

這個參數一般在數據庫正常無法恢復了,可以用它來強行打開數據庫,把數據文件先備份出來,這是
一個比較好的辦法。

SIMONE 2010-04-21 15:14 發表評論
]]>
Oracle 10g schedule job的常用操作http://www.aygfsteel.com/wangxinsh55/archive/2010/01/27/310972.htmlSIMONESIMONEWed, 27 Jan 2010 08:58:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2010/01/27/310972.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/310972.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2010/01/27/310972.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/310972.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/310972.html     Oracle數據庫10g schedule job的常用操作:

-- job 權限

grant create job to somebody;

-- job 創建

begin

dbms_scheduler.create_job (

job_name => 'AGENT_LIQUIDATION_JOB',

job_type => 'STORED_PROCEDURE',

job_action => 'AGENT_LIQUIDATION.LIQUIDATION', --存儲過程名

start_date => sysdate,

repeat_interval => 'FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=1;BYHOUR=1;BYMINUTE=0;BYSECOND=0', -- 按月,間隔為1個(月),每月1號,凌晨1點

comments => '執行代理商清分程序'

);

end;

/

-- job 執行時間測試

DECLARE

start_date date;

return_date_after date;

next_run_date date;

BEGIN

start_date := sysdate;--to_timestamp_tz('10-OCT-2004 10:00:00','DD-MM-YYYY HH24:MI:SS');

return_date_after := start_date;

FOR i IN 1..10 LOOP

DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=1;BYHOUR=1;BYMINUTE=0;BYSECOND=0',start_date, return_date_after, next_run_date);

DBMS_OUTPUT.PUT_LINE('next_run_date: ' || to_char(next_run_date,'yyyy-mm-dd HH24:MI:SS'));

return_date_after := next_run_date;

END LOOP;

END;

/

-- job 查詢

select owner, job_name, state from dba_scheduler_jobs;

select job_name, state from user_scheduler_jobs; 
        select * from all_jobs;

-- job 啟用

begin

dbms_scheduler.enable('BACKUP_JOB');

end;

/

-- job 運行

begin

dbms_scheduler.run_job('COLA_JOB',TRUE); -- true代表同步執行

end;

/

-- job 停止(不太好用)

begin

dbms_scheduler.stop_job(job_name => 'COLA_JOB',force => TRUE);

end;

/

-- job 刪除(對停job來說好用)

begin

dbms_scheduler.drop_job(job_name => 'COLA_JOB',force => TRUE);)

end;

/



SIMONE 2010-01-27 16:58 發表評論
]]>
在ORACLE存儲過程中創建臨時表http://www.aygfsteel.com/wangxinsh55/archive/2009/02/26/256856.htmlSIMONESIMONEThu, 26 Feb 2009 09:29:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2009/02/26/256856.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/256856.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2009/02/26/256856.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/256856.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/256856.html在ORACLE存儲過程中創建臨時表

存儲過程里不能直接使用DDL語句,所以只能使用動態SQL語句來執行

--ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交后ORACLE將截斷表(刪除全部行)
--ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。


CREATE OR REPLACE PROCEDURE temptest
(p_searchDate IN DATE)
IS
v_count INT;
str varchar2(300);
BEGIN
v_count := 0;
str:='drop table SETT_DAILYTEST';
execute immediate str;
str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST (
NACCOUNTID NUMBER not null,
NSUBACCOUNTID NUMBER not null)
ON COMMIT PRESERVE ROWS';
execute immediate str; ----使用動態SQL語句來執行
str:='insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance)';
execute immediate str;
END temptest;

上面建立一個臨時表的存儲過程

下面是執行一些操作,向臨時表寫數據。

CREATE OR REPLACE PROCEDURE PR_DAILYCHECK
(
p_Date IN DATE,
p_Office IN INTEGER,
p_Currency IN INTEGER,
P_Check IN INTEGER,
p_countNum OUT INTEGER)
IS
v_count INT;
BEGIN
v_count := 0;
IF p_Date IS NULL THEN
dbms_output.put_line('日期不能為空');
ELSE
IF P_Check = 1 THEN
insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_Date);

select
count(sd.naccountid) into v_count
from sett_subaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
and rownum < 2;
COMMIT;
p_countNum := v_count;
dbms_output.put_line(p_countNum);
END IF;
IF P_Check = 2 THEN
insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_Date);

select
count(sd.naccountid) into v_count
from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
and rownum < 2;
COMMIT;
p_countNum := v_count;
dbms_output.put_line(p_countNum);
END IF;
END IF;
END PR_DAILYCHECK;



需要創建一個臨時表,請舉例說明,謝謝!      
  ---------------------------------------------------------------      
     
  是TEMPORARY      
  CREATE     GLOBAL     TEMPORARY     TABLE     flight_schedule     (      
            startdate     DATE,          
            enddate     DATE,          
            cost     NUMBER)      
     
  ---------------------------------------------------------------      
     
  create     proecdure     name_pro      
  as      
  str     varchar2(100);      
  begin      
  str:='CREATE     GLOBAL     TEMPORARY     TABLE     TABLENAME     ON     COMMIT     PRESERVE     ROWS     as     select     *     from     others_table';      
  execute     immediate     str;      
  end;      
  /  
   
   
   
  可以把臨時表指定為事務相關(默認)或者是會話相關:  
  ON   COMMIT   DELETE   ROWS:指定臨時表是事務相關的,Oracle在每次提交后截斷表。  
  ON   COMMIT   PRESERVE   ROWS:指定臨時表是會話相關的,Oracle在會話中止后截斷表。  
   
  =================  
  可以創建以下兩種臨時表:  
  1。會話特有的臨時表  
        CREATE   GLOBAL   TEMPORARY   <TABLE_NAME>   (<column   specification>)  
        ON   COMMIT   PRESERVE   ROWS;  
  ========  
  對全局臨時表的總結  
   
  在臨時表上的操作比在一般的表上的操作要快。因為:  
  1創建臨時表不需要往編目表中插入條目,臨時表的使用也不需要訪問編目表,因此也沒有對編目表的爭用。  
  2僅有創建臨時表的app才可存取臨時表,所以在處理臨時表時沒有鎖。  
  3如果指定NOT   LOGGED選項,在處理臨時表時不記日志。所以如果有僅在數據庫的一個會話中使用的大量臨時數據,把這些數據存入臨時表能大大提高性能。  
  DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20));  
  在CONNECT   RESET命令后,臨時表不再存在。  
  建臨時表是動態編譯的,所以對臨時表的使用也必須放在DECLARE   CURSER   后面  
  CREATE   PROCEDURE   INSTT2(P1   INT,   P2   CHAR(20))  
  BEGIN  
      DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20))   %  
      INSERT   INTO   SESSION.TT   VALUES(P1,   P2);  
      BEGIN  
          DECLARE   C1   CURSOR   WITH   RETURN   FOR   SELECT   *   FROM   SESSION.TT;  
      END;  
  END   %  
   
  2。事務特有的臨時表  
        CREATE   GLOBAL   TEMPORARY   <TABLE_NAME>   (<column   specification>)  
        ON   COMMIT   DELETE   ROWS;  
       
      在Oracle中,全局臨時表并不會刪除,實際上你只需要建立一次,以后直接應用就行了,這與MS和Sybase不一樣。實際上在斷開數據庫連接時,臨時 表中數據自動清空,不同的Session之間是隔離的,不許要當心相互影響,不過如果起用了連接共享的話,你要用On   Commit   delete   rows使數據僅在事物內部有效。

3建立臨時表  
        臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.    
        建立方法:  
  1)   ON   COMMIT   DELETE   ROWS   定義了建立事務級臨時表的方法.  
  CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                  (startdate   DATE,  
                    enddate   DATE,  
                    class   CHAR(20))  
              ON   COMMIT   DELETE   ROWS;  
  EXAMPLE:  
  SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
      2                     (startdate   DATE,  
      3                       enddate   DATE,  
      4                       class   CHAR(20))  
      5                 ON   COMMIT   DELETE   ROWS;  
  SQL>   create   table   permernate(   a   number);  
  SQL>   insert   into   admin_work_area   values(sysdate,sysdate,'temperary   table');  
  SQL>   insert   into   permernate   values(1);  
  SQL>   commit;  
  SQL>   select   *   from   admin_work_area;  
  SQL>   select     *   from   permernate;  
    A  
  1  
  2)ON   COMMIT   PRESERVE   ROWS   定義了創建會話級臨時表的方法.  
  CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                  (startdate   DATE,  
                    enddate   DATE,  
                    class   CHAR(20))  
            ON   COMMIT   PRESERVE   ROWS;  
  EXAMPLE:  
   
  會話1:  
  SQL>   drop   table   admin_work_area;  
  SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
      2                     (startdate   DATE,  
      3                       enddate   DATE,  
      4                       class   CHAR(20))  
      5               ON   COMMIT   PRESERVE   ROWS;  
  SQL>   insert   into   permernate   values(2);  
  SQL>   insert   into   admin_work_area   values(sysdate,sysdate,'session   temperary');  
  SQL>   commit;  
  SQL>   select   *   from   permernate;  
   
                    A  
  ----------  
                    1  
                    2  
   
  SQL>   select   *   from   admin_work_area;  
   
  STARTDATE     ENDDATE         CLASS  
  ----------   ----------   --------------------  
  17-1&Ocirc;&Acirc;   -03   17-1&Ocirc;&Acirc;   -03   session   temperary  
   
  會話2:  
   
  SQL>   select   *   from   permernate;  
   
                    A  
  ----------  
                    1  
                    2  
   
  SQL>   select   *   from   admin_work_area;  
   
    未選擇行.  
   
  會話2看不見會話1中臨時表的數據.  

 



SIMONE 2009-02-26 17:29 發表評論
]]>
在hibernate中實現oracle的自動增長[轉]http://www.aygfsteel.com/wangxinsh55/archive/2008/08/19/222956.htmlSIMONESIMONETue, 19 Aug 2008 03:43:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2008/08/19/222956.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/222956.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2008/08/19/222956.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/222956.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/222956.html在hibernate中實現oracle的自動增長

http://kuangbaoxu.javaeye.com/blog/192434

關鍵字: hibernate oracle sequence native
根據hibernate的文檔,有兩種方式實現實體對象的主鍵自動增長。
第一種:設置ID的增長策略是sequence,同時指定sequence的名字,最好每個表建一個sequence,此種做法就如同MS-SQL,MY-SQL中的自動增長一樣,不需要創建觸發器,具體的oracle數據庫腳本及hibernate配置文件如下:


[1]oracle數據表的創建腳本:
Java代碼

CREATE TABLE DEPARTMENT (  
    ID NUMBER(19,0) DEFAULT '0' NOT NULL,  
    NAME VARCHAR2(255) NOT NULL,  
    DESCRIPTION CLOB  
);  
ALTER TABLE DEPARTMENT ADD CONSTRAINT PRIMARY_0 PRIMARY KEY(ID) ENABLE;  
ALTER TABLE DEPARTMENT ADD CONSTRAINT UK_DEPARTMENT_1 UNIQUE (NAME);  
 
CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVALUE 10000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE; 

創建DEPARTMENT表,并為DEPARTMENT表創建一個單獨的SEQUENCE,名字為SEQUENCE_ID_SEQ,并不需要創建觸發器。

[2]hibernate映射文件的配置:
Java代碼

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liyanframework.demo.domain">  
    <class name="Department" table="DEPARTMENT">  
        <id name="id" column="ID">  
            <generator class="sequence">  
                <param name="sequence">DEPARTMENT_ID_SEQ</param>  
            </generator>  
        </id>  
        <property name="name" column="NAME" type="string" />  
        <property name="description" column="DESCRIPTION" type="text" />  
    </class>  
</hibernate-mapping> 

在hibernate映射文件中,對ID的生成策略選擇sequence,指定sequence的名字DEPARTMENT_ID_SEQ就可以了,當你 保存新對象的時候,hibernate會自動取得DEPARTMENT_ID_SEQ.NEXTVAL作為新對象的ID保存到數據庫,所以不需要再使用觸 發器再來生成新記錄的ID。


第二種:設置ID的增長策略是native,但是需要創建一個名字為hibernate_sequence(這個名字好像是hibernate默認的 sequence名字,不創建會出錯的)的全局使用的sequence,然后再對每一個表的ID生成的時候,使用觸發器,取得 hibernate_sequence.CURRVAL作為新記錄的ID,具體的oracle數據庫腳本及hibernate配置文件如下:


[1]oracle數據表的創建腳本:
Java代碼


CREATE TABLE STAFF (  
    ID NUMBER(19,0) DEFAULT '0' NOT NULL,  
    NAME VARCHAR2(255) NOT NULL,  
    AGE NUMBER(3,0) NOT NULL,  
    BIRTHDAY DATE NOT NULL,  
    SALARY NUMBER(10,2) NOT NULL,  
    LEVELNESS FLOAT NOT NULL,  
    CREATETIME TIMESTAMP NOT NULL,  
    ENABLE CHAR(2) DEFAULT 'Y' NOT NULL,  
    STATUS VARCHAR2(64) NOT NULL,  
    DEPARTMENT_ID NUMBER(19,0)  
);  
ALTER TABLE STAFF ADD CONSTRAINT PRIMARY_1 PRIMARY KEY(ID) ENABLE;  
ALTER TABLE STAFF ADD CONSTRAINT STAFF_IBFK_0 FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(ID) ENABLE;  
ALTER TABLE STAFF ADD CONSTRAINT UK_STAFF_1 UNIQUE (NAME);  
CREATE INDEX IDX_STAFF_STATUS ON STAFF(STATUS);  
 
CREATE SEQUENCE HIBERNATE_SEQUENCE MINVALUE 90000 MAXVALUE 999999999999999999999999 INCREMENT BY 1 NOCYCLE;  
 
CREATE OR REPLACE TRIGGER STAFF_ID_TRG BEFORE INSERT ON STAFF  
FOR EACH ROW  
BEGIN  
    IF INSERTING AND :NEW.ID IS NULL THEN  
        SELECT HIBERNATE_SEQUENCE.CURRVAL INTO :NEW.ID FROM DUAL;  
    END IF;  
END; 

創建STAFF表,但是并沒有為STAFF創建相應的主鍵sequence,而是創建了一個名字為HIBERNATE_SEQUENCE的 sequence,然后創建一個觸發器STAFF_ID_TRG,當執行INSERT操作時,hibernate會先執行一次 HIBERNATE_SEQUENCE.NEXTVAL,所以在觸發器中只需要取得HIBERNATE_SEQUENCE.CURRVAL作為新記錄的 ID。

[2]hibernate映射文件的配置:
Java代碼


<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liyanframework.demo.domain">  
    <class name="Staff" table="STAFF">  
        <id name="id" column="ID">  
            <generator class="native" />  
        </id>  
        <property name="name" column="NAME" type="string" />  
        <property name="age" column="AGE" type="integer" />  
        <property name="birthday" column="BIRTHDAY" type="date" />  
        <property name="salary" column="SALARY" type="big_decimal" />  
        <property name="level" column="LEVELNESS" type="float" />  
        <property name="createTime" column="CREATETIME" type="timestamp" />  
        <property name="enable" column="ENABLE" type="character" />  
        <property name="status" column="STATUS" type="string" />  
        <many-to-one name="department" column="DEPARTMENT_ID" class="Department" />  
    </class>  
</hibernate-mapping> 

在hibernate映射文件中,對ID的生成策略選擇native,hibernate會根據你數據庫的觸發器來生成新記錄的ID。

比 較兩種做法,第二種做法也就是hibernate在代碼中,實現了oracle中的觸發器功能。對于不同的情況,選擇不懂的做法。如果新的系統,新建的 oracle數據庫,推薦使用第一種做法,簡單,容易移植到其他支持自動增長的數據庫;如果是老的系統,需要把其他數據庫轉換為oracle的,那就要用 第二種了,使用native的方式,可以不改動配置文件,兼容oracle和mysql之類帶有自動增長的數據庫。




安裝有oracle數據庫,創建數據庫,總是要創建一個主鍵ID,唯一標示各條記錄,但oracle不支持自動編號,所以還得創建一個SEQUENCE(序列)語句如
    
create sequence bign nocycle maxvalue 9999999999 start with1;//增加數據

insertintotable (ID,..) values(bign.nextval,..)

     在hibernate中的映射文件可這么寫
   <id name="id" type="java.lang.Long" column="ID">
            
<generator class="sequence">
                 
<param name="sequence">bign</param>
            
</generator>
   
</id>



<id name="id" type="java.lang.Long" column="ID">
            
<generator class="increment">
  
</id>


(increment 用與為long,short或者int類型生成唯一標示。只有在沒有其他進程忘同一張表中插入數據時才能使用。在集群下不要使用)



SIMONE 2008-08-19 11:43 發表評論
]]>
主站蜘蛛池模板: 巩义市| 东乡| 福海县| 新昌县| 海伦市| 阿拉善盟| 霍林郭勒市| 长兴县| 台南县| 东丰县| 舞阳县| 商水县| 兴山县| 平远县| 大厂| 白水县| 灵台县| 锡林郭勒盟| 长汀县| 峡江县| 杨浦区| 汉沽区| 新平| 高台县| 襄樊市| 宁国市| 游戏| 双柏县| 蒙城县| 洛扎县| 广水市| 石家庄市| 水城县| 新干县| 花莲市| 长海县| 临泽县| 五家渠市| 东阿县| 德庆县| 金秀|