本节介绍如何使用 mysqldump 创建 SQL 格式的转储文件。有关重新加载此类转储文件的信息,请参阅 第 9.4.2 节 “重新加载 SQL 格式的备份”。
默认情况下,mysqldump 将信息作为 SQL 语句写入标准输出。您可以将输出保存到文件中
$> mysqldump [arguments] > file_name
要转储所有数据库,请使用 --all-databases
选项调用 mysqldump
$> mysqldump --all-databases > dump.sql
要仅转储特定的数据库,请在命令行上命名它们,并使用 --databases
选项
$> mysqldump --databases db1 db2 db3 > dump.sql
--databases
选项会导致命令行上的所有名称都被视为数据库名称。如果没有此选项,mysqldump 会将第一个名称视为数据库名称,将后面的名称视为表名称。
使用 --all-databases
或 --databases
时,mysqldump 会在每个数据库的转储输出之前写入 CREATE DATABASE
和 USE
语句。这可确保在重新加载转储文件时,如果每个数据库不存在,则会创建它们,并将其设为默认数据库,以便将数据库内容加载到它们来自的同一个数据库中。如果希望转储文件在重新创建每个数据库之前强制删除它,请同时使用 --add-drop-database
选项。在这种情况下,mysqldump 会在每个 CREATE DATABASE
语句之前写入 DROP DATABASE
语句。
要转储单个数据库,请在命令行上命名它
$> mysqldump --databases test > dump.sql
在单数据库情况下,允许省略 --databases
选项
$> mysqldump test > dump.sql
前面两条命令的区别在于,如果没有 --databases
,则转储输出不包含 CREATE DATABASE
或 USE
语句。这有几个含义
重新加载转储文件时,必须指定默认数据库名称,以便服务器知道要重新加载哪个数据库。
对于重新加载,您可以指定与原始名称不同的数据库名称,这使您能够将数据重新加载到不同的数据库中。
如果要重新加载的数据库不存在,则必须先创建它。
因为输出不包含
CREATE DATABASE
语句,所以--add-drop-database
选项不起作用。如果使用它,则不会生成DROP DATABASE
语句。
要仅转储数据库中的特定表,请在数据库名称后面的命令行上命名它们
$> mysqldump test t1 t3 t7 > dump.sql
默认情况下,如果在创建转储文件的服务器上使用 GTID(gtid_mode=ON
),则 mysqldump 会在输出中包含 SET @@GLOBAL.gtid_purged
语句,以将源服务器上 gtid_executed
集中的 GTID 添加到目标服务器上的 gtid_purged
集中。如果仅转储特定的数据库或表,则需要注意的是,mysqldump 包含的值包括源服务器上 gtid_executed
集中所有事务的 GTID,即使是那些更改了数据库的抑制部分或服务器上未包含在部分转储中的其他数据库的事务。如果仅在目标服务器上重放一个部分转储文件,则额外的 GTID 不会对该服务器的未来操作造成任何问题。但是,如果在目标服务器上重放包含相同 GTID 的第二个转储文件(例如,来自同一源服务器的另一个部分转储),则第二个转储文件中的任何 SET @@GLOBAL.gtid_purged
语句都将失败。为避免此问题,可以将 mysqldump 选项 --set-gtid-purged
设置为 OFF
或 COMMENTED
,以便在没有活动 SET @@GLOBAL.gtid_purged
语句的情况下输出第二个转储文件,或者在重放转储文件之前手动删除该语句。