mysql:12781
From: "kyou tech" <"kyou tech" <kyou_tech@xxxxxxxxxx>>
Date: Mon, 20 Feb 2006 15:37:00 +0900
Subject: [mysql 12781] Re: Mysql JDBC接続時のサイズ制限
御免なさい。 表現の過ちです。言いたかったのは、例えば、200Bytesの項目は50,100,200個もある ような場合 です。50Kは妥当だと思います。 且つA table cannot contain more than 1000 columns、一フィールドは平均50Bとし て、 やっぱり50KBですよね。8Kと16Kはちょっと小さすぎると思います。 勝手なこと言ってすみません。 >From: Tetsuro IKEDA <tetsuro@xxxxxxxxxx> >Reply-To: ml@xxxxxxxxxx >To: ml@xxxxxxxxxx >Subject: [mysql 12780] Re: Mysql JDBC接続時のサイズ制限 >Date: Sun, 19 Feb 2006 22:01:26 -0800 > >池田です。 > >誤解されているかも?と思ったので補足します。 > > >> 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 > _________________________________________________________________ パソコンでも携帯電話でも使える 「MSN Hotmail」 http://promotion.msn.co.jp/hotmail/
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]