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

mysql:12780

From: Tetsuro IKEDA <Tetsuro IKEDA <tetsuro@xxxxxxxxxx>>
Date: Sun, 19 Feb 2006 22:01:26 -0800
Subject: [mysql 12780] Re: Mysql JDBC接続時のサイズ制限

池田です。

誤解されているかも?と思ったので補足します。

>> 14bitで表現できる最大値 = 16KBですね。
>
> これは拡張できなければちょっとまずいだと思います。業務アプリで100Kか
> 1M超えるrowもたくさん出ていると思います。
> いちいちテーブル分割、項目統合するのは綺麗な設計が出来なくて
> 開発工数も膨らむことになります。

InnoDBが格納できるレコードサイズそものの最大値は 4GB です。

例えば2GBの映像ファイルをバイナリデータとしてInnoDBに入れることは、
可能なはずで、その場合はMySQL 4.1.6以前では先頭の512バイトのみが、
MySQL 4.1.6以後では先頭の768のみが、そのレコードの主キーが格納されている
Pageと同じPageに格納されて、残りのデータは別の領域に格納されることに
なるはずです。

InnoDBのtablespace構造、すなわちtablespace->extent->page、および
Leaf-NodeセグメントとNon-Leaf-Nodeセグメント、またInnoDBのインデックス実装
であるPage単位のClustered Idexなどの話がこれに関連してくるのではと、
個人的に推測していますが。
(もう少し勉強しないとはっきりしたことは私は言えませんが)

