過去のMySqlのダンプファイルの取り込み時のエラー達
過去のMysql server 4.1でdumpされたsqlファイルを、Mysql server 8.0に取り込もうとしたところ、いくつものエラーが起きました。ネットの力で解決したのでせっかくなので、お礼とともに各サイトのリンクと簡単な解決方法を記録しておきます。
ちなみにwin10でMySql Workbench8.0上で作業してます。
その過去の資産がダンプされたsqlファイルは32MB程度で、42万行くらいあるものです。
さて最初のエラーはこちら。
ERROR 1426 (42000) at line ***: Too-big precision 14 specified for 'create_date'. Maximum is 6.Operation failed with exitcode 1
Stack overflowで調べると、
My version doesn't dump timestamp columns as timestamp(14). My version dumps them as simply timestamp.
とのこと。自分のsqlファイルを見ると何箇所かtimestamp(14)となっていたので、timestampに修正。別のサイト(yahoo知恵袋)で仕様変更ではないかとの記載あり。
次のエラーはこちら。
ERROR 1064 (42000) at line 11: you have an error in your sql syntax; 'TYPE=InnoDB'
kngy.netさんの記事で解決。
MySQL 5.5 から、create table時に指定するTYPE構文が使用できなくなってます。
とのことなので、TYPE=InnoDBをENGINE=InnoDBに置換して解消。
この修正後importをすると、同じ行で次のエラーに即遭遇。
ERROR 1050 (42S01) at line **: Table '*****' already exists
stack overflowで調べると、
Seriously now, you probably have a broken table. Try:
・DROP TABLE IF EXISTS contenttype
あ、最初の方のテーブルが既にあるということね。ということでDatabase(Schema)をDropして再度createしてからimportをしたらその行のエラーはなくなった。
でも、続いて次のエラーが。
ERROR 1071 (42000) at line ***: Specified key was too long; max key length is 1000 bytes
正直、このエラーは日曜PGの私にはちょっとてこずった。もうimportは諦めようかなととも思った。
いくつかのサイトで調べているうちにわかってきた。Yakstさんの記事によると、
文字数制限は、使っている文字コードに依存する。例えば latin1 であればインデックスを生成できる最大カラムは varchar(767)であるが、 utf8 の場合は varchar(255) までである。 インデックスあたり、3072バイトという別の制限もある。767バイトはカラムごとの制限なので、複数のカラムを(それぞれが767バイト以下で)3072バイトまで格納できる。 (MyISAMは少々異なり、インデックスに対し1000バイトの制限があり、カラムごとの制限はない)。
この制限に対する1つのワークアラウンドは、長いカラムの接頭部分だけにインデックスを作成することであるが、InnoDBの767バイトを超えるカラムにインデックスをはりたい場合どうしたらよいだろうか?
この場合、innodb_large_prefix を検討すると良いだろう。 これは、MySQL 5.5.14から導入され、マニュアル記載の通りInnodbインデックスに3072バイトまで許容するものだ。
ここで言うinnodb_large_prefixの設定の仕方はkamipo's blogさんの記事が分かりやすかった。
my.cnfに以下を追加して
[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
my.cnfはlinuxでWindowsだとmy.iniなのでC:\ProgramData\MySQL\MySQL Server 8.0にあるiniファイルを修正した後、importしたところ、エラーは無事解消(※)。
ここまでで全42万行あるうちの500行くらいしか勧めていなくて心が折れかかっている。が、諦めるのは 本当に煮詰まったらにしよう。
※12/13追記
この後、windowsを再起動後に、MySql Workbench8.0からMySQL serverに接続しようとしたところ「Can't connect to MySQL server on 'localhost' (10061) (2003)」というエラーが出て接続できなくなりました。MySql Workbench8.0のエラーログを見ると「Server unknown variable 'innodb_file_format=Barracuda」、「Server unknown option '--innodb_large_prefix'」となってました。こちらの海外サイトによると、innodb_file_formatとinnodb_file_formatはMySql 8.0では廃止になったとのことなので、my.iniファイルの該当箇所をコメントアウトしたところ無事接続できました。
続いてのエラーはこちら。
ERROR 1064 (42000) at line ****: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ****
とりあえずググってみたところ、こちらのCodeNoteさんの記事に辿り着いた。何やら予約語がかぶっているのではないかということで、こちらのWordPressチラシの裏さんのサイトで突き合わせたところ、読み仮名を入れる列名をreadにしていたのでもろに予約後だった。ここをyomiと修正したところ無事エラーは解消した。
次のエラーはこちら。
ERROR 1264 (22003) at line ******: Out of range value for column **** at row 1
教えてgooの記事によると、 create tableでdecimal(2,1)の列に20.6とかの値をinsertしたことによるエラーとのことなの、decimal(3,1)にしたところ無事解決。
ここまでの修正をしたら無事取り込めました。解決方法を記載してくれた皆様ありがとうございました。この場にてお礼申し上げます。