是否有一种方法可以追踪对MySQL数据库的更改?我离线开发,然后将所有更改提交到我的服务器。对于应用程序本身,我使用Git,它很好地工作。追溯更改MySQL数据库
但是,对于数据库,我手动更改所有内容,因为活动数据库包含客户数据,我不能用开发数据库替换它。
有没有办法只应用结构变化而不用一个数据库完全替代另一个数据库?
是否有一种方法可以追踪对MySQL数据库的更改?我离线开发,然后将所有更改提交到我的服务器。对于应用程序本身,我使用Git,它很好地工作。追溯更改MySQL数据库
但是,对于数据库,我手动更改所有内容,因为活动数据库包含客户数据,我不能用开发数据库替换它。
有没有办法只应用结构变化而不用一个数据库完全替代另一个数据库?
您正在寻找的术语是'数据库迁移'(并且不,它并不是指从一个RDBMS移动到另一个)。迁移是以编程方式对数据库结构进行版本控制的一种方式。大多数语言都有某种迁移工具包,通常作为ORM库/框架的一部分。
对于PHP你可以看看Doctrine
红宝石它当然
现在,它是一个广泛的领域。你必须做的第一件事就是决定你是否想用数据库中的某些数据来跟踪你的数据库。如果是这种情况,您有几种选择,从使用LVM,copying InnoDB binary logs,和简单的mysqldump。现在,如果你想要做的是在你的数据库更改(例如,你添加了一列)之间有一些平滑的过渡,你还有其他的选择。
第一个是复制。这是一个很好的选择,但有点复杂。通过复制,您可以更改一个从属设备,并在完成设置后,通过一些锁定,您可以使其成为主设备,并替换主设备,等等。这确实很困难,但是更好的选择。
如果您无法承担复制,您必须做的是将更改应用到您的单主数据库中,并且停机时间最短。一些不错的选择是这样的:
假设你想替换你的Customer表来添加一个“facebook_account”字段。首先,你可以使用一个别名表,就像这样:
原始表(有数据):
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
新一:
CREATE TABLE `new_customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`facebook_account` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
或者干脆:
CREATE TABLE new_customer LIKE customer;
ALTER TABLE new_customer add column facebook_account VARCHAR(255);
现在我们要将数据复制到新表中。我们需要首先发布一些其他的东西,我会每次解释它们。
首先,您可以允许其他连接在您更改表格时修改客户表格,所以我将发出锁定。如果您想了解更多关于这一点去here:
LOCK TABLES customer WRITE ,new_customer WRITE;
现在我刷新表写任何缓存内容的文件系统:
FLUSH TABLES customer;
现在我们可以插入。首先,我禁用性能问题的键。数据插入后,我再次启用密钥。
ALTER TABLE new_customer DISABLE KEYS;
INSERT INTO new_customer(id,name,facebook_account) SELECT customer.id,customer.name, Null FROM customer;
ALTER TABLE new_customer ENABLE KEYS;
现在我们可以切换表格了。
ALTER TABLE customer RENAME old_customer;
ALTER TABLE new_customer RENAME customer;
最后我们要释放锁。
UNLOCK TABLES;
就是这样。如果您想跟踪修改后的表,您可能需要将old_customer表重命名为其他内容或将其移至其他数据库。
我在这里没有涉及的唯一问题是关于触发器。你必须注意任何启用的触发器,但它将取决于你的模式。
就是这样,希望它有帮助。
如果你发现一个我很想听到它,迄今为止只有方法涉及提交到源代码管理的改变脚本。您有问题,如果您回滚/转发数据库,则可能会由于字段更改而导致数据丢失/损坏问题。我还没有找到一个处理这个问题的系统来满足MySQL的需求,但是我不禁想到它会在某个地方出现。 – 2012-02-21 11:43:26