• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 无法正确关闭表中的问题

    每个MyISAM索引文件(.MYI文件)在标头中都有一个计数器,可用于检查表是否已正确关闭。如果从CHECK TABLEmyisamchk收到以下警告,则表明该计数器不同步:

    clients are using or haven't closed the table properly
    

    此警告不一定表示该表已损坏,但您至少应检查该表。

    计数器的工作方式如下:

    • 在MySQL中第一次更新表时,索引文件标题中的计数器增加。
    • 计数器在进一步更新期间不会更改。
    • 当关闭表的最后一个实例时(由于FLUSH TABLES执行了操作或因为表高速缓存中没有空间),如果表在任何时候都已更新,则计数器递减。
    • 当您修理表或检查表时,如果发现还可以,则计数器将重置为零。
    • 为避免与可能检查该表的其他进程进行交互时出现问题,如果计数器为零,则计数器在关闭时不减少。

    换句话说,只有在以下情况下,计数器才会变得不正确:

    • MyISAM不先发出LOCK TABLESand的情况下复制表FLUSH TABLES
    • MySQL在更新和最终关闭之间崩溃了。(该表可能仍然可以,因为MySQL总是在每个语句之间发布所有内容的写操作。)
    • 一个表在mysqld使用的同时被myisamchk --recovermyisamchk --update-state修改。
    • 多个mysqld服务器正在使用该表,而另一台服务器正在使用该表时,一个服务器在表上执行REPAIR TABLECHECK TABLE。在此设置中,可以安全使用CHECK TABLE,尽管您可能会从其他服务器收到警告。但是,REPAIR TABLE应避免使用,因为当一台服务器用新服务器替换数据文件时,其他服务器不知道这一点。

      通常,在多个服务器之间共享数据目录是一个坏主意。有关更多讨论,请参见“在一台机器上运行多个MySQL实例”。

    上篇:MyISAM表损坏