Как перенести новую структуру базы данных MySQL из dev на рабочий сайт с помощью командной строки? - PullRequest
3 голосов
/ 15 декабря 2010

У меня есть две среды веб-сайтов (отдельные серверы, Media Temple DV): Dev и Production.

Мы начали создавать сайт на Production, затем получили сервер Dev, поэтому я изначально переместил базу данных Production на Dev, используя такие команды:

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

Затем я создал веб-сайт сервера Devи базы данных, переместил OUTPUT.mysql и настроил среду MySQL в Dev для импорта:

$ 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, такие как добавление / удаление полей в существующих таблицах и добавление таблиц, и я хотел бы перенести свои изменения в Production.

Как мне перенести только обновленную структуру из базы данных Dev и импортировать в Production с использованием командной строки, аналогично тому, что я делал изначально, но без перезаписи живых данных?(Все мои оперативные данные находятся в рабочей среде, поэтому нет необходимости переносить данные из Dev.)

База данных стала слишком большой, чтобы сделать это с помощью phpMyAdmin (кроме того, командная строка кажется быстрее и прощеработать с).Было бы неплохо держаться подальше от сторонних инструментов или программного обеспечения с открытым исходным кодом, потому что кажется, что это должен быть простой процесс, который я могу добавить в сценарий.Или я ошибаюсь и что-то лучшее, что мне не хватает?

ОБНОВЛЕНИЕ : Итак, основываясь на приведенных ниже ответах и ​​дополнительном чтении, я написал сценарий PHP, который проверяет как действующую базу данных, так и мою локальную базу данных (включая некоторые изменения) и сравниваетразличия между таблицами.

Сценарий находит, какие таблицы отсутствуют в действующей базе данных по сравнению с локальной, используя функцию MySQL «SHOW TABLES» для обеих баз данных и сравнения.Для этих таблиц, которые отсутствуют, я использовал SHOW CREATE TABLE, чтобы получить операторы MySQL для создания таблиц.

Аналогично, скрипт находит, какие столбцы отсутствуют, используя таблицу SHOW COLUMNS FROM $ для каждой таблицы в каждой базе данных.Эта команда MySQL возвращает имена и атрибуты столбцов, поэтому я мог бы автоматически создавать операторы ALTER TABLE для отсутствующих столбцов.

Наконец, PHP-скрипт выводит все как SQL-скрипт для создания и изменения таблиц, которые я запускал в phpMyAdmin.

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010

У вас есть два варианта:

  1. Вручную изучить каждую таблицу и определить, какие ALTER команды нужно выполнить, чтобы внести те же изменения в производство, что и в среду разработки

  2. Используйте mysqldump для резервного копирования всех данных на производственном сервере и попросите его пропустить операторы DROP / CREATE TABLE (посмотрите параметр командной строки --help).Затем выведите схему только с сервера разработки, импортируйте ее на рабочий сервер и импортируйте резервную копию, чтобы вернуть строки. Для этого необходимо, чтобы вы не удалили столбцы.

В будущем вы захотите начать отслеживать изменения вашей схемы.В современных ORM, таких как Doctrine, ActiveRecord есть так называемые «миграции», которые помогают вам управлять ими и применять их к базе данных, отслеживая версию схемы.

3 голосов
/ 15 декабря 2010

Вам необходимо создать несколько операторов SQL для обновления структуры базы данных.

По крайней мере, вы можете использовать mysqldump для выгрузки обеих баз данных без данных , простоструктуру, и используйте diff, чтобы увидеть, что изменилось.Таким образом, вы можете включить операторы create table для новых таблиц и написать операторы alter table для тех таблиц, которые изменились, чтобы обновить их.

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

В качестве альтернативы, вы можете переименовать старые таблицы, снова импортировать базу данных разработки без данных и вставить данные из старых таблиц в новые таблицы с помощью

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

, где "col1, col2" и т. Д. Являются столбцами из старой таблицы.

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

Для второго подхода база данных должна будет некоторое время отключаться (или долго, в зависимости от размера базы данных).

1 голос
/ 15 декабря 2010

Боюсь, если вы не хотите стереть производственные данные, которые будут болезненными.

  • Одним из инструментов, который вы можете использовать, является mysql workbench .Создайте схему EER путем обратного инжиниринга вашей базы данных разработки и попытайтесь синхронизировать ее с вашим рабочим сервером.Вы должны просмотреть все запросы, которые будет выполнять mysql-workbench, потому что это может быть опасно.Я советую вам сделать резервную копию, прежде чем начать что-либо.

  • Во-вторых, вы можете сравнить каждую таблицу и написать несколько ALTER table запросов для каждой таблицы, например, когда вы удалили / изменили / добавили некоторые поля в эту таблицу.

Я думаю, вам следует запустить некоторые инструменты миграции БД в следующий раз, например rake .Если вы не хотите использовать инструмент, вам следует создать несколько сценариев SQL со всеми вашими изменениями, чтобы вы могли легко обновить схему БД.Кроме того, MySQL хорошо подходит для выполнения подобных задач, но все еще немного глючит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...