【DB筆試面試501】在Oracle中,如何定時刪除歸檔日誌文件?
- 2019 年 10 月 11 日
- 筆記
在Oracle中,如何定時刪除歸檔日誌文件?
答案部分
對於單實例的資料庫可以使用如下的腳本:
1、在Oracle用戶下,創建歸檔日誌刪除文件del_OCPLHR1_arch.sh
文件位置:/home/oracle/crontabOra,內容如下:
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=OCPLHR1
export NLS_LANG="american_america.ZHS16GBK"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS"
LOG_DIR=/home/oracle/crontabOra/log
DATEL=`date
'+%Y-%m-%d'`
LOG_NAME=${LOG_DIR}/OCPLHR1_${DATEL}".log"
$ORACLE_HOME/bin/rman log=$LOG_NAME target sys/lhr@OCPLHR1 <<EOF
crosscheck archivelog all;
delete
force
noprompt archivelog all
completed before 'sysdate-6';
exit;
EOF
2、賦可執行許可權
chmod +x del_OCPLHR1_arch.sh
3、設定定時任務,在Oracle用戶下,編輯配置文件
crontab -e
配置文件內容(每天下午5點執行刪除任務):
0 17 * * * /home/oracle/crontabOra/del_OCPLHR1_arch.sh
確保crond服務處於啟動狀態:
ps -ef | grep crond #判斷定時服務是否啟動
service crond start|stop|restart #啟動、停止或重啟服務
對於DG環境,需要刪除已經應用到備庫的歸檔日誌,可以使用如下的腳本,在主備庫都需要部署:
mkdir -p /home/oracle/lhr/log
more /home/oracle/lhr/deladgarc_lhr.sh
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/18.3.0/dbhome_1
export ORACLE_SID=htzxdb1
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS"
LOG_DIR=/home/oracle/lhr/log
DATEL=`date
'+%Y-%m-%d'`
LOG_NAME=${LOG_DIR}/deladgarc_${ORACLE_SID}_${DATEL}".log"
SQL_NAME=${LOG_DIR}/deladgarc_${ORACLE_SID}_${DATEL}".sql"
LINK_NAME=tns_htzxdbphy
$ORACLE_HOME/bin/sqlplus -S sys/oracle@${LINK_NAME} as
sysdba <<EOF
set
feedback off
heading off
pagesize 0 linesize 100
col exec_sql format a50
spool ${SQL_NAME}
SELECT
'delete archivelog sequence '
|| A.SEQUENCE# || ' thread '
|| A.THREAD# || ';'
EXEC_SQL
FROM
V$ARCHIVED_LOG A
WHERE
(A.THREAD#, A.SEQUENCE#, a.RESETLOGS_CHANGE#) IN
(SELECT
b.THREAD#,
b.SEQUENCE#,
b.RESETLOGS_CHANGE#
FROM
V$ARCHIVED_LOG B
WHERE
B.APPLIED = 'YES'
AND
b.COMPLETION_TIME <= SYSDATE - 8)
AND
a.NAME
NOT
IN
(SELECT
b.DESTINATION
FROM
v$archive_dest b
WHERE
b.DESTINATION IS
NOT
NULL)
AND
A.COMPLETION_TIME <= SYSDATE - 8
ORDER
BY
A.THREAD#,
A.SEQUENCE#;
spool off
exit
EOF
$ORACLE_HOME/bin/rman log=$LOG_NAME target sys/oracle@${LINK_NAME} <<EOF
crosscheck archivelog all;
delete
noprompt expired archivelog all;
@${SQL_NAME}
exit;
EOF
一.在主庫或備庫查詢哪些歸檔日誌已經應用到備庫,這些日誌可以被刪除了:
SELECT
THREAD#,
NAME,
SEQUENCE#,
ARCHIVED,
APPLIED,
A.NEXT_CHANGE#,
A.COMPLETION_TIME,
'delete archivelog sequence '
|| A.SEQUENCE# || ' thread '
||
A.THREAD# || ';'
EXEC_SQL
FROM
V$ARCHIVED_LOG A
WHERE
(A.THREAD#, A.SEQUENCE#, a.RESETLOGS_CHANGE#) IN
(SELECT
b.THREAD#,
b.SEQUENCE#,
b.RESETLOGS_CHANGE#
FROM
V$ARCHIVED_LOG B
WHERE
B.APPLIED = 'YES'
AND
b.COMPLETION_TIME <= SYSDATE - 3)
AND
a.NAME
NOT
IN
(SELECT
b.DESTINATION
FROM
v$archive_dest b
WHERE
b.DESTINATION IS
NOT
NULL)
AND
A.COMPLETION_TIME <= SYSDATE - 3
ORDER
BY
A.THREAD#,
A.SEQUENCE#;
---在備庫查詢歸檔日誌的應用情況
COL NAME
FOR
A100
SET
LINESIZE 9999 PAGESIZE 9999
COL NEXT_CHANGE# FOR
999999999999999
SELECT
THREAD#, NAME, SEQUENCE#, ARCHIVED, APPLIED, A.NEXT_CHANGE#
FROM
V$ARCHIVED_LOG A
WHERE
A.SEQUENCE# >= (SELECT
MAX(B.SEQUENCE#) - 3
FROM
V$ARCHIVED_LOG B
WHERE
B.THREAD# = A.THREAD#
AND
B.RESETLOGS_CHANGE# = A.RESETLOGS_CHANGE#
AND
B.RESETLOGS_CHANGE# =
(SELECT
D.RESETLOGS_CHANGE# FROM
V$DATABASE
D)
AND
B.APPLIED = 'YES'
GROUP
BY
B.THREAD#)
ORDER
BY
A.THREAD#, A.SEQUENCE#;
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。