PHP+MySQL实现海量数据导入导出的总结:is_numbric函数的坑
前段时间有个需求:将生产环境的部分数据转移到测试服务器进行测试。由于只需要导入特定账号的数据,我就想着将写个脚本,将数据组装成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:/.sql;
source c:/.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='' mysql -u $User -p$Password -e "source $f" >err1.txt;//输出错误到文件中,方便后面查询 echo 'OK!'
这样导入,可以找到一些错误的提示,方便后面解决问题。
最近一直忙数据的东西,发现在处理海量数据时,PHP的处理速度是可以了,主要瓶颈是在MySQL,开了几个进程跑数据,MySQL服务器就顶不住了。后面我们在优化时,可以往MySQL方面进行研究。
---------------------------------------------------END----------------------------------------------------
欢迎关注我的公众号【phper的进阶之路】

不断更新各种技术心得,免费提供各种学习资源!
PHP+MySQL实现海量数据导入导出的总结:is_numbric函数的坑的更多相关文章
- (oracle/mysql)启停,导入导出,DB字符集
==================================================================================== DB启动停止 ======== ...
- Mysql:数据库导入导出
Mysql:数据库导入导出 Mysql数据库导出 mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 1.mysqldump是在cmd下的命令,需要在linux命令行 ...
- MySQL问题记录——导入导出权限设置
MySQL问题记录——导入导出权限设置 摘要:本文主要记录了在使用MySQL的过程中导入导出权限设置时遇到的问题以及解决方案. 相关日志 [Note] --secure-file-priv is se ...
- linux mysql 数据库操作导入导出 数据表导出导入
linux mysql 数据库操作导入导出 数据表导出导入 1,数据库导入 mysql -uroot -p show databases; create database newdb; use 数据库 ...
- mysql数据库的导入导出
当我们在操作数据库的时候,难免会遇到数据导入导出的一些操作,今天突然学到了这个知识点,特意来给大家分享. 我用的是data的这条数据 1.使用数据 mysql> use data; Databa ...
- 使用MYSQL命令直接导入导出SQL文件
很多时候,我们的数据开发都会用到很多开发利器,比如powerdesigner, navicat等这些软件,虽然好用,但是要收费,在公司里面是禁止使用盗版软件的,怕罚款各方面的,所以我们也不敢直接在公司 ...
- MYSQL 命令行导入导出数据库文件
MYSQL命令行导入数据库 1.首先通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令为: cd E:\MySQL\MySQL Server 5.5\bin,输入如下命令: mysql ...
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- MySQL命令行导入导出数据
参考:http://www.cnblogs.com/xcxc/archive/2013/01/30/2882840.html 这篇文章写得非常好,又简洁,而且深入浅出,排版也非常好看,不会像网上的只是 ...
随机推荐
- 今年新鲜出炉的30个流行Android库,你一定需要
作者|Michal Bialas 2017年快过去了,你年初的定的目标都快完成了吗?总结过去三个月内发布的 最新的30 个 Android 库和项目.你一定需要,建议收藏!让你事半功倍 1.Mater ...
- Android手势密码实现
图 二.实现思路: 1. 正上方的提示区域,用一个类(LockIndicator.java)来实现,自定义view来绘制9个提示图标: 2. 手势密码绘制区域,用一个类(GestureContentV ...
- idea插件Lombok
在spring boot 中,我们可以使用@Data标签,这样就不需要手动添加getter/setter方法了,但Idea会报错. 此时,我们需要安装Lombok插件,安装好插件后便可以解决这个问题. ...
- Java 性能调优指南之 Java 集合概览
[编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本 ...
- tomcat idea optinos
-server -XX:PermSize=128M -XX:MaxPermSize=256m -Xms512m -Xmx1024m
- 转:在决定使用ClickOnce发布你的软件前,应该知道的一些事情(一些常见问题解决方法)
1,无法有效避免非法的下载 使用ClickOnce部署,你的软件的更新版可以发布到Web服务器上,当用户从开始菜单启动软件时,ClickOnce自动到指定的URL去检测是否存在新版本,并且从这个地址下 ...
- 将jsonModel转化为文件
将jsonModel转化为文件 这个类是我自己写着用的,用于将字典文件直接转换成Model的文件,省去你写无数Model中属性的代码: TransformDictionary.h 与 Transfor ...
- VMware 11 安装苹果系统
没事研究了一下虚拟机安装苹果系统 1.下载需要的软件- F, c1 X: e- o1 }& V/ o9 J 1.1 VMware 11 下载和安装* P( R; O6 v1 N! ...
- unix时间戳的转换
UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() ...
- 获取索引--------用range()和len()
a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ'] for i in range(len(a)): print(i+1,a[i])