【发布时间】:2010-12-15 08:05:25
【问题描述】:
我有两个网站环境(单独的服务器,Media Temple DV):开发和生产。
我们开始在 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 数据库的结构进行了更改,例如在现有表中添加/删除字段,以及添加表,我想将我的更改迁移到生产。
如何仅从 Dev 数据库迁移更新的结构并使用命令行导入到生产中,类似于我最初所做的,但不会覆盖实时数据? (我所有的实时数据都在生产上,所以不需要从 Dev 带来数据。)
数据库已经变得太大,无法使用 phpMyAdmin 执行此操作(此外,命令行似乎更快更容易使用)。远离第三方工具或开源软件会很好,因为这看起来应该是一个简单的过程,我可以将其放入脚本中。还是我做错了,我错过了更好的东西?
更新:因此,基于以下答案和额外阅读,我最终编写了一个 PHP 脚本来检查实时数据库和我的本地数据库(包括一些更改)并比较差异桌子之间。
脚本使用 MySQL“SHOW TABLES”功能在两个数据库上查找实时数据库和本地数据库中缺少哪些表并进行比较。对于这些缺失的表,我使用 SHOW CREATE TABLE 来获取用于创建表的 MySQL 语句。
同样,该脚本通过对每个数据库中的每个表使用 SHOW COLUMNS FROM $table 来查找缺少哪些列。这个 MySQL 命令返回列名和属性,因此我可以为丢失的列自动构建 ALTER TABLE 语句。
最后,PHP 脚本将所有内容输出为用于创建和更改表的 SQL 脚本,我在 phpMyAdmin 中运行了该脚本。
【问题讨论】: