如何自动化PHP / MySQL应用程序的迁移(模式和数据)

时间:2009-05-05 16:35:16

标签: php mysql deployment migration

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

我已阅读了jeff'sK. Scott Allen's条款。

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

这有什么简单而好的过程吗?

11 个答案:

答案 0 :(得分:18)

我使用的是“Schema”对象 - 但是如果没有类,你可以做同样的事情。

您要做的是创建一个“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

答案 1 :(得分:4)

与gnarf的建议类似,我将运行以下内容:

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

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

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

我希望这是有道理的

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我在PHP中为MySQL创建了一个很小的迁移脚本。这对于早期项目和那些不需要(更)复杂的迁移脚本的项目是有益的。 https://github.com/kennberg/php-mysql-migrate

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你做不到。你要么

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

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

答案 6 :(得分:0)

您还可以使用免费的API SqlQuerySync

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

答案 7 :(得分:0)

使用@malukenho

中的migratedb https://github.com/malukenho/MigrateDB

答案 8 :(得分:0)

MySQL的测试平台软件(可以在mysql网站上找到)就是这样做的。它涉及重复的点击步骤。

答案 9 :(得分:0)

我有同样的目标:迁移一个大型数据库(在某些表中超过一百万行)。我正在考虑使用https://phinx.org似乎很好地处理模式迁移,此外它还附带了安全的回滚选项。

答案 10 :(得分:0)

您可以尝试使用此库:mysql-version-control

我喜欢这个,因为它区分了架构,核心数据和测试数据。但它是否仍然非常容易使用。