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.MyISAMとInnoDBの利点・欠点

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.MyISAMとInnoDBの利点・欠点

MyISAM

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

InnoDB

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

以上。

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

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

MySQL入門以前

MySQL入門以前

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

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

  • 作者: 松信嘉範
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/03/09
  • メディア: 単行本(ソフトカバー)
  • 購入: 20人 クリック: 486回
  • この商品を含むブログを見る

タイトルとURLをコピーしました