一、數據庫名
什么是數據庫名?
數據庫名就是一個數據庫的標識,就像人的身份證號一樣。他用參數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,即數據庫實例名。
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
將表空間和數據文件從一個位置移動到另一個位置的操作方法
一. OFFLINE
OFFLINE 分為ALTER DATABASE 與 ALTER TABLESPACE OFFLINE,
他們的區別參看blog:http://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
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
進入
執行下邊的交叉校驗
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 obsolete及delete 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 RMAN的show,list,crosscheck,delete
Oracle RMAN的show,list,crosscheck,delete 命令整理
1、SHOW命令:
顯示rman配置: RMAN> show all;
2、REPORT命令:
2.1、RMAN> report schema 報告目標數據庫的物理結構;
2.2、RMAN>report need backup days=3; 報告最近3天沒有被備份的數據文件;
2.3、RMAN> report need backup days 3 tablespace users; 在USERS表空間上3天未備份的數據文件;
2.4、RMAN> 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.7、RMAN> report unrecoverable; 報告數據庫所有不可恢復的數據文件;
2.8、RMAN> report obsolete redunndancy 2; 報告備份次數超過2次的陳舊備份;
2.9、RMAN>report obsolete; 報告多余的備份;
3、LIST命令:列出備份信息
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.4、RMAN> list backup of spfile 列出SPFILE備份集;
3.5、RMAN> list copy of datafile 5 列出數據文件映像副本;
3.6、RMAN> list copy of controlfile 列出控制文件映像副本;
3.7、RMAN> list copy of archivelog all 列出歸檔日志映像副本;
3.8、RMAN> 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.10、RMAN>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.5、RMAN> crosscheck backup of controlfile 核對控制文件的備份集;
4.6、RMAN> crosscheck backup of spfile 核對SPFILE的備份集;
4.7、RMAN> crosscheck backup of archivelog sequence 3 核對歸檔日志的備份集;
4.8、RMAN> crosscheck copy 核對所有映像副本;
4.9、RMAN> crosscheck copy of database 核對所有數據文件的映像副本;
4.10、RMAN> crosscheck copy of tablespace users 核對特定表空間的映像副本;
4.11、RMAN> crosscheck copy of datafile 6 核對特定數據文件的映像副本;
4.12、RMAN> crosscheck copy of archivelog sequence 4 核對歸檔日志的映像副本;
4.13、RMAN> crosscheck copy of controlfile 核對控制文件的映像副本;
4.14、RMAN> crosscheck backup tag='SAT_BACKUP';
4.15、RMAN> crosscheck backup completed after 'sysdate - 2'
4.16、RMAN> 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.20、RMAN> crosscheck archivelog from sequence 12;
4.21、RMAN> crosscheck archivelog until sequence 522;
5、DELETE:刪除備份
5.1、RMAN> delete obsolete; 刪除陳舊備份;
5.2、RMAN> delete expired backup; 刪除EXPIRED備份
5.3、RMAN> delete expired copy; 刪除EXPIRED副本;
5.4、RMAN> delete backupset 19; 刪除特定備份集;
5.5、RMAN> 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.9、RMAN> 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
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; 查看當前用戶的角色
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-
-- 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;
/
存儲過程里不能直接使用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ÔÂ -03 17-1ÔÂ -03 session temperary
會話2:
SQL> select * from permernate;
A
----------
1
2
SQL> select * from admin_work_area;
未選擇行.
會話2看不見會話1中臨時表的數據.
(increment 用與為long,short或者int類型生成唯一標示。只有在沒有其他進程忘同一張表中插入數據時才能使用。在集群下不要使用)