问题现象

客户在麒麟kylin v10 sp1环境上部署YashanDB,运行正常, 但是在巡检中发现run.log中有大量错误日志文件metadata changed,需要排查原因

问题单:前置机大量错误日志文件metadata changed,需要排查原因

问题的风险及影响

客户环境为准生产环境,担心影响业务执行。

问题影响的版本

YashanDB版本:22.2.11.100

问题发生原因

YashanDB利用操作系统linotify相关接口做文件设备的监控,范围是:数据文件、redo文件、控制文件、归档日志。

inotify_add_watch() 函数在部分麒麟(kylin v10 sp1)环境上执行结果和CentOS等其他环境不一致,在文件正常的情况下会返回大量的属性变更事件,导致大量错误日志,新版本(22.2.13.100之后)做了防洪规避,避免日志过多掩盖其他信息。

解决方法及规避方式

1、检查相应文件是否有异常。

2、升级到22.2.13.100之后版本。

问题分析和处理过程

检查参数DIAG_ADR_ENABLED,值为TRUE

该参数开启会启动HEATH_MONITOR线程, 做健康检查:

分析日志产生的原因

inotify_add_watch() 是 Linux 系统编程中用于监控文件系统事件的一个系统调用函数,它属于 inotify(Input/Output Notifier)接口的一部分。inotify 是 Linux 内核提供的一种高效、实时的文件系统事件监控机制,允许用户空间程序监控文件或目录的各种变化,如文件创建、删除、修改、移动等。

使用 inotify_add_watch() 监视某个文件或目录,并接收到属性变更(IN_ATTRIB)事件,但查看文件权限时并未发现明显的变化,可能有以下几种情况:

1、隐式属性变更:除了明显的权限(如读、写、执行)变更外,文件属性还包括其他一些可能被修改的元数据,如文件的拥有者、所属组、修改时间、访问时间、扩展属性(xattrs)等。这些属性的变更也可能触发 IN_ATTRIB 事件。请检查这些元数据是否发生了变化。

2、文件系统内部操作:有时,文件系统或底层存储设备可能会进行内部维护操作,如元数据刷新、缓存同步等,这些操作可能导致文件属性看似未变但实际上发生了内部变更,从而触发 IN_ATTRIB 事件。这种情况通常难以从用户层面察觉,但确实会导致事件通知。

3、文件系统挂载选项:如果文件系统是以特定挂载选项挂载的,某些属性变更可能不会立即反映到用户空间。例如,某些网络文件系统(如 NFS)或加密文件系统可能具有缓存属性或延迟写入特性。在这种情况下,虽然内核已经感知到属性变更并触发了 IN_ATTRIB 事件,但在用户空间观察时可能尚未看到变化。您可以尝试刷新文件系统缓存(如使用 sync 或 fsync),或者等待一段时间看属性是否会最终更新。

4、软件或服务干预:某些软件或服务(如备份工具、文件同步服务、权限管理工具等)可能在后台默默地修改文件属性,导致 IN_ATTRIB 事件的发生。检查是否有此类软件或服务正在运行,并确认它们是否可能影响到您监视的文件或目录。

5、编程错误或工具误报:如果您使用的是自编写的代码或第三方工具来检查文件权限,可能存在编程错误或工具本身的误报问题。请确保检查代码逻辑的正确性,或者使用可靠的命令行工具(如 ls -l 或 stat)来验证权限是否确实未变。

6、并发修改:如果多个进程或线程同时对文件进行操作,可能导致属性变更事件与您观察到的权限状态之间存在时间差。确保在接收到事件通知后立即检查权限,以减少并发修改带来的影响。

如果文件属性发生变化, 会触发IN_ATTRIB事件,输出错误日志

inotify_add_watch() 函数在部分麒麟(kylin v10 sp1)环境上执行结果和CentOS等其他环境不一致,在文件正常的情况下会返回大量的属性变更事件,导致大量错误日志。

检查数据库正常,该错误信息可忽略

客户确认数据库运行正常,inotify_add_watch是内核函数,其返回结果和其他系统不一致,新版本做了防洪规避,避免日志过多掩盖其他信息,可升级到新版本。

经验总结

1、YashanDB利用操作系统linotify相关接口做文件设备的监控,范围是:数据文件、redo文件、控制文件、归档日志。

2、inotify_add_watch() 函数在部分麒麟(kylin v10 sp1)环境上执行结果和CentOS等其他环境不一致,在文件正常的情况下会返回大量的属性变更事件,导致大量错误日志,新版本(22.2.13.100之后)做了防洪规避,避免日志过多掩盖其他信息。

