上云无忧 > 文档中心 > 百度智能云云数据库RDS mysqldump工具使用详解
云数据库 RDS
百度智能云云数据库RDS mysqldump工具使用详解

文档简介:
mysqldump是MySQL自带的客户端工具,它主要用于对MySQL进行逻辑备份,可实现库、表、行级别的数据备份及库表结构备份需求。应用场景包括不限于如下几种情况: 执行DML、DDL类型SQL前进行数据备份(用于回滚需要)。 不同云厂商之间数据库的数据迁移。 数据库版本升级过程中的数据迁移。 导出部分数据到测试环境用于功能和性能测试。 for MySQL 版
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

工具介绍

mysqldump是MySQL自带的客户端工具,它主要用于对MySQL进行逻辑备份,可实现库、表、行级别的数据备份及库表结构备份需求。应用场景包括不限于如下几种情况:

  • 执行DML、DDL类型SQL前进行数据备份(用于回滚需要)
  • 不同云厂商之间数据库的数据迁移
  • 数据库版本升级过程中的数据迁移
  • 导出部分数据到测试环境用于功能和性能测试

常见用法

场景 命令举例 关键参数
全库导出 mysqldump -h -P -u -p -A > result.sql -A, --all-databases
部分库导出 mysqldump -h -P -u -p -B db1 db2 > result.sql -B, --databases
单库部分表导出 mysqldump -h -P -u -p db1 tb1 tb2 > result.sql
单表部分数据导出 mysqldump -h -P -u -p db1 tb1 -w "id < 5" > result.sql -w, --where=name, 注意加引号
仅导出表结构 mysqldump -h -P -u -p -A -d > result.sql -d, --no-data
仅导出数据不包含表结构 mysqldump -h -P -u -p -A -t > result.sql -t, --no-create-info
导出数据库事件 mysqldump -h -P -u -p db1 tb1 -E > result.sql -E, --events
导出数据库触发器 mysqldump -h -P -u -p db1 tb1 --triggers > result.sql --triggers
导出数据库存储过程与函数 mysqldump -h -P -u -p db1 tb1 -R > result.sql -R, --routines
指定字符集导出 mysqldump -h -P -u -p -A --default-character-set=utf8 > result.sql --default-character-set

重要参数

  • --add-drop-table

    【说明】默认开启,mysqldump导出的SQL文件中包括DROP语句:DROP TABLE IF EXISTS 'XXX';

    【注意】防止将SQL文件直接导入线上实例时drop原数据表,造成数据丢失。可使用参数 --skip-add-drop-table 避免导出DROP语句

  • --add-locks

    【说明】默认开启,在INSERT语句前后分别加 LOCK TABLES 'XXX' WRITE 和 UNLOCK TABLES

    【注意】防止将SQL导入实例时锁表阻塞其他连接写入。可使用参数 --skip-add-locks 规避

  • --lock-tables

    【说明】默认开启,对指定库下的表加读锁(LOCK TABLES xxx READ)阻塞写入,保证备份位点一致性

    【注意】对于InnoDB引擎表请使用—single-transaction而非--lock-tables。可使用参数 --skip-lock-tables 规避

  • --lock-all-tables

    【说明】默认关闭,通过在备份期前加read lock锁定所有库的所有表

    【注意】该参数会自动关闭参数选项 --single-transaction 和 --lock-tables。

  • --single-transaction

    【说明】mysqldump会自动开启一个可重复读的事务(REPEATABLE READ),然后备份出一致性的数据快照。仅对事务型表如InnoDB引擎的表有用

    【注意】如果数据库中都是InnoDB引擎的表,建议mysqldump导出时开启该参数。具体执行过程是:在备份前设置事务隔离级别为REPEATABLE READ并向server发送 START TRANSACTION 语句,在MySQL的全日志中可以看到如下内容:

    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
    START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
    SAVEPOINT SP
    ... ...
    ROLLBACK TO SAVEPOINT SP
    RELEASE SAVEPOINT SP
  • --set-gtid-purged

    【说明】默认开启,导出的SQL文件中是否包含GTID_PURGED信息

    当设置为ON/AUTO时,导出的SQL文件中包含 SET @@GLOBAL.GTID_PURGED='xxx:1-xxx';

    当设置为OFF时,导出的SQL文件中不包含SET @@GLOBAL.GTID_PURGED='xxx:1-xxx';

    【注意】开启GTID的实例需要设置该参数

  • --master-data

    【说明】用于在主库进行备份时记录备份时刻主库的binlog位点

    取值1:导出的SQL文件中未注释CHANGE MASTER TO MASTER_LOG_FILE='XXX', MASTER_LOG_POS=XXX;

    取值2:导出的SQL文件中注释CHANGE MASTER TO MASTER_LOG_FILE='XXX', MASTER_LOG_POS=XXX;

    【注意】开启了binlog,但未开启GTID的情况下,需要设置该参数

  • --dump-slave

    【说明】用于在从库上备份并记录备份时刻对应主库的binlog位点

    取值1:导出的SQL文件中未注释CHANGE MASTER TO MASTER_LOG_FILE='XXX', MASTER_LOG_POS=XXX;

    取值2:导出的SQL文件中注释CHANGE MASTER TO MASTER_LOG_FILE='XXX', MASTER_LOG_POS=XXX;

    【注意】从库上执行mysqldump,默认先使用命令 flush table with read lock 获取备份一致性快照,当实例不存在非事务表时建议与--single-transaction 同时使用保证备份过程中不阻塞主从同步线程写入。

