2008年4月12日 星期六

04)MySQL

MySQL
是一種 client/server 的資料庫伺服器,可以多人同時處理大量的資料。
多用於網頁應用程式,並與 php 語言有良好的搭配。
是非常優秀的跨平台、開放原始碼的自由軟體。
http://www.mysql.com/

UTF-8 編碼問題
顯示目前的 MySQL 編碼 SHOW VARIABLES LIKE 'character_set_%';
在 /etc/make.conf 中設定 (會影響 MySQL) WITH_CHARSET=utf8
WITH_XCHARSET=complex
各種方法:
建一個新的 table, 編碼用 utf8, 然後寫一個小程式把原先 latin1 的資料, 用 set names latin1 讀出來, 再用 set names utf8 寫進去新的 table 裡.
加上下面這行 (注意喔!是 utf8 不是 utf-8) $this->query("SET NAMES 'utf8'");
參考資料:
如何修正 MySQL 資料庫的 encoding?
MySQL 4.1.x SET NAMES UTF8
MySQL 4.1x 中文亂碼問題
phpBB 由 BIG5 轉換到 UTF-8
MySQL UTF-8 亂碼問題
MYSQL由 Big5 轉UTF-8問題
MySQL 4.1.x 會把某些不存在的中文字, 例如 宏碁的碁吃掉..
PHP、XML、以及字元編碼:一則關於悲情、憤怒以及傷逝(資料)的故事
phpmyadmin的亂碼問題
從零開始
修復資料庫
修理 MySQL 壞掉資料庫的工具:
myisamchk 修不好? 還是你用innodb.

One-way Replication
From: http://www.study-area.net/tips/mysql_replication.htm
Instructions for setting up MySQL Replication 作者﹕myz
-以下這份文件是針對兩台 MySQL 伺服器進行One-way Replication -Starting in Version 3.23.15, MySQL supports one-way replication internally. -參考文件 1. http://www.mysql.com/doc/en/Replication.html
-測試環境 RedHat 7.3 + MySQL 3.23.49 MySQL資料庫路徑: /var/lib/mysql MySQL設定檔: /etc/my.cnf Master IP: 192.168.1.1 Slave IP: 192.168.1.2 -設定步驟Master/Slave -設定Master 1.確認Master/Slave機器上所裝的MySQL版本能進行replication.Use Version 3.23.29 or higher. 2.在Master MySQL上開放一個帳號給Slave
mysql –u root –p
mysql>GRANT FILE ON *.* TO repl@192.168.1.2 IDENTIFIED BY ‘abc123’; mysql>\q
上面是Master開放一個帳號repl密碼abc123給IP:192.168.1.2有檔案處理的權限. 3.shutdown MySQL on the Master
mysqladmin –u root –p shutdown
4.備份Master所有資料庫..通常都用tar指令.
tar –cvf /tmp/mysql-snapshot.tar /var/lib/mysql
注意:tar的時候,MySQL是要在stop情況下 不過在mysql網站的FAQ有不用shutdown的方法 5.在master機器上修改/etc/my.cnf 在[mysqld]區段內加入參數 log-bin server-id=這邊設定server-id=1 sql-bin-update-same binlog-do-db=phpBB只針對phpBB資料庫做紀錄 6.Restart MySQL on the master 此時因為有加入log-bin參數,因此開始有index產生了,在/var/lib/mysql目錄下有.index檔案紀錄資料庫的異動log.
-接下來設定Slave 7.在slave設定/etc/my.cnf 在[mysqld]區段加入 master-host= master-user= master-password= master-port= server-id= 這邊設定 master-host=192.168.1.1 master-user=repl master-password=abc123 master-port=3306 server-id=2 master-connect-retry=60預設重試間隔60秒 replicate-do-db=phpBB告訴slave只做phpBB資料庫的更新 log-slave-updates
8.將master上的mysql-snapshot.tar copy到slave上 用ftp傳到slave的/tmp 9.解壓縮
cd /var/lib/
tar xvf /tmp/mysql-snapshot.tar
chown –R mysql:mysql mysql
chmod –R 770 mysql(視情況)
10.Restart MySQL on the slave server 這時在/var/lib/mysql目錄會出現master.info,此檔案紀錄了Master MySQL server的資訊.
-狀況測試 1.Master跟Slave網路及服務都正常情況下,由Master端異動資料後, 到Slave端瀏覽資料,檢視是否有進行replication?! 2.模擬Slave掛點,可用在於slave真的掛點,或是slave不一定需要一直跟master connect. 將Slave MySQL server shutdown,由Master端異動資料,到slave端瀏覽, 此時Slave應該沒有被replication更新,然後再將Slave端MySQL server start起來, 預設60秒後Slave會嘗試跟Master要求進行replication.再去Slave端檢視是否有更新資料?! 3.模擬Master掛點.那沒搞頭了,因為是設定One-way replication.一旦Master掛點, Slave端沒有Master的source可以download,所以沒搞頭了. 4.基於第3點狀況於是發展雙向Replication,即A/B都分別擔任Master/Slave身分
-以下是針對兩台MySQL伺服器進行雙向Replication 觀念同單向replication只是改成Master也有Slave身分, Slave也有Master的身分. 先分別在A/B都去grant一個進行replication的身分 [A]mysql>GRANT FILE ON *.* TO repl@192.168.1.2 IDENTIFIED BY ‘abc123’; [B]mysql> GRANT FILE ON *.* TO repl@192.168.1.1 IDENTIFIED BY ‘abc123’;
做完單向replication後,stop A/B MySQL service,此時A/B資料是一樣的.
修改/etc/my.cnf設定 範例: Server A [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=1 log-bin sql-bin-update-same binlog-do-db=phpBB
master-host=192.168.1.2 master-user=repl master-password=abc123 log-slave-updates master-connect-retry=60 replicate-do-db=phpBB Server B [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=2 log-bin sql-bin-update-same binlog-do-db=phpBB
master-host=192.168.1.1 master-user=repl master-password=abc123 log-slave-updates master-connect-retry=60 replicate-do-db=phpBB
分別start A/B MySQL後,此時雙方都是Master/Slave身分, 一但哪一方資料異動就會通知對方來replication. -若replication失效,我的做法是將A/B的master.info及.index,.00x都砍掉, 然後分別restart MySQL server,進行測試.檢視成果.
-再來由雙向replication延伸出replication chain/(circular),即A->B->C->…(->A) 觀念chain是單向replication的延伸, circular是chain的尾巴接回頭. 舉例A-B-C-A A為B的master,B是C的master,而C是A的master. 反過來說 B是A的slave,C是B的slave,而A是C的slave. 只要將/etc/my.cnf檔案[mysqld]區段都加入master/slave對應的參數 宣告為master是 server-id=x其中x為主機id=1,2,3 log-bin sql-bin-update-same binlog-do-db=phpBB
定義slave是 master-host=192.168.1.x其中x為主機ip=1,2,3 master-user=repl master-password=abc123 log-slave-updates master-connect-retry=60 replicate-do-db=phpBB
-測試 1.各server(A/B/C)都運作正常下,任一台異動資料,就會通知slave進行replication 2.模擬其中一台掛點.如B,則A異動時,因為B掛點,故此chain已經斷了,所以C並不會被更新. 所以這種chain的方式缺點在於說其中一個環節點失效時,其後的都不會更新了, 但可由手動方式change master將下個節點change master from掛點的 to 上一個ok的節點. 優點是有很多台server都有replication備份.

引用

沒有留言: