2014-05-18

2014-05-18 15:24

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を利用してクエリを最適化したり、
クエリ自体を複数に分けるのも一つの方法だと思います。
重くなりがちなJOINGROUP BYUNIONSUB QUERYなどを中心にチューニングしましょう。

0 コメント:

コメントを投稿