繁体   English   中英

从 --all-databases 转储导入单个数据库

[英]Import single database from --all-databases dump

是否可以从 --all-databases mysqldump 导入单个数据库? 我想我可以手动修改文件,但想知道是否有任何命令行选项可以做到这一点。

我正在移动服务器并拥有很多数据库,其中大部分我目前不需要或不想要,但如果需要,我希望可以选择恢复单个数据库。

您可以使用以下命令:

mysql -u root -p --one-database destdbname < alldatabases.sql

其中destdbname是您想要恢复的数据库。

恕我直言,另一个更安全的选择是从--all-databases转储中提取数据库。 例子:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' alldatabases.sql > output.sql

dbname替换为所需的数据库名称。 alldatabases.sql是您的 sql-dump 文件的名称。 这样,您将拥有单独的数据库,然后您可以使用简单的 mysql 命令进行恢复。

(致谢:Darren Mothersele - 见他的页面

mysqldump输出只是一组SQL语句。

您可以在命令行中提供所需的数据库,并使用以下命令跳过针对其他数据库的命令:

mysql -D mydatabase -o mydatabase < dump.sql

这只会在使用mydatabase时执行命令

使用 Hetzbh 建议的sed方法时,请务必从原始转储中手动复制初始行和最终行,例如

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

分别到 sed 生成的剥离文件的开头和结尾。 否则,由于转储中表的字母顺序不遵守外部约束,导入可能会失败(即errno: 150 "Foreign key constraint is incorrectly formed" )。

下面是从$BACKUP_FILE备份文件中仅恢复名为$DB_FROM的数据库的命令:

(sed '/^-- Current Database: `/q' "$BACKUP_FILE"; sed -n "/^-- Current Database: \`$DB_FROM\`/,/^-- Current Database: \`/p" "$BACKUP_FILE") | mysql -u root -p

如果您想同时将新数据库恢复为$DB_TO (而不是$DB_FROM ),这意味着将数据库恢复为不同的名称,这里是完整的命令:

(sed '/^-- Current Database: `/q' "$BACKUP_FILE"; sed -n "/^-- Current Database: \`$DB_FROM\`/,/^-- Current Database: \`/p" "$BACKUP_FILE") | sed "s/\`$DB_FROM\`/\`$DB_TO\`/g" | mysql -u root -p

我的回答受到了这个以及这个这个网页的启发。

MariaDB 文档建议的方法是通过临时创建一个仅具有恢复对象权限的用户来仅恢复一个对象(表或数据库),如下所示:

GRANT SELECT
ON db1.* TO 'admin_restore_temp'@'localhost' 
IDENTIFIED BY 'its_pwd';

GRANT ALL ON db1.table1
TO 'admin_restore_temp'@'localhost';

之后,可以安全地进行还原:

mysql --user admin_restore_temp --password --force < /data/backup/db1.sql

向 @ anthony-o 大喊,以获得处理现有 --all-databases 转储的最佳答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM