PHP+MySQL實現海量數據導入導出的總結:is_numbric函數的坑

前段時間有個需求:將生產環境的部分數據轉移到測試服務器進行測試。因爲只須要導入特定帳號的數據,我就想着將寫個腳本,將數據組裝成sql語句導出爲sql文件,而後轉移到測試服務器,導入到MySQL中。想象是美好的,過程是痛苦的,下面總結下幾點。php

PHP腳本的處理

1、腳本的思路就是:查詢特定帳號數據,組裝拼接成sql文本數據。這裏要注意,對查詢的值要進行過濾處理,由於有些字段是包含一些非法字符,好比:’(單引號),」(雙引號),`(鍵盤左上角第二個),這些符號在拼接sql語句時,會由於找不到閉合的另外一端,讓值變了,致使sql語句拼接有問題,因此這部分字符要替換掉,我是用str_replace()函數將這些符號置爲空。html

2、我是使用is_numeri函數判斷值是不是數字類型結構,是的話就加""(雙引號),可是is_numeri有個問題,遇到有些數值有e字母的,它也是返回true,mysql

 

實錘了這樣是有問題的,由於這樣值沒加""是不能insert到MySQL中的,天坑。linux

後來我同時加上is_float(),is_string()函數同時來判斷這個值是否須要加入雙引號。sql

3、因爲導出的數據量比較多,我是分了4個PHP進程來跑,一個進程跑一萬個用戶數據,這樣可以節省不少時間。可是要注意的是,存儲的sql文本也是須要進行區分的,由於多個進程同時寫一個文本文件可能會出現數據丟失(我是後面才發現,花了好多時間補回去數據)。shell

4、使用tar -xcvf 命令對sql文件進行壓縮打包,一個7G的文件,能夠壓縮到700多M,壓縮效果仍是不錯的。數據庫

導入數據到MySQL

1、因爲數據量比較大,我也是分了幾個進程跑數據。使用的是MySQL source 命令來導入這些大的sql文件bash

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的進階之路】

不斷更新各類技術心得,免費提供各類學習資源!

原文出處:https://www.cnblogs.com/yaozhengqi/p/10666604.html

相關文章
相關標籤/搜索