2015-08-16 68 views
0

我有3 sql文件從sqlite3轉儲遷移。不幸的是,他們有多行字符串值。所以,當我mysql -p dbname <- dbname.sql它在特定線路返回語法錯誤:mysql文件導入多行字符串

ERROR 1064 (42000) at line 87194: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '15052','53663423259319','21:35:45','FALSE','536625' at line 1 

這些行可能看起來像這樣(線已經被編輯過屏蔽):

87193 INSERT INTO `tbl` VALUES('15052','53663968185392','21:57:25','FALSE','53634933924616','79886','','','','','79886','rado','simple',''); 
87194 INSERT INTO `tbl` VALUES('15052','53663466948450','21:37:30','FALSE','53653949005223','62487','','','','','62487','Nopa','oh, i dunno: 
87195 
87196  ☺ 
87197 /|\ /()\ 
87198 /\ /\',''); 
87199 INSERT INTO `tbl` VALUES('15052','53663423259319','21:35:45','FALSE','53662542442479','28086','','','','','28086','ESOS','AHAHAHAHAHAHAHA ',''); 

如何導入這些SQL文件,並讓MySQL明白,如果一個字符串不以單引號結尾,那麼下面還有一行?我搜索了一些MySQL的參數,但沒有找到任何。

我也嘗試使用http://www.redmine.org/attachments/8273/sqlite3-to-mysql.py並重做遷移,因爲它說python腳本處理這種多線路故障。然而,每當控制檯顯示「Killed」時,我猜想是因爲臨時文件操作(sqlite3數據庫文件超過100Gb)。我改變了tempfile.tempdir = "/home/username/sqlite_to_mysql/,希望它可以爲臨時文件提供足夠的空間(6Tb免費),但控制檯仍然返回「Killed」。在創建sql文件之前,我不知道其他解決方法。

非常感謝您的幫助!

+0

你用過Django的? Django轉儲和導入功能是從一個數據庫移動到另一個數據庫的最簡單方式。但是,如果你從未使用Django,學習曲線將會過於陡峭。 – e4c5

+0

返回確切的錯誤是什麼? –

+0

謝謝! @ e4c5我從來沒有用過django。 – leoce

回答

1

問題不在於線條的間距,而在於內容的引用。

在錯誤消息中提到的行上,文本內容有\'作爲最後一個字符;最終逃離'並導致解析器將該行的其餘部分視爲一個單獨的字符串。

最終效果是當它遇到下一個'時,它已經斬斷了查詢語句的開始,從而導致了錯誤。

爲防止出現這種情況,您需要禁用\作爲轉義字符;你可以通過設置NO_BACKSLASH_ESCAPES sql模式來完成。

以下內容添加到您的文件的開頭:

SET sql_mode = 'NO_BACKSLASH_ESCAPES'; 
+0

非常感謝,@Burhan Khalid!它在20小時的導入後工作,這是三者中最小的sql文件(170Gb)。雖然我還是不太明白數據的位置,因爲'ls -l/var/lib/mysql/dbname /'說'''共有16個 -rw-rw ----。 1 mysql mysql 65 Aug 13 14:01 db.opt -rw-rw ----。 1 mysql mysql 9310 Aug 16 14:34 tbl.frm ''' 我可以看到90GB左右被'df'檢查'/ var'中的空間導入,但顯然數據不在'/ var/lib中/ MySQL的/ dbname'。 – leoce