前段時間有個需求:將生產環境的部分數據轉移到測試伺服器進行測試。由於只需要導入特定賬號的數據,我就想著將寫個腳本,將數據組裝成sql語句導出為sql文件,然後轉移到測試伺服器,導入到MySQL中。想象是美好的,過程是痛苦的,下麵總結下幾點。 PHP腳本的處理 1、腳本的思路就是:查詢特定賬號數據,組 ...
前段時間有個需求:將生產環境的部分數據轉移到測試伺服器進行測試。由於只需要導入特定賬號的數據,我就想著將寫個腳本,將數據組裝成sql語句導出為sql文件,然後轉移到測試伺服器,導入到MySQL中。想象是美好的,過程是痛苦的,下麵總結下幾點。
PHP腳本的處理
1、腳本的思路就是:查詢特定賬號數據,組裝拼接成sql文本數據。這裡要註意,對查詢的值要進行過濾處理,因為有些欄位是包含一些非法字元,比如:’(單引號),”(雙引號),`(鍵盤左上角第二個),這些符號在拼接sql語句時,會因為找不到閉合的另一端,讓值變了,導致sql語句拼接有問題,所以這部分字元要替換掉,我是用str_replace()函數將這些符號置為空。
2、我是使用is_numeri函數判斷值是否是數字類型結構,是的話就加""(雙引號),但是is_numeri有個問題,遇到有些數值有e字母的,它也是返回true,
實錘了這樣是有問題的,因為這樣值沒加""是不能insert到MySQL中的,天坑。
後來我同時加上is_float(),is_string()函數同時來判斷這個值是否需要加入雙引號。
3、由於導出的數據量比較多,我是分了4個PHP進程來跑,一個進程跑一萬個用戶數據,這樣能夠節省很多時間。但是要註意的是,存儲的sql文本也是需要進行區分的,因為多個進程同時寫一個文本文件可能會出現數據丟失(我是後面才發現,花了好多時間補回去數據)。
4、使用tar -xcvf 命令對sql文件進行壓縮打包,一個7G的文件,可以壓縮到700多M,壓縮效果還是不錯的。
導入數據到MySQL
1、由於數據量比較大,我也是分了幾個進程跑數據。使用的是MySQL source 命令來導入這些大的sql文件
mysql>source D:/www/sql/data.sql;
sql文件裡面包含了use 資料庫,這裡就不需要use 資料庫了。
通過source命令導入多個文件,可以新建一個sou.sql文件,裡面存放下麵的命令
例如:
source c:/1.sql; source c:/2.sql;
這樣就可以在一個source命令裡面導入多個sql文件了。
期間也有一些問題:
出現:
mysql Got a packet bigger than 'max_allowed_packet' bytes
查了下,是因為單表數據量較大,大體定位到mysql會對單表數據量較大的SQL做限制
解決:
更改max_allowed_packet包大小
方案一,臨時修改:輸入命令 set global max_allowed_packet = 大小; (註意,這裡的大小隻能填寫位元組。重啟mysql服務後,配置將會失效!)
方案二,修改my.ini文件,在[mysqld]部分加入 max_allowed_packet=大小
2、由於source命令這種方式不能記錄定位記錄到錯誤信息,所以後來我改用了linux shell方式導入
如下:sql.sh
#!/bin/bash p="d:backup/sql.sql" //絕對路徑 User='abc' Password='123' mysql -u $User -p$Password -e "source $f" 2>err1.txt;//輸出錯誤到文件中,方便後面查詢 echo 'OK!'
這樣導入,可以找到一些錯誤的提示,方便後面解決問題。
最近一直忙數據的東西,發現在處理海量數據時,PHP的處理速度是可以了,主要瓶頸是在MySQL,開了幾個進程跑數據,MySQL伺服器就頂不住了。後面我們在優化時,可以往MySQL方面進行研究。
---------------------------------------------------END----------------------------------------------------
歡迎關註我的公眾號【phper的進階之路】
不斷更新各種技術心得,免費提供各種學習資源!