mysqldump的原理
    1/在备份之前会给所有表加一个读锁(flush tables with read lock)。
    2/一旦获得了这个锁,就会读取bin-log,并释放这个锁。
    3/如果在执行flush tables with read lock时有一个大事务正在执行,会等待这个事务结束,然后执行flush操作
    4/之后开始备份,并且不会影响表上的读写操作。

    1. shell> mysqldump --single-transaction --flush-logs --master-data=2 \
    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