Mysqldump是一个客户端程序,用于导出数据,适合用于开发、DBA测试等工作。在它的man帮助里,提及到,mysqldump进行的是逻辑备份,生成的内容是一堆SQL语句。也可以输出为csv、文本文件(其他分割符号)、XML格式。

Mysqldump要求起码具备selectshow viewtriggerlock tables权限(前提是未使用—single-transaction选项)。

当要重新导入dump文件时,需要具备dump文件中所有sql语句的对应权限(例如create databasecreate table之类的)

如果所使用的数据库引擎是MyISAM,可以使用mysqlhotcopy

 

 

对于大量数据的备份,Mysqldump并不是一个快速和可扩展的备份方案。因为尽管它导出需要些时间,但导入更慢,因为涉及到磁盘IO、重建索引等等。应考虑使用物理备份:如果是混合引擎的数据库,应使用mysqlbackup,可以提供最佳性能与最小停机,企业应考虑使用它来进行备份;如果只有MyISAM引擎,则应使用mysqlhotcopy

 

Mysqldump会使用内存做导出结果的缓存,但对于大量的数据来说,会比较消耗内存,可以搭配—quick选项来避免使用缓存;如果一定要使用缓存,可以使用—skip-opt选项。

 

Mysqldump的写法:

Mysqldump [选项] db_name [tbl_name….]  这种写法导出表数据。

Mysqldump [选项] –databases db_name ….  这种写法导出多个数据库。

Mysqldump [选项] –all-databases 这种写法导出所有数据库。

 

Mysqldump默认不导出INFORMATION_SCHEMAperformance_schema 数据库,如果需要,则需要显式指出,并使用--skip-lock-tables选项。

 

MySQL 5.5.25以前,mysqldump不导出general_log slow_query_log;从MySQL 5.5.25开始,mysqldump导出时包含了创建这些表的语句,使得恢复数据时,能创建出这些表,但表的内容不会恢复。

 

Mysqldump也不会导出MySQL集群的ndbinfoinformation数据库

 

Mysqldump有一些选项的缩写

·  --opt 代表了--add-drop-table, --add-locks, --create-options, --disable-keys,--extended-insert, --lock-tables, --quick, --set-charset 。而且—opt默认是开启的。

·  --compact代表了--skip-add-drop-table, --skip-add-locks, --skip-comments,--skip-disable-keys, --skip-set-charset

 

如果想关闭一个选项组内的部分功能,可以这样指定,命令组–skip-xxx ,举例

--opt –skip-quick代表使用opt选项组,但关闭quick功能。

--skip-opt –quick代表关闭整个opt选项组,但开启quick功能

 

 -B --databases 使用与否还是有区别的,如果不用的话,只能导出一个数据库;用了的话,则可一次导出多个数据库,而且会插入CREATE DATABASE

[root@vmtest ~]# mysqldump -uroot -p -B mydb -h 127.0.0.1 -P 3308 >mydb-B.sql
[root@vmtest ~]# mysqldump -uroot -p mydb -h 127.0.0.1 -P 3308 >mydb.sql
[root@vmtest ~]# vimdiff mydb-B.sql mydb.sql 
2 files to edit
+ +-- 12 lines: -- MySQL dump 10.13  Distrib 5.5.47, for |+ +-- 12 lines: -- MySQL dump 10.13  Distrib 5.5.47, for
  /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE|  /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQU
  /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHEC|  /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHE
  /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUT|  /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AU
  /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */|  /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 *
                                                         |  
  --                                                     |  --
  -- Current Database: `mydb`                            |  ------------------------------------------------------
  --                                                     |  ------------------------------------------------------
                                                         |  ------------------------------------------------------
  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydb` /*!4010|  ------------------------------------------------------
                                                         |  ------------------------------------------------------
  USE `mydb`;                                            |  ------------------------------------------------------
                                                         |  ------------------------------------------------------
  --                                                     |  ------------------------------------------------------
  -- Table structure for table `student`                 |  -- Table structure for table `student`


导出后使用压缩

mysqldump -uroot -p -B mydb -h 127.0.0.1 -P 3308|gzip >mydb.sql.gz
[root@vmtest ~]# ll mydb*
-rw-r--r--. 1 root root 2411 Jan 20 15:44 mydb-B.sql
-rw-r--r--. 1 root root  907 Jan 20 16:08 mydb.sql.gz

可以看出体积还是查了2倍多的

-d --no-data 不导出数据,常用于只保留表结构。

-t --no-create-info 不导出表结构,常用于只保留表数据。

-n --no-create-db 不保留CREATE DATABASE语句。


-A 也可用于导出所有数据库,一般跟-B一齐用

-F 刷新binlog,把多个数据库的binlog都切割一下

-master-data[=#] 等号后面是1或者2,用于在导出的文件中插入binlog的位置,这样就知道备份点是处在哪个binlog的哪个位置。利用这个命令可以不切割binlog,但我个人还是觉得切割一下比较好。

1和2的区别在于,插入的那句话

mysqldump -uroot -p -h 127.0.0.1 -P 3308 -B -A --events --master-data=1 > 3308.sql

会在3308.sql里插入以下这句

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=74535;

如果是2,那么会在这句话前面加上SQL的注释--符号


在生产环境中

如果是MyISAM引擎的数据库备份,大约是这样

mysqldump -uroot -p -h 127.0.0.1 -P 3308 -A -B -x --events --master-data=1|gzip >3308.sql.gz

需要注意参数-x,对于MyISAM来说,备份需要锁全表

而如果是InnoDB的备份,则把-x替换成--single-transcation

而如果数据库中,既有InnoDB也有MyISAM,那么就用-x的那种





更多选项参考man mysqldump