暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【ACDU 翻译】MySQL 8.11.5 外部锁定

原创 由迪 2021-06-29
233

外部锁定是使用文件系统锁定来管理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 TABLEandREPAIR TABLE 语句来检查和修复 MyISAM表。

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

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

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论