2010-06-15 34 views
2

如何確保複製將使用latin1而不是utf-8?MySQL複製中的字符集

我在Linux系統上的MySQL 5.1.22服務器(主服務器)和FreeBSD系統上的MySQL 5.1.42服務器(從服務器)之間遷移。我的複製效果很好,但當我的varchars中有非ascii字符時,它們變成了「怪異」。在Linux/MySQL的-5.1.22顯示如下字符集的變量:

character_set_client=latin1 
character_set_connection=latin1 
character_set_database=latin1 
character_set_filesystem=binary 
character_set_results=latin1 
character_set_server=latin1 
character_set_system=utf8 
character_sets_dir=/usr/share/mysql/charsets/ 
collation_connection=latin1_swedish_ci 
collation_database=latin1_swedish_ci 
collation_server=latin1_swedish_ci 

雖然FreeBSD的顯示

character_set_client=utf8 
character_set_connection=utf8 
character_set_database=utf8 
character_set_filesystem=binary 
character_set_results=utf8 
character_set_server=utf8 
character_set_system=utf8 
character_sets_dir=/usr/local/share/mysql/charsets/ 
collation_connection=utf8_general_ci 
collation_database=utf8_general_ci 
collation_server=utf8_general_ci 

在設置任何從MySQL CLI這些變量中有沒有效果,他們設置my.cnf或在命令行中導致服務器無法啓動。

當然,兩臺服務器都有相同的表格創建問題,在這種情況下使用DEFAULT CHARSET = latin1。我給大家舉一個例子:

CREATE TABLE `test` (
    `test` varchar(5) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

當我的師傅做的,在一個Latin1的終端,「INSERT INTO測試VALUES(‘æøå’)」,這成爲對奴隸,當我從選擇它基於Latin1的終端

+--------+ 
| test | 
+--------+ 
| æøå | 
+--------+ 

上的複製從一個UTF-8的終端,測試包含:

+--------+ 
| test | 
+--------+ 
| æøå | 
+--------+ 

所以我的結論是,它被轉化爲utf8,即使表的定義是拉丁語1。這是一個正確的結論嗎?

當然,在主,在latin1的終端,還在說:

+------+ 
| test | 
+------+ 
| æøå | 
+------+ 

因爲這兩個系統的字符集是UTF-8,如果我設置兩端爲UTF-8並再次執行「 INSERT INTO測試VALUES(「æøå」)」上用UTF-8終端的主,在使用UTF-8我得到的奴隸:

+------------+ 
| test  | 
+------------+ 
| æøà | 
+------------+ 

如果我的結論是正確的,我所有的複製數據被轉換成utf8(如果它是utf8,它將被視爲latin1並轉換爲utf8),而表中的所有舊數據,如CRE ATE TABLE建議,latin1。如果不是因爲遺留應用程序依賴於latin1,我很想將其全部轉換爲utf-8,所以我需要在latin1中保留它,但它們仍然存在。

我該怎麼做才能確保複製讀取latin1,將其視爲latin1並將其作爲latin1寫入從站?

乾杯

回答

0

在一般情況下,你必須使用MySQL完全相同的配置文件和版本的奴隸(除了在升級/遷移方案,以及需要是不同的幾件事情奴隸像server_id)。

您將需要腳本數據庫設置,以便您的數據庫服務器是您的軟件部署的一部分。所有數據庫服務器(包括非生產環境中的服務器)都使用完全相同的配置是非常重要的。

未能同步配置將導致意外的錯誤。

我不知道爲什麼你覺得需要在不同的服務器上運行不同的操作系統,但是如果你這樣做,你會讓你的Ops人員變得更加困難。

1

不支持全局character_set_%和collat​​ion%參數不同的服務器之間的複製。

http://dev.mysql.com/doc/refman/5.6/en/replication-features-charset.html

-- on both servers check the output of... 
SHOW VARIABLES LIKE 'char%'; 
SHOW VARIABLES LIKE 'collat%'; 

不僅可以複製,如果套&排序規則是不同的失敗,但它會導致不同的排序順序和字符丟失時轉換套/歸類。如果使用基於語句的複製,排序順序可能會影響插入/更新等操作。

您最好將新服務器配置爲使用與舊服務器相同的集合和歸類。這將確保複製正常工作。您還需要確保數據庫,表和列在主從服務器之間都具有相同的排序規則。一旦你遷移到新的服務器,你可以修改設置&整理工具,如5.6在線模式更改或從percona工具包更改pt-online-schema。

我還建議運行percona的pt-table-checksum來確保您的表在複製或初始導出/導入過程中沒有發生分歧。

在這裏看到有關性別差異的影響的更多信息:

給任何使用Amazon RDS的人,請記住默認的MySQL 5.6設置使用混合的utf8(mb3)和latin1(用於服務器和數據庫)。如果從非RDS複製到/從RDS(匹配源/目標服務器),您應該覆蓋具有自定義參數組的那些。