[前][次][番号順一覧][スレッド一覧]

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]