Replication of MySQL database

MySQL database 自 3.23.15 版以後就支援 Replication 功能,使用 Replication 可以拿來當備援及作流量分散

其實設定十分簡單,整理設定方法說明如下:

假設 Master 是 A (192.168.100.1) , Slave 是 B (192.168.100.2) ,要複製的 database 為 hello

[步驟一] A 機器上面..

首先編輯 /etc/my.cnf,加入下列幾行

[mysqld]
server-id=1
log-bin

binlog-do-db=hello

log-bin 是告訴 MySQL server 把 Binary Log 機制啟動,把對 hello 這個 DB 的所有更動 LOG 紀錄下來,然後才有辦法讓 Slave 過來同步

接下來重新啟動 MySQL server

[步驟二]

使用 phpMyAdmin 連接到 A,增加一個連線帳號,要擁有 replication 的權限,記得要設定正確的來源位址 (假設是帳號: replication 密碼: simba)

[步驟三]

把 A 機器的 /home/mysql/ (或是 /var/db/) tar 下來,並於 B 機器上面回存,

這個步驟是要讓一開始 B 擁有和 A 相同的資料,後續的複製工作才有辦法進行

[步驟四]

B 機器上面..

編輯 /etc/my.cnf,加入下列幾行

[mysqld]
master-host=192.168.100.1
master-user=replication
master-password=simba
master-port=3306
server-id=2
master-connect-retry=60
replicate-do-db=hello
log-slave-updates

[步驟五]

重新啟動 B 上面的 MySQL database

[步驟六]

測試在 A 上面的 hello database 內建立一個 table,然後去 B 看看是否有相同的 table 出現

HINT: 若有多個 DB 要做 Replication 的話,分別指定多行 binlog-do-db replicate-do-db 即可

讓 FreeBSD 下的 PHP DBA extension 能支援 ‘dbm’ handler

讓 FreeBSD 下的 PHP DBA extension 能支援 ‘dbm’ handler

在 FreeBSD 上面開發了一些程式,使用到 DBOPEN(3) 這個函數來處理一些 hash..

原本 PHP 有支援 DBM extension 可以讀取這些 db,不過新版的 PHP 已經不支援 DBM extension 了,改用 DBA extension 配合 ‘dbm’ handler 來存取這些 db

然而在 FreeBSD 下,使用 ports 去安裝的新版 PHP,其中的 DBA extension 卻無法支援 ‘dbm’ handler..

當然,如果可以的話改用 ‘db4’ handler 可能是比較好的,不過由於歷史因素難解.. 所以就只好自己跳下去改程式,讓 PHP 在安裝時能夠利用 DBOPEN(3) 來提供 ‘dbm’ handler

DBM 事實上只是一個 API,其所產生的 db 檔案格式在各種系統下可能不相容,而且利用不同方式提供的 DBM handler 所產生的 db 檔案格式也可能不一樣..

這個 patch 我有回送給 PHP 開發小組,據說 PHP 5.1 已經恢復支援 DBM handler 了,不過我還沒空去測試

有了這個 patch,你就可以使用 PHP 來存取 FreeBSD 的一些系統 db 檔案了,例如 /etc/mail/aliases.db

$id = dba_open("/etc/mail/aliases.db", "r", "dbm");
$root_alias = dba_fetch( "root\0", $id );

另外,這個 patch 使用 HASH(3) 當作內部的資料格式,因此如果用 C 寫程式,記得第四個參數要使用 DB_HASH ,例如:

db = dbopen("/tmp/test.db", O_RDWR, 0644, DB_HASH, NULL);

其他詳細資訊請參考: http://www.csie.nctu.edu.tw/~cdsheen/codings/freebsd-phpdbm-patch.php