MySQL 命令行工具之 mysqldump 深入研究(9)

3)--lock-all-tables
      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.

上面三个选项中,只有 --lock-tables 默认是打开的;打开 --single-transaction 或者 打开 --lock-all-tables 都将关闭 --lock-tables. 而--lock-all-tables会自动关闭 --single-transaction 和 --lock-tables。所以三者是互斥的。我们应该一次只启用其中一个选项。

4)--flush-logs   

Flush logs file in server before starting dump. Note that if you dump many databases at once (using the option --databases= or

--all-databases), the logs will be flushed for each database dumped. The exception is when using --lock-all-tables or

--master-data: in this case the logs will be flushed only once, corresponding to the moment all tables are locked. So if you want your

dump and the log flush to happen at the same exact moment you should use --lock-all-tables or --master-data with --flush-logs.

为了获得导出数据和刷新日志的一致性(同时发生),必须将 --flush-logs 选项和 --lock-all-tables 或者 --master-data 以前使用:

mysqldump --flush-logs --lock-all-tables;  mysqldump --flush-logs --master-data=2

5)--flush-privileges 

Emit a FLUSH PRIVILEGES statement after dumping the mysql database.  This option should be used any time the dump contains the

      mysql database and any other database that depends on the data in the mysql database for proper restore.

如何导出包含了mysql数据,就应该启用该选项。该选项会在导出的 mysql 数据库的后面加上 flush privileges 语句,因为在向mysql数据库inert了语句

之后,必须使用 flush privileges,不然权限不生效。下面是例子:

MySQL 命令行工具之 mysqldump 深入研究

6)  --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.

所以为了获得一致性的备份数据和在备份是同时刷新binary日志,我们应该如下结合使用这些选项(完美组合):

mysqldump -uxxx -pxxx --single-transaction --master-data=2 --flush-logs --routines --databases db1 > db1.sql;

(其中 --flush-logs 不是必须的; 搭建slave时,不要导出events,但是需要导出rountines.)

其中被 --master-data 打开的 --lock-all-tables 选项,又被 --single-transaction 关闭掉了--flush-logs 借助于 --master-data 可以达到即使一次导出多个数据库时,其 flush 的二进制日志也是在同一个时间点的,不是每一个数据库flush一次的。并且这个时间点 和 --master-data 记录的 binary log position 和 binary log file是同一个时间点,这些都是利用了 --single-transaction 和 --master-data 合用时短暂的使用一个全局的读锁来达到目的的

5. mysqldump 复制 的相关选项

1)  --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.

该选项,上面已经介绍了。--master-data=1 表示会导出 change master to 语句,--master-data=2 该语句放在注释中,默认是为 0 。

一般会和 --single-transaction一起使用,用于搭建master-slave环境。

下面是 --master-data=1 和 --master-data=2 的比较:

MySQL 命令行工具之 mysqldump 深入研究

MySQL 命令行工具之 mysqldump 深入研究

在导出文件的前30行左右可以看到 change master to 语句。可以使用 head -n 30 db1.sql 查看

2)  --dump-slave[=#]   

This causes the binary log position and filename of the master to be appended to the dumped data output. Setting the value to 1, will

printit as a CHANGE MASTER command in the dumped data output; 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.

--dump-slave 和 --master-data 几乎一样。区别只是--dump-slave用于slave建立下一级的slave;而 --master-data用于master建立slave;

如果在 master 上使用 --dump-slave 会报错:mysqldump: Couldn't execute 'START SLAVE': The server is not configured as slave;

3) --apply-slave-statements
      Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START SLAVE' to bottom of dump.

在 change master 导出 stop slave 语句, 在 change master 之后导出 start slave语句。其实是一个自动化的处理。和 --master-data=1 类似。

如下图���示:开头有 stop slave, 结尾有 start slave语句:

MySQL 命令行工具之 mysqldump 深入研究

MySQL 命令行工具之 mysqldump 深入研究

4)--include-master-host-port
      Adds 'MASTER_HOST=<host>, MASTER_PORT=<port>' to 'CHANGE MASTER TO..' in dump produced with --dump-slave.

该选择要结合 --dump-slave=1/2 使用。会在导出中加入 host。

5)--include-master-host-port
    Adds 'MASTER_HOST=<host>, MASTER_PORT=<port>' to 'CHANGE MASTER TO..' in dump produced with --dump-slave.

该选择要结合 --dump-slave=1/2 使用。会在导出中加入mysql的 port。

6)--delete-master-logs
    Delete logs on master after backup. This automatically enables --master-data.

在备份之后,删除 master上的binary log。该选项会自动打开 --master-data 选项(等于2)。该选项一般不用。日志一般不能随便删除。

7)--set-gtid-purged[=name]
    Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible values for this option are ON, OFF and AUTO. If ON is used and GTIDs

are not enabled on the server, an error is generated. If OFF is used, this option does nothing. If AUTO is used and GTIDs are enabled

on the server, 'SET @@GLOBAL.GTID_PURGED' is added to the output. If GTIDs are disabled, AUTO does nothing. If no value is

supplied then the default (AUTO) value will be considered.

该选项用于启用了GTID特性的环境。

6. mysqldump 字符集 的相关选项

1)--set-charset     

Add 'SET NAMES default_character_set' to the output.  (Defaults to on; use --skip-set-charset to disable.)

--set-charset=1/0 开启和关闭。也可以使用 --skip-set-charset 关闭。

该选项我们上面已经说到了。表示是否生成 /*!40101 SET NAMES utf8 */;

2)-N, --no-set-names 

Same as --skip-set-charset. 关闭 --set-charset. 不生成 /*!40101 SET NAMES utf8 */; 语句。

3)--default-character-set=name
    Set the default character set.

该选项上面也涉及到了。指定语句:/*!40101 SET NAMES utf8 */;中的字符集;可能你需要改成 --default-character-set=utf8mb4

7. mysqldump 控制是否生成 DDL 语句 的相关选项

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/38784cef23fd1f12966185d2cc51010a.html