CentOS 6.5 ext4 filesystemio_options=SETALL 备库archivelog 损坏问题

数据库版本 11.2.0.3.15
操作系统 CentOS 6.5 
文件系统 ext4

最近发现我们线上数据库的3台备库,全部出现一样的错误如下:
INCIDENT_ID          PROBLEM_KEY                                                 CREATE_TIME                              
-------------------- ----------------------------------------------------------- ---------------------------------------- 
352249               ORA 445                                                     2016-04-07 22:18:02.350000 +08:00       
640297               ORA 600 [3020]                                              2016-11-08 20:09:44.612000 +08:00       
640217               ORA 600 [ORA-00600: internal error code, arguments: [3020], 2016-11-08 20:10:19.945000 +08:00       
640298               ORA 600 [3020]                                              2016-11-14 11:40:52.532000 +08:00       
640177               ORA 600 [ORA-00600: internal error code, arguments: [3020], 2016-11-14 11:41:32.540000 +08:00 

Dump continued from file: /home/oracle/database/diag/rdbms/yjfhisd/yjfhis/trace/yjfhis_mrp0_27052.trc
ORA-00600: internal error code, arguments: [3020], [3], [33188], [12616100], [], [], [], [], [], [], [], []
ORA-10567: Redo is inconsistent with data block (file# 3, block# 33188, file offset is 271876096 bytes)
ORA-10564: tablespace UNDOTBS1
ORA-01110: da
========= Dump for incident 640177 (ORA 600 [ORA-00600: internal error code, arguments: [3020], [3], [33188], [12616100], [], [], [], [], [], [], [], []

开始查询这个错误发现可能是BUG引起的,只能是重新进行备库配置,但是回头想想为什么只有这一套库的STANDBY 出现问题,
回想一下这台机器因为磁盘I/O不行,我开启了异步I/O,让I/O进入内核态缓存,加快ORACLE I/O的速度
也就是
filesystemio_options=SETALL
初衷是好的,但是经过查询MOS和一些网友的文章 也发现同样的问题。
MOS:
ORA-1578 ORA-353 ORA-19599 Corrupt blocks with zeros when filesystemio_options=SETALL on ext4 file system using Linux (文档 ID 1487957.1)
这个文章指出,不光是备库,主库的各种文件都可能出现问题,卧槽这个问题就大了。只有改参数重启数据库了。

同时我注意到这样一句话:
Database files on ext4 File System on Linux and Database parameter filesystemio_options is set to SETALL.
This is a Linux defect when using O_SYNC|O_DIRECT on ext4 file systems 
(filesystemio_options=SETALL open the database files using O_SYNC|O_DIRECT). 

也就是说ORACLE调用LINUX API OPEN 函数的时候 由LINUX决定使用使用O_SYNC还是O_DIRECT
那么这也就说明了一点为什么这个参数是静态的,
因为ORACLE进程调用 OPEN函数调用打开文件后返回一个文件描述符给 ORACLE进程,除非数据库
进程终止,一直在read write的情况下 这个不可能动态修改。

再来看
O_SYNC,O_DIRECT
O_DIRECT (Since Linux 2.4.10)
              Try  to  minimize cache effects of the I/O to and from this file.  In general this will degrade performance, but it is useful in special
              situations, such as when applications do their own caching.  File I/O is done directly to/from user space  buffers.   The  I/O  is  syn-
              chronous, that is, at the completion of a read(2) or write(2), data is guaranteed to have been transferred.  See NOTES below for further
              discussion.
大概意思是说,最小化系统cache,这里应该是值的内核缓冲区,一般情况会导致性能问题,但是如果应用程序有自己的缓存,可以这样干。

O_SYNC The file is opened for synchronous I/O.  Any write(2)s on the resulting file descriptor will block the calling process  until  the  data
       has been physically written to the underlying hardware.  But see NOTES below.

再来看看ORACLE对这个参数的描述:

FILESYTEMIO_OPTIONS can be set to one of the following values:
ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.
在文件系统文件上启用异步I/O,在数据传送上没有计时要求。
DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.
在文件系统文件上启用直接I/O,绕过buffer cache。
SETALL: enable both asynchronous and direct I/O on file system files.
在文件系统文件上启用异步和直接I/O。
NONE: disable both asynchronous and direct I/O on file system files.
在文件系统文件上禁用异步和直接I/O。

然后看看LINUX为什么把它设置为NONE
Linux none
Oracle only supports native Linux asynchronous I/O, 
which requires also using direct I/O.  
Older Linux kernels do not support native asynchronous I/O.

LINUX老版本不支持(没有)原生的异步I/O(native asynchronous I/O),其实
回想MYSQL的早期版本的实现是MYSQL层自己模拟的异步的I/O,后来
mysql也采用LINUX的原生异步I/O。
ORACLE出于这种考虑设置为了NONE,其实还应该加一句就是回触发本文的
这个问题。

最后我们看看MYSQL innodb 中一般也有一个差不多的参数:
innodb_flush_method 这个参数一般设置为O_DIRECT,绕开内核缓冲区
http://blog.itpub.net/7728585/viewspace-1980262/

总之在linux 5 6 EXT4文件系统上主备不要设置
filesystemio_options=SETALL
另外设置这种底层的参数,需要参考MOS的建议或查看一下有没有什么bug或者
严重问题,千万不要想当然,除非大家都这样用。。

时间: 2024-07-30 10:48:41

CentOS 6.5 ext4 filesystemio_options=SETALL 备库archivelog 损坏问题的相关文章

oracle中11gR2 dataguard 备库文件损坏解决案例

某客户的一套11gR2 dataguard环境出现异常,检查发现是备库出现文件损坏,且无法正常情况,已经超过1个多月没同步了. 我们先来看下备库的日志: .......省略部分内容 See Note 411.1 at My Oracle Support for error and packaging details. Slave exiting with ORA-600 exception Errors in file /u01/app/oracle/diag/rdbms/crjnew/crjn

如何搭建阿里云RDS PostgreSQL数据库的物理备库

如何搭建阿里云RDS PostgreSQL数据库的物理备库 用户在阿里云购买了RDS PostgreSQL,如何在自己的机房或者ECS上建立备库?关于如何构建逻辑备库,在我以前的文章有详细的讲解,所谓逻辑备库,是可以跨版本,甚至仅仅同步一部分相同步的表的备库.https://yq.aliyun.com/articles/7240 如果用户需要构建一个和RDS PostgreSQL一模一样的备库,则可以通过流复制或者归档来完成. 步骤如下.1. 准备备库环境 安装64位Linux 安装与RDS P

你的备库做好准备了吗

这篇文章计划了一段时间,本来想写篇心情文字,还是留到周末再放飞心情吧. 今天的内容是关于数据库的备库的思考,当然我们可以自己问自己,我们的备库准备工作做好了吗?扪心自问,其实有些工作我也没有准备好,这是我的建议,其实一个备库的思考点还是有很多值得考量和斟酌的地方.自己也需要后续完善 备库总是在容灾中有着举足轻重的作用,但是故障难免,我们的备机备库是否能够在危机降临的时候顶住压力,这个需要打上一个问号,我会从硬件配置,系统层面,数据库层面,架构层面和网络层面进行一些分析.硬件配置    备库硬件配

逻辑备库的Swichover和Failover

逻辑备库的Switchover  检查Primary数据库状态 查看当前Primary数据库状态:SQL>  SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -------------------- TO STANDBY  如果该查询返回TO STANDBY 或SESSIONS ACTIVE则表示状态正常,可以执行转换操作,如果是其他值,你就需要重新检查一下Data Guard配置,如看看LOG_ARCHIVE_DEST_n

MySQL复制(2) 主备库都为空的情况下创建主备复制

本文适用于新安装的主库和备库,假定主备库为空,如果你是从已存在的主库复制,请转到<[MySQL] 复制(3)- 创建主备复制(从另一个服务器开始复制)> 主库的配置 主库需要打开二进制日志,并制定一个唯一的server id,my.cnf文件中增加或修改如下内容: server_id=60 log-bin = /data/mysql/log/mysql-bin 备库的配置 备库my.cnf的配置如下: server_id=61 read_only=1 log_bin = /data/mysql

Oracle中DG备库报错ORA-00313、00312、27037

DATAGUARD配置如下: PROD为主库,SBDB为备库 日志组1-3组为redolog file,4-6组为standby log 在创建standby log后主库关库,使用冷备tar包将数据传输到备库进行的恢复. DG配置完成之后,启动备库之后,备库alert日志报错如下: Errors in file /u01/app/oracle/admin/SBDB/udump/sbdb_rfs_14903.trc: ORA-00313: open failed for members of l

oracle 10g物理备库也可以read/write

从Oracle 10g开始,physical standby也可以临时的置于read/write状态,以便用于开发,测试以及做报表等,然后再通过flashback到先前的时间点,继续应用主库的归档. 下面通过一个实验演示整个过程: 1.设置闪回恢复区 SQL> alter system set db_recovery_file_dest_size=2G; 系统已更改. SQL> alter system set db_recovery_file_dest='e:/oracle/back'; 系

Oracle 11g DataGuard 物理备库配置及Active DataGuard测试

说明: 本文安装配置了Oracle 11g Dataguard 物理备库,并测试了11g Dataguard 物理备库新特性Active Data Guard, 是Oracle Database Enterprise Edition的一个功能,需要额外授权,本文只用于测试. 一.环境介绍 1. 主数据库环境 操作系统版本: OEL5.8 x64 数据库版本  : Oracle 11.2.0.3 x64 数据库sid名 : orcl 2. 备库环境 操作系统版本: OEL5.8 x64 数据库版本

Oracle 11g Dataguard物理备库配置(六) broker fastfailover测试

本文采用Oracle 11g Dataguard broker fastfailover测试 Oracle 11g Dataguard fast failover配置,需要主备数据库开启闪回功能,闪回功能开启本文略过. 闪回开启需要启动到mount状态时,主备库的监听不要随意关闭. 1. dgmgrl查看主备库状态 $ dgmgrl sys/oracle DGMGRL for Linux: Version 11.2.0.3.0 - 64bit Production Copyright (c) 2