首页 > 解决方案 > MySQL JDBC 驱动程序无法将数据插入到只读副本上的临时表中

问题描述

我正在连接到 MySQL 的只读副本实例(实际上是 Google Cloud SQL)。JDBC 驱动程序似乎能够创建临时表,但不能向其中插入数据。但是,使用另一个客户端(在我的情况下是 MySQL 工作台),我能够创建数据并将其插入到临时表中。看起来像 JDBC 驱动程序中的错误?有哪些选项可以让它工作?

这是我得到的异常(由于公司政策,我无法发布整个堆栈跟踪):

Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2006)

版本详情:
MySQL 版本 = 5.7.25-google-log
JDBC 驱动程序 = mysql-connector-java-5.1.21.jar

注意:在主实例(而不是只读副本)上运行将是我的最后选择。我几乎知道它会起作用。

标签: javamysqljdbcgoogle-cloud-sqlread-replication

解决方案


不,驱动程序版本 99% 不是问题原因(我猜)。因为我在 MySQL 5.0、5.1、5.6 和 5.7 上使用匹配的 JDBC 驱动程序版本成功写入了临时表。

错误消息告诉我,服务器本身由于其“只读”配置而拒绝尝试。

有一个相关的错误报告:https ://bugs.mysql.com/bug.php?id=64992

您确定您的表确实是临时表(不是常规表)并且您在同一个会话/连接中使用它吗?因为否则它不会故意工作。


推荐阅读