Капистрано: Как развернуть базу данных MySQL для PHP-приложения?


Я разрабатываю приложение на основе PHP и использую Capistrano для его развертывания на своем веб-сервере.

До сих пор я не использовал базы данных, и, следовательно, развертывание работало нормально.

Однако теперь я пытаюсь использовать базу данных MySQL также и с этим приложением, и мне было интересно, есть ли возможность развертывания базы данных, а также на удаленном сервере с Capistrano - так, как это делается для баз данных Rails.

С уважением
Нихил Гупта

Author: marc_s, 2011-03-09

3 answers

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

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

Возможно, вы захотите попробовать с этим код:

set :mysql_params, "-u user -ppassword"
set :mysql_db_name, "database_name"

after :deploy, :migrate
desc "migrate database on server"
task :migrate do
  run "touch #{shared_path}/migration.list ;
ls -1v #{current_path}/sql/*.sql 2>/dev/null > #{shared_path}/migration.available;
diff #{shared_path}/migration.available #{shared_path}/migration.list | awk \"/^</ {print \\$2}\" | while read f ;
do echo \"migrating $(basename $f)\"; mysql #{mysql_params} #{mysql_db_name} < $f && echo $f >> #{shared_path}/migration.list ; done;
rm -f #{shared_path}/migration.available"
end

after "deploy:setup", :create_db
desc "create database on server"
task :create_db do
  run "mysql #{mysql_params} -e \"CREATE DATABASE #{mysql_db_name}\""
end

И, что наиболее важно, чтобы сохранить порядок миграций, вы должны называть свои миграции последовательными номерами или date_time, поэтому пример вывода ls -1v #{current_path}/migrations/*.sql будет выглядеть так:

0001_create_database.sql
0002_create_user_table.sql
0003_add_password_to_users.sql
20101205_141534_add_admin_user.sql
20110108_090712_create_post_table.sql
20110210_165609_create_comment_table.sql

Записи даты и времени используют формат YYYYmmdd_hhMMss_title.sql

 6
Author: mpapis, 2011-04-18 11:06:47

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

Я несколько раз выступал на эту тему и публиковал свои слайды (формат HTML) на GitHub: https://github.com/wjgilmore/Automating-Deployments-with-Phing--Capistrano-and-Liquibase

Включает бонусные материалы для развертывания PHP-сайтов с использованием Capistrano. :-)

 7
Author: Jason, 2011-04-19 15:26:45

Насколько я знаю, существует 3 полностью автоматических подхода к развертыванию базы данных на рабочем сервере.

  • Используйте ликвидную базу , напишите (или создайте ) наборы изменений, которые содержат ваш код миграции.
  • Используйте источник событий с реляционным кэшем чтения, имеющим ту же структуру, что и обычно. Отправьте дамп схемы вместе с вашими выпусками. Очистите весь кэш чтения, включая таблицы. Воссоздайте таблицы, используя дамп. Повторная вставка данных в одной транзакции используя хранилище событий и прогнозы. Откат не так уж и сложен, вы можете сбросить свой старый кэш чтения или выполнить те же действия со старым выпуском.
  • Напишите свой собственный сценарий миграции и sql для каждого выпуска. Не рекомендуется, так как это может привести к ошибкам.
 0
Author: inf3rno, 2014-05-15 03:26:16