WordPress 和 DigitalOcean 托管数据库 SQL 需要主键问题

问题描述

背景:WP 开发知识不多,但总体上是经验丰富的 PHP 开发人员。

因此,众所周知(或不知道,就像我不知道)DigitalOcean 的托管数据库系统设置为具有必需的主键(不可全局更改)。虽然我理解这样更好,但有时在 wordpress 网站上安装现有插件时,插件必须创建表,其中可能有也可能没有主键。

我有这些插件的列表,我会在可能的情况下向其发送改进请求,但作为一种解决方法,我想通过使用钩子和/或“必须使用的插件”来解决此问题wordpress 系统在每个 create table 语句(或者一般的每个 sql 语句,如果没有办法只关注 create table 语句)之前调用 SET SESSION sql_require_primary_key = OFF;

  1. 这是一个“好的”且可行的解决方法吗?
  2. 我怎样才能做到这一点(我应该调用什么钩子)?

解决方法

现在 wp-cerber 遇到了同样的问题,并得到了 Digital Ocean 的回复:

我们目前已将变量 sql_require_primary_key 打开为 允许用户在表上创建主键以避免复制 问题、节点复制等。这在过去有效,但没有 强制执行,但我们收集的经验、时间和信息 从频繁的问题,例如。为一个节点创建一个新节点所需的时间 来自大表备份的服务。

主键对于某些管理操作也是必不可少的 没有备用或只读副本服务的服务;任何节点 替换是通过首先启动一个备用数据库来执行的,所有 来自旧 master 的数据被复制并且没有主键,这 过程可能需要很长时间或失败,失败的节点也是 替换为恢复备份,这需要播放二进制文件 日志,如果没有主键的大表,这可能不起作用 最近有变化。

如果您决定不使用主键继续,您可以使用两个 选项:

  1. 我们可以从我们的末端禁用主要需求

  2. 您可以使用 SET SESSION sql_require_primary_key = 0;

注 2 是针对单个会话的。退出后,您将 需要再次运行。

以下网址有更多信息 https://www.digitalocean.com/docs/databases/mysql/how-to/create-primary-keys/#how-digitalocean-uses-primary-keys