我們將巨大的互聯網服務從域.de重定向到domain .com - 這是討論板(vBulletin)。目前,我們需要改變,如 「domainame.de」 所有詞組爲 「domainame.com」:替換超過120個表中的MySQL值
- 超過120臺(帖子,線程)
- 很多的MySQL領域的
任何人都有建議如何做這樣的事情?我們需要將字符串「domainame.de」替換爲「domainname.com」 - 無處不在。
我們將巨大的互聯網服務從域.de重定向到domain .com - 這是討論板(vBulletin)。目前,我們需要改變,如 「domainame.de」 所有詞組爲 「domainame.com」:替換超過120個表中的MySQL值
任何人都有建議如何做這樣的事情?我們需要將字符串「domainame.de」替換爲「domainname.com」 - 無處不在。
你想做什麼聽起來很危險,因爲它可能會造成一些誤報,並且無意中改變了事情。假設你的舊域名是「acme.de」和新的「acme.com」,以及一些隨機訪問者發表了以下的(這是一個過於簡單化的例子):
我喜歡與Acme.Depending工作對我的心情。
這將是很容易將其轉換爲:
我喜歡與Acme.compending我的心情工作。
因此,我建議,爲了優先:
不更新DB可言,只是配置Web服務器的流量由Matchi.com提供回到重定向到.COM流量。你不太可能以這種方式犯錯。
如果您必須更新討論區,請在顯示邏輯中執行,而不是在數據庫中執行 - 那麼您將無法做出不可撤銷的錯誤。
用Perl編寫腳本,或者您最喜歡的文本處理語言,在每個表/字段上執行正則表達式替換。我建議採取以下策略:
a。做一個SELECT id,<field name> FROM <table> WHERE <field name> LIKE '%domain.de%'
b。將輸出存儲爲CSV或其他易於解析的格式。
c。運行您的Regex腳本以更改domain.de至domain.com
d。檢查輸出。
e。用你的腳本的輸出做一個UPDATE <table> SET <field>=? WHERE id=?
。
首先以小塊形式(每次幾十或幾百個帖子)完成它,然後在將更改提交到數據庫之前直觀地檢查結果,以確保您沒有犯過錯誤。
我不知道這是否會爲你工作,但看看這個
下面的查詢會給你的表的表(120個表)
SELECT DISTINCT table_name
FROM
(
SELECT *
FROM information_schema.`COLUMNS` C
) t1
WHERE TABLE_SCHEMA='schema_name'
下一個 你可以爲每個表使用UPDATE查詢。您可以通過實現這個CURSORS
我不擅長在遊標,但我認爲它會在這種情況下
幫忙寫一個腳本來做到這一點?您需要遍歷每個表,行和列。當然,您應該在副本上嘗試此操作,以確保在執行實時數據之前運行正常。您需要做出決定,具體取決於運行需要多長時間,是否可以在實時數據庫上運行這樣的腳本(因爲在腳本運行時您將混合使用域),還是需要你需要停機。我會使用PHP或類似的腳本語言,順便說一句。 – halfer
@halfer:等等,你是說沒有特殊的SQL命令來做這些事情嗎? :) –
@SergioTulentsev - 我討厭成爲壞消息的持有者':p' – halfer