【问题标题】:Copy a database with data in MySQL使用 MySQL 中的数据复制数据库
【发布时间】:2011-09-08 15:00:28
【问题描述】:

我的服务器上的数据库中有一组基本数据。当用户注册我的服务时,我希望能够将此数据库复制到另一个已创建的数据库中。有没有使用 PHP / MySQL 的简单有效的方法来做到这一点?纯 MySQL 会更好。

我曾考虑循环遍历基础数据库中的所有表,但我不知道如何创建包含新数据库列的表。

运行 PHP 5.1 和 MySQL 5。

谢谢。

【问题讨论】:

  • 不要冒昧……但你确定要这样做吗?
  • 嗯,是的。这个问题背后的原因是什么?我有一个数据库,该数据库将始终使用程序的最新更改进行更新。在我看来,将其用作一组基础数据是有意义的……
  • 你可以尝试 mysql dump 命令然后再次导入它:P
  • 随着产品的不断更新,数据库经常发生变化。我只是在寻找复制一组默认数据的方法,而不是对我没有提供任何信息的应用程序结构背后的批评。
  • ... 如果您担心性能,请尝试partitioning 并设置适当的indices。至于“[您的]应用程序结构背后的批评”,有时正确的答案是当前的任务是错误的事情,您应该以不同的方式实现您的overall goal

标签: php mysql


【解决方案1】:

如果您有权使用 make "exec" 系统调用,您可以执行以下操作

exec("mysql -u".$DB_USER." --password='".$DB_PASS."' -e 'DROP DATABASE IF EXISTS `".$NEW_DB."`; CREATE DATABASE `".$NEW_DB."`;'");
exec("mysqldump -u".$DB_USER." -p'".$DB_PASS."' ".$EXISTING_DB." | mysql -u ".$DB_USER." --password='".$DB_PASS."' ".$NEW_DB);

这将删除 $NEW_DB(如果存在)并重新创建它,然后将 $EXISTING_DB 中的所有表和数据转储到 $NEW_DB 中

免责声明:在命令行上传递您的 mysql 密码通常不是一个好主意。我不确定,但我猜这可能会被具有 root 访问权限的人查看,他们能够查看所有进程和启动它们的命令行选项。

另外,关于如何在新数据库中创建具有与另一个匹配的列的表的其他问题,您可以使用以下 SQL

CREATE TABLE new_database.new_table LIKE old_database.old_table

【讨论】:

    【解决方案2】:

    我的首选方式是使用来自MySQL WorkbenchMigration Wizard。经过一些使用/练习后,它使用起来非常简单快捷(一些使用后约 5 分钟)。

    提示:最棘手的部分是“对象迁移”->“手动编辑”。您应该切换到“查看:所有对象”来调整您的新架构。

    提示 2:您还可以同时迁移/复制和备份。旧的数据库当然会被保留。

    另一个比较好的工具是synchronization feature in phpMyAdmin。它有点 hacky 并且不那么直观,但如果您不能使用 Workbench,它可能会起作用。

    【讨论】:

    • 好的,刚刚看到您想在客户注册时即时执行此操作。所以我的回答不太合适,但它仍然是一种快速且安全地复制数据库的好方法。
    【解决方案3】:

    我不认为为每个注册复制数据库是一个好的选择。 您应该让每个签名用户共享基础数据库并根据需要查询所需的数据,而不是做太多的重复。

    如果您知道基础数据库的架构,我不明白为什么您在创建相应表时遇到问题。

    您拥有的客户越多,您就越应该考虑分享而不是复制。尽管数据库是为事务设计的,但您应该尽可能避免不必要的写入,因为这会占用太多时间和资源。

    【讨论】:

    • 我有 150 多个客户,行数可以增长到数百万。一个数据库不是一个好主意,也不是一个很好的建议。
    • 如果您的数据库设计得当(带有索引等),那么数百万行应该不会导致任何问题,并且您不必为每个用户复制数据库。如果数据库设计不当,您将遇到无法通过为每个用户复制数据库来解决的问题。
    【解决方案4】:

    第 1 步。您需要编写 SQL 语句来创建每个数据库及其(空)表。您可以在您的 php 代码中执行此操作。如果有任何额外内容,例如:索引、触发器、sp 等,您必须同样创建它们。

    第 2 步。仍然在您的 php 代码中,连接到您的基础数据库以及新数据库,并执行您的 SQL 语句以将基础数据复制(选择..插入)到新数据库中。

    【讨论】:

      【解决方案5】:

      如果我理解正确,您希望在每次用户注册时执行某种类型的快照。这不是可以很好扩展的东西。我的建议;

      MySQL:使用触发器。 MySQL:使用 MySQL 复制 PHP:将相同的语句写入两个不同的地方。

      复制可能是实现所需结果的最佳方式,而且它允许您在不增加主服务器负载的情况下对数据执行临时报告。

      【讨论】:

        【解决方案6】:

        这是一篇文章,介绍了备份和恢复数据库的十种方法。每个都使用不同的方法,其中大多数可能适用于您的情况,但也有一些适用:

        http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html

        第六篇谈到创建转储文件然后再次恢复它。您可以使用它来转储数据,然后您可以将其恢复到新数据库。

        这里的另一个选项是制作数据库的物理副本。如果您将数据库存储在不同的位置,这可能是一种选择。它不会这么简单,但它应该可以正常工作。

        最后,您可以从 PHP 运行一个脚本,该脚本将为您执行 MySql 转储命令。这将允许您复制整个数据库并将其设置在新的位置,这样您甚至不必建立数据库即可完成此操作:

        MySQL to MySQL clone with PHP

        【讨论】:

          猜你喜欢
          • 2012-09-15
          • 2015-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 2012-07-10
          • 2020-05-13
          • 2010-12-25
          相关资源
          最近更新 更多