2013-01-02 43 views
0

我們將巨大的互聯網服務從域.de重定向到domain .com - 這是討論板(vBulletin)。目前,我們需要改變,如 「domainame.de」 所有詞組爲 「domainame.com」:替換超過120個表中的MySQL值

  • 超過120臺(帖子,線程)
  • 很多的MySQL領域的

任何人都有建議如何做這樣的事情?我們需要將字符串「domainame.de」替換爲「domainname.com」 - 無處不在。

+1

幫忙寫一個腳本來做到這一點?您需要遍歷每個表,行和列。當然,您應該在副本上嘗試此操作,以確保在執行實時數據之前運行正常。您需要做出決定,具體取決於運行需要多長時間,是否可以在實時數據庫上運行這樣的腳本(因爲在腳本運行時您將混合使用域),還是需要你需要停機。我會使用PHP或類似的腳本語言,順便說一句。 – halfer

+0

@halfer:等等,你是說沒有特殊的SQL命令來做這些事情嗎? :) –

+0

@SergioTulentsev - 我討厭成爲壞消息的持有者':p' – halfer

回答

2

你想做什麼聽起來很危險,因爲它可能會造成一些誤報,並且無意中改變了事情。假設你的舊域名是「acme.de」和新的「acme.com」,以及一些隨機訪問者發表了以下的(這是一個過於簡單化的例子):

我喜歡與Acme.Depending工作對我的心情。

這將是很容易將其轉換爲:

我喜歡與Acme.compending我的心情工作。

因此,我建議,爲了優先:

  1. 不更新DB可言,只是配置Web服務器的流量由Matchi.com提供回到重定向到.COM流量。你不太可能以這種方式犯錯。

  2. 如果您必須更新討論區,請在顯示邏輯中執行,而不是在數據庫中執行 - 那麼您將無法做出不可撤銷的錯誤。

  3. 用Perl編寫腳本,或者您最喜歡的文本處理語言,在每個表/字段上執行正則表達式替換。我建議採取以下策略:

    a。做一個SELECT id,<field name> FROM <table> WHERE <field name> LIKE '%domain.de%'

    b。將輸出存儲爲CSV或其他易於解析的格式。

    c。運行您的Regex腳本以更改domain.dedomain.com

    d。檢查輸出。

    e。用你的腳本的輸出做一個UPDATE <table> SET <field>=? WHERE id=?

    首先以小塊形式(每次幾十或幾百個帖子)完成它,然後在將更改提交到數據庫之前直觀地檢查結果,以確保您沒有犯過錯誤。

0

我不知道這是否會爲你工作,但看看這個

下面的查詢會給你的表的表(120個表)

SELECT DISTINCT table_name 
    FROM 
    (
    SELECT * 
    FROM information_schema.`COLUMNS` C 
    ) t1 
    WHERE TABLE_SCHEMA='schema_name' 

下一個 你可以爲每個表使用UPDATE查詢。您可以通過實現這個CURSORS

我不擅長在遊標,但我認爲它會在這種情況下