问题
如何从包含所有数据库和表的备份转储文件中恢复特定表?
之路教程 https://onitr oad .com
解决方法
有时我们可能需要恢复特定的表,但唯一可用的备份包含所有数据库。
从备份中恢复所有内容可能不是一种选择。
相反,我们将需要能够仅恢复特定的数据库或者表。
以下过程可用于在应用备份时有效过滤备份:
- 第一步是创建一个新的用户帐户,专门用于恢复备份。
这可以通过 CREATE USER 语句来完成,如下所示:
CREATE USER 'restorative_user'@'localhost' IDENTIFIED BY 'its_password';
在此示例中,我们创建了一个名为 restoreative_user 的用户。
其中:任何名字都可以。
我们可以将 its_password 替换为我们想使用的任何密码。
- 完成此操作后,我们需要授予此新用户帐户对所有数据库和表的 SELECT 权限。
这可以通过像这样的 GRANT 语句来完成:
GRANT SELECT ON *.* TO 'restorative_user'@'localhost';
- 接下来,我们需要为需要恢复的数据库和表授予新用户所有权限。
同样,这可以使用 GRANT 语句完成,如下所示:
GRANT ALL ON db1.table1 TO 'restorative_user'@'localhost';
GRANT ALL ON db2.* TO 'restorative_user'@'localhost';
在此示例中,我们仅针对数据库 db1 中的 table1 表授予了用户 restoreative_user 的完全权限。
在此处的第二条语句中,我们已授予数据库 db2 中所有表的完全权限。
如果整个 db2 数据库都需要恢复(没有特定的表),我们可以使用 -one-database 选项来过滤语句,而无需创建 restorative_user 用户帐户。
- 现在我们已准备好使用新用户帐户恢复备份。
我们将从命令行执行此操作,如下所示:
mysql -u restorative_user -pits_password --force < /path/backup.sql
执行上述操作将导致重放完整备份。
但是,只有恢复用户具有权限的那些数据库和表才会被恢复。
--force 选项使备份继续恢复,即使在出现错误后也是如此。
在这种情况下,会出现授权错误,因为备份语句会被授予用户的权限过滤掉。
对所有数据库的 SELECT 权限至关重要,否则更改 mysqldump 生成的所有数据库备份中的数据库的 USE 语句将失败,但连续的 DROP 和 CREATE 语句可能会成功。
这可能会导致一个数据库中的表被恢复到另一个数据库。
或者更糟的是,如果来自两个数据库的表名相同,则其中一个表可能会被表定义和另一个表中的数据覆盖。
日期:2020-09-17 00:11:43 来源:oir作者:oir