前段时间有个需求:将生产环境的部分数据转移到测试服务器进行测试。因为只须要导入特定帐号的数据,我就想着将写个脚本,将数据组装成sql语句导出为sql文件,而后转移到测试服务器,导入到MySQL中。想象是美好的,过程是痛苦的,下面总结下几点。php
1、脚本的思路就是:查询特定帐号数据,组装拼接成sql文本数据。这里要注意,对查询的值要进行过滤处理,由于有些字段是包含一些非法字符,好比:’(单引号),”(双引号),`(键盘左上角第二个),这些符号在拼接sql语句时,会由于找不到闭合的另外一端,让值变了,致使sql语句拼接有问题,因此这部分字符要替换掉,我是用str_replace()函数将这些符号置为空。mysql
2、我是使用is_numeri函数判断值是不是数字类型结构,是的话就加""(双引号),可是is_numeri有个问题,遇到有些数值有e字母的,它也是返回true,linux
实锤了这样是有问题的,由于这样值没加""是不能insert到MySQL中的,天坑。sql
后来我同时加上is_float(),is_string()函数同时来判断这个值是否须要加入双引号。shell
3、因为导出的数据量比较多,我是分了4个PHP进程来跑,一个进程跑一万个用户数据,这样可以节省不少时间。可是要注意的是,存储的sql文本也是须要进行区分的,由于多个进程同时写一个文本文件可能会出现数据丢失(我是后面才发现,花了好多时间补回去数据)。数据库
4、使用tar -xcvf 命令对sql文件进行压缩打包,一个7G的文件,能够压缩到700多M,压缩效果仍是不错的。bash
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的进阶之路】
不断更新各类技术心得,免费提供各类学习资源!