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

3

背景:我对WP开发知识不是很了解,但是有一般PHP开发经验。

众所周知(或者像我一样不知道),DigitalOcean的托管数据库系统需要设置必需的主键(无法全局更改)。虽然我理解这样更好,但有时在WordPress网站上安装现有插件时,该插件必须创建表格,这些表格可能有也可能没有主键。

我有一个这种类型的插件列表,我将在可能的情况下发送改进请求,但作为解决方法,我希望利用WordPress的钩子和/或“必须使用插件”系统,在每个创建表语句(或每个sql语句)之前调用SET SESSION sql_require_primary_key = OFF;

  1. 这是一个“好”的且可行的解决方法吗?
  2. 我应该调用哪个钩子来实现它?

1
你试过这个方法来验证在创建表之前是否可以禁用主键要求吗?看起来如果你创建没有主键的表,这些表将无法正确复制,这就是为什么他们现在强制执行这个要求的原因。 - Mark B
@MarkB 谢谢你的评论。我完全没有意识到这是原因。看起来我的唯一解决办法就是迁移我的数据库了,因为我无法控制客户使用的某些插件,并且为每个插件手动创建数据库并不现实,因为每次更新都有可能创建一个新的...真是太让人沮丧了... - Solid
@MarkB; 也对:是的。我已经验证过了。因为,当我手动创建表格(并在SQL编辑器中禁用sql_require_primary_key选项)时,即使没有主键,表格也能成功创建。 - Solid
1
是的,我也对此感到非常沮丧。因为这个原因,我正在将一些东西从DO转移到Lightsail,因为Lightsail没有这样的索引要求。 - Mark B
@MarkB 如果你不介意我问一下:这是否意味着对于这样的数据库,复制将不可能实现;即使我转移到AWS或一个独立的SQL droplet集群? - Solid
显示剩余2条评论
1个回答

1

我现在也遇到了与wp-cerber相关的问题,Digital Ocean 给出了以下回复:

我们目前打开了变量“sql_require_primary_key”,以便用户在表格上创建主键以避免复制问题、节点复制等。虽然过去这种方式没有得到强制执行,但经验、时间和我们从频繁出现的问题中收集到的信息使得这种方法是可行的,例如在使用备份创建服务的新节点时所需的时间。

主键对于某些管理操作来说是必不可少的,也适用于没有备用或读取副本服务的服务;任何节点更换都是通过首先启动一个备用节点进行的,所有老主节点上的数据都会被复制到备用节点中,如果没有主键,此过程可能需要很长时间或失败,此外,如果没有主键且最近更改了大型表,则使用备份还原节点将需要回放二进制日志,这可能无法正常工作。

如果您决定不使用主键,则有两个选项:

  1. 我们可以在我们这一端禁用主要条件。
  2. 您可以使用SET SESSION sql_require_primary_key = 0;

请注意,第2点仅适用于单个会话。一旦您登出,您将需要再次运行此命令。

下面的URL链接中包含更多信息:https://www.digitalocean.com/docs/databases/mysql/how-to/create-primary-keys/#how-digitalocean-uses-primary-keys


你解决了这个问题吗?我从他们那里得到了同样的回复。 - Shafkhan
很遗憾,不行。 - selfagency

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接