我已经打开了一个针对MySQL http://bugs.mysql.com/bug.php?id=70793&thanks=4 的错误报告。这里有一个代码示例,可以演示此错误。我发现还有一个解决方法包含在错误报告中。此解决方法适用于 PHP 和控制台
我在存储过程和 PHP PDO 方面遇到了一个奇怪的问题。
不允许我发布存储过程的正文,但我可以提供以下信息。
- 当使用PHP PDO共享的同一用户从控制台访问时,它在只读副本上正常工作 - 编辑:我在这里的初始报告部分不正确,如果临时表存在,存储过程将工作,如果临时表在控制台和PDO环境中都不存在,则存储过程将失败。有关详细信息,请参阅链接到 MySQL 的错误报告。
- 我已经验证我在两个地方使用相同的用户。
- 它执行的唯一写入活动是在临时表中
- 它确实利用了游标
- 主副本都运行 MySQL 5.5.27
- MySQL 服务器在 AWS RDS 上进行管理;我有一个具有标准配置的参数组。
我的问题是我无法从 PHP PDO 调用此存储过程,我收到此错误
SQLSTATE[HY000]:一般错误:1290 MySQL 服务器正在使用 --read-only 选项运行,因此它无法执行此语句
这绝对没有意义,因为只要我不是从 PHP 执行此操作,我就可以在只读副本上调用它。
谁能阐明这里可能发生的事情?
编辑更多离奇信息
我可以使控制台会话失败,但也可以使其成功。这取决于存储进程使用的临时表是否已创建。因此,让我解释一下我的工作和失败用例
失败
- 在控制台上登录到服务器
- 尝试调用存储的进程
- 失败
The MySQL server is running with the --read-only option so it cannot execute this statement
通过
- 在控制台上登录到服务器
- 创建临时表
- 尝试调用存储的进程
- 成功
更奇怪的是,我肯定会将该临时表放在存储的进程中,如果存在,请重新创建它。
我有理由确定在这一点上我们正在研究一个MySQL错误
您是否尝试将 TEMPORARY 关键字添加到 DROP TABLE 命令中?
TEMPORARY 关键字具有以下效果:
- 该语句仅删除临时表。
- 该语句不会结束正在进行的事务。
- 不检查访问权限。(A 临时表仅对创建它的会话可见,因此不进行任何检查必要。
--read-only
仅适用于非root或非副本用户。因此,控制台中的 ROOT 仍然可以执行任何操作,但不能执行 PHP 用户的操作。