我使用inotify來監視對mysql數據文件的更改,而存儲引擎是InnoDB。當InnoDB文件中的數據實際更新時,inotify將始終無法捕獲任何事件。但是,當我將相同表格的存儲轉換爲MyISAM存儲引擎時,一切都像魅力一樣。inotify在InnoDB文件上失敗
對發生了什麼事有什麼想法?
我使用inotify來監視對mysql數據文件的更改,而存儲引擎是InnoDB。當InnoDB文件中的數據實際更新時,inotify將始終無法捕獲任何事件。但是,當我將相同表格的存儲轉換爲MyISAM存儲引擎時,一切都像魅力一樣。inotify在InnoDB文件上失敗
對發生了什麼事有什麼想法?
它工作正常,我來監視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
,我使用一些DML像INSERT更改數據, inotify不報告它。
但是,當我禁用O_DIRECT並允許InnoDB I/O通過文件系統緩衝區時,inotify確實將DML更改報告給.ibd文件。
其他詳情:
Linux distro: CentOS 6.5
Linux kernel version: 2.6.32
inotify version: 3.14
Filesystem for MySQL datadir: xfs
在標準的MySQL服務器配置下,InnoDB使用一組數據文件(ibdata1
等)來存儲服務器管理的所有InnoDB表的數據。數據庫目錄中的文件僅用於存儲元數據,例如列布局。另外,InnoDB緩衝寫入這些數據文件。對數據庫的更改不一定對應於對InnoDB數據文件的寫入。
如果你想觀看數據庫表的修改,使用MySQL觸發器。
FWIW,在MySQL 5.6中,innodb_file_per_table現在是默認值。 –
我設置了innodb_file_per_table = 1,並實際監視每個表的.ibd文件。 .ibd文件的時間戳已更改,並且.ibd文件的SHA1散列也已更改,即使文件大小未更改。但是,inotify不會拿起它。 – user2468956
我假設你使用innodb_flush_method = O_DIRECT
,打開文件時使用O_DIRECT
標誌。我會假設inotify不起作用O_DIRECT
,但無法很快找到確認。
我剛做了一些測試,看起來你是對的。使用O_DIRECT,DML更改不會被inotify注意到。當我禁用O_DIRECT時,報告了DML更改。 –
我很好奇,如果您已嘗試切換innodb_file_per_table並監視每個表的.ibd文件。它在我的情況下不起作用。 – user2468956