TechNote

事務屋のおぼえがき

MySQLでCSVインポート時に Got error 139 from storage engine エラー

定期的にメンテしているWebアプリの、あるテーブル(マスタ系)にcsvデータをインポートするときに出たエラー。一度くらい見た記憶があったが、どんな対応をとったか忘れていたので、今回はメモを残す。

f:id:kojikoji75:20141029203904j:plain
photo credit: Yuri Yu. Samoilov via photopin cc
サマリー

1.現象
2.原因と解決策
3.MyISAMInnoDBの利点・欠点


1.現象

MySQLのテーブルにcsvをインポートしようとすると下記のエラー。

Got error 139 from storage engine




2.原因と解決策

テーブルがInnoDBであったのが原因。InnoDBの行サイズの上限はデフォルトでは約8000バイト。
varchar型などのテキストデータは先頭の768バイトのみ内部に保存され、それ以外は外部に保存される仕組み。
なのでvarchar型のフィールドを多く(X個)持つ場合、その先頭「768バイト * X」だけで8000バイトを超えてしまう場合があるので、そのような場合に上記エラーとなってしまう。

以下でMyISAMに変換することで、正常にcsvがインポートできる状態となる。

alter table my_table engine=MyISAM;





3.MyISAMInnoDBの利点・欠点

MyISAM

  • テーブルロック方式のため、気軽に更新をかけにくい(更新処理の期間は排他ロックされる)
  • 壊れやすい(壊れたらrepare必要)
  • 更新なしテーブルでは高速
  • 全文検索に有利

InnoDB

  • 壊れにくい(再起動だけでrepareできる)
  • innodb_buffer_pool_sizeによるテーブルデータのキャッシュ管理
  • 「よほどの理由がない限りはこっち」と言われている。


以上。

あわせて読みたい

PHPからODBC経由でoracleデータベースへ接続するための記述 - TechNotePHPからODBC経由でoracleデータベースへ接続するための記述 - TechNote

単純な接続方法だが、意外にハマったのでメモを残す。1.COMを使った接続方法(ADODB)2.odbc_connectを使った接続方法1.COMを使った方法(A...

PHP+ACCESSでの文字化けについて - TechNotePHP+ACCESSでの文字化けについて - TechNote

Accessとの入出力は全てShift-JISになる。ほとんどの場合、結果取得やデータ更新時は文字エンコードが必要。テーブルより取得したデータを画面表示する前$...

PHPからAccessデータベースの使用 - TechNotePHPからAccessデータベースの使用 - TechNote

PHPからAccessのデータベース(mdb)を利用するにはODBC経由での接続が必要。ODBCの設定手順1.「コントロールパネル」→「管理ツール」→「データソ...

プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNoteプログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNote

基本情報技術者試験応用情報技術者試験の時期も近まった今、あらためて整列アルゴリズムをまとめてみたので、忘備録を兼ねてメモを残します。即席コードも併せて記載しま...



エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

MySQL入門以前

MySQL入門以前

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)