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

来源:https://www.cnblogs.com/yaozhengqi/archive/2019/04/07/10666604.html
-Advertisement-
Play Games

前段時間有個需求:將生產環境的部分數據轉移到測試伺服器進行測試。由於只需要導入特定賬號的數據,我就想著將寫個腳本,將數據組裝成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的進階之路】

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原理: 從客戶端上傳到伺服器 照片——文件夾——資料庫 例如:桌面一張照片,在tomacat里創建upload文件夾,把桌面照片上傳到upload文件夾里,並且把照片的名字取出來,取完名字把這個名字插入到資料庫裡面,下次要想取就取這個名字到upload文件夾下麵去尋找這個照片,找到以後寫相對路徑,就 ...
  • 給定一個 n × n 的二維矩陣表示一個圖像。將圖像順時針旋轉 90 度。說明:你必須在原地旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。示例 1:給定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋轉輸入矩陣,使其變為:[ [7 ...
  • 給定一個沒有重覆數字的序列,返回其所有可能的全排列。示例:輸入: [1,2,3]輸出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 兩種方法,第一種用了STL中的函數,第二種用遞歸+回溯,我個人很喜歡第二種方法 ...
  • 使用Consul提供註冊和發現服務 什麼是 Consul Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內置了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 存儲 ...
  • 前言 - 那久遠的故事 工作好多年, 有時腦海裡總回想兒時看的夢. 那時還剛上初中, 班上個子小的同學, 閑暇娛樂可能就是看 <飄渺之旅> 之類的小說. 前幾年嘗試滿足自己少年時的記憶. 於是寫加整理了這本書 <C 修真之旅> 讓我們蕩起雙槳 - https://music.163.com/#/so ...
  • 1.Sublime Text: 這是一個輕量級的代碼編輯器,跨平臺,支持幾十種編程語言,包括Python,Java,C/C++等,小巧靈活,運行輕快,支持代碼高亮、自動補全、語法提示,插件擴展豐富,是一個很不錯的代碼編輯器,配置相關文件後,可直接運行python程式: 2.VS Code: 這是微軟 ...
  • 最近在學習Python,不得不說,Python真的是一門很好用的語言。但是學習的過程中關於變數作用域(scope)的命名空間(namespace)的問題真的把我給搞懵了。在查閱了相關資料之後,覺得自己對Python的作用域和命名空間有了一定得瞭解。故寫在這裡,一方面加深自己的理解,另一方面分享知識。 ...
  • 本文將主要講解 J.U.C 中的 Future 框架,並分析結合源碼分析其內部結構邏輯; 一、Future 框架概述 JDK 中的 Future 框架實際就是 Future 模式的實現,通常情況下我們會配合線程池使用,但也可以單獨使用;下麵我們就單獨使用簡單舉例; 1. 應用實例 列印: 如上面代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...