mysqldump 对于 MySQL 数据库备份是有一个很好用的命令, 并且是 MySQL 自带的.
-d: 只备份表结构, 备份文件是 SQL 语句形式; 只备份创建表的语句, 插入的数据不备份.
-t: 只备份数据, 数据是文本形式; 表结构不备份
-T [--tab]: 表结构与数据分离, 表结构为 sql 文件, 数据为普通文件
-A: 导出所有数据库
-B: 导出指定数据库
-x, --lock-all-tables: 锁表
锁表原理: 从执行定时备份脚本起(带 - x 参数), 不能往表里更新, 但是缺点, 锁表后无法更新, 如果单库一般在低谷, 比如凌晨后半夜里; 多库, 就从从库里锁表备份(并且从库不对外, 只做备份)
Locks all tables across all databases. This is achieved by taking a global read lock for the duration of the whole dump.
Automatically turns --single-transaction and --lock-tables off. 启用该选项, 会自动关闭 --single-transaction 和 --lock-tables.
-l, --lock-tables: 只读锁表
Lock all tables before dumping them
Lock all tables for read.
(Defaults to on; use --skip-lock-tables to disable.)
该选项默认打开的, 上面已经说到了. 它的作用是在导出过程中锁定所有表.--single-transaction 和 --lock-all-tables 都会将该选项关闭.
在用 LOCK TABLES 给表显式加表锁时, 必须同时取得所有涉及到表的锁, 也就是说, 在执行 LOCK TABLES 后, 只能访问显式加锁的这些表, 不能访问未加锁的表; 同时, 如果加的是读锁, 那么只能执行锁表的查询操作, MyISAM 总是一次获得 SQL 语句所需要的全部锁. 这也正是 MyISAM 表不会出现死锁 (Deadlock Free) 的原因.
--single-transaction
--single-transaction 可以得到一致性的导出结果. 他是通过将导出行为放入一个事务中达到目的的.
它有一些要求: 只能是 innodb 引擎; 导出的过程中, 不能有任何人执行 alter table, drop table, rename table, truncate table 等 DDL 语句.
实际上 DDL 会被事务所阻塞, 因为事务持有表的 metadata lock 的共享锁, 而 DDL 会申请 metadata lock 的互斥锁, 所以阻塞了.
--single-transaction 会自动关闭 --lock-tables 选项; 上面我们说到 mysqldump 默认会打开了 --lock-tables, 它会在导出过程中锁定所有表.
因为 --single-transaction 会自动关闭 --lock-tables, 所以单独使用 --single-transaction 是不会使用锁的. 与 --master-data 合用才有锁.
-q: 不做缓冲查询, 直接导到标准输出
-R: 导出存储过程和函数
-E,--events: 导出调度事件
--add-drop-database
在 CREATE DATABASE 语句前增加 DROP DATABASE 语句, 一般配合 --all-databases 或 --databases 使用, 因为只有使用了这二者其一, 才会记录 CREATE DATABASE 语句.
--add-drop-table
在 CREATE TABLE 语句前增加 CREATE TABLE 语句.
--add-drop-trigger
在 CREATE TRIGGER 语句前增加 DROP TRIGGER 语句
--all-tablespaces, -Y
导出全部表空间. 该参数目前仅用在 MySQL Cluster 表上(NDB 引擎)
--add-locks
在每个表导出之前增加 LOCK TABLES 并且之后 UNLOCK TABLE.(默认为打开状态, 使用 --skip-add-locks 取消选项)
--opt
等同于 --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 该选项默认开启, 可以用 --skip-opt 禁用.
-F,--flush-logs: 刷新 binlog 日志
--master-data
mysqldump 导出数据时, 当这个参数的值为 1 的时候, mysqldump 出来的备份文件就会包括 CHANGE MASTER TO 这个语句, CHANGE MASTER TO 后面紧接着就是 file 和 position 的记录, 在 slave 上导入数据时会执行该语句, salve 就会根据 CHANGE MASTER TO 后面指定的 binlog 文件和 binlog 日志文件里的位置点, 从 master 端复制 binlog. 默认情况下这个值是 1 . 运维经常使用到该参数, 主从复制时, 该参数是一个很好的功能, 同时也可以做增量恢复.
当这个参数的值为 2 的时候 mysqldump 导出来的备份文件也会包含 CHANGE MASTER TO 语句, 但是该语句被注释掉, 不会生效, 只是提供一个信息.
--master-data 也会刷新 binlog 日志.
来源: http://www.bubuko.com/infodetail-2698876.html