mysqldumpのコメント
先般建造したCentOS 6.2上ではmysql 5.1.52が走っているので、まずこの上にデータを移行しようと思うのに…なんだか上手くいきません。
旧サーバでmysqldumpを走らせて作ったsqlを
# mysql -uroot -p database < a.sql
みたく読ませようとしても
CREATE TABLE sessi' at line 1
ERROR 1064 (42000) at line 4: 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 '-------------------------------------------------------
ERROR 1064 (42000) at line 4: 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 '-------------------------------------------------------
とエラーに。
・・・・・・へ? 4行め(at line 4)??(^^;;
ちなみにsqlの中身は
-- MySQL dump 8.23
--
-- Host: localhost Database: database
---------------------------------------------------------
-- Server version 3.23.58-log
--
-- Table structure for table `sessions`
--
DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` int(11) unsigned NOT NULL default '0',
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) TYPE=MyISAM;
--
-- Host: localhost Database: database
---------------------------------------------------------
-- Server version 3.23.58-log
--
-- Table structure for table `sessions`
--
DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` int(11) unsigned NOT NULL default '0',
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) TYPE=MyISAM;
↑こんな感じ。4行めは赤い行。
「・・・・コメントがエラー・・・???」
ということで、試しにコメント行(行頭が「--」)を除く
DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` int(11) unsigned NOT NULL default '0',
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) TYPE=MyISAM;
CREATE TABLE `sessions` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` int(11) unsigned NOT NULL default '0',
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) TYPE=MyISAM;
だけを喰わせてみたら…あっさり通りました。
もしかして、MySQLの新旧バージョンでコメントの書き方が違ったりするんだろか…??
またデータ中に\nとか含んでるとsql処理中に
「\nって書いてあるココが行末」
と誤認してエラーが出ちゃったので、旧サーバ上でmysqldumpを--tabオプションで起動してテーブル毎にデータバックアップを作り直し。
# mysqldump -uroot -p database --default-character-set=ujis --tab=./sql_backup
作成されたsqlはコメント(「--」で始まる行)を大量に含んでるので、正規表現で一括削除。
^--(.*)\n
をヌルに置換しておけば、*.sqlに書かれたテーブル作成のsqlは通ります。
# mysql -uroot -p database < sessions.sql
こうして元と同様のテーブルを作成した後、sessions.txtを新サーバ上で
# mysqlimport -uroot -p database --default-character-set=ujis --delete --lines-terminated-by="\n" --local sessions.txt
としてやることで、無事旧サーバのDBの中身を移行することができました(^_^)
さて、次はperlやphpのバージョン違いが吸収出来るかどうかの検証だ。