使用mysqldump以SQL格式导出数据

来自泡泡学习笔记
跳到导航 跳到搜索

本节介绍如何使用mysqldump创建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语句,或者在回放导出文件之前手动删除该语句。