mysqldump的原理
1/在备份之前会给所有表加一个读锁(flush tables with read lock)。
2/一旦获得了这个锁,就会读取bin-log,并释放这个锁。
3/如果在执行flush tables with read lock时有一个大事务正在执行,会等待这个事务结束,然后执行flush操作
4/之后开始备份,并且不会影响表上的读写操作。
shell> mysqldump --single-transaction --flush-logs --master-data=2 \--all-databases --delete-master-logs > backup_sunday_1_PM.sql
如果在备份的时候有Innodb的表,且使用了—single-transaction选项,mysqldump将会保证一致性读,由其他连接产生的改变mysqldump将不会见到(相当于建了一个快照)。如果包含了非事务性的表,在一致性查询时,不能改变表中的数据。
在全备之前进行flush logs,会把全备期间产生的变化记录到新的bin-log日志文件。
—master-data=2选项会把当前产生的新的bin-log以注释的方式记录到备份文件中。
—delete-master-logs选项会在备份时删除无用的bin-log日志文件。
如果有主从复制,—delete-master-logs这个选项慎用,因为备份时,可能binlog日志文件还没应用到从库。
备份示例
备份所有的库
shell> mysqldump --all-databases > dump.sql
备份指定的库
shell> mysqldump --databases db1 db2 db3 > dump.sql
—database选项用来指定选项后的值都是数据库名,如果不指定—database,第一个值是数据库,从第二个开始就是表名
当使用了—all-database,—database选项时,mysqldump会自动把CREATE DATABASE 跟USE语句加到备份中。
shell> mysqldump --databases test > dump.sql
shell> mysqldump test > dump.sql
这两个语句都会备份test库,但是下面的语句不会将CREATE DATABASE 跟USE语句记录到备份中。
当使用下面这个语句时,还原时需要指定数据库名称,如果实例中没有该数据库,需要先创建。也可以将test数据库中的数据导入到其他数据库,因为导入时需要指定名字。
备份指定库中的指定表
shell> mysqldump test t1 t3 t7 > dump.sql
将表以分割文本的形式备份
—tab=dir_name选项,会将表备份成两个文件。一个是.sql,一个是.txt。.sql包含建表语句,.txt包含表的数据。
这种备份方式实际上是调用了SELECT ….. INTO OUTFILE的方式,所以必须要有FILE的权限,另外,如果.txt文件已经存在将会报错。
如果使用这种方式备份数据,—tab指定的目录最好在服务器端进行。如果使用远程备份,那么需要服务器端与本地都需要—tab指定的目录。因为mysqldump将把.txt文件保存在服务器端,把.sql文件保存在本地。
如果想使用不同的格式来记录数据,可以使用以下参数:
—fields-terminated-by=str
指定字段之间的分隔符,默认是tab建
—fields-enclosed-by=char
用来封闭列值的字符,默认无
—fields-optionally-enclosed-by=char
用来封闭非数字列值的字符,默认无
—fields-escaped-by=char
逃逸字符,默认无
—lines-terminated-by=str
用来界定新行的字符,默认newline
备份小技巧
使用mysqldump复制一个数据库
shell> mysqldump db1 > dump.sql
shell> mysqladmin create db2
shell> mysql db2 < dump.sql
将一个库从一台服务器上复制到另一台服务器上
shell> mysqldump --databases db1 > dump.sql
scp
shell> mysql < dump.sql
只备份表结构或者只备份数据
shell> mysqldump --no-data test > dump-defs.sql
shell> mysqldump --no-create-info test > dump-data.sql
