是否有一種方法可以追蹤對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