如何使用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-20160617.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
不要忘记用实际用户名替换“用户名”。我们也在转义百分号('%'),因为它们在crontab中具有特殊含义。
我们还可以创建另一个cronjob来删除30天以上的所有备份:
find /path/to/backups -type f -name "*.sql" -mtime +30 -delete
当然,我们需要根据备份位置和文件名来调整命令。