Mysqldump - 数据库备份程序
mysqldump客户端实用程序执行逻辑备份,生成一组可以执行以恢复原始数据库对象定义和表数据的SQL语句。它将一个或多个MySQL数据库备份或传输到另一个SQL服务器。mysqldump命令还可以生成CSV、其他定界文本或XML格式的输出。
提示
考虑使用MySQL Shell转储实用程序,它提供多线程并行转储、文件压缩和进度信息显示功能,以及诸如Oracle Cloud Infrastructure Object Storage流式传输、MySQL HeatWave服务兼容性检查和修改等功能。可以使用MySQL Shell加载转储实用程序将转储轻松导入到MySQL服务器实例或MySQL HeatWave服务DB系统中。
mysqldump至少需要转储表的SELECT权限、转储视图的SHOW VIEW权限、转储触发器的TRIGGER权限,如果未使用–single-transaction选项,则还需要LOCK TABLES权限。如果未使用–no-tablespaces选项,则需要在8.0.21及更高版本中使用PROCESS()权限,并在8.0.32及更高版本中使用RELOAD或FLUSH_TABLES权限(如果gtid_mode=ON且–set-gtid=purged=ON|AUTO)。
要重新加载转储文件,您必须具有执行其中包含的语句所需的权限,例如为由这些语句创建的对象分配适当的CREATE权限。
mysqldump输出可能包括更改数据库排序规则的ALTER DATABASE语句。这些可能在转储存储程序时保留其字符编码。要重新加载包含此类语句的转储文件,需要对受影响的数据库的ALTER权限。
注意
使用Windows上的PowerShell通过输出重定向创建的文件具有UTF-16编码:
mysqldump [options] > dump.sql但是,UTF-16不是允许作为连接字符集的(参见不允许的客户端字符集),因此无法正确加载该转储文件。要解决此问题,请使用–result-file选项,它在ASCII格式中创建输出:
mysqldump [options] --result-file=dump.sql
不建议在服务器上启用GTID时(gtid_mode=ON)加载包含系统表的转储文件。mysqldump为使用非事务性MyISAM存储引擎的系统表发出DML指令,当启用GTID时,这不允许。
性能和可扩展性考虑
mysqldump的优势包括在恢复之前查看或编辑输出的便利性和灵活性。您可以克隆开发和DBA工作所需的数据库,或为测试生成现有数据库的轻微变化。它不是用于大量数据备份和恢复的快速或可扩展解决方案。对于大量数据,即使备份步骤花费合理时间,恢复数据也可能非常慢,因为重新播放SQL语句涉及插入、索引创建等磁盘I/O。
对于大规模备份和恢复,物理备份更合适,以复制数据文件的原始格式,以便可以快速恢复。
如果您的表主要是InnoDB表,或者您有一个混合了InnoDB和MyISAM表的表,可以考虑使用mysqlbackup,它是MySQL Enterprise的一部分。此工具为InnoDB备份提供了高性能,最小干扰;它可以备份来自MyISAM和其他存储引擎的表;它还提供了一些方便的选项来适应不同的备份场景。
mysqldump可以按行检索和转储表内容,也可以从表中检索整个内容并将其缓冲在内存中再转储。缓冲在内存中可能是一个问题,如果您正在转储大型表。要按行转储表,请使用–quick选项(或–opt,后者启用–quick)。–opt选项(因此–quick)默认启用,因此要启用内存缓冲,请使用–skip-quick。
如果您使用较新版本的mysqldump生成要重新加载到非常旧的MySQL服务器的转储,请使用–skip-opt选项而不是–opt或–extended-insert选项。
调用语法
通常有三种方法可以使用mysqldump——为了转储一个或多个表的集合、一个或多个完整的数据库集合或整个MySQL服务器——如上所示:
mysqldump [options] db_name [tbl_name ...] mysqldump [options] --databases db_name ... mysqldump [options] --all-databases
要转储整个数据库,不要在db_name后命名任何表,或使用–databases或–all-databases选项。
要查看支持您的mysqldump版本的选项列表,请输入命令mysqldump –help。
示例
要备份整个数据库:
mysqldump db_name > backup-file.sql
将dump文件重新加载到服务器:
mysql db_name < backup-file.sql
另一种重新加载dump文件的方法:
mysql -e "source /path-to-backup/backup-file.sql" db_name
mysqldump还非常适用于通过从一个MySQL服务器复制数据来填充数据库:
mysqldump --opt db_name | mysql --host=remote_host -C db_name
您可以使用一条命令备份多个数据库:
mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql
要备份所有数据库,请使用–all-databases选项:
mysqldump --all-databases > all_databases.sql
对于InnoDB表,mysqldump提供了一种在线备份的方法:
mysqldump --all-databases --master-data --single-transaction > all_databases.sql
或者从MySQL 8.0.26开始:
mysqldump –all-databases –source-data –single-transaction > all_databases.sql
此备份在dump开始时获取对所有表的全局读锁(使用FLUSH TABLES WITH READ LOCK)。一旦获得此锁,就会读取二进制日志坐标并释放锁。如果在发出FLUSH语句时正在运行长时间更新语句,MySQL服务器可能会在那些语句完成之前停滞不前。在那之后,dump变为无锁,对表中的读写操作不受影响。如果MySQL服务器接收到的更新语句执行时间很短(以执行时间为准),则初始锁定期不应引起注意,即使有大量更新。
对于时点恢复(也称为“回滚”,当您需要恢复旧备份并重放自该备份以来发生的变化时),通常有用的是轮换二进制日志或至少知道dump对应的二进制日志坐标:
mysqldump --all-databases --master-data=2 > all_databases.sql
或者从MySQL 8.0.26开始: mysqldump –all-databases –source-data=2 > all_databases.sql
或者:
mysqldump --all-databases --flush-logs --master-data=2 > all_databases.sql
或者从MySQL 8.0.26开始:
mysqldump --all-databases --flush-logs --source-data=2 > all_databases.sql
–source-data或–master-data选项可以与–single-transaction选项同时使用,提供一种方便的方法,用于在存储使用InnoDB存储引擎的表之前进行在线备份,以便进行时点恢复。
要选择–opt除了某些功能之外的效果,请为每个功能使用–skip选项。要禁用扩展插入和内存缓冲区,请使用–opt –skip-extended-insert –skip-quick。(实际上,–skip-extended-insert –skip-quick足够了,因为–opt默认启用。)
要反转–opt的所有功能,除了禁用索引和表锁定,请使用–skip-opt –disable-keys –lock-tables。
限制
- mysqldump默认不会转储performance_schema或sys schema。要转储这些中的任何一个,请在命令行上明确指定它们。您还可以使用–databases选项指定它们。对于performance_schema,还要使用–skip-lock-tables选项。
- mysqldump不会转储INFORMATION_SCHEMA模式。
- mysqldump不会转储InnoDB CREATE TABLESPACE语句。
- mysqldump不会转储NDB Cluster ndbinfo信息数据库。
- mysqldump包括用于mysql数据库的dump的general_log和slow_query_log表的重新创建语句。Log表内容不会被转储。
mysqlimport - 数据导入程序
mysqlimport客户端提供了LOAD DATA SQL语句的命令行界面。大多数mysqlimport选项直接对应于LOAD DATA语法的子句。
调用mysqlimport的方式如下:
mysqlimport [options] db_name textfile1 [textfile2 ...]
对于命令行上命名的每个文本文件,mysqlimport会从文件名中删除任何扩展名,并使用结果来确定要导入文件内容的表的名称。例如,命名为patient.txt、patient.text和patient的文件都将导入到一个名为patient的表中。
以下是演示mysqlimport用法的示例会话:
$> mysql -e ‘CREATE TABLE imptest(id INT, n VARCHAR(30))’ test $> ed a 100 Max Sydow 101 Count Dracula . w imptest.txt 32 q $> od -c imptest.txt 0000000 1 0 0 a x S y d o w 0 0000020 1 o u n t D r a c u l a $> mysqlimport –local test imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 $> mysql -e ‘SELECT * FROM imptest’ test +——+—————+ | id | n | +——+—————+ | 100 | Max Sydow | | 101 | Count Dracula | +——+—————+