【问题标题】:Complete database reset for MySQL dump?为 MySQL 转储完成数据库重置?
【发布时间】:2014-05-22 00:46:44
【问题描述】:

这似乎是一个非常愚蠢的问题,但我没有以任何其他方式学习它,我只是想澄清一下。

我前段时间开始使用 MySQL,为了测试各种场景,我备份了我的数据库。我为此使用了 MySQL 转储:

导出:

mysqldump -hSERVER -uUSER -pPASSWORD --all-databases > 文件名.sql

进口:

mysql -hSERVER -uUSER -pPASSWORD

很简单,到目前为止它运行良好,当我注意到这个“设置”的一个小问题时:它没有完全“重置”数据库和表。例如,如果在创建转储文件后添加了一个附加表,那么如果您导入相同的转储文件,该附加表将不会消失。它本质上只是“更正”已经存在的表并重新创建任何缺少的数据库或表,但不会删除任何其他表,这些表的名称恰好不在转储文件中。

我想要做的是在导入这样的转储文件时完全重置服务器上的所有数据库。最好的解决方案是什么?是否为此目的保留了特殊的导入功能,还是我必须先自己删除数据库?还是这是个坏主意?

【问题讨论】:

  • 在不备份的情况下删除数据绝不是个好主意。
  • AFAIK,从 SQL 文件导入不会删除数据,除非 SQL 文件包含 DELETE/DROP 查询。

标签: mysql sql database


【解决方案1】:

您可以使用参数 --add-drop-database 在每个“create database”语句之前向转储中添加“drop database”语句。

例如

mysqldump -hSERVER -uUSER -pPASSWORD --all-databases --add-drop-database >filename.sql

详情请参阅here

【讨论】:

    【解决方案2】:

    您描述的转储和恢复过程没有什么神奇之处。 mysqldump 写出描述您正在转储的一个或多个数据库的当前状态的 SQL 语句。它必须获取您要转储的每个数据库中的表列表,然后必须逐个读取这些表并将它们写为 SQL。在任何规模的数据库上,这都需要时间。

    因此,如果您在 mysqldump 运行时创建一个新表,它可能不会选择该新表。同样,如果您的应用软件在 mysqldump 运行时更改了表的内容,这些更改可能会或可能不会显示在备份中。

    您可以查看mysqldump 写出的 .sql 文件,看看他们收集了什么。如果您想确保转储的 .sql 文件完美无缺,您需要在一个安静的服务器上运行 mysqldump——没有人在运行数据定义语言。

    MySQL 热备份解决方案可用。你可能需要调查一下。

    【讨论】:

      【解决方案3】:

      OP 可能想要调查

      mysql_install_db
      

      如果他们想要使用安装后默认设置重新开始 恢复一个或多个转储数据库之前的设置。为了 生产服务器,另一个有用的脚本是:

      mysql_secure_installation
      

      此外,他们可能更愿意转储他们单独创建的数据库:

      mysqldump -hSERVER -uUSER -pPASSWORD --database foo > foo.sql
      

      为避免无意中更改内部数据库: mysql、information_schema、performance_schema。

      【讨论】:

        猜你喜欢
        • 2020-06-07
        • 2012-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        相关资源
        最近更新 更多