转载来自:http://blog..net/jesseyoung/article/details/41078947
1 mysqldump简介
mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器)。转储包含创建表和/或装载表的SQL语句。mysqldump可提供两种格式的文件输出,分别是sql格式的标准输出和文件分隔符形式的输出。也可直接在两个mysql数据库之间进行数据复制。
2
相关参数介绍
参考我前面的文章http://blog..net/jesseyoung/article/details/41042825
3
实例分析
3.1 SQL格式备份还原不带--tab选项时,mysqldump输出sql格式的标准输出,包含CREATE及INSERT语句。基本格式为:mysqldump [arguments] > file_name3.1.1 导出SQL格式备份文件导出全部数据库及表
[sql] view
plaincopy
[root@localhost /]# mysqldump--all-databases > /tmp/dump.sql
导出部分数据库及表
[sql] view
plaincopy
[root@localhost /]# mysqldump--databases db1 db2 db3 > /tmp/dump.sql
导出单个数据库可以用如下两种格式
[sql] view
plaincopy
[root@localhost /]# mysqldump--databases test > /tmp/dump.sql
[root@localhost /]# mysqldump test > /tmp/dump.sql
区别是使用--databases在导出数据时会加上CREATE DATABASE 或 USE 语句,不使用--databases参数在导入数据时需要先指定一个存在的数据库作为默认数据库导入数据。导出指定表
[sql] view
plaincopy
[root@localhost /]# mysqldump test t1 t3 t5 > /tmp/dump.sql
[root@localhost /]# mysqldump --tables test t1 t3 t5 > /tmp/dump.sql
3.1.2 导入SQL格式备份文件如果导出文件时指定了--all-databases 或 --databases选项,备份文件会包含CREATE DATABASE 和 USE语句,我们直接导入即可,无需预先创建库和指定库。以下两种方式均可。
[sql] view
plaincopy
[root@localhost /]# mysql
mysql> source /tmp/dump.sql (方法2:进入mysql数据库操作)
如果导出文件时未指定了--all-databases 或 --databases选项,备份文件不包含CREATE DATABASE 和 USE语句,导入数据前我们需要预先创建库和指定库。方法1:shell命令行下操作
[sql] view
plaincopy
[root@localhost /]# mysqladmincreatedb1
[root@localhost /]# mysql db1
方法2:进入mysql数据库操作
[sql] view
plaincopy
mysql>CREATEDATABASEIFNOTEXISTS db1;
mysql> USE db1;
mysql> source dump.sql
3.2 文件分隔符格式备份还原带--tab选项时,mysqldump为每个表输出两种文件到tab指定的路径下,分别是带CREATE
TABLE语句的形如tbl_name.sql的文件,存放表结构,以及制表符分割的形如tbl_name.txt的数据文件。数据文件本质上是通过SELECT ... INTO OUTFILE语句写入数据到文件的。该备份方式最好在本地执行,如果client在远程执行的话,client端和server端需要有相同路径的备份目录,且.sql文件记录在client端,.txt文件记录在server端。3.2.1 导出tab格式备份文件默认格式导出这种方式导出的文件,以制表符(tab空格)作为列的分割,且列字段没有引号包裹,以换行作为一行的结束。
[plain] view
plaincopy
[root@localhost /]# mysqldump --tab=/tmp db1
指定格式导出我们可以通过参数控制导出数据文件的格式,参数分别为:--fields-terminated-by=str:隔开字段的字符,默认为tab制表符。--fields-enclosed-by=char:包裹字段的符号(包裹所有字段),默认没有符号。--fields-optionally-enclosed-by=char:包裹字段的符号(包裹除数字类型之外的所有字段),默认没有符号。--fields-escaped-by=char:指定字符对特殊字符进行转义,例如--fields-enclosed-by指定为双引号,而字段内容包含双引号,就需要一个字符如#或其他,对字段内的双引号进行转义。--lines-terminated-by=str:一行的终止,默认为换行符。例如:需要导出的表信息为
[sql] view
plaincopy
mysql>select*fromdb.dbtable;
+------+-------------+--------------+
| c1 | c2 | c3 |
+------+-------------+--------------+
| 1 | test, comma | test " quote |
+------+-------------+--------------+
导出指定格式数据表命令
[sql] view
plaincopy
[root@localhost /]# mysqldump--tab=/tmp --fields-terminated-by=',' --fields-enclosed-by=0x22 --fields-escaped-by='#' --lines-terminated-by='\n' db1
[root@localhost tmp]# cat dbtable.txt
"1","test, comma","test #"quote"
或者
[sql] view
plaincopy
[root@localhost /]# mysqldump--tab=/tmp --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --fields-escaped-by='#' --lines-terminated-by='\n' db1
[root@localhost tmp]# cat dbtable.txt
1,"test, comma","test #"quote"
注:我们可以用十六进制代替参数所指定的值。--fields-optionally-enclosed-by选项对数字不包裹。3.2.2 导入tab格式备份文件大体步骤:先导入sql文件,再导入txt文件。对默认格式的导入:
[sql] view
plaincopy
[root@localhost /]# mysql db1
[root@localhost /]# mysqlimport db1 /tmp/t1.txt
对指定格式的导入:
[sql] view
plaincopy
[root@localhost /]# mysql db1
[root@localhost /]# mysqlimport --fields-terminated-by=',' --fields-enclosed-by='"' --fields-escaped-by='#' --lines-terminated-by='\n' db1 t1.txt
或者
[sql] view
plaincopy
mysql> USE db1;
mysql> LOADDATA INFILE't1.txt'INTOTABLEt1 FIELDS FIELDS TERMINATEDBY','ENCLOSEDBY'"'ESCAPEDBY'#'LINES TERMINATEDBY'\n';
3.3 填充数据至另一数据库
[plain] view
plaincopy
[root@localhost /]# mysqldump db1 | mysql -h192.168.1.100 -P3306 -ujesse -pjesse -C db2
4
mysqldump一些使用技巧
4.1 在线热备份使用参数 --single-transaction,适用于InnoDB表,与--lock-tables参数互斥,备份期间不锁表。为确保得到有效的备份文件,使用该参数备份期间应避免使用DDL(ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE.)语句,因为连续性的读并没有对这些语句进行隔离,备份期间使用这些DDL语句会导致潜在的select获取到的返回的数据不一致或错误,比如数据读出一半表被删了。参考实例:
[sql] view
plaincopy
[root@localhost /]# mysqldump--all-databases --single-transaction --master-data=1 --flush-logs --events > /tmp/dump.sql
--flush-logs:全备前刷新所有日志到binlog文件,并创建一个新的binlog文件,用于增备。--master-data:该参数有两个值1和2,默认为1,mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。当这个值是2的时候,chang
master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。4.2 备份存储过程触发器及事件--events: 事件调度,默认未开启,显示关闭使用--skip-events--routines: 存储过程及函数, 默认未开启,显示关闭使用--skip-routines--triggers: 触发器,默认为开启,关闭使用--skip-triggers4.3 只备份表结构或数据--no-data:只导出建表语句。--no-create-info:只导出数据,不导出表结构。
[sql] view
plaincopy
[root@localhost /]# mysqldump--no-data --routines --events testdb > /tmp/dump.sql
[root@localhost /]# mysqldump --no-create-info testdb > /tmp/dump.sql
4.4 备份压缩参考实例:压缩备份文件,并以当前时间戳命名
[sql] view
plaincopy
[root@localhost /]# mysqldump--all-databases --single-transaction --master-data=1 --flush-logs --events | gzip > /tmp/dump_`date '+%Y-%m-%d_%H:%M:%S'`.sql.gz
5
常见问题及注意事项
5.1 对备份目录没有写权限
[sql] view
plaincopy
[root@localhost tmp]# mysqldump -uroot -p******--tab=/tmp/test/ db1
mysqldump: Got error: 1: Can't create/write to file '/tmp/test/dump.txt' (Errcode: 13 - Permission denied) when executing 'SELECTINTOOUTFILE'
解决办法:让other用户也能够写。
[sql] view
plaincopy
[root@localhost /]# chmod 757 /tmp/test/
或者把目标目录修改为mysql组所有
[sql] view
plaincopy
[root@localhost tmp]# chown mysql:mysql /tmp/test/
5.2 执行备份时磁盘空间不足
[sql] view
plaincopy
[root@localhost /]# mysqldump--tab=/tmp/test -uroot -p****** db1
mysqldump: Error: 'Got error 28 from storage engine'whentryingtodump tablespaces
mysqldump: Couldn't execute 'show fieldsfrom`handler_table`': Got error 28fromstorage engine (1030)
出现此问题的原因:临时空间不够,无法执行此SQL语句实际案例:查了一下,数据库文件所在的盘应该没事,应该是数据库用的临时目录空间不够
[sql] view
plaincopy
[root@localhost /]# df -h
Filesystem SizeUsed Avail Use% Mountedon
/dev/mapper/VolGroup00-LogVol00
64G 64G 0 100% /
tmpfs 128G 0 128G 0% /dev/shm
/dev/sda1 190M 68M 113M 38% /boot
解决办法:清理磁盘空间。5.3 远程备份,client端与server端目录不一致client端(没有/tmp/test目录)
[sql] view
plaincopy
[root@localhost /]# mysqldump--tab=/tmp/test -uroot -p -h192.168.1.200 -P3355 test
Enter password:
mysqldump: Can't create/write to file '/tmp/test/handler_table.sql' (Errcode: 2)
mysqldump: Can't create/write to file '/tmp/test/handler_table.sql' (Errcode: 2)