kyou tech wrote:
> 
> ご対応ありがとうございます。
> 
>> http://bugs.mysql.com/bug.php?id=17561
> 
> もっと柔軟なやり方はcreate databaseまたはcreate table時指定てきれば
> いいなと思ったけど、OSSに対して厳しく要求できません。
> 最低ソースをいじらなくてconfigureで済めば、いいと思います。
> 
>> /* The data size of record must be smaller than this because we reserve
>> two upmost bits in a two byte offset for special purposes */
>> #define REC_MAX_DATA_SIZE    (16 * 1024)
>> このように「2バイト-2bit分のoffsetにて管理している=14bit分」という説 
>> 明があ
> 
> ります。
> 
>> 14bitで表現できる最大値 = 16KBですね。
> 
> これは拡張できなければちょっとまずいだと思います。業務アプリで100Kか1M超 
> える
> row
> もたくさん出ていると思います。いちいちテーブル分割、項目統合するのは綺麗 
> な設
> 計が出来なくて
> 開発工数も膨らむことになります。
> これも要望として反映していただけますか。
> でも今回はテーブル分割か項目の統合かをやらなければならないらしいですね 
> (>.<
> ;)
> 
> 
> 
> 
> 
> 
> 
>> From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx>
>> Reply-To: ml@xxxxxxxxxx
>> To: ml@xxxxxxxxxx
>> Subject: [mysql 12778] Re: Mysql JDBC接続時のサイズ制限
>> Date: Sun, 19 Feb 2006 13:43:55 -0800
>>
>> 池田です。
>>
>> InnoDBのPageサイズを./configureオプションで変更できるようにして欲しい、
>> という内容のFeature Requestを出しておきました。
>>
>> http://bugs.mysql.com/bug.php?id=17561
>>
>> どういう反応が返ってくるかは分かりませんが・・・。
>>
>> Tetsuro IKEDA wrote:
>> > こんにちは。池田です。
>> >
>> > 長文レス失礼します。
>> >
>> >
>> >>一、
>> >>text項目にそれぞれ50000Bytesに入れてテストしました。
>> >>そうすると、c30まで登録できました。c31はで139がでました。
>> >>ただ、マニュアルによると
>> >>「InnoDB stores the first 768 bytes of a VARCHAR, BLOB, or TEXT column
>> >>in the row, and the rest into separate pages. 」
>> >>16K=16384/768=21.3333
>> >>DBのmeta情報を考えるc21かc22で落ちるはずですが、c30までできたのは 
>> ちょっ
> 
> 
>> >>と不
>> >>思議です。
>> >
>> >
>> > c30まで格納できるのは、お使いのMySQLのバージョンがMySQL 4.0.21である 
>> ため
> 
> です。
> 
>> >
>> > ヘッダーファイル innobase/include/dict0mem.h を見ますと、MySQL 4.0.21で
> 
> は、
> 
>> >
>> > #define DICT_MAX_COL_PREFIX_LEN 512
>> >
>> > と定義されています。
>> >
>> > 一方で、MySQL 5.0.18などでは、
>> >
>> > /* DICT_MAX_INDEX_COL_LEN is measured in bytes and is the max index 
> 
> column
> 
>> > length + 1. Starting from 4.1.6, we set it to < 3 * 256, so that one 
> 
> can
> 
>> > create a column prefix index on 255 characters of a TEXT field also in 
> 
> the
> 
>> > UTF-8 charset. In that charset, a character may take at most 3 bytes. 
> 
> */
> 
>> >
>> > #define DICT_MAX_INDEX_COL_LEN     768
>> >
>> > と定義されています。この変更はMySQL 4.1.6に行われたもので、MySQL 4.1 
>> 系に
> 
> て
> 
>> > 行われたマルチバイト文字コード対応に伴ったものです。
>> > このコメントにはUTF-8で255文字入れた場合にもExtraDataを使わずに行えるよ
> 
> うに
> 
>> > してあるという説明がなされています。
>> >
>> > 英語版マニュアルに書かれている「768バイト」というのはこのMySQL 4.1.6 
>> 変更
> 
> 後を
> 
>> > 前提としているようです。
>> > # http://dev.mysql.com/doc/refman/4.1/en/innodb-restrictions.html
>> > # http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html
>> > # http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
>> >
>> > より古いマニュアルを探すと(公式ではないですが)、512バイトと書いてあり
> 
> ます。
> 
>> > 何通か前のメールで私が512バイトといったのは、これがあったためです。
>> > (MySQL 4.0.21をお使いとのことでしたので)
>> > 
> 
> http://linux.ouc.edu.cn/manual/APM/innodb/en/index.html#InnoDB_restrictions
> 
>> >
>> >
>> >>二、
>> >>
>> >>
>> >>>#define REC_MAX_DATA_SIZE    (16 * 1024)
>> >>
>> >>を(32*1024)のように修正して32Kまでできないでしょうか。
>> >>
>> >>何度もすみません。
>> >
>> >
>> > innobase/include/rem0rec.hのREC_MAX_DATA_SIZEですが、
>> >
>> > /* The data size of record must be smaller than this because we reserve
>> > two upmost bits in a two byte offset for special purposes */
>> > #define REC_MAX_DATA_SIZE    (16 * 1024)
>> >
>> > このように「2バイト-2bit分のoffsetにて管理している=14bit分」という説明
> 
> があります。
> 
>> > 14bitで表現できる最大値 = 16KBですね。
>> >
>> > さらにここを修正するとなると、今のところちょっと私には自信がないです 
>> (^
> 
> ^;
> 
>> >
>> >
>> >>三、
>> >>このようなパラメーターの設定はconfigureのオプションまたは サーバ起動時
> 
> の
> 
>> >>--defaults-fileの中にした方が便利かなと思っています。
>> >
>> >
>> > Pageサイズを変えるとibdata1やib_logfile1などのファイルも作り変えなけ 
>> れば
> 
> 
>> > ならないでしょう。となると起動時に指定可能にするのは、ちょっとやりす 
>> ぎか
> 
> もと思います。
> 
>> >
>> > ただしconfigureオプションで指定可能というのはあって然るべきですね。
>> > Feature Requestを出しておきますね。
>> >
>> > #よく見るとInnoDBに関するconfigureオプションて、現状だとskip-innodb 
>> だけ
> 
> ですよね。
> 
>> >
>> > ではでは。
>> >
>> > kyou tech wrote:
>> >
>> >>返事遅くてすみません。
>> >>こっちもUNIV_PAGE_SIZEを64Kに拡張して、コンパイルして
>> >>試しました。大体同じ結果を確認しました。
>> >>一、
>> >>text項目にそれぞれ50000Bytesに入れてテストしました。
>> >>そうすると、c30まで登録できました。c31はで139がでました。
>> >>ただ、マニュアルによると
>> >>「InnoDB stores the first 768 bytes of a VARCHAR, BLOB, or TEXT column
>> >>in the row, and the rest into separate pages. 」
>> >>16K=16384/768=21.3333
>> >>DBのmeta情報を考えるc21かc22で落ちるはずですが、c30までできたのは 
>> ちょっ
> 
> 
>> >>と不
>> >>思議です。
>> >>
>> >>二、
>> >>
>> >>
>> >>>#define REC_MAX_DATA_SIZE    (16 * 1024)
>> >>
>> >>を(32*1024)のように修正して32Kまでできないでしょうか。
>> >>
>> >>何度もすみません。
>> >>
>> >>
>> >>三、
>> >>このようなパラメーターの設定はconfigureのオプションまたは サーバ起動時
> 
> の
> 
>> >>--defaults-fileの中にした方が便利かなと思っています。
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>>From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx>
>> >>>Reply-To: ml@xxxxxxxxxx
>> >>>To: ml@xxxxxxxxxx
>> >>>Subject: [mysql 12775] Re: Mysql JDBC接続時のサイズ制限
>> >>>Date: Sat, 18 Feb 2006 02:10:03 -0500
>> >>>
>> >>>池田です。
>> >>>
>> >>>InnoDBのPageサイズを大きくすることで1行辺りのデータサイズの制限を
>> >>>緩和する件ですが、仕組みを調べてみようとソースコードを読んでいましたと
> 
> こ
> 
>> >>
>> >>ろ、
>> >>
>> >>
>> >>>以下のような記述を見つけました。
>> >>>
>> >>>MySQL 4.0.21 innobase/include/rem0rec.h
>> >>>
>> >>>/* The data size of record must be smaller than this because we 
> 
> reserve
> 
>> >>>two upmost bits in a two byte offset for special purposes */
>> >>>#define REC_MAX_DATA_SIZE    (16 * 1024)
>> >>>
>> >>>この定数なのですが、InnoDBが行サイズを計算するのに使用していると思われ
> 
> る
> 
>> >>>btr_cur_optimistic_insert関数(innobase/btr/btr0cur.c)にて使用され 
>> てい
> 
> ま
> 
>> >>
>> >>す。
>> >>
>> >>
>> >>>この関数のロジックを読んでみると、どうもこの定数を超える場合には
>> >>>"Got error 139 from table handler"のエラー処理を行うように思えました。
>> >>>
>> >>>つまりPageサイズを64KBまで拡張したとしても、1行辺りのデータサイズは
> 
> 16KB
> 
>> >>>までしか扱えないのではないかということです。
>> >>>
>> >>>これを確かめるべく、Pageサイズを64KBに拡張したMySQL 4.0.21にて、以下の
>> >>>SQL文を実行してみましたところ、やはり16KBを超えたところで
>> >>>"Got error 139 from table handler"のエラーが返るようになりました。
>> >>>
>> >>>create table t1 (c1 blob, c2 blob, c3 blob, c4 blob, c5 blob, c6 blob, 
> 
> c7
> 
>> >>
>> >>blob, c8 blob,
>> >>
>> >>
>> >>>c9 blob, c10 blob, c11 blob, c12 blob, c13 blob, c14 blob, c15 blob, 
> 
> c16
> 
>> >>
>> >>blob, c17 blob,
>> >>
>> >>
>> >>>c18 blob, c19 blob, c20 blob, c21 blob, c22 blob, c23 blob, c24 blob, 
> 
> c25
> 
>> >>
>> >>blob, c26 blob,
>> >>
>> >>
>> >>>c27 blob, c28 blob, c29 blob, c30 blob, c31 blob, c32 blob, c33 blob, 
> 
> c34
> 
>> >>
>> >>blob, c35 blob,
>> >>
>> >>
>> >>>c36 blob, c37 blob, c38 blob, c39 blob, c40 blob, c41 blob, c42 blob, 
> 
> c43
> 
>> >>
>> >>blob, c44 blob,
>> >>
>> >>
>> >>>c45 blob, c46 blob, c47 blob, c48 blob, c49 blob, c50 blob, c51 blob, 
> 
> c52
> 
>> >>
>> >>blob, c53 blob,
>> >>
>> >>
>> >>>c54 blob, c55 blob, c56 blob, c57 blob, c58 blob, c59 blob, c60 blob, 
> 
> c61
> 
>> >>
>> >>blob, c62 blob,
>> >>
>> >>
>> >>>c63 blob, c64 blob, c65 blob) type=innodb;
>> >>>
>> >>>insert into t1 set c1=repeat('A', 512);
>> >>>
>> >>>update t1 set c2=c1, c3=c1, c4=c1, c5=c1, c6=c1, c7=c1, c8=c1, c9=c1,
>> >>
>> >>c10=c1, c11=c1,
>> >>
>> >>
>> >>>c12=c1, c13=c1, c14=c1, c15=c1;
>> >>>
>> >>>まずこれで 512*15=7680バイトを格納します。
>> >>>
>> >>>update t1 set c16=c1;
>> >>>
>> >>>これで8192バイトとなり、8000バイト超となりますがPageサイズが拡張されて
>> >>>いる
>> >>
>> >>ためエラーになり
>> >>
>> >>
>> >>>ません。
>> >>>
>> >>>update t1 set c17=c1, c18=c1, c19=c1, c20=c1, c21=c1, c22=c1, c23=c1,
>> >>
>> >>c24=c1, c25=c1,
>> >>
>> >>
>> >>>c26=c1, c27=c1, c28=c1, c29=c1, c30=c1, c31=c1;
>> >>>
>> >>>さらにこれで合計 512*31=15872バイトを格納します。ここまではOKです。し
>> >>>かし、
>> >>
>> >>
>> >>>update t1 set c32=c1;
>> >>>ERROR 1030: Got error 139 from table handler
>> >>>
>> >>>16KBに達したところでこのエラーとなってしまいました。
>> >>>この新たに判明した16KB制限でありますが、現在のInnoDBの行構造を改造でも
>> >>>しない限り、増やすことは難しいと思います。
>> >>>
>> >>>以上、ご参考まで。
>> >>>
>> >>>
>> >>>Tetsuro IKEDA wrote:
>> >>>
>> >>>>池田です。こちらの手元のマシンで動作確認を完了しました。
>> >>>>
>> >>>>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
>> >>>
>> >>
>> >>_________________________________________________________________
>> >>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
>>
> 
> _________________________________________________________________
> 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]