使用mysqldump完美备份

69
如何使用mysqldump制作完美的mysql数据库备份? 当我进行备份时,只有指定数据库中的表被备份,存储过程和函数没有被备份。
这是我使用的备份命令: (操作系统是Windows Vista。)
mysqldump -u username -p db1 > backup.sql
9个回答

116

如果您想要进行完整备份,即备份所有数据库、存储过程、例程和事件,而不会中断任何连接:

mysqldump -u [username] -p -A -R -E --triggers --single-transaction > full_backup.sql
  1. -A 适用于所有数据库(您也可以使用 --all-databases
  2. -R 适用于所有例程(存储过程和触发器)
  3. -E 适用于所有事件
  4. --single-transaction 在不锁定表格即不中断任何连接(读/写)的情况下进行备份。

如果您只想备份特定的数据库:

mysqldump -u [username] -p [database_name] [other_database_name] -R -e --triggers --single-transaction > database_backup.sql

如果你想备份数据库中的特定表:

mysqldump -u [username] -p [database_name] [table_name] > table_backup.sql
如果你只想备份数据库结构,只需在先前的命令中添加--no-data即可:
mysqldump -u [username] –p[password] –-no-data [database_name] > dump_file.sql

mysqldump 有许多更多选项,所有这些选项都在 mysqldump 文档 中记录,或者通过在命令行运行 man mysqldump 来查看。


我在将数据加载到MySQL时遇到了问题,由于外键约束,转储的表的顺序没有任何特定顺序来满足外键约束(依赖表在引用表之前)。 - Kemin Zhou
你可以在会话级别使用以下命令: SET FOREIGN_KEY_CHECKS=0; 如果你使用全局设置,请确保将其还原。 - NarasimhaTejaJ
可以了!谢谢!-e 可能有一个打字错误。我使用了 -E。但是两个都有,你可以通过 mysqldump --help 看到。 - qräbnö
点赞。我认为导入这样的SQL备份文件不需要任何标志,对吗?即 $ mysql -u [用户名] -p [新数据库名] << 数据库备份.sql - s3c
1
您还可以直接压缩备份文件,如下所示:mysqldump <必要的参数> | gzip > backup.sql.gz - Paul

20

这取决于您使用的版本。在5.0.13之前,使用mysqldump是不可能做到的。

来自mysqldump手册页面(v 5.1.30)

 --routines, -R

      Dump stored routines (functions and procedures) from the dumped
      databases. Use of this option requires the SELECT privilege for the
      mysql.proc table. The output generated by using --routines contains
      CREATE PROCEDURE and CREATE FUNCTION statements to re-create the
      routines. However, these statements do not include attributes such
      as the routine creation and modification timestamps. This means that
      when the routines are reloaded, they will be created with the
      timestamps equal to the reload time.
      ...

      This option was added in MySQL 5.0.13. Before that, stored routines
      are not dumped. Routine DEFINER values are not dumped until MySQL
      5.0.20. This means that before 5.0.20, when routines are reloaded,
      they will be created with the definer set to the reloading user. If
      you require routines to be re-created with their original definer,
      dump and load the contents of the mysql.proc table directly as
      described earlier.

导出可以正常工作,但是导入无法正常工作。 mysqldump -u root demo -R < E:\Java\AkshayProject\Dump\DBbackup.sql 无法正常工作。 - अक्षय परूळेकर

16

使用以下命令:

mysqldump <other mysqldump options> --routines > outputfile.sql

如果我们只想备份存储过程和触发器,而不是mysql表和数据,那么我们应该运行类似以下的命令:

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt <database> > outputfile.sql

如果您需要将它们导入到另一个数据库/服务器中,您需要运行类似以下命令:

mysql <database> < outputfile.sql

5
除了--routines标志外,您还需要授予备份用户读取存储过程的权限:
GRANT SELECT ON `mysql`.`proc` TO <backup user>@<backup host>;

我的备份用户所需的最小GRANT权限如下:

GRANT USAGE ON *.* TO ...
GRANT SELECT, LOCK TABLES ON <target_db>.* TO ...
GRANT SELECT ON `mysql`.`proc` TO ...

授予权限,这就是我所缺少的!+1 - carla
2
还有,在最后别忘了加上 FLUSH PRIVILEGES; - carla

3

我正在使用MySQL 5.5.40版本。该版本有一个选项--all-databases

mysqldump -u<username> -p<password> --all-databases --events > /tmp/all_databases__`date +%d_%b_%Y_%H_%M_%S`.sql

这个命令将会创建一个名为当前日期时间的文件,其中包含MySQL服务器中所有数据库的完整备份。


2

使用'-R'备份存储过程,但也要记住,如果您想在数据库被修改时获得一致的转储,需要使用--single-transaction(如果您只备份InnoDB),或者--lock-all-tables(如果您还需要MyISAM表)。


1

在MySQL 5.7上,它对我有效,我正在使用CentOS7。

用于获取Dump。

命令:

mysqldump -u user_name -p database_name -R -E > file_name.sql

例子:

mysqldump -u root -p mr_sbc_clean -R -E > mr_sbc_clean_dump.sql

用于部署Dump。

命令:

mysql -u user_name -p database_name < file_name.sql

例子:

mysql -u root -p mr_sbc_clean_new < mr_sbc_clean_dump.sql

0
例如,使用默认情况下隐式使用的-E(--events)-R(--routines)--triggers,您可以将apple数据库的表的模式和数据以及其eventsroutines(过程和函数)triggers导出到backup.sql,如下所示。*--single-transaction保证了一致(可靠)的转储,不可能仅导出过程或函数,--skip-triggers可以排除默认情况下包含的触发器,而my answer解释了如何导出数据库的表的模式和数据。
mysqldump -u john -p -E -R --single-transaction apple > backup.sql

或者:

mysqldump -u john -p --events --routines --single-transaction apple > backup.sql

或者,你可以明确地使用下面所示的--triggers参数:
                           ↓↓ Here ↓↓
mysqldump -u john -p -E -R --triggers --single-transaction apple > backup.sql

使用{{link1:-B(-数据库)}},您可以将appleorange数据库的模式和数据以及它们的事件、例程(过程和函数)和触发器导出到backup.sql,如下所示。*{{link2:我的回答}}解释了如何导出多个数据库的模式和数据。
mysqldump -u john -p -B -E -R --single-transaction apple orange > backup.sql

使用{{link1:-A(- - all-databases)}},您可以将所有数据库的模式和数据以及它们的事件、例程(过程和函数)和触发器导出到backup.sql,如下所示。*{{link2:我的回答}}解释了如何导出所有数据库的模式和数据:
mysqldump -u john -p -A -B -E -R --single-transaction > backup.sql

0

创建转储文件的步骤如下:

  1. 打开CMD并进入您安装MySQL的bin文件夹
    例如:C:\Program Files\MySQL\MySQL Server 8.0\bin。如果您在此文件夹中看到mysqldump.exe,则已经安装好了。或者您已经将上述文件夹设置为环境变量的Path变量。

  2. 现在,如果您在CMD中输入mysqldump,您会发现CMD能够识别dump命令。

  3. 现在运行“mysqldump -h [host] -P [port] -u [username] -p --skip-triggers --no-create-info --single-transaction --quick --lock-tables=false ABC_databse > c:\xyz.sql
  4. 以上命令将提示输入密码,然后开始处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接