備份
每臺 Oracle 機(jī)器都已配置了每天凌晨 03:03 開始自動做備份懂傀。
[oracle@oracle-test-001:/home/oracle]
$ crontab -l
3 3 * * * sh /data/backup/backup.sh
開發(fā)童鞋若需臨時備份,在 需要備份的機(jī)器上直接跑一次備份腳本即可爆哑。
備份示例:
su - oracle
sh /data/backup/backup.sh
腳本正常執(zhí)行完畢后什猖,可以到存放備份的目錄下在檢查一下備份文件。
備份腳本 backup.sh 示例:
$ cat /data/backup/backup.sh
#!/bin/bash
DATE=`date +%d`
echo $DATE
export ORACLE_APP=/data/app/oracle
export ORACLE_BASE=$ORACLE_APP
export ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
del_date=`date -d "7 days ago" +%d`
echo $del_date
rm -f /data/backup/*$del_date.dmp
exp USER_ONE/USER_ONE file=/data/backup/USER_ONE-$DATE.dmp owner=USER_ONE
exp USER_TWO/USER_TWO file=/data/backup/USER_TWO-$DATE.dmp owner=USER_TWO
啟動和關(guān)閉
啟動:
su - oracle
sqlplus / as sysdba
startup
用參數(shù)文件啟動 Oracle素邪,比如:
SQL> startup pfile='/data/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
關(guān)閉:
su - oracle
sqlplus / as sysdba
shutdown immediate;
啟動和關(guān)閉監(jiān)聽(oracle用戶下執(zhí)行):
lsnrctl start
lsnrctl stop
lsnrctl status
刪除用戶和表空間
drop user wac_tmp CASCADE;
drop tablespace wac_tmp including contents cascade constraints;
創(chuàng)建用戶和表空間
創(chuàng)建表空間:
create tablespace wac_tmp
datafile '/data/oradata/orcl/wac_tmp.dbf'
size 100M
reuse
autoextend on
next 100M
maxsize unlimited;
創(chuàng)建用戶:
create user wac_tmp identified by "1" default tablespace wac_tmp;
刪除用戶和表空間
對于單個 user 和tablespace 來說外莲, 可以使用如下命令來完成。
1兔朦、刪除 user :
drop user ×× cascade
說明: 刪除了 user偷线,只是刪除了該 user 下的 schema objects ,是不會刪除相應(yīng)的 tablespace 的沽甥。
2声邦、 刪除 tablespace
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
用戶授權(quán)
-- Grant/Revoke role privileges
grant connect,resource to 用戶名;
-- Grant/Revoke system privileges
grant create any sequence to 用戶名;
grant select any table to 用戶名;
grant update any table to 用戶名;
grant unlimited tablespace to 用戶名;
grant select on dba_tables to 用戶名;
grant read, write on directory data_pump_dir to 用戶名;
用戶解鎖
查看當(dāng)前被鎖賬戶及鎖定時間:
select username,account_status,lock_date from dba_users;
若有業(yè)務(wù)用戶被鎖定,可以這樣解鎖:
alter user username account unlock;
用戶已經(jīng)被鎖住了安接,一般是用戶錯誤的密碼嘗試次數(shù)太多翔忽,我們也可以修改允許的最大密碼輸入錯誤次數(shù),具體修改方法如下:
1盏檐、查看當(dāng)前設(shè)置值
select * from dba_profiles where RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
2歇式、修改為30次
alter profile default limit FAILED_LOGIN_ATTEMPTS 30;
3、修改為無限次(為安全起見胡野,不建議使用)
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
修改用戶密碼
ALTER USER user_name IDENTIFIED BY new_password;
密碼過期處理
使用 sqlplus 登錄管理員賬戶材失,查看指定概要文件(如default)的密碼有效期設(shè)置為 180 天:
SQL> SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE
------------------------------ -------------------------------- --------
LIMIT
----------------------------------------
DEFAULT PASSWORD_LIFE_TIME PASSWORD
180
將密碼有效期由默認(rèn)的 180 天修改成無限制,執(zhí)行:
alter profile default limit password_life_time unlimited;
修改之后不需要重啟動數(shù)據(jù)庫硫豆,會立即生效龙巨。這會讓密碼沒有過期限制。
11g 之前的 Oracle 版本的默認(rèn) profile 是沒有密碼過期限制的熊响,而在 Oracle 11g 中旨别,默認(rèn)情況下 profile 啟用的密碼過期時間是 180 天。若登錄賬號的密碼已經(jīng)超過 180 天沒有修改了汗茄,就會出現(xiàn)提示密碼過期的問題秸弛,原來的賬戶就不能登錄到 Oracle 數(shù)據(jù)庫了。
另 2 種解決辦法:
- 使用sqlplus登錄出問題賬戶,會提示設(shè)置新密碼递览,此時重新輸入密碼即可叼屠,新密碼可以和原來的密碼相同。
- 使用sqlplus登錄管理員賬戶绞铃,執(zhí)行 alter user 賬戶名 identified by 新密碼镜雨,新密碼可以和原來的密碼相同。
查看鎖表情況
查看鎖表情況:
select t2.username, t2.sid,t2.serial#,t2.LOCKWAIT,t2.logon_time,t3.object_name,t1.LOCKED_MODE from v$locked_object t1, v$session t2, dba_objects t3 where t1.session_id = t2.sid and t1.object_id = t3.object_id order by t2.logon_time;
或
select t2.username,t2.sid,t2.serial#,t1.LOCKED_MODE,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time
/
查看鎖表語句:
假設(shè) sid 為 1306:
SELECT sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),DECODE(sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.sid = '1306') ORDER BY piece ASC;
查出原因后儿捧,解除數(shù)據(jù)庫中被鎖住的表(SID,SERIAL):
SID=39荚坞,SERIAL=1390
alter system kill session '39,1390’;
查看連接數(shù)
select * from v$session where username is not null
select username,count(username) from v$session where username is not null group by username
查看不同用戶的連接數(shù):
select count(*) from v$session
并發(fā)連接數(shù):
Select count(*) from v$session where status='ACTIVE'
查看 oralce 登錄用戶的IP
step1: 查看每個oracle帳戶的連接總數(shù):
select username,count(username) from v$session where username is not null group by username;
step2: 缺省從 v$session 中不能直接獲得客戶端 IP,可以在數(shù)據(jù)庫中創(chuàng)建一個追蹤客戶端IP地址的觸發(fā)器:
create or replace trigger on_logon_trigger after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
/
step3: 比較常用的顯示客戶端信息的sql(通過step2執(zhí)行以后纯命,再執(zhí)行step3西剥,新鏈接上來的客戶端信息,就能顯示ip了)
select sid,serial#,username,program,machine,client_info
from v$session
where username is not null
order by username,program,machine;
sqlplus 每行信息顯示不全亿汞,使用
SQL> set linesize 900;
查看大表有哪些
賬戶隔離瞭空,先切換到用戶下,然后查看疗我。
比如:查看 zilingzhi 用戶下大于 10000 行的表
SQL> conn zilingzhi/zilingzhi
SQL> select table_name,num_rows from user_tables where num_rows>10000;
以此類推咆畏。
查看表屬于哪個用戶
select owner from dba_tables where table_name=upper('表名');
這個要求當(dāng)前登錄的用戶權(quán)限為 dba 或有查詢這個視圖的權(quán)限才行。
栗子:
SQL> select owner from dba_tables where table_name=upper('G_USERDATA_HISTORY');
OWNER
------------------------------
GENE_ICON2
GENE_ICON1
查看表結(jié)構(gòu)
desc table_name
SQL> SET LONG 9999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','table_name') FROM DUAL;
查看字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
修改字符集
比如吴裤,將數(shù)據(jù)庫的字符集修改為:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
1旧找、關(guān)閉數(shù)據(jù)庫,修改 oracle 用戶的環(huán)境變量
shutdown immediate
vim /home/oracle/.bash_profile
將
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
修改為:
export NLS_LANG="Simplified Chinese_china”.ZHS16GBK
2麦牺、讓修改的參數(shù)生效
source /home/oracle/.bash_profile
3钮蛛、啟動數(shù)據(jù)庫
su - oracle
sqlplus / as sysdba
startup
查看表結(jié)構(gòu)及大小
查看表結(jié)構(gòu):
desc tablename;
查看表大小(M):
select segment_name,bytes/1024/1024 from dba_segments where segment_name in('G_USERDATA_HISTORY','G_AGENT_STATE_HISTORY','G_CALL_HISTORY','G_IR_HISTORY','G_PARTY_HISTORY');
truncate 表操作
conn usr_tmp1/usr_tmp1
truncate table usr_tmp1.USERDATA_HISTORY;
查看用戶權(quán)限
查看用戶或角色系統(tǒng)權(quán)限(直接賦值給用戶或角色的系統(tǒng)權(quán)限):
select * from dba_sys_privs;
select * from user_sys_privs;
查看角色(只能查看登陸用戶擁有的角色)所包含的權(quán)限:
select * from role_sys_privs;
查看一個用戶的所有系統(tǒng)權(quán)限(包含角色的系統(tǒng)權(quán)限):
select privilege from dba_sys_privs where grantee='DATAUSER'
union
select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='DATAUSER' );
導(dǎo)入和導(dǎo)出
通過 exp 和 imp 導(dǎo)出導(dǎo)入:
exp(導(dǎo)出dmp):
exp TMP_USER/1 file=/data/backup/TMP_USER-$DATE.dmp owner=TMP_USER
imp(導(dǎo)入dmp):
imp TMP_USER/1 file=/data/backup/TMP_USER-26.dmp
EXP 有三種主要的方式(完全剖膳、用戶魏颓、表)
A、完全:EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y 如果要執(zhí)行完全導(dǎo)出吱晒,必須具有特殊的權(quán)限
B甸饱、用戶模式:EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC 這樣用戶SONIC的所有對象被輸出到文件中。
C仑濒、表模式:EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC) 這樣用戶SONIC的表SONIC就被導(dǎo)出
IMP 具有三種模式(完全叹话、用戶、表)
A墩瞳、完全:IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
B驼壶、用戶模式:IMP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC 這樣用戶SONIC的所有對象被導(dǎo)入到文件中。必須指定FROMUSER喉酌、TOUSER參數(shù)辅柴,這樣才能導(dǎo)入數(shù)據(jù)箩溃。
C、表模式:IMP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC) 這樣用戶SONIC的表SONIC就被導(dǎo)入碌嘀。
Oracle 11g 可以通過expdp/impdp導(dǎo)入導(dǎo)出
expdp 導(dǎo)出:
源庫:SID=PROD2
用戶:test/oracle
表:t1
sqlplus / as sysdba
建立導(dǎo)出目錄(建立的目錄在系統(tǒng)層面必須存在)并賦讀寫權(quán)限:
create directory exp_dir as '/home/oracle/backup';
grant read,write on directory exp_dir to public;
系統(tǒng)下(Oracle用戶)進(jìn)行導(dǎo)出:
expdp system/oracle file=t1.dmp directory=exp_dir schemas=test;
impdp 導(dǎo)入:
目標(biāo)庫:SID=PROD1
用戶:test/oracle
原有表:test
注意:
1.按用戶導(dǎo)出導(dǎo)入,目標(biāo)庫不須先建立相應(yīng)用戶歪架,impdp導(dǎo)入會自動創(chuàng)建相應(yīng)用戶股冗。如果系統(tǒng)中已有該用戶,會把表導(dǎo)入到該用戶下和蚪,并且有對該表原有的操作權(quán)限止状。
2.把導(dǎo)出來的dmp文件拷貝到目標(biāo)庫的任意一個目錄(比如在/home/oracle/backup 目錄)并在數(shù)據(jù)庫中創(chuàng)建導(dǎo)入目錄并賦權(quán)
create directory exp_dir as '/home/oracle/backup';
grant read,write on directory exp_dir to public;
系統(tǒng)下(Oracle用戶)進(jìn)行導(dǎo)入:
impdp system/oracle file=t1.dmp directory=exp_dir schemas=test;
注意:導(dǎo)入時不加路徑會報錯
提示導(dǎo)入成功后登陸到數(shù)據(jù)庫進(jìn)行驗證:
sqlplus / as sysdba
conn test/oracle
select count(*) from t1;
發(fā)現(xiàn)t1表已經(jīng)導(dǎo)入到目標(biāo)庫test用戶下了,導(dǎo)入完成攒霹。
修改 undo怯疤,temp 表空間
當(dāng)undo表空間容量不足時,可以考慮增加新的數(shù)據(jù)文件或改變數(shù)據(jù)文件的大小催束。
將 undo tablespace 里面的 undo.dbf 文件擴(kuò)充為 10000M
alter database datafile '/data1/oradata/center/undo.dbf' resize 10000M;
將臨時數(shù)據(jù)文件大小調(diào)整為2G
ALTER DATABASE TEMPFILE '/data1/oradata/center/temp.dbf' RESIZE 2G;
為 undo tablespace 添加新的數(shù)據(jù)文件
alter tablespace UNDOTS add datafile '/data1/oradata/center/undotbs02.dbf' size 20000M;
表空間擴(kuò)展集峦,增加表空間數(shù)據(jù)文件(ORA-01653)
比如已有表空間 KTS_kd_sale_dx 寫滿了,需要給表空間 KTS_kd_sale_dx 增加數(shù)據(jù)文件抠刺,以便業(yè)務(wù)可以繼續(xù)寫入塔淤。
查看表空間對應(yīng)的 datafile 的信息:
SELECT file_name,
tablespace_name,
bytes / 1024 / 1024 "bytes MB",
maxbytes / 1024 / 1024 "maxbytes MB"
FROM dba_data_files
WHERE tablespace_name = 'KTS_kd_sale_dx';
FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME bytes MB maxbytes MB
------------------------------ ---------- -----------
/data01/oradata/jinzheng/KTS_kd_sale_dx_01.DBF
KTS_kd_sale_dx 1323 0
/data01/oradata/jinzheng/KTS_kd_sale_dx_02.DBF
KTS_kd_sale_dx 1657.625 0
/data01/oradata/jinzheng/KTS_kd_sale_dx_03.DBF
KTS_kd_sale_dx 1267.5 0
查看表空間對應(yīng)的datafile是否可以自動擴(kuò)展(當(dāng)然有些場景開啟自動擴(kuò)展功能可能會帶來一些潛在的問題,所以不是所有的公司都開啟這個):
SELECT file_id,
file_name,
tablespace_name,
autoextensible,
increment_by
FROM dba_data_files
WHERE tablespace_name = 'KTS_kd_sale_dx'
ORDER BY file_id DESC;
添加數(shù)據(jù)文件:
alter tablespace KTS_kd_sale_dx add datafile '/data01/oradata/jinzheng/KTS_kd_sale_dx_04.DBF'
size 5G autoextend on next 100m maxsize 20G;
alter tablespace KTS_kd_sale_dx add datafile '/data01/oradata/jinzheng/KTS_kd_sale_dx_05.DBF'
size 5G autoextend on next 100m maxsize 20G;
alter tablespace KTS_kd_sale_dx add datafile '/data01/oradata/jinzheng/KTS_kd_sale_dx_06.DBF'
size 5G autoextend on next 100m maxsize 20G;
該 tablespace創(chuàng)建時創(chuàng)建為普通表空間速妖,普通表空間最大限制是32G高蜂,寫滿 32G 了就會報錯 ORA-01653 無法繼續(xù)寫入。此時可以用如上方法罕容,增加數(shù)據(jù)文件的方式以讓業(yè)務(wù)先繼續(xù)寫入备恤。
一般大數(shù)據(jù)量的用戶所用表空間,可以創(chuàng)建為 bigfile tablespace 锦秒,這樣一般不會有上面的問題露泊。
create bigfile tablespace :
create bigfile tablespace KTS_kd_sale_dx datafile '/data1/oradata/center/KTS_kd_sale_dx.dbf' size 50000M autoextend on next 10M maxsize unlimited;
刪除數(shù)據(jù)文件:
alter tablespace KTS_kd_sale_dx drop datafile '/data01/oradata/jinzheng/KTS_kd_sale_dx_03.DBF' ;
Tips:
在Oracle 10g中,推出了Bigfile tablespace的概念脂崔。表空間Tablespace從Oracle 10g以后就分為兩個類型滤淳,smallfile tablespace和bigfile tablespace。過去一個表空間對應(yīng)多個數(shù)據(jù)文件我們稱為Smallfile Tablespace砌左。
所謂Bigfile Tablespace最顯著的差別就是一個表空間只能對應(yīng)一個數(shù)據(jù)文件脖咐。Bigfile Tablespace雖只對應(yīng)一個數(shù)據(jù)文件,但數(shù)據(jù)文件對應(yīng)的最大體積大大增加汇歹。傳統(tǒng)的small datafile每個文件中最多包括4M個數(shù)據(jù)塊屁擅,按照一個數(shù)據(jù)塊8K的大小核算,最大文件大小為32G产弹。每個Small Tablespace理論上能夠包括1024個數(shù)據(jù)文件派歌,這樣計算理論的最大值為32TB大小弯囊。而Bigfile Datafile具有更強(qiáng)大的數(shù)據(jù)塊block容納能力,最多能夠包括4G個數(shù)據(jù)塊胶果。同樣按照數(shù)據(jù)塊8K計算匾嘱,Bigfile Datafile大小為32KG=32TB。理論上small tablespace和big tablespace總?cè)萘肯嗤?
查看 Oracle 最耗時的 SQL
查看總消耗時間最多的前 10 條 SQL 語句:
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
查看CPU消耗時間最多的前 10 條 SQL 語句:
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
查看消耗磁盤讀取最多的前 10 條 SQL 語句:
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
手動刪除歸檔日志
進(jìn)入 RMAN:
RMAN TARGET /
查看當(dāng)前所有的歸檔日志:
RMAN> list archivelog all;
手工刪除歸檔日志文件早抠,保留 15 天的歸檔日志
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-15';
自動刪除歸檔日志
每臺 Oracle 機(jī)器都已配置了每天凌晨自動刪除不用的歸檔日志霎烙。
[oracle@oracle-test-001:/home/oracle]
$ crontab -l
1 1 * * * sh /data/backup/scripts/delete_archive_log.sh
刪除歸檔日志腳本 delete_archive_log.sh 示例:
$ cat /data/backup/scripts/delete_archive_log.sh
#/data/backup/scripts/backup_full.sh
export ORACLE_APP=/data/app/oracle
export ORACLE_BASE=$ORACLE_APP
export ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CMD_FILE=/data/backup/scripts/delete_archive_log.rman
LOG_FILE=/data/backup/logs/delete_archive_log.logs
rman target / nocatalog cmdfile=$CMD_FILE msglog=$LOG_FILE
$ cat /data/backup/scripts/delete_archive_log.rman
RUN {
delete force noprompt archivelog until time 'sysdate-15';
}
EXIT;
RMAN 無法刪除舊的歸檔日志解決辦法
一套 Oracle 11g 數(shù)據(jù)庫使用 RMAN 自動刪除歸檔日志, 卻沒辦法刪除舊的歸檔日志蕊连,而舊的歸檔日志占用了近 1T 空間悬垃,導(dǎo)致磁盤使用率很高。
使用 RMAN list archivelog all; 查看日志甘苍,沒有顯示舊歸檔日志的記錄尝蠕。
解決辦法:
使用 catalog start with 命令重新注冊這些文件到控制文件中。
RMAN 刪除歸檔日志的依據(jù)是 controlfile 中記錄的歸檔日志载庭,而不是你磁盤上實際存在的歸檔日志
看彼,如果你的歸檔日志已經(jīng)不在 controlfile 中就無法被 RMAN 識別到,也就無法被刪除昧捷。而致于歸檔信息何時在控制文件中被覆蓋闲昭,這由一個參數(shù) control_file_record_keep_time 來控制。
查看數(shù)據(jù)庫中的參數(shù)是默認(rèn)的7天靡挥。
$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon May 20 11:32:26 2019
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show parameter CONTROL_FILE_RECORD_KEEP_TIME
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
難道是在控制文件中歸檔日志的記錄條數(shù)只能保留7天的么序矩?于是到 MOS 去找相關(guān)文檔找到一篇 Why Are Controlfile Entries For Archived Logs Not Overwritten After CONTROL_FILE_RECORD_KEEP_TIME ? (文檔 ID 1056085.1),文檔介紹 CONTROL_FILE_RECORD_KEEP_TIME 參數(shù)并不是強(qiáng)制在控制文件中保留多少天的歸檔日志條目跋破,而是由 V$CONTROLFILE_RECORD_SECTION 視圖中的 ARCHIVED LOG 條目去控制的簸淀,當(dāng) RECORDS_TOTAL=RECORDS_USED 時,舊的歸檔日志就會被覆蓋掉。
查看到 RECORDS_TOTAL=RECORDS_USED=1792 :
SQL> select * from v$controlfile_record_section where type='ARCHIVED LOG';
TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX
---------------------------- ----------- ------------- ------------ -----------
LAST_INDEX LAST_RECID
---------- ----------
ARCHIVED LOG 584 1792 1792 900
899 11651
SQL> select count(*) from v$archived_log;
COUNT(*)
----------
1792
SQL> exit
這時應(yīng)該可以推斷出由于控制文件中只能保留 1792 條歸檔日志數(shù)據(jù)毒返,所以以前的歸檔信息已經(jīng)被控制文件刷出租幕,RMAN 無法識別到這些歸檔文件,所以就無法刪除這些歸檔日志拧簸。
那么現(xiàn)在如何使用 RMAN 刪除這些舊的歸檔日志呢劲绪?
使用 catalog start with 命令重新注冊這些舊的歸檔日志文件到控制文件中:
$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Mon May 20 11:40:29 2019
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: CENTER (DBID=xxxxxxxxx)
RMAN> catalog start with '/data1/oradata/center/archive';
using target database control file instead of recovery catalog
searching for all files that match the pattern /data1/oradata/center/archive
List of Files Unknown to the Database
=====================================
File Name: /data1/oradata/center/archive/1_1_990215949.dbf
File Name: /data1/oradata/center/archive/1_5_990215522.arc
File Name: /data1/oradata/center/archive/1_4_990215522.arc
File Name: /data1/oradata/center/archive/1_6_990215522.arc
File Name: /data1/oradata/center/archive/1_7_990215522.arc
.....
Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files...
cataloging done
List of Cataloged Files
=======================
File Name: /data1/oradata/center/archive/1_5_990215522.arc
File Name: /data1/oradata/center/archive/1_4_990215522.arc
File Name: /data1/oradata/center/archive/1_6_990215522.arc
File Name: /data1/oradata/center/archive/1_7_990215522.arc
.....
此時,再 list archivelog all 就能看的舊的歸檔日志了盆赤,然后再刪除 60 天之前的歸檔日志即可:
RMAN> list archivelog all;
.....
RMAN> delete force noprompt archivelog until time 'sysdate-60';
再次查詢 v$controlfile_record_section 視圖贾富,RECORDS_TOTAL 也被“撐”大到了 7168 :
SQL> select * from v$controlfile_record_section where type='ARCHIVED LOG';
TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX
---------------------------- ----------- ------------- ------------ -----------
LAST_INDEX LAST_RECID
---------- ----------
ARCHIVED LOG 584 7168 5070 6011
3912 29224
SQL>