innobackupex 是 Percona 因為 XtraBackup 需要,改自 InnoDB 的 script,可以不停機備份 InnoDB 或 XtraDB。對於沒有一開始就設定 DRBD 或是類似架構的人來說,這個方法算是蠻不錯的。(當然,如果允許停機的話更簡單)
這個方法是以 InnoDB 為主體的 database 為主,MyISAM 也可以透過這個方式備份,不過這就不在我測試的範圍內了... (我測的兩個 cluster 只有系統資料庫是使用 MyISAM,其他都是 InnoDB)
這邊寫的版本是使用 XtraBackup 0.7 版 (前幾天測試的,當時 0.8 版還沒有正式放出來,就先拿 0.7 版測試),在 Debian 上先安裝 package:
# dpkg -i xtrabackup_0.7-1_amd64.deb
裝完後就可以試著使用 innobackupex
備份,並要求 innobackupex 紀錄 slave 資訊:
# innobackupex-1.5.1 --slave-info [dest_path]
在「Btw xtrabackup is not only backup..」有推薦用 --stream=tar
將備份資料輸出成 tar 格式,不過實際上會因為 ibdata1 被改變而使得 tar 認為無法備份而失敗,所以目前比較偏好的作法是直接輸出到某個目錄下 (就不會用到 tar),目錄可以是 nfs 或是 local disk。
另外,預設是透過 socket 連 MySQL,但也可以故意用 --port=3306
強制他走 TCP,或是用其他指令指定帳號及密碼,這些都可以直接執行 innobackupex
看到。
innobackupex 會試著使用 mysql
並下一些指令,但使用時並不會指定完整路徑,所以會依照 PATH
內所設定的路徑而執行。不過,因為上面的指令通常需要 root 權限,如果使用 sudo 有可能會將 PATH
重設而造成 mysql
無法執行而失敗 (像是 Percona 的版本是裝在 /usr/local/mysql-blah-blah
下,所以配合 sudo 時的用法會是:
# sudo env PATH=/usr/local/mysql/sbin:/usr/local/mysql/bin:[original_path] innobackupex-1.5.1 --slave-info [dest_path]
這樣就解決了。
備份完成後再用 --apply-log
把還在 log 的 entry 寫回 pool:
# sudo innobackupex-1.5.1 --apply-log [dest_path]
這樣一來,一份可以當作 slave server 的資料就完成了。
丟到其他機器後,用 chown 先把檔案權限改對:
# chown -R mysql:mysql [data_dir]
然後跑起 mysql 後,看裡面的 slave 資訊設定 master:
CHANGE MASTER TO master_host = 'master_host', master_user = 'master_user', master_password = 'master_password', master_log_file = 'blahblah.012345', master_log_pos = 123456;
這樣就可以讓 slave 動起來了。(記得要自己 START SLAVE;
)
关于--stream=tar这个bug在新版本中已经修复了。