mysql:12772
From: Tetsuro IKEDA <Tetsuro IKEDA <tetsuro@xxxxxxxxxx>>
Date: Fri, 17 Feb 2006 01:15:43 -0500
Subject: [mysql 12772] Re: Mysql JDBC接続時のサイズ制限
池田@自己レスです。 ちゃんとコメント読め、という感じでした(^^; ・UNIV_PAGE_SIZE には2の累乗を設定する ・UNIV_PAGE_SIZE_SHIFT にはUNIV_PAGE_SIZEのその2の対数を設定する ということですね。 つまりPageサイズには48KBのようなサイズは指定できないということですね。 64KBの場合、 UNIV_PAGE_SIZE = 8 * 8192 UNIV_PAGE_SIZE_SHIFT = 16 ということになるでしょうか。 Tetsuro IKEDA wrote: > 池田です。 > > InnoDBのPageサイズを変えるためには、ソースファイルを直接編集した後に、 > コンパイルする必要があるようです。 > > 【変更対象】 > $MySQL/innobase/include/univ.i > ・UNIV_PAGE_SIZE > ・UNIV_PAGE_SIZE_SHIFT > > 【参考】 > http://dev.mysql.com/doc/refman/4.1/en/innodb-restrictions.html > > 例えばPageサイズを64KBにする場合、UNIV_PAGE_SIZEを"8 * 8192"に変えるのは > 良いとして、UNIV_PAGE_SIZE_SHIFTはどう変更するのがいいんでしょうかね。 > > 考え中・・・。もし分かったら教えてください(^^) > > kyou tech wrote: > >>だいぶ解ったような気がします。丁寧なご説明に感動しました。 >>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 >> > > > -- 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]