如何使用命令行将新的MySQL数据库结构从开发人员迁移到生产网站?

时间:2010-12-15 08:05:26

标签: php mysql unix

我有两个网站环境(单独的服务器,Media Temple DV):Dev和Production。

我们开始在Production上构建网站,然后获得了Dev服务器,所以我最初使用以下命令将Production数据库移动到Dev:

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

然后我创建了Dev服务器网站和数据库,移动OUTPUT.mysql并在Dev上设置MySQL环境以进行导入:

$ 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 $ table来查找缺少哪些列。这个MySQL命令返回列名和属性,因此我可以自动为缺少的列构建ALTER TABLE语句。

最后,PHP脚本输出所有内容作为创建和更改表的SQL脚本,我在phpMyAdmin中运行。

3 个答案:

答案 0 :(得分:4)

您有两种选择:

  1. 手动检查每个表并确定执行哪些ALTER命令以对生产环境进行与生产环境相同的更改

  2. 使用mysqldump备份生产服务器中的所有数据,并告诉它跳过DROP / CREATE TABLE语句(通过--help查看命令行选项)。然后仅从开发服务器转储模式,将其导入生产服务器,然后导入备份以重新获取行。这要求您没有删除任何列。

  3. 将来,您需要开始跟踪架构更改。像Doctrine,ActiveRecord这样的现代ORM有一些叫做“迁移”的东西,它可以帮助你管理这些东西,并通过跟踪模式版本将它们应用到数据库中。

答案 1 :(得分:3)

您需要生成一些SQL语句来升级数据库的结构。

至少,您可以使用mysqldump转储没有数据的数据库,只转储结构,并使用diff查看已更改的内容。这样,您可以包含新表的create table语句,并为那些已更改的表编写alter table语句,以升级它们。

也许有一个可以生成alter table命令的免费脚本,它听起来确实像一个有趣的小项目。

或者,您可以重命名旧表,再次导入开发数据库而不使用数据,并通过

将旧表中的数据插入到新表中
insert into mytable (col1, col2) select (col1, col2) from oldmytable;

其中“col1,col2”等是旧表中的列。

同样,可以查询数据库中每个表的列数,以便您可以轻松编写脚本来生成这些插入语句。

对于第二种方法,数据库必须离线一段时间(或者很长一段时间,具体取决于数据库的大小)。

答案 2 :(得分:1)

如果您不想删除那些令人痛苦的生产数据,我担心。

  • 您可以使用的一个工具是mysql workbench。通过逆向工程开发数据库创建EER模式,并尝试与生产服务器同步。您必须查看mysql-workbench将要执行的所有查询,因为它可能很危险。我建议你在开始之前做一个备份。

  • 第二个可能性是您比较每个表并为每个不同的表写一些ALTER table查询,例如当您删除/更改/添加某些字段到该表时。

我认为您应该在下次启动一些数据库迁移工具,例如rake。如果您不想使用工具,则应该使用所有alter创建一些SQL脚本,以便轻松升级DB方案。 mysql workbench也很安静很好,可以完成这些任务,但仍然有点儿麻烦。