我有两个网站环境(单独的服务器,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 数据库的结构进行了更改,例如在现有表中添加/删除字段,以及添加表,我想将我的更改迁移到生产。

我如何仅从 Dev 数据库迁移更新的结构并使用命令行导入到生产中,类似于我最初所做的,但不覆盖实时数据? (我所有的实时数据都在 Production 上,所以不需要从 Dev 带过来数据。)

数据库变得太大而无法使用 phpMyAdmin 执行此操作(此外,命令行似乎更快更容易使用)。远离第三方工具或开源软件会很好,因为它看起来应该是一个简单的过程,我可以将其放入脚本中。还是我做错了,我错过了更好的东西?

更新 :因此,基于以下答案和额外阅读,我最终编写了一个 PHP 脚本,该脚本检查实时数据库和我的本地数据库(包括一些更改)并比较表之间的差异。

该脚本在两个数据库上使用 MySQL“SHOW TABLES”功能并进行比较,从而找出实时数据库与本地数据库中缺少哪些表。对于这些缺失的表,我使用 SHOW CREATE TABLE 来获取用于创建表的 MySQL 语句。

同样,脚本通过在每个数据库中的每个表上使用 SHOW COLUMNS FROM $table 来查找缺少哪些列。这个 MySQL 命令返回列名和属性,因此我可以为丢失的列自动构建 ALTER TABLE 语句。

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

最佳答案

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

至少,您可以使用 mysqldump 转储没有数据的两个数据库,只转储结构,并使用 diff 查看发生了什么变化。这样您就可以为新表包含 create table 语句,并为那些更改的表编写 alter table 语句以升级它们。

也许某处有一个免费脚本可以生成那些 alter table 命令,这听起来确实是一个有趣的小项目。

或者,您可以重命名旧表,导入开发数据库,​​再次不带数据,然后将旧表中的数据插入新表中

insert into mytable (col1, col2) select (col1, col2) from oldmytable;

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

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

对于第二种方法,数据库将不得不离线一段时间(或很长时间,取决于数据库的大小)。

关于php - 如何使用命令行将新的 MySQL 数据库结构从开发网站迁移到生产网站?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4447880/

10-13 07:20
查看更多