【问题标题】:Import single database from --all-databases dump从 --all-databases 转储导入单个数据库
【发布时间】:2023-03-24 09:37:01
【问题描述】:

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

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

【问题讨论】:

    标签: mysql database import mysqldump


    【解决方案1】:

    您可以使用以下命令:

    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 - 见his page

    【讨论】:

    • 很好的解决方案!这表示我必须添加原始转储标头以避免一些错误...
    • 这应该是公认的答案
    • 请注意,这在Powershell中不起作用,但在cmd中起作用
    • sed这个东西真的很有帮助!
    • 你怎么会说另一种选择,恕我直言更安全?使用--one-database有什么风险吗?
    【解决方案2】:

    mysqldump 输出只是一组SQL 语句。

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

    mysql -D mydatabase -o mydatabase < dump.sql
    

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

    【讨论】:

    • 感谢您的快速答复!太棒了。
    • 对我很有用,谢谢!!您可以添加 --disable-keys 以避免外键错误;) mysql -u user -D --disable-keys database -o
    • 这是一个非常鲁莽且非常危险的答案。如果您启动 mysqldump --all-databases,mysqldump 输出将包含 MySQL 实例中每个数据库的 DROP DATABASE IF EXISTS dbname; CREATE DATABASE dbname; USE dbname;,包括 mysql 模式。请查看 mysqldump 文档:dev.mysql.com/doc/refman/5.5/en/…。这意味着每个数据库都会被无情地覆盖。你能提供证据证明它将跳过所有数据库,但一个???注意:您可以使用 mysqlbinlog 对二进制日志执行此操作。
    • 对于偏执狂,我首先创建了一个只有特定数据库权限的用户,然后使用该用户的凭据运行此命令。尝试切换数据库时出现错误,但保留了特定数据库的数据。
    • 这个答案不正确。从 mysqldump --all-databases 生成的文件中读取 MySQL 语句时,-D 选项无效。此外,它将在 mysql 模式中 DROP 和 CREATE 表,包括用户表。
    【解决方案3】:

    使用 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"),导入可能会失败。

    【讨论】:

      【解决方案4】:

      以下命令仅从 $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
      

      我的回答受到this one 以及this onethis webpage 的启发。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 2016-07-31
        • 2010-09-23
        • 1970-01-01
        • 2011-06-10
        • 2011-07-22
        • 1970-01-01
        相关资源
        最近更新 更多