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
来源: https://www.cnblogs.com/VoiceOfDreams/p/9440942.html