mysqldump是mysql软件内自带的逻辑备份工具,把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备份的文件的过程。该工具只支持单线程工作。支持远程导出。

1.1 Mysqldump导出内部流程

Eg:mysqldump –h127.0.0.1 -uroot –pmysql –R –single-transaction –master-data=2 --q –e –all-databases

锁定但是可以进行写入操作,无法ddl操作,保证innodb引擎表一致性

3.1.1 全库导出

mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

3.1.2 单库/多库导出
mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --databases test [employees ceshi] > test.sql

3.1.3 单表/多表导出
mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R  test a [b c] > double.sql

注:不指定databases参数,不包含建库语句

3.1.4 按条件导出

mysqldump -uroot -pmysql --single-transaction --master-data=2 test test --where="id<6  and name='a'" > test.sql

3.1.5 只导出结构

mysqldump -uroot -pmysql --no-data --routines --events --databases test [ceshi]> dump-defs.sql

注:可用于测试升级

3.1.6 只导出数据

mysqldump -uroot -pmysql --no-create-info --routines --events --databases test [ceshi]> dump-data.sql

3.1.7 远程导出并导入
mysqldump --host=h1 -uroot -proot  remote_db1 tablename | mysql --host=h2 -uroot -proot db2

注:db2数据库必须存在

3.2 Delimited-Text Format

注:必须指定secure-file-priv 安全目录参数!!!否则报错无法导出

3.2.1 单库导出

mysqldump --tab=/tmp/12 --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\n' DBNAME

3.2.2 单表/多表导出
mysqldump --tab=/tmp/12 --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\n' DBNAME TABNAME1 [TABNAME2]

注:每张表格生成两个文件

*.sql   属于执行命令用户(root)   包含建表语句

*.txt   属于数据库用户(mysql)    包含数据

4.1 案例一: 测试 --all-databases参数

mysqldump -uroot -pmysql --single-transaction --master-data=2  --all-databases > full_1.sql
mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

注:--all-database 参数是不包含存储过程,事件等,需要格外指定参数导出。

4.2 案例二: mysqldump 期间是否可以DDL操作

测试环境:

测试语句:

mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

测试目的:针对INNODB表,开启事务性备份是否会堵塞DDL操作

测试方法:根据general 通用日志,判断表是否已经完成备份。对已备份完毕,正在完成备份,未开始备份表分别做DDL操作,判断是否会堵塞DDL操作

情况一:对已完成备份表做DDL操作

1.开启全库备份

mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

2.观察通用日志,发现已经employees.departments表已经完成备份

3.进行DDL操作,正常进行

4.备份正常完成

情况二:对正在备份表做DDL操作

1.开启全库备份

mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

2.观察通用日志,发现正在对xh.test表进行备份

3.进行DDL操作,并堵塞

4.查看进程

5.备份正常完成

情况三:对未开始备份表做DDL操作

1.开启全库备份

mysqldump -uroot -pmysql --single-transaction --master-data=2  -E -R --all-databases > full.sql

2.观察通用日志,现在仍在备份employees数据库,还未备份到xh库

3.进行DDL操作,正常进行

4.导出报错

结论:使用 --single-transaction 参数导出数据,DDL操作只会影响正在备份的表,已经完成备份或还未备份的表不会被堵塞。但是对未完成备份的表做完DDL操作,当备份到这张被DDL之后的表,mysqldump进程被中断并报错。

MySQL/Oracle数据库领域从业经验,TB级高并发数据库的管理经验。对于MySQL/Oracle内部原理、体系结构,数据页/块结构原理有着深刻认识;对于MySQL/ORACLE新特性、分布式高可用架构和性能调优有着丰富的的实战经验。擅长故障诊断以及数据库异常打开及数据灾难挽救。

注册时间: 2015-06-28

195608

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员