导入数据时的注意事项

  1. 导入数据时误删除数据

    未指定--add-drop-table=FALSE 时导出的SQL文件中包含了drop table语句,当需要将备份数据恢复到线上时会先drop table再重建表,期间业务可能会报错提示表不存在并且原表数据丢失。

  2. 导入数据时锁表

    在未指定--add-locks=FALSE时导出的SQL文件中包含了lock table write语句,当需要将备份数据恢复到线上时会进行锁表,期间该表其他连接的写入会被阻塞并且可能造成连接数升高。

  3. 当5.7开启GTID后,使用--set-gtid-purged参数导出的SQL会包含SET @@SESSION.SQL_LOG_BIN= 0语句,导入时的数据不会记录binlog,因此从库不会同步数据。如果需要主从数据一致,需要去掉mysqldump出来文件中的如下语句:

    SET @@SESSION.SQL_LOG_BIN= 0;
  4. 导出的SQL文件中除了包含库表数据外还包含了部分变量设置语句,再导入线上时需要特别注意!
相似文档
  • time_zone参数是MySQL记录时区信息的变量,经常有客户发起对time_zone的修改需求,原因包括但不限于如下几点: 新迁移上云的RDS实例,修改time_zone对齐原数据库实例的时区信息。 由于JDBC时区函数的问题,导致应用程序查看到的时间和实际时间存在若干小时的偏差。 for MySQL 版
  • MySQL的InnoDB存储引擎的表存在一系列的限制条件,其中比较常见的一种是表的字段索引长度限制,该限制与参数innodb_large_prefix相关。 问题现象: 执行如下两个建表SQL操作,都返回了报错信息,导致建表失败。 for MySQL 版
  • 在数据库的使用过程中,经常需要进行批量的数据导入操作,MySQL数据库批量数据导入可以使用LOAD DATA命令,实现大批量数据的快速入库需求。 问题现象: 在使用LOAD DATA命令可能会遇到如下报错情况: 使用 LOAD DATA LOCAL INFILE 命令批量导入数据时,报错: ERROR 1148 (42000): The used command is not allowed with this MySQL version. for MySQL 版
  • 百度云支持更改数据库表的大小写设置参数,该参数修改后需要重启实例生效: lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上。 lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上,且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入。 for MySQL 版
  • MySQL中有这样的一个默认行为:一行数据中的某些列被更新了,如果这一行中有timestamp类型的列,那么这个timestamp列会自动更新时间戳。这个行为是由explicit_defaults_for_timestamp参数控制的。在实际使用过程中经常会遇到一些非预期的异常情况,这给数据库使用过程带来诸多不便,本文重点介绍参数explicit_defaults_for_timestamp使用过程中的常见问题和注意事项。 for MySQL 版
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部