簡體   English   中英

將龐大的數據庫從Latin1轉換為UTF8?

[英]Convert huge database from Latin1 to UTF8?

我們有一個用PHP編寫的系統,這些系統在過去幾年中變得越來越大。 該數據庫是MySQL(InnoDB表),當前具有超過12GB的數據,有數百個表,其中許多具有超過1200萬條記錄!

問題是,很多表/列(但不是全部)都在latin1中,並且(顯然)我們在存儲外來字符時遇到了問題。

對於我們來說,將所有表/文本列轉換為UTF8且停機時間最短的最佳方法是什么?

該系統被24/7的數百人使用,因此長時間的停機確實不是一種選擇。

有沒有什么方法可以成功地做到這一點而又不會造成大量停機,是否有任何明顯的事情需要我們注意?

我知道我們需要設置以下內容以使我們的應用程序使用utf-8:

  • <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  • ini_set('default_charset', 'utf-8');
  • SET NAMES utf8
  • 上傳文件之前,請先在我們的IDE中將文件編碼為UTF8

我讀過其他各種文章,但是每個人似乎都在建議不同的方法,有人說它需要完整的數據庫轉儲/還原……這將意味着數小時的停機時間。

那么最好的方法是什么?

您希望做一些可能的事情,但是非常艱巨且冒險。 放棄聰明 :沒有什么魔術可以使這變得容易。 一方面,您需要在停機時間和勞動力成本之間進行權衡,另一方面又要避免數據丟失的風險。 您的人工成本可能會比15個小時的停機時間高十倍。

是否可以為每個表編寫一個SELECT查詢,以確保檢索自特定日期/時間以來已添加或更改的每一行,並且能夠快速執行呢? 如果是這樣,請為每個表編寫此查詢,並將其放在手邊。 如果沒有,則不能使用此方法。

您可以逐表執行此操作。

小桌子不需要太多工作。 您可以在非高峰時間運行應用程序時執行這些操作。 只需轉換列。

如果您從未更新過較大的表,則可以為這些表創建具有所需字符集和默認排序規則的表的副本。 然后可以使用INSERT ... SELECT復制數據。 http://dev.mysql.com/doc/refman/5.1/en/insert-select.html )最后,在停機期間,您可以重命名生產表,然后為新表提供生產表名稱。 您可能需要成千上萬的行來執行此操作,以防止InnoDB的事務完整性系統耗盡服務器的RAM。

最后,您必須處理大型且不斷變化的表。 再次,使用INSERT ... SELECT復制表,以確保InnoDB事務不會掛起應用程序的操作或耗盡RAM的方式。 此處的目的是在特定日期/時間獲取表的快照。

然后,關閉生產。 使用方便的查詢選擇自開始以來所有已插入和已更改的行,並將其插入/更新到目標表中。 然后重命名生產表,並為目標表提供生產表的名稱,然后重新開始生產。 您應該能夠相當快地執行此操作。

如果您是我,那么我將對您的實時生產數據庫進行暫存副本,並在實際運行之前排練此過程的每個步驟。 例如,您將在InnoDB中遇到外鍵約束的麻煩。 您需要能夠仔細地解決這些問題。

實際上,如果我是您,我不會嘗試這樣做。 這就像在飛機飛行中更換飛機發動機一樣。 可能出什么問題了? :-)相反,我需要安排Web應用程序的停機時間來完成此轉換。 即使在這種情況下,您也應該在上線服務器之前嘗試整個過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM