故障报错
Thread 1 cannot allocate new log, sequence 2594
Checkpoint not complete
故障现象
redo log频繁切换,数据库DML性能下降。额外的日志归档影响IO性能。
故障原因及解决方案
该故障大部分情况下是由于redo log切换过于频繁导致没有及时进行日志归档。此外,日志切换前没有完成检查点操作也会导致同样报错,可以通过调整fast_start_mttr_target参数优化检查点操作。
通过如下脚本可以检测出redo log的切换频率
SELECT
TO_CHAR(first_time, 'YYYY-MON-DD') DAY
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '00', 1, 0)), '99') "00"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '01', 1, 0)), '99') "01"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '02', 1, 0)), '99') "02"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '03', 1, 0)), '99') "03"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '04', 1, 0)), '99') "04"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '05', 1, 0)), '99') "05"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '06', 1, 0)), '99') "06"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '07', 1, 0)), '99') "07"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '08', 1, 0)), '99') "0"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '09', 1, 0)), '99') "09"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '10', 1, 0)), '99') "10"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '11', 1, 0)), '99') "11"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '12', 1, 0)), '99') "12"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '13', 1, 0)), '99') "13"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '14', 1, 0)), '99') "14"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '15', 1, 0)), '99') "15"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '16', 1, 0)), '99') "16"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '17', 1, 0)), '99') "17"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '18', 1, 0)), '99') "18"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '19', 1, 0)), '99') "19"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '20', 1, 0)), '99') "20"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '21', 1, 0)), '99') "21"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '22', 1, 0)), '99') "22"
, TO_CHAR(SUM(DECODE(TO_CHAR(first_time, 'HH24'), '23', 1, 0)), '99') "23"
FROM v$log_history
GROUP BY TO_CHAR(first_time, 'YYYY-MON-DD') ;
根据经验值,redo log的在高峰期的切换不应超过每小时10次,redo log 文件组为5组,每个日志文件组的日志位于不同的文件系统或者存储设备上。具体redo log大小和文件组数需要根据实际情况确定。
查询现有redo log大小,日志状态,日志文件组和每组日志文件的成员数。
SELECT
group#
, thread#
, bytes / 1024 / 1024 mb
, members
, status
FROM v$log;
可以看到共有个日志文件组9个日志文件组,每组1个日志文件,第4组为正在使用的日志文件组,如果status为active说明该日志文件需要用于实例恢复。应进行归档后才能将其删除。
redo日志调整
计算redo日志大小
30(最多每小时切换次数) * 5000MB / 10 = 15000MB
根据上面计算值,理论上应将日志文件组大小扩大至15000MB,考虑到ODS数据库DML操作时间段分布不均的特点,过大的redo日志设置会使数据库在丢失当前日志文件组进行数据库恢复的时候丢失较多数据。因此,综合考虑将日志文件扩大至10GB,这样也保证了系统在不繁忙的时候可以进行redo日志的归档和切换。具体操作脚本如下,请根据实际情况调整日志文件路径和日志文件大小。
-- 注意,在删除所有归档日志之前,请保留3个日志文件组已确保系统稳定,待修改完日志文件组后再将其删除。
sqlplus / as sysdba
host mkdir -p $ORACLE_BASE/standby/redo
host mkdir -p /mnt/EMC1/redo/
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 7;
alter database drop logfile group 8;
alter database drop logfile group 9;
alter database add logfile group 1 ('/mnt/EMC1/redo/group1redo1.log', '/opt/app/oracle/standby/redo/group1redo2.log') size 10G;
alter database add logfile group 2 ('/mnt/EMC1/redo/group2redo1.log', '/opt/app/oracle/standby/redo/group2redo2.log') size 10G;
alter database add logfile group 3 ('/mnt/EMC1/redo/group3redo1.log', '/opt/app/oracle/standby/redo/group3redo2.log') size 10G;
-- 切换当前日志文件组
alter system archive log current;
alter system archive log current;
alter system checkpoint;
alter database drop logfile group 4;
alter database drop logfile group 5;
alter database drop logfile group 6;
alter database add logfile group 4 ('/mnt/EMC1/redo/group4redo1.log', '/opt/app/oracle/standby/redo/group4redo2.log') size 10G;
alter database add logfile group 5 ('/mnt/EMC1/redo/group5redo1.log', '/opt/app/oracle/standby/redo/group5redo2.log') size 10G;
-- 确认日志文件组当前状态
select * from v$logfile order by member;
select * from v$log;
-- 删除操作系统上无用的日志文件组
rm -f /mnt/EMC1/redo1.log
rm -f /mnt/EMC1/redo10.log
rm -f /mnt/EMC1/redo11.log
rm -f /mnt/EMC1/redo12.log
rm -f /mnt/EMC1/redo2.log
rm -f /mnt/EMC1/redo3.log
rm -f /mnt/EMC1/redo4.log
rm -f /mnt/EMC1/redo5.log
rm -f /mnt/EMC1/redo6.log
rm -f /mnt/EMC1/redo7.log
rm -f /mnt/EMC1/redo8.log
rm -f /mnt/EMC1/redo9.log
-- 注意,在删除所有归档日志之前,请保留3个日志文件组已确保系统稳定,待修改完日志文件组后再将其删除。
调整FAST_START_MTTR_TARGET
参数FAST_START_MTTR_TARGET参数是一个加快实例恢复的参数,我们可以根据服务界别来定义一个合理的、可接受的值。该值得单位为秒。比如设定为60S,假定该值处于合理的情况之下,则一旦实例崩溃,在60S以内实例应当能够被恢复。合理即该值不能太大,也不能太小。太大则实例恢复所需的时间较长,太小则导致大量数据的及时写入,增加了系统的I/O。
影响实例恢复时间长短的主要因素是从最近检查点位置到联机重做日志尾部之间的距离。距离越长则所需要的cache recovery和undo、redo的时间越长。所以如何有效的缩短最近检查点位置与联机重做日志尾部之间的距离,正是FAST_START_MTTR_TARGET的目的。
FAST_START_MTTR_TARGET的值实际上是通过触发检查点来实现它的目的的。当内存中产生的dirty buffer所需的恢复时间(estimated_mttr)到达FAST_START_MTTR_TARGET所指定的时间,则检查点进程被触发。检查点进程一旦被触发,将通过DBWn进程按检查点队列顺序将脏数据写入到数据文件,从而缩短了最后检查点位置与联机重做日志间的距离,减少了实例恢复所需的时间。
alter system set fast_start_mttr_target=30;
相关文档可以参阅:Can Not Allocate Log (文档 ID 1265962.1)
本文原创,转载请注明出处,作者
如有错误,欢迎指正
邮箱:czmmiao@outlook.com
相关推荐
在执行编译程序时,如果虚拟机的内存不足,可能会出现“Virtual Memory Exhausted: Cannot Allocate Memory”的错误提示。这是因为编译程序需要占用大量的内存空间,而虚拟机的内存不足以满足编译程序的需求。 解决...
Thread 1 cannot allocate new log, sequence 8740 Checkpoint not complete Current log #1 seq #8739 mem #0: +DATA/pracdb1/onlinelog/group_1.257.648662189 Current log #1 seq #8739 mem #1: +FLASH/pracdb1/...
演示如何让Delphi7编译的程序在Win7下请求管理员...如果把例子代码里的{$R uac.res}这行去掉再编译本程序,在Win7下使用ping就会出现 Cannot allocate socket的错误,因为TIdIcmpClient不是使用icmp.dll实现ping的。
标题中的"forge-bootstrap-2.0.0.Alpha7.zip"是一个软件开发框架的版本压缩包,Forge Bootstrap 提供了一个快速启动新项目的环境,通常包含了基本的项目结构、配置和依赖管理,使得开发者能够更便捷地搭建开发环境。...
标题"Use new Allocate Space"直接指出了我们的讨论重点:使用`new`来分配内存空间。在C++中,当声明一个变量时,通常会为其在栈上分配空间。然而,如果需要更大的内存块或者内存生命周期超过函数调用的范围,就需要...
C#开发的窗体实现四边阴影效果 压缩包内有源码
在SQL Server的日常使用中,可能会遇到各种各样的问题,这些问题涵盖了从数据库连接、日志管理到查询性能优化等多个方面。下面将详细讨论这些常见问题及其解决方案。 首先,我们来看SQL Server连接问题。...
114啦网址导航建站系统历史版本功能特性: ...====================================================================== V1.13 (2010年07月02日修复列表) ... .# 修复站点提交模块的跨站脚本漏洞;...
Unicode and Character Set Functions (Windows)
2. `[ERROR] InnoDB: Cannot allocate memory for the buffer pool` - 这表示InnoDB无法为缓冲池分配内存,缓冲池是InnoDB用来缓存数据和索引的重要组件。 3. `[ERROR] Plugin 'InnoDB' init function returned ...
mmap: Cannot allocate memory 但是,该系统似乎并没有像Java那样锁定。 同一用户可以运行另一个mmap测试: cwb@laptop$ (./a.out | tail -1) & (./a.out | tail -1) mmap: Cannot allocate memory mmap: Cannot ...
云服务器编译安装PHP遇到virtual memory exhausted: Cannot allocate memory
开源项目-cjrd-allocate.zip,A simple utility package for initializing go structs with pointer fields to zero'd values instead of nil values
#### 一、TX-allocate ITL Entry 等待事件解析 **TX-allocate ITL Entry** 是一种常见的Oracle数据库等待事件,它通常发生在多用户并发修改同一行数据时。当一个事务尝试修改一行数据但无法立即获得所需的**意向...
slateblue.vim 这是一个基于“slate”配色方案的 Vim 配色方案。 截图 C 使用和 Python 使用 、 和 ... 使用 ...如果您是 NeoBundle 用户,则可以通过在 vimrc 中添加以下行并重新启动 vim 来安装此配色方案。...
### DB2的表空间和缓冲池 #### 一、表空间概述 在DB2数据库管理系统中,表空间是用于组织和存储数据的基本单位。表空间的设计与优化对提高数据库性能至关重要。按照不同的用途和管理方式,DB2中的表空间可以分为五...
2.Before creating a new tablespace,you should check the available disk space and the database configuration. 3.Before releasing a tablespace,you should check the tablespace usage and the database ...
Linphone编译错误及解决方法 Linphone是一款开源的VoIP电话软件,但是在编译过程中经常会遇到各种错误。这些错误可能是由于缺少依赖项、头文件、库文件等原因引起的。在这里,我们将列举一些常见的Linphone编译...
c++系统默认分配器 allocate 的源码分析