【YashanDB数据库】数据库运行正常,日志出现大量错误metadata changed的更多相关文章

  1. 传递给数据库 'master' 中的日志扫描操作的日志扫描号无效

    错误:连接数据库的时候提示:SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确 C:\Documents and Settings\Administrator>" ...

  2. 你真的了解 MySQL 数据库的运行状况吗?

    2015年第三方市场调查机构 Evans 数据公司最近公布的一系列客户调查数据显示,在过去两年里,MySQL 在所有开发者使用的数据库中获得了25%的市场份额,Evans 公司的本次调查显示,数据库的 ...

  3. sqlserver服务启动后停止,传递给数据库 'master' 中的日志扫描操作的日志扫描号无效

    电脑异常重启,导致SqlServer服务启动后,自动停止,在[计算机管理]-[事件查看器]-[windows日志]中进行查看系统错误日志,在[应用程序]下发现可能的错误信息有以下两条: 1.错误:传递 ...

  4. 使用SQL语句创建数据库1——创建一个数据库文件和一个日志文件的数据库

    目的:创建一个数据库文件和一个日志文件的数据库 在matser数据库下新建查询,输入的命令如下: USE master——指向当前使用的数据库.创建数据库实际上是向master数据库中增加一条数据库信 ...

  5. Mysql数据库的用户和日志管理

    Mysql数据库的用户和日志管理 数据库的用户管理 1.mysql用户账号管理 用户账号 user@host user:账户名称 host:此账户可通过哪些客户端主机请求创建连接线程,可以是ip.主机 ...

  6. 数据库 'tempdb' 的事务日志已满。若要查明无法重用日志中的空间的原因

    最常的做法: --1.清空日志 DUMP TRANSACTION tempdb WITH NO_LOG --2.截断事务日志: BACKUP LOG tempdb WITH NO_LOG --3.收缩 ...

  7. 数据库tempdb的事物日志已满,原因为“ACTIVE_TRANSACTION”

    系统运行过程中,突然报错数据库tempdb的事物日志已满,原因为"ACTIVE_TRANSACTION".导致所有业务崩溃. 接到报警后,进入数据库服务器.检查硬盘空间正常,于是登 ...

  8. SharePoint 2010 数据库xxx的事务日志已满

    接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中 ...

  9. 传递给数据库 'model' 中的日志扫描操作的日志扫描号无效

    状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止   通过"事件查看器" 发现 错误: ,严重度: ,状态: LSN(::)无效.该 LSN 是传递给数据库 ...

  10. 使用ODBC 数据库 ,运行程序时 出现 “遇到不适当的参数”

    我知道的一种情况是 数据库打开了,没有关闭,再次调用数据库打开函数,会出现这样错误.当然是打开同一个数据库同一张表.

随机推荐

  1. Python2 SyntaxError: Non-ASCII character '\xc3' in file...

    使用pip安装完需要的python库,运行脚本时报错:Syntax Error: Non-ASCII character '\xc3' in file /usr/local/lib/python2.7 ...

  2. Bom浏览器对象模型 -- 手稿

    ------------恢复内容开始------------ ------------恢复内容结束------------ ------------恢复内容开始------------ ------- ...

  3. 使用pyqt5制作简单计分桌面应用

    这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,希望对大家有所帮助.制作这个小程序的起因是因为有个艺术类比赛需要设计这个一个桌面程序,方便统分. (此程序尚存在部分小bug,请慎用,公开代码 ...

  4. PHP str_replace() 函数详解

    PHP str_replace() 函数详解 1.前言: str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写). 该函数区分大小写.请使用 str_ireplace() 函数 ...

  5. 在该serializer中使用source参数指定序列化时使用的字段的choices选项

    在序列化中获取time_unit字段的中文名称,你可以使用choices选项中定义的第二个值,即元组中的第二个元素.你可以通过定义一个serializer,然后在该serializer中使用sourc ...

  6. [oeasy]python0119_语言的演化_拉丁字符_罗马帝国_罗马体

    罗马拉丁字符 回忆上次内容 起源于埃及的 圣书体 象形文字 在与 两河流域的 苏美尔楔形文字 结合后 经过 腓尼基人 的拼音化 和 广泛传播 终于来到了 希腊   ​   添加图片注释,不超过 140 ...

  7. [oeasy]python0084_扩展BCD_EBCDIC_ibm的发家史

    编码进化 回忆上次内容 上次 回顾了 数字 进入二进制世界的 过程 采用的编码 是 BCD Binary Coded Decimal 也叫8421码 十进制数的 二进制形态 数字的 输出形式 辉光管 ...

  8. JWT浅了解

    JWT通过数字签名的方式(让我想起了软考),以json对象为载体,在不同的服务终端之间安全传输信息 是一种授权认证 生成token的原理:通过header的加密方式,对payload进行加密.然后把h ...

  9. XCode 编译 PAG 源码

    最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译. 1 下载源码 编译源码首先要下载源码,有关PAG源码可直接到github上下载. 2 添加相关依赖 下载源 ...

  10. 如何在WSL2中安装可执行编译.cu文件的cuda环境

    参考nvidia官方文档: https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-insider-preview-buil ...