2014-02-11 1 views
1

inotify를 사용하여 mysql 데이터 파일의 변경 사항을 모니터링합니다. 저장소 엔진은 InnoDB입니다. inotify는 실제로 InnoDB 파일의 데이터가 업데이트 될 때 어떤 이벤트도 포착하지 못합니다. 그러나 동일한 테이블의 스토리지를 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 있고, 경우 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 
+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

난 당신이 파일을 열 때 O_DIRECT 플래그를 사용 innodb_flush_method = O_DIRECT를 사용하는 가정합니다. 나는 inotify가 O_DIRECT과 작동하지 않는다고 생각 하겠지만 빨리 그 확인을 찾을 수 없었다.

+0

방금 ​​두 가지 테스트를했는데 네 말이 맞아 보인다. O_DIRECT를 사용하면 inotify가 DML 변경을 알 수 없습니다. O_DIRECT를 비활성화하면 DML 변경 사항이보고되었습니다. –

관련 문제