プロが教える店舗&オフィスのセキュリティ対策術

win2000にMysql5.0.45を入れスタンドアロンで使っています。
取り込みデータサイズ:2.4G、2800万件のテキストデータをテーブルにインポート(InnoDB)するところまでは出来ているのですが、select~order by でソートをかけようとしたところ
ERROR 3 (HY000): Error writing file 'C:\TEMP\MY10.tmp'(errcode:28)
とでてしまいます。原因がCの空き容量が1G程度しかないため、容量のあるDにテンポラリを移そうと、set session tmpdir = 'D:/MySQL/TEMP' ;
としても、ERROR 1238 read only variable となってしまいます。
また、MySQLadministrator>StartupVariable>InnoDB Paramaters>datafilesからも変更できず行き詰まってしまいました。
調べてはみたのですが、話がwinとlinuxとの間でごちゃごちゃになってしまっています。ご教授いただけないでしょうか。

A 回答 (3件)

>MySQL5.0ではMy.iniはMySQL4.0のように[mysqld]で区分されていなかったと思います



私の環境は、MySQL 5.0.19-ntなのですが、My.iniの[mysqld]等のセクションの指定は、MySQL 4.1と同等だと思いますよ?

私の環境のMy.ini(抜粋)は、下記のようになっています。

[mysqld]
language=japanese-sjis
# The TCP/IP Port the MySQL Server will listen on
port=3306
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.0/"
#Path to the database root
datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"

tmpdir="C:/temp/MySQL/"

なお、私の使用バージョンでは、「set tmpdir=値」や「--tmpdir」で「unknown system variable」と矛盾するエラーになってしまいます。
バグがあり、Mysql5.0.45までには修正されたのかも知れませんね。
なお、My.iniにtmpdirの指定を入れ、サービスの停止・再起動で変更が反映されることは、私のバージョンでは確認済です。
    • good
    • 0
この回答へのお礼

いろいろありがとうございます。
[mysqld]の件は思い違いで、修正後解決しました。
と思ったらOut Of Memory (Needed 2832908 byte)で落ちています・・・
TEMPのバッファサイズの問題あたりかと思いますが調べてみようと思います。書籍含め資料も少ない設定関連は、とっかかり初心者には高すぎるハードルです。また、質問させていただくかもしれません。

お礼日時:2007/08/29 16:09

#1回答者です。



tmpdirの変更方法について、回答します。
tmpdirは、ダイナミックな変更(setコマンドでの変更)は、できません。

(1)My.iniまたはMy.cnfのどちらか実際に使っている方の[mysqld]下に、tmpdirの指定を入れる。
(2)MySQLのサービスを停止、再起動する。

これで変更できていると思うので、「show variables like 'tmpdir'で確認してみてください。

この回答への補足

詳細を解説いただきありがとうございます。
手元で中身の正確な確認できない中の補足になってしまいますが、
MySQL5.0ではMy.iniはMySQL4.0のように[mysqld]で区分されていなかったと思います。その際の指定の加え方がまったくわからないのですが・・・
mysqld --tmpdir 'D:/TEMP' と指定ができないか明日にでも・・・とは考えていましたが。

補足日時:2007/08/27 14:40
    • good
    • 0

Yahoo!知恵袋にも質問していた人でしょうか?



2800万件ものデータをSQLでソートさせることの方が異常であり、インデクスを定義してソート抑止すればいいだけの話では?

「select ~ from t1 order by c1」のようなSQLであれば、c1にインデクスを定義し、「select ~ from t1 where c1>=0 order by c1」のようにc1が全件ヒットする検索条件を指定することで、ソート抑止されると思いますが?

order byの指定と同じ構成列のインデクスがあれば、検索条件がなくてもインデクスを利用してソート抑止してくれるRDBMSも少なくないのですが、MySQLは検索条件の指定がないとソート抑止してくれないようです。

なお、実行前にexplainで、インデクスを利用してソート抑止されていることを確認してみてください。

この回答への補足

知恵袋に続き、回答ありがとうございます。
ソート件数が異常なのは承知しています。
ただ、そのテーブルをテキストでエクスポートすることを前提にしているのでこのような方法しかないかと。
(これらでクロスをかける可能性があるため、プログラムを組むのではなくこの方法をトライしています。本来はこのデータが5000万件を超えるほどあるのですが、4Gの問題などあるようなのでこのレベルでとどめています。)

補足日時:2007/08/27 14:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!