Подтвердить что ты не робот

Как автоматизировать миграцию (схему и данные) для приложения PHP/MySQL

У меня есть приложение в PHP/MySQL. Я ищу автоматический способ обновления базы данных за приложением. Мне не нужно иметь совместимость со старыми версиями после его обновления.

Я прочитал jeff's и K. Скотта Аллена об этом.

Я все еще не уверен, как реализовать это для приложения PHP/MySQL.

Есть ли простой и хороший процесс для этого?

4b9b3361

Ответ 1

У меня есть объект "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

Ответ 2

Подобно предложению gnarf, я буду запускать со следующим:

  • Для каждого изменения схемы создайте файл SQL, который при запуске приведет вас от старой версии к новой версии (это может быть один файл на основную версию или множество небольших изменений).
  • Создайте отдельный файл, в котором перечислены все имена файлов SQL в том порядке, в котором они должны быть применены (самая старая сверху, самая новая внизу)
  • Создайте простую таблицу "версий" (все, что ей нужно - это один столбец VARCHAR) в вашей базе данных

Теперь вам нужно написать простой script, который работает следующим образом:

  • Запрос таблицы версий для имени последнего используемого файла обновления SQL
  • Если есть новые файлы изменений SQL, которые нужно запустить, выполните их последовательно.
  • записать имя последнего примененного файла SQL

Я надеюсь, что имеет смысл

Ответ 3

Попробуйте использовать этот инструмент для миграции схемы: https://github.com/idler/MMP/

Ответ 4

Я создал небольшую миграцию script для MySQL в PHP. Это хорошо для проектов на ранней стадии и тех, которые не нуждаются (еще) в более сложных сценариях миграции. https://github.com/kennberg/php-mysql-migrate

Ответ 5

Один из способов, которым вы можете это сделать, - выгрузить базу данных в большой sql файл с помощью mysqldump. Просто возьмите этот файл и отправьте его в новую установку.

Ответ 6

Вы не можете. Вы либо

  • Записывайте файлы обновлений со всеми sql, которые были выполнены в исходной среде, а затем выполняйте их (упомянутые выше), похожие на SVN. Нужен php script для выполнения и ручной работы для написания sql

  • Постобработать обе среды и предложить пользователю, какие обновления должны быть перенесены. В основном то же самое, что и первое, за исключением того, что у вас есть один большой шаг для миграции, а не много мелких кусков. SQLyog может анализировать различия для обеих схем и данных.

Ответ 7

Вы также можете использовать бесплатный API SqlQuerySync

или создать для себя таблицу базы данных, управляющую запросами CREATE/ALTER/DELETE.

Ответ 9

Программное обеспечение для работы с MySQL (может быть найдено на веб-сайте mysql) делает это. Это включает в себя повторяющиеся щелчные шаги, хотя.

Ответ 10

У меня та же цель: перенос большой базы данных (более миллиона строк в некоторых таблицах). Я рассматриваю возможность использования https://phinx.org, который, похоже, подходит для миграции схемы, кроме того, он поставляется с возможностью отката для обеспечения безопасности.

Ответ 11

Вы можете попробовать эту библиотеку: mysql-version-control.

Мне нравится этот, потому что он отличает между собой схему, данные ядра и данные теста. Но делает это таким образом, который по-прежнему очень прост в использовании.