【问题标题】:How do I migrate new MySQL database structure from dev to production website using the command line?如何使用命令行将新的 MySQL 数据库结构从开发网站迁移到生产网站?
【发布时间】:2010-12-15 08:05:25
【问题描述】:

我有两个网站环境(单独的服务器,Media Temple DV):开发和生产。

我们开始在 Production 上构建站点,然后得到了一个 Dev 服务器,所以我最初使用如下命令将 Production 数据库移动到 Dev:

$ mysqldump -a -u USERNAME -p DATABASE > OUTPUT.mysql
$ gzip OUTPUT.mysql

然后我创建了 Dev 服务器网站和数据库,将 OUTPUT.mysql 移过来并在 Dev 上设置 MySQL 环境以进行导入:

$ mysql -u USERNAME -p DATABASE

set up environment for large data import: 
mysql> set global net_buffer_length=1000000; 
mysql> set global max_allowed_packet=1000000000;
mysql> exit

并使用以下命令将数据和架构导入 Dev:

$ gunzip -f OUTPUT.mysql.gz
$ mysql -u USERNAME -p TARGET_DATABASE_NAME < OUTPUT.sql

现在我对 Dev MySQL 数据库的结构进行了更改,例如在现有表中添加/删除字段,以及添加表,我想将我的更改迁移到生产。

如何仅从 Dev 数据库迁移更新的结构并使用命令行导入到生产中,类似于我最初所做的,但不会覆盖实时数据? (我所有的实时数据都在生产上,所以不需要从 Dev 带来数据。)

数据库已经变得太大,无法使用 phpMyAdmin 执行此操作(此外,命令行似乎更快更容易使用)。远离第三方工具或开源软件会很好,因为这看起来应该是一个简单的过程,我可以将其放入脚本中。还是我做错了,我错过了更好的东西?

更新:因此,基于以下答案和额外阅读,我最终编写了一个 PHP 脚本来检查实时数据库和我的本地数据库(包括一些更改)并比较差异桌子之间。

脚本使用 MySQL“SHOW TABLES”功能在两个数据库上查找实时数据库和本地数据库中缺少哪些表并进行比较。对于这些缺失的表,我使用 SHOW CREATE TABLE 来获取用于创建表的 MySQL 语句。

同样,该脚本通过对每个数据库中的每个表使用 SHOW COLUMNS FROM $table 来查找缺少哪些列。这个 MySQL 命令返回列名和属性,因此我可以为丢失的列自动构建 ALTER TABLE 语句。

最后,PHP 脚本将所有内容输出为用于创建和更改表的 SQL 脚本,我在 phpMyAdmin 中运行了该脚本。

【问题讨论】:

    标签: php mysql unix


    【解决方案1】:

    你有两个选择:

    1. 手动检查每个表并确定要执行哪些 ALTER 命令以对生产环境进行与您对开发环境所做的相同的更改

    2. 使用 mysqldump 备份生产服务器中的所有数据,并告诉它跳过 DROP/CREATE TABLE 语句(通过 --help 查看命令行选项)。然后仅从开发服务器转储架构,将其导入生产服务器,然后导入备份以重新获取行。这要求您没有删除任何列。

    将来,您会希望开始跟踪架构更改。像 Doctrine、ActiveRecord 这样的现代 ORM 有一些称为“迁移”的东西,可以帮助您管理这些并通过跟踪架构版本将它们应用到数据库中。

    【讨论】:

      【解决方案2】:

      你需要产生一些SQL语句来升级数据库的结构。

      至少,您可以使用mysqldump 转储两个数据库没有数据,只转储结构,然后使用diff 查看发生了什么变化。这样,您可以为新表包含 create table 语句,并为更改的表编写 alter table 语句以升级它们。

      也许某个地方有一个免费脚本可以生成那些alter table 命令,这听起来确实是一个有趣的小项目。

      或者,您可以重命名旧表,导入开发数据库,​​再次没有数据,然后将旧表中的数据插入到新表中

      insert into mytable (col1, col2) select (col1, col2) from oldmytable;
      

      其中“col1, col2”等是旧表中的列。

      同样,可以查询数据库中每个表有哪些列,这样您就可以轻松编写脚本来生成这些插入语句。

      对于第二种方法,数据库必须离线一段时间(或很长时间,具体取决于数据库的大小)。

      【讨论】:

        【解决方案3】:

        如果您不想删除生产数据,恐怕会很痛苦。

        • 您可以使用的一个工具是mysql workbench。通过对您的开发数据库进行逆向工程来创建 EER 模式,并尝试与您的生产服务器同步。您必须查看 mysql-workbench 将执行的所有查询,因为它可能很危险。我建议您在开始任何事情之前进行备份。

        • 第二种可能性是您比较每个表并为每个不同的表编写一些 ALTER table 查询,例如当您向该表删除/更改/添加一些字段时。

        我认为您下次应该启动一些数据库迁移工具,例如rake。如果您不想使用工具,您应该使用所有更改创建一些 SQL 脚本,以便您可以轻松升级 DB 方案。 mysql 工作台也很安静,可以完成这些任务,但仍然有点问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-10
          • 2011-06-03
          相关资源
          最近更新 更多