首頁 >後端開發 >php教程 >PHP+MySQL實作海量資料導入匯出的總結

PHP+MySQL實作海量資料導入匯出的總結

little bottle
little bottle轉載
2019-04-16 13:25:242659瀏覽

前段時間有個需求:將生產環境的部分資料轉移到測試伺服器進行測試。由於只需要匯入特定帳號的數據,我就想著將寫個腳本,將資料組裝成sql語句匯出為sql文件,然後轉移到測試伺服器,匯入到MySQL中。想像是美好的,過程是痛苦的,以下總結下幾點。

PHP腳本的處理

1、腳本的想法就是:查詢特定帳號數據,組裝拼接成sql文字資料。這裡要注意,對查詢的值要進行過濾處理,因為有些字段是包含一些非法字符,例如:'(單引號),」(雙引號),`(鍵盤左上角第二個),這些符號在拼接sql語句時,會因為找不到閉合的另一端,讓值變了,導致sql語句拼接有問題,所以這部分字元要替換掉,我是用str_replace()函數將這些符號置為空。

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

PHP+MySQL實作海量資料導入匯出的總結

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

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

4、使用tar -xcvf 指令對sql檔案進行壓縮打包,一個7G的文件,可以壓縮到700多M,壓縮效果還是不錯的。PHP影片教學 

#匯入資料到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_pa​​cket' bytes

查了一下,是因為單表資料量較大,大體定位到mysql會對單表資料量較大的SQL做限制

解決:

更改max_allowed_pa​​cket套件大小

方案一,暫時修改:輸入指令set global max_allowed_pa​​cket = 大小; (注意,這裡的大小只能填入位元組。重啟mysql服務後,配置將會失效! )

方案二,修改my.ini文件,在[mysqld]部分加入max_allowed_pa​​cket=大小

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!'

這樣導入,可以找到一些錯誤的提示,方便後面解決問題。  mysql影片教學

以上是PHP+MySQL實作海量資料導入匯出的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除