mysql:12773
From: Tetsuro IKEDA <Tetsuro IKEDA <tetsuro@xxxxxxxxxx>>
Date: Fri, 17 Feb 2006 02:42:09 -0500
Subject: [mysql 12773] Re: Mysql JDBC接続時のサイズ制限
池田です。こちらの手元のマシンで動作確認を完了しました。 innobase/include/univ.i ファイルを以下のように変更することで、 何通か前に送ったメールではエラーとなっていたものを、 エラー無しにUPDATEすることができました。 > 64KBの場合、 > > UNIV_PAGE_SIZE = 8 * 8192 > UNIV_PAGE_SIZE_SHIFT = 16 > 【注意点】 この変更を行うと、InnoDBのデータファイル、ログファイル、ログバッファなどの 設定値がデフォルトのままでは起動しなくなります。 Pageサイズが4倍になっているので、その影響だと思われます。 例えば、以下のように十分な値を設定する必要があります。 --innodb_data_home_dir= --innodb_data_file_path=/foobar/ibdata1:100M:autoextend --innodb_log_file_size=50M --innodb_buffer_pool_size=200M Tetsuro IKEDA wrote: > 池田@自己レスです。 > > ちゃんとコメント読め、という感じでした(^^; > > ・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]