Capistrano:如何为PHP应用程序部署MySQL数据库?

时间:2011-03-09 13:58:59

标签: php mysql capistrano

我正在开发一个基于PHP的应用程序,并使用Capistrano将其部署到我的网络服务器。

到目前为止,我还没有使用数据库,因此部署运行良好。

然而,现在我正在尝试使用这个应用程序的MySQL数据库,并且想知道,如果有可能部署数据库,以及使用Capistrano的远程服务器 - 就像Rails的数据库那样。

问候
尼基尔古普塔

3 个答案:

答案 0 :(得分:7)

关于这个问题,我迟到了,但是无论如何要发帖,因为这是一个很少回答的常见问题。我一起使用Phing和Liquibase取得了巨大的成功,您可以使用Liquibase以高度正式的方式向前和向后滚动数据库更改,甚至可以跟踪版本控制中的更改。

我已多次介绍此主题并将我的幻灯片(HTML格式)发布到GitHub:https://github.com/wjgilmore/Automating-Deployments-with-Phing--Capistrano-and-Liquibase

包含使用Capistrano部署PHP网站的奖励材料。 : - )

答案 1 :(得分:6)

数据库部署的全部魔力是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

date_time条目使用格式YYYYmmdd_hhMMss_title.sql

答案 2 :(得分:0)

据我所知,有3种全自动方法可以将数据库部署到生产服务器。

  • 使用liquibase,编写(或generate)变更集,其中包含您的迁移代码。
  • 使用event sourcing,关系读缓存具有与正常相同的结构。使用您的版本发送架构转储。清除整个读缓存,包括表。使用转储重新创建表。使用事件存储和投影在单个事务中重新插入数据。回滚并不是那么难,您可以转储旧的读取缓存,或者您可以使用旧版本执行相同的步骤。
  • 为每个版本编写自己的迁移脚本和sql。不推荐,因为它容易出错。