如何使用 Mysqldump 备份和恢复 MySQL 数据库
本教程介绍如何使用 mysqldump 实用程序从命令行备份和恢复 MySQL 或 MariaDB 数据库。
mysqldump 实用程序创建的备份文件基本上是一组可用于重新创建原始数据库的 SQL 语句。 mysqldump 命令还可以生成 CSV 和 XML 格式的文件。
您还可以使用 mysqldump 实用程序将 MySQL 数据库传输到另一台 MySQL 服务器。
如果不备份数据库,软件错误或硬盘故障可能会造成灾难性的后果。为了帮助您节省大量时间并减少麻烦,强烈建议您采取预防措施定期备份 MySQL 数据库。
Mysqldump 命令语法
在介绍如何使用 mysqldump 命令之前,我们首先回顾一下基本语法。
mysqldump 实用程序表达式采用以下形式:
mysqldump [options] > file.sql
options
- mysqldump选项file.sql
- 转储(备份)文件
要使用 mysqldump 命令,MySQL 服务器必须可访问且正在运行。
备份单个 MySQL 数据库
mysqldump 工具最常见的用例是备份单个数据库。
例如,要使用用户 root
创建名为 database_name
的数据库的备份并将其保存到名为 database_name.sql
的文件中,您将运行以下命令:
mysqldump -u root -p database_name > database_name.sql
系统将提示您输入 root 密码。身份验证成功后,转储过程将开始。根据数据库大小,该过程可能需要一些时间。
如果您以用于执行导出的同一用户身份登录,并且该用户不需要密码,则可以省略 -u
和 -p
选项:
mysqldump database_name > database_name.sql
备份多个 MySQL 数据库
要使用一个命令备份多个 MySQL 数据库,您需要使用 --database
选项,后跟要备份的数据库列表。每个数据库名称必须用空格分隔。
mysqldump -u root -p --databases database_name_a database_name_b > databases_a_b.sql
上面的命令将创建一个包含两个数据库的转储文件。
备份所有 MySQL 数据库
使用--all-databases
选项备份所有MySQL数据库:
mysqldump -u root -p --all-databases > all_databases.sql
与前面的示例相同,上面的命令将创建一个包含所有数据库的转储文件。
将所有 MySQL 数据库备份到单独的文件中
mysqldump
工具没有提供将所有数据库备份到单独文件的选项,但我们可以通过简单的 bash FOR
循环轻松实现这一点:
for DB in $(mysql -e 'show databases' -s --skip-column-names); do
mysqldump $DB > "$DB.sql";
done
上面的命令将为每个数据库创建一个单独的转储文件,使用数据库名称作为文件名。
创建压缩的 MySQL 数据库备份
如果数据库大小非常大,那么压缩输出是个好主意。为此,只需将输出通过管道传输到 gzip
实用程序,并将其重定向到文件,如下所示:
mysqldump database_name | gzip > database_name.sql.gz
创建带有时间戳的备份
如果您想在同一位置保留多个备份,则可以添加当前的日期 备份文件名:
mysqldump database_name > database_name-$(date +%Y%m%d).sql
上面的命令将创建一个具有以下格式database_name-20180617.sql
的文件
恢复 MySQL 转储
您可以使用mysql
工具恢复MySQL转储。命令一般语法如下:
mysql database_name < file.sql
在大多数情况下,您需要创建数据库 来导入。如果数据库已经存在,首先需要将其删除。
在以下示例中,第一个命令将创建一个名为 database_name
的数据库,然后将转储 database_name.sql
导入其中:
mysql -u root -p -e "create database database_name"
mysql -u root -p database_name < database_name.sql
从完整 MySQL 转储恢复单个 MySQL 数据库
如果您使用-all-databases
选项备份了所有数据库,并且想要从包含多个数据库的备份文件恢复单个数据库,请使用--one-database
选项,如下所示:
mysql --one-database database_name < all_databases.sql
通过一个命令导出和导入 MySQL 数据库
您可以使用以下一行代码,而不是从一个数据库创建转储文件,然后将备份导入到另一个 MySQL 数据库中:
mysqldump -u root -p database_name | mysql -h remote_host -u root -p remote_database_name
上面的命令会将输出通过管道传输到远程主机上的 mysql 客户端,并将其导入到名为 remote_database_name
的数据库中。运行该命令之前,请确保远程服务器上已存在数据库。
使用 Cron 自动备份
自动化备份数据库的过程就像创建 cron 作业 一样简单,在指定时间运行 mysqldump 命令即可。
要使用 cronjob 设置 MySQL 数据库的自动备份,请按照以下步骤操作:
在您的用户主目录中创建一个名为
.my.cnf
的文件:sudo nano ~/.my.cnf
将以下文本复制并粘贴到 .my.cnf 文件中。
[client] user = dbuser password = dbpasswd
不要忘记将
dbuser
和dbpasswd
替换为数据库用户和用户密码。限制凭证文件的 权限,以便只有你的用户才能访问它:
chmod 600 ~/.my.cnf
创建目录 来存储备份:
mkdir ~/db_backups
打开您的用户 crontab 文件:
crontab -e
添加以下 cron 作业,该作业将在每天凌晨 3 点创建数据库名称
mydb
的备份:0 3 * * * /usr/bin/mysqldump -u dbuser mydb > /home/username/db_backups/mydb-$(date +\%Y\%m\%d).sql
不要忘记将
username
替换为您的实际用户名。我们还转义了百分号 (%
),因为它们在 crontab 中具有特殊含义。
您还可以创建另一个 cronjob 来删除任何超过 30 天的备份:
find /path/to/backups -type f -name "*.sql" -mtime +30 -delete
当然,您需要根据您的备份位置和文件名来调整命令。要了解有关 find 命令的更多信息,请查看我们的 如何在 Linux 中使用命令行查找文件指南。
结论
本教程仅涵盖基础知识,但对于任何想要学习如何使用 mysqldump 实用程序从命令行创建和恢复 MySQL 数据库的人来说,它应该是一个良好的起点。
如果您想了解有关从命令行使用 MySQL 的更多信息,请查看我们的 如何管理MySQL用户帐户和数据库 指导。
您还可以查看有关如何重置 MySQL root 密码的教程,以防你忘记了。
如果您有任何问题或反馈,请随时发表评论。