我使用inotify来监视对mysql数据文件的更改,而存储引擎是InnoDB。当实际更新InnoDB文件中的数据时,inotify将始终无法捕获任何事件。但是,当我将相同表的存储转换为MyISAM存储引擎时,一切都像魅力一样。
关于发生了什么的任何想法?
答案 0 :(得分:1)
我可以监控InnoDB表空间:
$ inotifywatch -v -t 60 -r /var/lib/mysql/data/*
. . .
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total access modify close_nowrite open filename
21 12 0 4 5 /var/lib/mysql/data/test/
3 1 0 1 1 /var/lib/mysql/data/imdb/
3 1 0 1 1 /var/lib/mysql/data/performance_schema/
2 0 2 0 0 /var/lib/mysql/data/ibdata1
2 0 2 0 0 /var/lib/mysql/data/ib_logfile0
1 0 1 0 0 /var/lib/mysql/data/mysqld-bin.000017
我做了一些测试,似乎当我有innodb_flush_method=O_DIRECT
时,我使用像INSERT这样的DML来更改数据,inotify不报告它。
但是当我禁用O_DIRECT并允许InnoDB I / O通过文件系统缓冲区时,inotify会报告对.ibd文件的DML更改。
其他细节:
Linux distro: CentOS 6.5
Linux kernel version: 2.6.32
inotify version: 3.14
Filesystem for MySQL datadir: xfs
答案 1 :(得分:1)
我假设您使用的是innodb_flush_method = O_DIRECT
,它在打开文件时使用O_DIRECT
标志。我认为inotify不能与O_DIRECT
一起使用,但无法快速找到确认。
答案 2 :(得分:0)
在标准MySQL服务器配置下,InnoDB使用一组数据文件(ibdata1
等)来存储服务器管理的所有InnoDB表的数据。数据库目录中的文件仅用于存储元数据,例如列布局。此外,InnoDB缓冲对这些数据文件的写入。对数据库的更改不一定与对InnoDB数据文件的写入相对应。
如果要查看数据库表以进行修改,请使用MySQL触发器。