mysql:12770
From: "kyou tech" <"kyou tech" <kyou_tech@xxxxxxxxxx>>
Date: Fri, 17 Feb 2006 14:32:18 +0900
Subject: [mysql 12770] Re: Mysql JDBC接続時のサイズ制限
だいぶ解ったような気がします。丁寧なご説明に感動しました。 mysqlの醍醐味も感じ始めています。 >2.コンパイルオプションを指定してInnoDBのPageサイズをデフォルトの16KBか ら、 > もっと大きな値にする(最大で64KBまで指定可能)。 > (64KBにすることで制限は8KBから32KBに緩和される。) で試したいと思います。 ただ、configure --helpで見るとpage sizeのオプションがないようですが、 直接configureファイルを修正することになるでしょうか。 >From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx> >Reply-To: ml@xxxxxxxxxx >To: ml@xxxxxxxxxx >Subject: [mysql 12769] Re: Mysql JDBC接続時のサイズ制限 >Date: Thu, 16 Feb 2006 22:04:00 -0500 > >池田@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 > _________________________________________________________________ MSNショッピングでXbox360を早速チェック! http://shopping.msn.co.jp/softcontent/softcontent.aspx?scmId=593
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]