• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 外部锁定

    外部锁定是使用文件系统锁定来管理MyISAM多个进程对数据库表的争用。在不能将单个进程(例如MySQL服务器)假定为唯一需要访问表的进程的情况下,可以使用外部锁定。这里有些例子:

    • 如果运行多个使用相同数据库目录的服务器(不建议),则每个服务器必须启用了外部锁定。
    • 如果使用myisamchk对表执行表维护操作MyISAM,则必须确保服务器未运行,或者服务器已启用外部锁定,以便根据需要锁定表文件以与myisamchk协作以访问表。使用myisampack打包MyISAM表也是如此。

      如果服务器在启用了外部锁定的情况下运行,则可以随时使用myisamchk进行诸如检查表之类的读取操作。在这种情况下,如果服务器尝试更新myisamchk正在使用的表,则服务器将等待myisamchk完成后才能继续。

      如果使用myisamchk进行诸如修复或优化表之类的写操作,或者使用myisampack打包表,则必须始终确保mysqld服务器未使用该表。如果不停止mysqld,至少在运行myisamchk之前先执行mysqladmin flush-tables。如果服务器和myisamchk同时访问表,则表可能已损坏

    启用外部锁定后,每个需要访问表的进程都将在继续访问表之前获取表文件的文件系统锁。如果无法获取所有必需的锁,则会阻止该进程访问表,直到获得锁为止(在当前持有锁的进程释放它们之后)。

    外部锁定会影响服务器性能,因为服务器有时必须等待其他进程才能访问表。

    如果您运行单个服务器来访问给定的数据目录(这是通常的情况),并且在服务器运行时不需要其他程序(例如myisamchk)来修改表,则不需要外部锁定。如果仅使用其他程序读取表,则不需要外部锁定,尽管如果myisamchk在读取表时服务器更改表,myisamchk可能会报告警告。

    在禁用外部锁定的情况下,要使用myisamchk,必须在myisamchk执行时停止服务器,或者在运行myisamchk之前锁定并刷新表。为避免此要求,请使用CHECK TABLE nd REPAIR TABLE语句检查和修复MyISAM表。

    对于mysqld,外部锁定由skip_external_locking系统变量的值控制。启用此变量后,将禁用外部锁定,反之亦然。默认情况下,外部锁定是禁用的。

    可以使用--external-locking--skip-external-locking选项在服务器启动时控制外部锁定的使用。

    如果确实使用外部锁定选项来启用MyISAM来自许多MySQL进程的表更新,则不要在delay_key_write系统变量设置为的情况下启动服务器,也不要对任何共享表ALL使用DELAY_KEY_WRITE=1表选项。否则,可能会发生索引损坏。

    满足此条件的最简单方法是始终--external-locking与一起使用--delay-key-write=OFF。(默认情况下不会执行此操作,因为在许多设置中,混合使用上述选项会很有用。)

    上篇:元数据锁定