9.4.1 使用 mysqldump 转储 SQL 格式的数据
本节描述了如何使用mysqldump创建SQL格式的备份文件。有关重新加载这样的备份文件的信息,请参阅第9.4.2节,“重新加载SQL格式备份”。
mysqldump默认情况下,将信息作为SQL语句写入标准输出。你可以将输出保存到文件中:
$> mysqldump [arguments] > file_name
要备份所有数据库,请使用mysqldump并指定--all-databases
选项:
$> 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
默认情况下,如果服务器上启用了GTIDs(gtid_mode=ON
),mysqldump在输出中包含一个mysqldump语句,用于将源服务器上的gtid_executed
集中的GTIDs添加到目标服务器上的gtid_purged
集中。如果您只备份特定的数据库或表,请注意mysqldump包含了源服务器gtid_executed
集中所有事务的GTIDs,即使这些事务改变了被抑制的数据库部分,或者是该服务器上未包含在部分备份中的其他数据库。如果您只在目标服务器上重放一个部分备份文件,这些额外的GTIDs不会影响该服务器的未来操作。然而,如果您在目标服务器上重放第二个包含相同GTIDs(例如来自同一源服务器的另一个部分备份)的备份文件,第二个备份文件中的任何mysqldump语句都会失败。为了避免这个问题,您可以设置mysqldump选项--set-gtid-purged
为OFF
或COMMENTED
,以便在输出第二个备份文件时不包含活动的mysqldump语句,或者在重放备份文件之前手动删除该语句。