在本地和远程开发环境之间同步数据库

8

最近我正在处理一个本地项目,并将其与在线服务器同步。

问题是,现在它涉及到数据库功能。这意味着每当我在本地做出数据库更改时,我必须访问网站的cPanel,进入PHPMyAdmin,删除整个数据库,并复制本地版本导出的SQL查询。

使用本地-远程设计逻辑,有没有更容易的方法来处理MySQL数据库?


许多框架都提供了用于对数据库进行“迁移”的工具;但是类似的工具,比如 phpmig,可以独立于任何框架执行相同的任务。 - Mark Baker
@MarkBaker,我不太明白phpmig是怎么工作的。你能详细解释一下吗? - Lucas
phpmig基本上提供了一种机制,用于构建一个PHP脚本来更新数据库的结构(以及可能的附加数据或更改数据),以便与升级一起使用(同时具有还原这些更改的方法)。 - Mark Baker
3个回答

2

这是开发中更具挑战性的方面之一,当你有多个开发人员和潜在的多个分支和/或服务器时,环境经常会发生变化。然而,由于我们不知道确切情况,很难说它会对您产生什么影响。

你当前操作的一个元素可能是消除登录到各种接口的需求,并使用脚本来实现你需要的内容 - 更少的手动操作;更多的自动化... 最基本的是,你可以创建一个 PHP 脚本:

  • 备份你的生产数据库并将其保存为唯一的备份
  • 应用你的更改(或者如果需要,进行整个重建)
  • 允许你在出现问题时恢复备份

一般选项:

更新而非重建

除非所有数据都发生了更改(并且需要更改),否则没有必要在任何环境中删除整个数据库并重新构建。最基本的是,需要更改结构/模式而不是完全重建。

复制

可以使用主-主或主-从复制同步 MySQL 数据库,但有时这在某些环境中过度,除非非常小心地管理,否则可能会破坏功能。如果你在本地(在开发环境中)进行了更改,它们可能会破坏你的远程站点功能...

使用框架工具

如果你正在使用现代框架,其中许多都带有工具来促进数据库更新和更新(以及潜在的回滚),但通常它们并不完美,因为你可能需要更新特定的数据或表格,这些不能轻松地回滚。

我的当前设置

¬ multiple local developers
  ¬ multiple dev branches 
    ¬ development
      ¬ staging server 
          live

在我们的情况下,我们使用一个定制的脚本(以及链接的SQL文件),允许每个开发人员通过运行以下命令从命令行应用更改并将更改推广到分支:
php migrate.php server/branch update 

或者:

php migrate.php server/branch rollback

这个可以为基本设置简化,但是我不知道如何做到更简单,除非了解更多的情况。 默认情况下,也值得在dba.stackexchange.com上提出这个问题,因为你将获得精确的面向数据库的回复。


0

我会在远程制作一个PHP页面,其中包含一个文本框,可以输入ALTER语句,您只需粘贴并单击即可。如果通过80端口访问该页面,则需要使用强制https重定向、密码和IP验证进行保护,以便只有您才能运行它-这仅需要几行代码。


但这并没有帮助 - 访问PHPMyAdmin更安全,而且在许多方面使用起来更容易。 - Lucas
你的问题的重点是不想使用phpMyAdmin,对吗?你对运行ALTER语句的脚本有什么安全顾虑?此外,为什么需要删除并重新创建整个数据库? - BarryDevSF
不,只是我认为手动更新远程和本地数据库长时间变得非常困难。 - Lucas

-1

是的。但是!

首先,您必须在远程服务器上创建一个MySQL用户,该用户被允许从您的本地PC连接,或者如果您勇敢的话,从任何IP连接。例如:think123@yourIp 或 think123@%,使用非常强的密码。

如果您无法或不被允许执行此操作,则答案为否。有些主机允许此操作,而有些则不允许。请查看您的cPanel。

如果他们允许此操作,则您可以从运行在本地计算机上的phpMyAdmin中访问远程服务器。但是,您必须对本地phpMyAdmin进行一些配置更改,以通知它有关其他可能的连接。

在 \wamp\alias\phpmyadmin.conf 中,应该有一个类似于以下内容的部分:

$i = 0;

/*
 * First server
 */
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

你需要做的是添加另一个$cfg['Servers']来告诉phpMyAdmin它有另一个可能的连接。就像这样:-
$i = 0;

/*
 * First server
 */
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

/*
 * Second Server
 */
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'REMOTE_SERVERS_IP';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

当您运行本地的phpMyAdmin时,它应该在登录界面上添加另一个字段,即下拉菜单,用于选择要使用的连接。

-1,这不是关于使用phpMyAdmin进行远程访问的问题,而是询问如何自动化当前使用它完成的过程,完全绕过它。 - Charles
@Charles 你可能是对的,我猜我误读了问题!但这至少可以让他/她从一个地方完成所有操作,而不必不断登录到cPanel等等。我不确定这是否真的应该被投下反对票,因为提问者实际上并没有指定自动化这个词! - RiggsFolly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接