MySQL 不自动更新information_schema,除非我手动运行ANALYZE TABLE myTable
在本文中,我们将介绍MySQL中的information_schema和ANALYZE TABLE命令。同时,我们将讨论在MySQL中如何解决信息_schema不自动更新的问题。
阅读更多:MySQL 教程
什么是information_schema?
information_schema是MySQL中的一个数据库,它包含了当前MySQL实例中所有数据库、表、列、索引等对象的元数据信息。使用information_schema,我们可以轻松地获取有关这些对象的详细信息,比如表的行数、索引的数量等等。
information_schema提供了查询视图和表的方式,这些查询可以用来从元数据中提取所需的信息。
为什么information_schema要更新?
更新information_schema非常重要,因为它会影响到许多MySQL管理和监控工具的操作效果。如果information_schema中的数据被过时或不准确,这不仅会干扰MySQL服务器的基本操作,还会导致错误的查询计划、不必要的锁定和内存泄漏等一系列问题。
在MySQL中,更新information_schema有两种方式:
1.定期自动更新
MySQL会自动更新information_schema,但这个过程不是实时的。默认情况下,MySQL会把information_schema的数据每隔固定时间写入一个内存表(也就是“全局记录日志(GRL)”表),然后定期以固定频率flush到磁盘上对应的元数据文件里。这样做的好处是即使MySQL崩溃,information_schema的数据也不会丢失。
2.手动更新
除此之外,我们也可以手动更新information_schema。这可以通过使用ANALYZE TABLE命令来实现。
ANALYZE TABLE是MySQL的一个命令,用于分析并更新表或分区的索引和统计信息。 这有助于MySQL优化器更好地理解表的数据并选择更好的查询计划,此外它也可以确保information_schema中的数据和实际表数据同步。
在这个例子中,我们手动更新名为“myTable”的表,并在information_schema中更新它的元数据。在没有崩溃或其它异常情况的情况下,靠这个方法手动更新information_schema通常不会有太大问题。但是,这种需要手动更新的方式也会带来一些繁琐和不安全的问题。如果我们有成百上千个表需要更新,那么手动操作可能会让我们感到非常繁琐。
如何解决information_schema不自动更新的问题?
当我们发现MySQL没有自动更新information_schema时,我们应该检查以下几个原因:
1. MySQL配置问题
首先,我们应该检查MySQL的配置文件(my.cnf或my.ini)中是否启用了全局日志记录功能。如果没有启用,MySQL在更新information_schema时不会写入日志。通过修改配置文件,可以将GRL文件保存在不同的文件夹或磁盘分区中,这样会更加安全。以下是如何检查和设置GRL的相关配置:
2. MySQL优化器的配置问题
当MySQL优化器发现缺乏充足的统计信息时,它会使用默认的统计信息来生成执行计划。这样可能会带来计划性能瓶颈,尤其是对于大型表或高并发查询的场景,解决办法是手动更新。
3. 数据库被锁定
当MySQL执行大量DDL操作,或者在备份、恢复、刷新、优化等过程中,会产生一些锁定操作,这可能会导致information_schema无法更新。因此,在进行这些操作时,我们应该谨慎并避免锁定database schema。
4. 数据库表被锁定
当一个表被锁定时,它的元数据信息可能在information_schema视图中受到影响。这也会导致我们发现information_schema没有自动更新的问题。因此,我们需要确保任何表锁都始终与相应的表更新操作同步。
总结
在MySQL中,information_schema是元数据信息库,提供有关MySQL实例中所有数据库、表、列、索引等对象的详细信息。当information_schema不自动更新时,我们应该首先检查MySQL是否正确配置,并避免因其他原因导致的数据库或表的锁定。如果information_schema不自动更新,请使用ANALYZE TABLE命令手动更新表的元数据信息。通过这些方法,我们可以维护和更新information_schema,以确保我们在MySQL中获得准确、详细的信息,并帮助我们更好地管理和操作我们的数据库。