ORA-00257: archiver error. Connect internal only, until freed
檢視歸檔日誌序列
SQL> archive log list;
Automatic archival Enabled #自動歸檔
Archive destination USE_DB_RECOVERY_FILE_DEST #歸檔目錄為指定的閃回恢復區
Oldest online log sequence 174 #最舊的線上日誌序列
Next log sequence to archive 176 #下一個日誌序列歸檔
Current log sequence 176 #當前日誌序列
歸檔日誌預設是儲存在oracle系統的閃回恢復區(Flash recovery area)
檢視閃回恢復區引數
SQL> show parameter db_recovery_file_dest;
NAME TYPE VALUE
----------------------- --------- ----------------------------
db_recovery_file_dest string /data/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 3G
檢查flash recovery area的使用情況
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
--------- ------------------ ------------------------- --------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 99.98 0 23
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
可以看到ARCHIVE LOG日誌已佔用99.98%的快閃記憶體空間
方案一:刪除過期歸檔日誌,增大閃回恢復區空間大小
若有需要先行將歸檔日誌備份再刪除
一、刪除歸檔日誌檔案
找到歸檔日誌存放目錄:/data/oracle/flash_recovery_area/ORCL/archivelog
刪除不需要的歸檔日誌檔案
直接刪除歸檔日誌後,必須用RMAN維護控制檔案
二、使用RMAN維護控制檔案
[oracle@dbsrc ~]$ rman target sys/pass
RMAN> crosscheck backup; #核對所有備份集
RMAN> run{
delete noprompt obsolete;
crosscheck archivelog all;
delete noprompt expired archivelog all;
crosscheck backup;
delete noprompt expired backup;
}
RMAN> exit;
run{}中的命令被視為一個作業,一個失敗整個命令停止執行
delete obsolete; #刪除超出儲存策略的備份
crosscheck archivelog all; #檢查無效的歸檔日誌(失效的標記為expired)
delete expired archivelog all; #刪除expired的歸檔日誌
delete expired backup; #刪除所有失效的備份集
delete expired 刪除的是那些本來RMAN以為存在但是實際上在磁碟或者磁帶上已經被刪除了的資訊,刪除的只是RMAN資料庫中的記錄;
delete obsolete 刪除舊於備份保留策略定義的備份資料同時也更新RMAN資料庫以及控制檔案。
noprompt 指無需確認
三、增大閃回恢復區空間大小
SQL> alter system set db_recovery_file_dest_size=8G;
檢視閃回恢復區引數
SQL> show parameter db_recovery_file_dest;
四、重新檢查flash recovery area的使用情況
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
--------- ------------------ ------------------------- --------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 4.5 0 3
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
五、新增定時任務,清理歸檔日誌儲存空間
1、新建指令碼檔案存放資料夾
[root@dbsrc ~]# mkdir -p /backup/oracledata
2、編輯指令碼內容
[root@dbsrc ~]# vim /backup/oracledata/oracle_archivelog_clean.sh
#指令碼內容 (/backup/oracledata/oracle_archivelog_clean.sh)刪除三天前的所有歸檔檔案
find /data/oracle/flash_recovery_area/ORCL/archivelog/ -mtime +3 -name "201*" -exec rm -rf {} ;
3、設定指令碼檔案許可權
[root@dbsrc ~]# chmod 777 /backup/oracledata/oracle_archivelog_clean.sh
4、新增計劃任務(系統排程任務和使用者排程任務新增其一)
系統任務排程:系統週期性所要執行的工作,比如寫快取資料到硬碟、日誌清理等。在/etc目錄下crontab檔案,這個就是系統任務排程的配置檔案。
使用者任務排程:使用者定期要執行的工作,比如使用者資料備份、定時郵件提醒等。使用者可以使用crontab工具來定製自己的計劃任務。所有使用者定義的crontab檔案都被儲存在 /var/spool/cron目錄中。其檔名與使用者名稱一致。
1)、系統任務排程
編輯系統任務計劃
[root@dbsrc ~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#SHELL 變數指定了系統要使用哪個shell,這裡是bash
#PATH 變數指定了系統執行命令的路徑
#MAILTO 變數指定了crond的任務執行資訊將通過電子郵件傳送給root使用者,如果MAILTO變數的值為空,則表示不傳送任務執行資訊給使用者
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#(*):代表所有 (,):多個值間隔 (-):範圍連線符
#(/)指定時間間隔頻率,例如(*/10)如果在minute欄位,表示每十分鐘執行一次
# 以管理員身份每天凌晨05:00,執行相應目錄下的指令碼任務
0 5 * * * root /backup/oracledata/oracle_archivelog_clean.sh
2)、使用者任務排程
編輯使用者任務計劃
[root@dbsrc ~]# crontab -e
#以管理員身份每天凌晨05:00,執行相應目錄下的指令碼
0 5 * * * /backup/oracledata/oracle_archivelog_clean.sh
無需再新增執行使用者,否則任務計劃無法執行,將有以下報錯
[root@dbsrc ~]# cat /var/spool/mail/root
From root@dbsrc.localdomain Tue Aug 7 05:00:01 2018
Return-Path: <root@dbsrc.localdomain>
X-Original-To: root
Delivered-To: root@dbsrc.localdomain
Received: by dbsrc.localdomain (Postfix, from userid 0)
id 9662C2827; Tue, 7 Aug 2018 05:00:01 +0800 (CST)
From: "(Cron Daemon)" <root@dbsrc.localdomain>
To: root@dbsrc.localdomain
Subject: Cron <root@dbsrc> root /backup/oracledata/oracle_archivelog_clean.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=6910>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20180806210001.9662C2827@dbsrc.localdomain>
Date: Tue, 7 Aug 2018 05:00:01 +0800 (CST)
/bin/sh: root: command not found
檢視使用者計劃
[root@dbsrc ~]# crontab -l
0 5 * * * /backup/oracledata/oracle_archivelog_clean.sh
5、檢視cron服務是否在設定時間呼叫
[root@dbsrc ~]# cat /var/log/cron
Aug 7 05:00:01 dbsrc CROND[12655]: (root) CMD (root /backup/oracledata/oracle_archivelog_clean.sh)
Aug 7 05:01:01 dbsrc CROND[12795]: (root) CMD (run-parts /etc/cron.hourly)
Aug 7 05:01:01 dbsrc run-parts(/etc/cron.hourly)[12795]: starting 0anacron
Aug 7 05:01:01 dbsrc run-parts(/etc/cron.hourly)[12804]: finished 0anacron
6、檢視shell指令碼是否報錯(cat /var/spool/mail/使用者名稱)
[root@dbsrc ~]# cat /var/spool/mail/root
From root@dbsrc.localdomain Tue Aug 7 05:00:01 2018
Return-Path: <root@dbsrc.localdomain>
X-Original-To: root
Delivered-To: root@dbsrc.localdomain
Received: by dbsrc.localdomain (Postfix, from userid 0)
id 9662C2827; Tue, 7 Aug 2018 05:00:01 +0800 (CST)
From: "(Cron Daemon)" <root@dbsrc.localdomain>
To: root@dbsrc.localdomain
Subject: Cron <root@dbsrc> /backup/oracledata/oracle_archivelog_clean.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=6910>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20180806210001.9662C2827@dbsrc.localdomain>
Date: Tue, 7 Aug 2018 05:00:01 +0800 (CST)
find: ‘/data/oracle/flash_recovery_area/ORCL/archivelog/2018_08_04’: No such file or directory
7、重啟crond服務
[root@dbsrc ~]# service crond restart
或者
[root@dbsrc ~]# /etc/init.d/crond restar
註釋
service crond start //啟動服務
service crond stop //關閉服務
service crond restart //重啟服務
service crond reload //重新載入配置
service crond status //檢視服務狀態
crontab [-u user] [ -e | -l | -r ]
-e:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。
-l:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。
-r:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。
-i:在刪除使用者的crontab檔案時給確認提示。
#提示You have new mail in /var/spool/mail/root解決
[root@dbsrc ~]# echo "unset MAILCHECK">> /etc/profile;
[root@dbsrc ~]# source /etc/profile
方案二:修改歸檔目錄位置
一、建立新的歸檔檔案存放目錄
[root@dbsrc ~]# mkdir /data/oracle/archive_log
二、設定目錄擁有者和許可權
[root@dbsrc ~]# chown -R oracle:oinstall /data/oracle/archive_log
[root@dbsrc ~]# chmod –R 775 /data/oracle/archive_log
三、禁止往閃回恢復區放歸檔日誌
SQL> alter system set db_recovery_file_dest=``;
四、設定歸檔日誌存放目錄
SQL> alter system set log_archive_dest=`/data/oracle/archive_log`;
五、檢視歸檔日誌序列
SQL> archive log list;
Automatic archival Enabled
Archive destination /data/oracle/archive_log
Oldest online log sequence 174
Next log sequence to archive 176
Current log sequence 176