2011-05-31 50 views
4

我們有一箇中等規模的生產MySQL數據庫。我們會定期運行命令,通常是通過導軌遷移,在運行時停止數據庫。作爲一個具體的例子,我們可能會將一個索引添加到一個大表中。降低MySQL命令/作業的優先級(添加索引/其他命令)?

是否有任何方法可以降低MySQL給予特定任務的優先級。 MySQL本身內的一種「不錯」?我發現這,這是什麼啓發了問題:
PostgreSQL tips and tricks

由於添加索引引起在數據庫和MySQL的過程中完成的工作,降低了Rails遷移進程的優先級好像它不會幫助。有其他方法可以降低優先級嗎?

+0

你正在運行什麼樣的命令? – moritz 2011-05-31 15:55:48

+0

這是維護窗口的用途。 – Eric 2011-05-31 22:48:37

回答

2

我們使用多個複製的數據庫服務器來進行這樣的更改。

在我們的案例中,db1是master,複製到db2。 (db1-> DB2)。

首先對db2進行更改。如果事情鎖定,複製將停止,但沒關係。

將您的流量轉移到db2。任何去往db1的剩餘流量都會複製,所以你不會失去任何東西。

一旦db1上沒有流量,就重建它作爲db2的從屬服務器(db2-> db1)。

這是一般的想法,你會得到非常少的停機時間,你不必拉一個更快的!我們實際上有三臺服務器,所以它稍微複雜一些,但並不多。

祝你好運。

+0

它看起來像我所希望的是不可能的,所以我向你授予答案,因爲你的建議看起來像是要走的路... – ebeland 2011-06-08 21:01:52

+0

我相信其他存儲引擎(非isam,非innodb )承諾在更改架構時不鎖定表。我一直猶豫使用它們。 – 2011-06-08 21:43:03

2

不幸的是,沒有簡單的方法來做到這一點:改變數據庫結構的命令沒有優先選項。

如果你的表是MyISAM的,你可以試試這個:

  • mysqlhotcopy使表的備份
  • 導入備份成不同的數據庫服務器(一個在負載下不是)
  • 進行更改
  • 做出改變表的mysqlhotcopy的備份
  • 將其導入到直播服務器

請注意,這可能比也可能不會快於在實時服務器上添加索引,具體取決於您來回傳送表所需的時間。

+0

這裏假定在這個過程中表中沒有數據發生變化。 – 2011-06-03 00:31:35

+0

@Alain Collins:這是一個問題,是的;並可能會對FKs和其他東西造成嚴重破壞。有一些解決方法可以重新同步這段時間內添加的行,但是(複製不足)除了'LOCK TABLE WRITE'外,我還找不到100%安全的解決方法 - 在這種情況下,不要麻煩和只是'ALTER TABLE'就地。 – Piskvor 2011-06-13 21:08:14