百度百科这么解释:把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据、并且从这些数据中创建INSERT语句
mysqldump的大概流程整理如下(白话):
1:连接数据库,校验账户,密码,IP
2:进入INFORMATION_SCHEMA库,获取要备份的数据库的信息,包含存储过程,视图,表
3:进入INFORMATION_SCHEMA库,获取每个表的字段名称,字段类型等信息
4:查询每个表的数据,select SQL_NO_CACHE from tbname
5:拼接成DDL SQL
6:写入备份文件
几个重要的参数一定要明白
有一点需要说明就是single-transaction级别比锁大 因为加上-sing** 就不会用--X
--master-data[=#] This causes the binary log position and filename to be
appended to the output. If equal to 1, will print it as a
CHANGE MASTER command; if equal to 2, that command will
be prefixed with a comment symbol. This option will turn
--lock-all-tables on, unless --single-transaction is
specified too (in which case a global read lock is only
taken a short time at the beginning of the dump; don‘t
forget to read about --single-transaction below). In all
cases, any action on logs will happen at the exact moment
of the dump. Option automatically turns --lock-tables off.
这个参数会运行--lock-all-tables,将master的binlog和postion信息写入SQL文件的头部,除非结合--single-transaction(但并不是说就完全的不会锁表了,执行的时候也会添加短暂的全局读锁)
--single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。
本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用 --quick 选项
--skip-opt
遇到过好几次mysqldump出来的备份不能导入,同样的库如果mysqldump
--skip-opt是可以导入的,分析两个不同的备份文件,发现--skip-opt是一条条的insert语句,但是--opt一个表只有1条insert语句,这样有可能表数据太多导致溢出,可以适当调整
my.cnf中的table_cache值尽量避免这种情况,生产服务器中我设置的是table_cache=512,内存2G,问题解决。--opt导入的速度比--skip-opt要快点,毕竟是优化的,呵呵。table_cache还涉及到mysql的优化,要结合实际应用来调整。
--opt
这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option
--disable-keys --extended-insert --lock-tables --quick --set-charset
选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt
禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt
选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。
--lock-tables
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。