6

我已经打开了针对 MySQL http://bugs.mysql.com/bug.php?id=70793&thanks=4的错误报告。这里有一个代码示例演示了这个错误。我还发现错误报告中包含了一种解决方法。此解决方法适用于 PHP 和控制台

我在存储过程和 PHP PDO 中遇到了一个奇怪的问题。

我不允许发布存储过程的主体,但我可以提供以下信息。

  • 当使用PHP PDO 共享的同一用户从控制台访问时,它在只读副本上正常工作-编辑:我的初始报告部分不正确,如果临时表存在,存储过程将工作,如果临时表不存在,则存储过程将失败'在控制台和 pdo 环境中都不存在。有关详细信息,请参阅链接到 MySQL 的错误报告。
  • 我已经验证我在两个地方都使用了同一个用户。
  • 它执行的唯一写入活动是在临时表内
  • 它确实使用了游标
  • master 和 replica 都运行 MySQL 5.5.27
  • MySQL 服务器在 AWS RDS 上进行管理;我有一个带有标准配置的参数组。

我的问题是我无法从 PHP PDO 调用此存储过程,我收到此错误

SQLSTATE[HY000]:一般错误:1290 MySQL 服务器正在使用 --read-only 选项运行,因此无法执行此语句

这绝对没有意义,因为我可以在只读副本上调用它,只要我不是从 PHP 执行它。

任何人都可以阐明这里可能发生的事情吗?

编辑更多离奇信息

我可以让控制台会话失败,但我也可以让它成功。这取决于存储过程使用的临时表是否已经创建。所以让我解释一下我的工作和失败的用例

失败

  1. 在控制台上登录服务器
  2. 尝试调用存储过程
  3. 失败The MySQL server is running with the --read-only option so it cannot execute this statement

经过

  1. 在控制台上登录服务器
  2. 创建临时表
  3. 尝试调用存储过程
  4. 成功

更奇怪的是,我肯定会在存储的过程中删除该临时表,并在它存在时重新创建它。

我有理由确定在这一点上我们正在查看一个 MySQL 错误

4

2 回答 2

2

您是否尝试将 TEMPORARY 关键字添加到DROP TABLE 命令

TEMPORARY 关键字具有以下效果:

  • 该语句仅删除 TEMPORARY 表。
  • 该声明不会结束正在进行的交易。
  • 不检查访问权限。(TEMPORARY 表仅对创建它的会话可见,因此无需检查。)
于 2013-11-01T00:52:27.290 回答
-1

--read-only仅适用于非 root 或非副本用户。因此,来自控制台的 ROOT 仍然可以做任何事情,但 PHP 用户不能。

于 2019-01-08T17:09:41.313 回答