【问题标题】:How to automate migration (schema and data) for PHP/MySQL application如何为 PHP/MySQL 应用程序自动迁移(模式和数据)
【发布时间】:2010-10-23 23:18:42
【问题描述】:

我有一个 PHP/MySQL 应用程序。我正在寻找一种自动方式升级应用程序背后的数据库。 升级后我不需要兼容旧版本。

我已阅读 jeff'sK. Scott Allen's 关于此的文章。

我仍然不确定如何为 PHP/MySQL 应用程序实现这一点。

有没有什么简单又好的流程呢?

【问题讨论】:

    标签: php mysql deployment migration


    【解决方案1】:

    我有一个我使用的“架构”对象 - 但你可以在没有类的情况下做同样的事情..

    您要做的是创建一个“db_schema_versions”表:

    CREATE TABLE db_schema_versions (
      `table` varchar(255) NOT NULL PRIMARY KEY, 
      `version` INT NOT NULL
    )
    

    在您的数据库可以跟踪它所在的版本之后 - 它可以自动进行 SQL 升级。

    您应该在升级架构时锁定您的架构表。这样您就不会同时有两个请求尝试升级您的架构。

    所以 - 跟踪您要升级的版本 - 构建一个大交换机 - 像这样:

    class SNTrack_Db_Schema extends MW_Db_Schema_Abstract {
      protected $table = "sntrack_db_schema";
      protected $version = 5;
    
      protected function upgrade($fromVersion) {
        // don't break
        switch($fromVersion) {
          case 0:
            $this->db->query('CREATE TABLE sntrack_inbound_shipment (
                `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                `from` VARCHAR(255) NOT NULL,
                `date` DATE NOT NULL,
                `invoice` VARCHAR(255) NOT NULL,
                `notes` TEXT
              )');
            $this->setVersion(1);
          case 1:
            $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT');
            $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0');
            $this->db->query('CREATE TABLE sntrack_inventory_shipment (
                `shipment_id` INT NOT NULL,
                `product_id` INT NOT NULL,
                `qty` INT NOT NULL,
                PRIMARY KEY (`shipment_id`, `product_id`)
              )');
            $this->setVersion(2);
    ...etc
    

    【讨论】:

    • 如果用户从版本 2 升级到版本 6。您会遍历每个版本 2-6 并在开关 2、3、4、5 和 6 中运行每个 SQL,以便每次升级switch只是从之前版本升级的sql?
    【解决方案2】:

    类似于 gnarf 的建议,我将使用以下内容:

    • 为架构的每次更改创建一个 SQL 文件,运行该文件时会将您从旧版本带到新版本(这可能是每个主要版本一个文件或许多较小的更改)。
    • 创建一个单独的文件,按照它们必须应用的顺序列出每个 SQL 文件名(最旧的在顶部,最新的在底部)
    • 在您的数据库中创建一个简单的“版本控制”表(它只需要一个 VARCHAR 列)

    现在您需要编写一个按以下方式工作的简单脚本:

    • 在版本控制表中查询上次应用的 SQL 更新文件的名称
    • 如果有较新的 SQL 更改文件要运行,请按顺序执行它们
    • 记录最新应用的 SQL 文件的名称

    我希望这是有道理的

    【讨论】:

    • +1 以获得良好的逻辑。但是你如何从 PHP 中执行 sql 文件呢? SOURCE file.sql 不适用于 mysqli_real_query!或者你如何编写脚本?
    • 也许你必须爆炸;查找语句(但这很容易破坏)。可以使用 cat /some/deployment-file.sql | mysql ... 的某种不太好的实现
    【解决方案3】:

    尝试使用此工具进行架构迁移:https://github.com/idler/MMP/

    【讨论】:

    • 我已经合并了您的注册和未注册帐户,因此您可以完全控制自己的帖子。
    【解决方案4】:

    我用 PHP 为 MySQL 创建了一个小型迁移脚本。它适用于早期项目和那些(还)不需要更复杂的迁移脚本的项目。 https://github.com/kennberg/php-mysql-migrate

    【讨论】:

      【解决方案5】:

      一种方法是使用 mysqldump 将数据库转储到一个大的 sql 文件中。只需获取该文件并在新安装中获取它。

      【讨论】:

        【解决方案6】:

        你不能。你要么

        1. 使用在源环境中执行的所有 sql 编写更新文件,然后执行它们(如上所述),类似于 SVN。需要php脚本来执行和手动编写sql

        2. 对两个环境进行后分析,并向用户建议应该迁移哪些更新。与第一个基本相同,只是您有一个很大的迁移步骤,而不是很多小块。 SQLyog 可以分析模式和数据的差异。

        【讨论】:

          【解决方案7】:

          您也可以使用免费的 API SqlQuerySync

          或为自己创建一个管理 CREATE / ALTER / DELETE 查询的数据库表。

          【讨论】:

            【解决方案8】:

            使用来自@malukenho 的 migratedb https://github.com/malukenho/MigrateDB

            【讨论】:

              【解决方案9】:

              MySQL bench 软件(可以在 mysql 网站上找到)可以做到这一点。但它涉及重复的点击步骤。

              【讨论】:

                【解决方案10】:

                我的目标相同:迁移大型数据库(某些表中超过一百万行)。我正在考虑使用https://phinx.org,这似乎很适合处理架构迁移,此外它还带有回滚选项以确保安全。

                【讨论】:

                  【解决方案11】:

                  你可以试试这个库:mysql-version-control

                  我喜欢这个,因为它区分了模式、核心数据和测试数据。但它的使用方式仍然非常容易使用。

                  【讨论】:

                    猜你喜欢
                    • 2016-12-12
                    • 2017-02-26
                    • 2011-07-08
                    • 1970-01-01
                    • 2020-01-22
                    • 2010-11-26
                    • 2012-04-27
                    • 2011-02-21
                    相关资源
                    最近更新 更多