我已经在我的系统上设置了一个用于本地测试的MySQL数据库,并且我正在监控这些表以查看何时进行了更改。
第1步 - 转到DIR
cd /usr/local/mysql-5.7.16-osx10.11-x86_64/data/blog_atom_tables/
第2步 - 运行脚本
watchDB
watchDB()
的位置(为了便于阅读而稍作修改)......
function watchDB() {
declare -A aa // Associative array of filenames and their md5 hashes
declare k // Holder for current md5
prt="0"
while true; do // Run forever
// Loop through all table files within directory
for i in *.ibd;
do
k=$(sudo md5 -q $i) // md5 of file (table)
// If table has not been hashed yet
if [[ ${aa[$(echo $i | cut -f 1 -d '.')]} == "" ]]; then
aa[$(echo $i | cut -f 1 -d '.')]=$k
// If table has been hashed, and diff md5 (i.e. table changed)
elif [[ ${aa[$(echo $i | cut -f 1 -d '.')]} != $k ]]; then
echo $i;
aa[$(echo $i | cut -f 1 -d '.')]=$k
fi
done
done
}
TL; DR 遍历目录中的所有表文件,保存每个md5
的副本,并继续循环检查更改。
我不需要查看哪些行/列已更改,只是表本身不同。在大多数情况下,这完全符合我的要求,但计算每个表的md5
需要相当长的时间。对于仅25个表,执行每个循环需要3到5秒。
除了md5
之外,还有更快捷的方法吗?我使用类似cmp
之类的东西,但我需要保存文件当前状态的引用,所以我有一些东西需要对它进行比较。
这只占最终总数的1/6左右,因此欢迎任何速度提升。
答案 0 :(得分:1)
虽然它并没有真正检查文件的内容,但您可以使用文件系统属性作为监视更改的简单方法。除非在禁用时间戳的情况下挂载文件系统,否则您可以监视访问时间和修改时间戳:
stat -f "%m" <filename>
文件系统驱动程序知道何时发生读取和写入,然后更新时间戳。