sqlite3只小巧輕便,但是并不支持并發(fā)訪問,但網(wǎng)站并發(fā)量較大時候膳汪,數(shù)據(jù)庫請求隊列邊長宙刘,有可能導(dǎo)致隊列末尾去數(shù)據(jù)庫操作超時,從而操作失敗稚叹。因此需要切換到支持并發(fā)訪問的數(shù)據(jù)庫。
切換數(shù)據(jù)庫需要將老的數(shù)據(jù)導(dǎo)出,再導(dǎo)入到新的數(shù)據(jù)庫中叠洗,但是sqlite3和mysql的數(shù)據(jù)庫并不完全兼容,需要做部分調(diào)整才能正常導(dǎo)入到mysql中旅东。
需要忽略如下語句:
? BEGIN TRANSACTION
? ?COMMIT
? ?sqlite_sequence
? ?CREATE UNIQUE INDEX
? ?PRAGMA foreign_keys=OFF
并做如下替換
?"tablename/field"? => `tablename/field`
?布爾值?'t' => 1, 'f' => 0
?AUTOINCREMENT => AUTO_INCREMENT
?varchar => varchar(255)
?CREATE TABLE table... => DROP TABLE table; CREATE TABLE table...
為了盡可能減少切換數(shù)據(jù)庫所需時間灭抑,需要對導(dǎo)出的sql文件做點優(yōu)化,將多條插入語句合并成一條玉锌。
?INSERT INTO table VALUES('val1');
?INSERT INTO table VALUES('val2');? ? =>? INSERT INTO table VALUES('val1'), ('val2'), ('val3');
? INSERT INTO table VALUES('val3');
并在插入語句前設(shè)置
SET AUTOCOMMIT=0;
采用這兩項優(yōu)化之后可以大幅度加快導(dǎo)入速度名挥。
上述這些改動可以采用腳本完成,bash不夠靈活主守,python字符串處理效率比較低禀倔,所以我最終選用perl榄融,處理速度與用bash命令差不多,同時也能很容易實現(xiàn)復(fù)雜的處理邏輯救湖。
處理之后的sql文件導(dǎo)入到mysql中可能會出現(xiàn)如下錯誤
原因是合并多條語句最終會有很多單條語句長度超過默認(rèn)的max_allowed_packet值(16M)愧杯,可以將其設(shè)置為mysql允許的最大值(1G),
SET GLOBAL max_allowed_packet=209715200;
最后放上最終的轉(zhuǎn)化腳本?sqlite2mysql.pl