mysql:12769
From: Tetsuro IKEDA <Tetsuro IKEDA <tetsuro@xxxxxxxxxx>>
Date: Thu, 16 Feb 2006 22:04:00 -0500
Subject: [mysql 12769] Re: Mysql JDBC接続時のサイズ制限
池田@Connector/Jチームにてインターン中です。
まず確認したいのですが、使用しているストレージエンジンはInnoDBで宜しいでしょうか?
さて、InnoDB前提で考えた場合、ちょっと説明が長くなりますが、以下私の予想です。
【InnoDBにおける行サイズのデフォルトの最大値(約8000バイト)を超えたのが原因】
InnoDBはテーブルのデータを格納する領域であるTable Spaceを、デフォルトでは16KB
(これはコンパイル時に指定されます)のPage単位に分割して管理しており、
それぞれのPage内に各行を"主キーでソートした状態"で格納しています。
(InnoDBにおけるClustered Index)
これに関連して、InnoDBでは各行の最大長はPageサイズの半分以下であること、という
制限があります。デフォルトのPageサイズ16KBにおいては、8KBがこれに当たります。
しかしInnoDBでは、InnoDBではTEXT(LONGTEXT)やBLOB(LONGBLOB)を使用すると、
該当データをその行が可能されているPageの外に格納することができるため、
実際には最大4GBまでの行を格納することができます。
ただし、例えば以下のDDLがあり、
CREATE TABLE t1 (c1 TEXT) TYPE=InnoDB;
以下のDMLが実行されたとすると、
INSERT INTO t1 SET c1 = REPEAT('A', 10000);
行が格納されているPageにはカラムc1の先頭512バイトが格納され、
Page外に格納されるのは、残りの10000-512=9488バイトとなります。
すなわち、この残りの9488バイトについては何も問題は無いのですが、
先頭512バイト分については行が格納されているPage内に格納されるため、
例えばこのc1のようなカラムが複数存在する場合には、Page内に合計で
格納されるデータサイズが8000バイトを超えてしまい、今回生じているような、
Got error 139 from table handler
というエラーがInnoDBから投げられてしまうということになります。
例えば以下のようなDDLおよびDMLを実行してみると分かりやすいでしょう。
mysql> create table many_text(a text, b text, c text, d text, e text, f text, g
text, h text, i text, j text, k text, l text, m text, n text, o text, p text)
type=innodb;
mysql> insert into many_text set a = repeat('.', 512);
mysql> update many_text set
b=a,c=a,d=a,e=a,f=e,g=a,h=a,i=a,j=a,k=a,l=a,m=a,n=a,o=a;
mysql> update many_text set
b=a,c=a,d=a,e=a,f=e,g=a,h=a,i=a,j=a,k=a,l=a,m=a,n=a,o=a,p=a;
ERROR 1030: Got error 139 from table handler
となると、今回の問題の回避方法ですが、以下の2つのどちらかではないかと思われます。
1.DDLを変更して8000バイト以上のデータがPage内に入らないようにする。
例:テーブルを分割する、行を統合するなど
2.コンパイルオプションを指定してInnoDBのPageサイズをデフォルトの16KBから、
もっと大きな値にする(最大で64KBまで指定可能)。
(64KBにすることで制限は8KBから32KBに緩和される。)
以上です。
皆様、何か補足などありましたら宜しくお願いいたします。
kyou tech wrote:
>
> 池田さん
>
> ご返事ありがとうございます。
> 対象テーブルは130項目があって、50項目ぐらいはTEXT型です。
> 中でfull size10000Byte項目が一個、5000Byte、3000Byte項目が若干あります。
> full sizeのレコード長は105KBぐらいです。
> もともとMysqlのTextの上限は65535Byteと認識していますから、
> 個々のフィールドの制限違反よりは、
> Mysql(4.0.21)の行のサイズに制限があるような感じしています。
> 本当にそうでしょうか。もしそうであれば、どこかの設定を修正するか(そう
> 願って
> います)、
> まさかテーブル分割することになるでしょうか。
> 今回始めてMysqlを使うことで、無知な質問ばかりですみません。
>
>
>
>
>
>> From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx>
>> Reply-To: ml@xxxxxxxxxx
>> To: ml@xxxxxxxxxx
>> Subject: [mysql 12767] Re: Mysql JDBC接続時のサイズ制限
>> Date: Thu, 16 Feb 2006 07:07:24 -0500
>>
>> 池田です。
>>
>> Connector/J(MySQL JDBC Type4 Driver)でStatementあるいはClient-Sideの
>> PreparedStatementを使用する場合の送信可能なクエリの最大長は2GBです。
>> (普通はそれよりも先にJVMのHEAPサイズが事実上の制限になると思います)
>>
>> Connector/Jに限らず、MySQLの全ての種類のクライアントは16MBを超えるSQL文に
>> ついては、複数のPacketに分割してサーバへ送信します。
>> max_allowed_packetは20MBに設定しているということですので、
>> これが原因ということも無いと思います。
>>
>> > |java.sql.SQLException: Got error 139 from table handler
>>
>> こちらのエラーをPerrorで見るに、
>>
>> D:\mysql\mysql-4.0.26-win32\bin>perror 139
>> MySQL error: 139 = Too big row
>>
>> これはConnector/Jが作成したエラーではなく、
>> サーバから"Too big row"というメッセージでエラーが返ってきたことを意味
>> してい
>
> ます。
>
>>
>> 何か思い当たる節はありませんか?
>>
>> kyou tech wrote:
>> >
>> > 質問内容曖昧ですみません。
>> > 実は
>> > 画面上の各項目をfull sizeで入力して登録すると
>> > 下記のエラーが発生しています。
>> > 各項目を小さいサイズで入力するとうまく登録できます。
>> > full sizeでのレコードの長さ:100KB
>> > 一応mysql server(4.0.21) の
>> > max_allowed_packet
>> > max_heap_table_sizeをそれぞれ20MBと32MBに調整したが、
>> > 同じくエラーが出ていますので、
>> > jdbcのクエリーの長さに制限があるかと思っています。
>> > ご教授いただければ助かります。
>> >
>> > |java.sql.SQLException: Got error 139 from table handler
>> > | at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921)
>> > | at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1570)
>> > | at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
>> > | at com.mysql.jdbc.Connection.execSQL(Connection.java:2978)
>> > | at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
>> > | at
>> > com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
>> > va:930)
>> > | at
>> > com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
>> > :1159)
>> > | at
>> > com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
>> > :1076)
>> > | at
>> > com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java
>> > :1061)
>> > | at
>> > org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeUpdat
>> > e(Unknown Source)
>> >
>> >> | at
>> >> com.sony.framework.util.sqltemplate2.UpdateSQLCommand.runStatement(Up
>> >> dateSQLCommand.java:65)
>> >>
>> >
>> >
>> >
>> >
>> >> From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx>
>> >> Reply-To: ml@xxxxxxxxxx
>> >> To: ml@xxxxxxxxxx
>> >> Subject: [mysql 12765] Re: Mysql JDBC接続時のサイズ制限
>> >> Date: Thu, 16 Feb 2006 05:43:19 -0500
>> >>
>> >> こんにちは。池田です。
>> >>
>> >> > Mysql JDBC接続時のサイズ制限(stateMentの長さ)がありますか。
>> >> > もしあれば、どうやって調整(設定)しますでしょうか。
>> >>
>> >> java.sql.Statementを使う場合にサーバに送信できるクエリの最大長について
>
> の
>
>> >> ご質問でしょうか?
>> >>
>> >> 質問の意図をもう少し詳しく教えてください。
>> >>
>> >>
>> >> --
>> >> Tetsuro Ikeda, Intern Development & Support
>> >> MySQL Inc, www.mysql.com
>> >> Office: +1-206-336-2030 Mobile: +1-206-661-4293
>> >> Are you MySQL certified? www.mysql.com/certification
>> >>
>> >
>> > _________________________________________________________________
>> > 迷惑メールやウイルスへの対策も万全「MSN Hotmail」
>> > http://promotion.msn.co.jp/hotmail/
>> >
>>
>>
>> --
>> Tetsuro Ikeda, Intern Development & Support
>> MySQL Inc, www.mysql.com
>> Office: +1-206-336-2030 Mobile: +1-206-661-4293
>> Are you MySQL certified? www.mysql.com/certification
>>
>
> _________________________________________________________________
> パソコンでも携帯電話でも使える 「MSN Hotmail」
> http://promotion.msn.co.jp/hotmail/
>
--
Tetsuro Ikeda, Intern Development & Support
MySQL Inc, www.mysql.com
Office: +1-206-336-2030 Mobile: +1-206-661-4293
Are you MySQL certified? www.mysql.com/certification
12763 2006-02-16 13:49 ["Matsunobu, Yoshinor] Re: MySQL のバックアップ・復元について 12764 2006-02-16 17:24 ┣["kyou tech" <kyou_te] Mysql JDBC接続時のサイズ制限 12765 2006-02-16 19:43 ┃┗[Tetsuro IKEDA <tetsu] 12766 2006-02-16 20:18 ┃ ┗["kyou tech" <kyou_te] 12767 2006-02-16 21:07 ┃ ┗[Tetsuro IKEDA <tetsu] 12768 2006-02-17 10:37 ┃ ┗["kyou tech" <kyou_te] -> 12769 2006-02-17 12:04 ┃ ┗[Tetsuro IKEDA <tetsu] 12770 2006-02-17 14:32 ┃ ┗["kyou tech" <kyou_te] 12771 2006-02-17 15:02 ┃ ┗[Tetsuro IKEDA <tetsu] 12772 2006-02-17 15:15 ┃ ┗[Tetsuro IKEDA <tetsu] 12773 2006-02-17 16:42 ┃ ┗[Tetsuro IKEDA <tetsu] 12775 2006-02-18 16:10 ┃ ┗[Tetsuro IKEDA <tetsu] 12776 2006-02-19 21:08 ┃ ┗["kyou tech" <kyou_te] 12777 2006-02-20 04:06 ┃ ┗[Tetsuro IKEDA <tetsu] 12778 2006-02-20 06:43 ┃ ┗[Tetsuro IKEDA <tetsu] 12779 2006-02-20 14:51 ┃ ┗["kyou tech" <kyou_te] 12780 2006-02-20 15:01 ┃ ┗[Tetsuro IKEDA <tetsu] 12781 2006-02-20 15:37 ┃ ┗["kyou tech" <kyou_te] 12782 2006-02-20 15:45 ┃ ┗[Tetsuro IKEDA <tetsu] 12774 2006-02-17 17:59 ┗[baya <bayapbayap@xxx]