Linux中sql大文件拆分导入

一、文件压缩与解压

sql文件比较大,通常会压缩至大概十分之一大小。

1、压缩文件 非打包
tar -czvf  test.tar.gz  test.sql   //压缩 test.sql文件为test.tar.gz(会保留原文件)
tar -czvf  test.tar.gz  test/      //压缩目录下的文件 (不过目录的压缩效果就一般了)

2、列出压缩文件内容
tar -tzvf test.tar.gz 
rw-r--r-- root/root     0 2010-05-24 16:51:59 test.sql

3、解压文件
tar -xzvf test.tar.gz (会保留原文件)

二、大文件拆分

今天遇到一个问题,要将一个很大的sql脚本导入数据库,谁可想这个文件已经40G多。刚开始直接导入,结果导入了几个G之后就卡死不再执行了,在网上查了一下,感觉是文件太大了,内存不够无法一次性缓存这么多内容。于是我就想到了拆分文件的方式,被我拆成了100多个文件,之后找到上一次执行的位置,一个个小文件执行,最终完美解决了问题。
只不过有一个注意事项,由于文件是按行拆分的,所以可能会将创建表的create语句截断了,所以执行这个文件之前要先检查一下,如有问题就编辑一下文件再执行。

1.功能:
将文件分割成多个

2.语法:
split [OPTION]... [INPUT [PREFIX]]

3.描述:
将输入文件'INPUT'分割,输出固定大小的文件片段"PREFIXaa,PREFIXab,...",默认大小为1000行,并且PREFIX的默认值为'x',如果没有指定输入文件(INPUT文件),或者输入为-,那么会从标准输入读取。

4.常用参数
-a, --suffix-length=N
使用的后缀的长度,默认长度为2,例如'aa','ab'等后缀,其长度就是2。
-b, --bytes=SIZE
指定每个输出文件片段的大小。
-C, --line-bytes=SIZE
指定每个输出文件片段的最大行字节(???)。
-d, --numeric-suffixes
指定输出文件片段后缀为数字而不是默认的字母形式。
-l, --lines=NUMBER
指定每个输出文件片段的行数。

以上,指定的大小"SIZE"可以用如下的方式指定单位:后缀为b表示512字节,后缀为k表示1K,后缀为m表示1M。

5.本次使用
每300行拆分成一个文件,拆分后的文件名以name开头,以数字作为后缀后缀长度为3
split -l 300 test.sql -d -a 3 name

三、数据库导入

1、mysql -uxxxx -pxxxx -h119.xxx.xxx.xxx --port=36991 -A;(这我们连接数据库的命令,需要带ip和端口。带上-A 在切换数据库时就不用预读表数据,要不然会很卡)

2.show databases ; 查询数据库。

  1. use xxxx; 使用某个数据库

  2. 一个个文件接着导入:
    每个文件使用前,检查一下文件首末端,有没有create 建表语句被截断,如果有就手动处理下。
    mysql>source /web/name001;(在mysql命令行执行,先创建并进入数据库,/web/name001 是你拆分的子文件地址)

5.一个报错处理

导入完成之后,在打开数据表示,mysql报错! Can't create/write to file '/tmp/#sql_c62_0.MYI' ......

重启数据库也报错了,于是查看日志:
cd /var/log/
tail -50 mysqld.log
日志中也是这样的错误
/usr/libexec/mysqld: Can't create/write to file '/tmp/ibyPwDHe' (Errcode: 13)

解决:
看了下系统目录/tmp的权限不够,之前设置的是1666 改成 1777就可以了。
这方面的说明,可查看我的另一篇文章:http://blog.51cto.com/ycgit/1406909

猜你喜欢

转载自blog.51cto.com/ycgit/2169835
今日推荐