2014-02-11 57 views
1

我使用inotify來監視對mysql數據文件的更改,而存儲引擎是InnoDB。當InnoDB文件中的數據實際更新時,inotify將始終無法捕獲任何事件。但是,當我將相同表格的存儲轉換爲MyISAM存儲引擎時,一切都像魅力一樣。inotify在InnoDB文件上失敗

對發生了什麼事有什麼想法?

回答

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,我使用一些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 
+0

我很好奇,如果您已嘗試切換innodb_file_per_table並監視每個表的.ibd文件。它在我的情況下不起作用。 – user2468956

0

在標準的MySQL服務器配置下,InnoDB使用一組數據文件(ibdata1等)來存儲服務器管理的所有InnoDB表的數據。數據庫目錄中的文件僅用於存儲元數據,例如列布局。另外,InnoDB緩衝寫入這些數據文件。對數據庫的更改不一定對應於對InnoDB數據文件的寫入。

如果你想觀看數據庫表的修改,使用MySQL觸發器。

+1

FWIW,在MySQL 5.6中,innodb_file_per_table現在是默認值。 –

+0

我設置了innodb_file_per_table = 1,並實際監視每個表的.ibd文件。 .ibd文件的時間戳已更改,並且.ibd文件的SHA1散列也已更改,即使文件大小未更改。但是,inotify不會拿起它。 – user2468956

1

我假設你使用innodb_flush_method = O_DIRECT,打開文件時使用O_DIRECT標誌。我會假設inotify不起作用O_DIRECT,但無法很快找到確認。

+0

我剛做了一些測試,看起來你是對的。使用O_DIRECT,DML更改不會被inotify注意到。當我禁用O_DIRECT時,報告了DML更改。 –