mysqlサーバから特定のQueryを実行したところ、
error 12
が返ってきた場合の対処方法をメモしておきます。Tomcatなどの場合は以下のようなエラーが発生します。
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Server connection failure during transaction. Due to underlying exception: 'java.sql.SQLException: Got error 12 from storage engine'. ** BEGIN NESTED EXCEPTION ** java.sql.SQLException MESSAGE: Got error 12 from storage engine STACKTRACE: java.sql.SQLException: Got error 12 from storage engine at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3277) at com.mysql.jdbc.Connection.execSQL(Connection.java:3206) at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232) at com.mysql.jdbc.Connection.loadServerVariables(Connection.java:4478) at com.mysql.jdbc.Connection.initializePropsFromServer(Connection.java:4062) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2940) at com.mysql.jdbc.Connection.(Connection.java:1555) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) at org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) at org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294) at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1148) at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
error 12の原因
調べたところ、メモリに関するエラーのようで、Error 12 = Cannot allocate memory私の場合はQueryを実施した直後、エラーが発生していましたので、
Queryもしくはその結果データをメモリ上に上げる時に
エラーが発生していると判断しました。
解決
エラーが発生した原因によって解決方法は変わると思いますが、今回は
mysqlサーバの使用可能メモリを増やす
とQueryの最適化
という方法で、
解決しました。・MySQLのメモリを増やす
以下のページを参照して、必要なパラメタを増やしましょう。MySQLのmy.cnfファイル
MyISAMの
key_buffer_size
を動的に増やす例)
SET global key_buffer_size=1024*1024*1024;
・Queryを最適化する
SELECTクエリ自体が重い場合はEXPLAIN
を利用してクエリを最適化したり、クエリ自体を複数に分けるのも一つの方法だと思います。
重くなりがちな
JOIN
、GROUP BY
、UNION
、SUB QUERY
などを中心にチューニングしましょう。
0 コメント:
コメントを投稿