Mysqldump是一个客户端程序,用于导出数据,适合用于开发、DBA测试等工作。在它的man帮助里,提及到,mysqldump进行的是逻辑备份,生成的内容是一堆SQL语句。也可以输出为csv、文本文件(其他分割符号)、XML格式。
Mysqldump要求起码具备select、show view、trigger、lock tables权限(前提是未使用—single-transaction选项)。
当要重新导入dump文件时,需要具备dump文件中所有sql语句的对应权限(例如create database、create 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_SCHEMA或performance_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