mysql備份與AB複製

MySql備份與AB複製
2009-09-11 16:44
一 Mysql 的完全備份備份有2種方式
1 使用操作系統命令進行備份
就是將需要備份的文件保存到別的地方去;
例如 
/etc/init.d/mysqld stop
cd /var/lib/mysql
tar cvfz mydb_backup.tar.gz mydb 
/etc/init.d/mysqld start
從操作中可以看出,使用系統操作命令進行備份時,需要停止mysql 服務,這是一個致命的缺點;該方法的另外一個缺點是:無法將在版本不同的mysql 恢復備份的數據。
該方法恢復數據的方法:將tar 包解壓覆蓋回去即可。

2 使用mysqldump 進行備份
mysqldump 備份的原理是將數據庫中的內容對應生成sql 語句,將其保存到一個文本文檔中;恢復時只要將該文本文檔中的sql 語句導出交給mysql 重新執行一次,即恢復了數據。
例如
mysqldump -uroot -p cacti > /var/backup/cacti.sql
如果需要備份mysql 中的所有數據庫,使用 -all-databases
mysqldump -uroot -p --all-databases > /var/backup/mysql_bak.sql
恢復數據的命令如下:
mysql -uroot -p cacti < /var/backup/cacti.ql

二 mysql 的增量備份
增量備份是比完全備份作的頻率高的多的操作;
mysql 的增量備份使用的方法的是用過mysql 的二進制日誌來實現的;
mysql 的二進制日誌中保存了對mysql 的所有操作sql 語句;
mysql 的二進制日誌功能默認是關閉着的,我們需要自己手動去打開;
vim /etc/my.cnf 編輯添加
log-bin=noah(臺頭) 如果不加臺頭則默認爲binlog;
重新啓動服務後就會在/var/lib/mysql 中發現binlog 二進制文件;
二進制的日誌文件我們需要使用命令mysqlbinlog 來查看;

那麼,如何使用二進制文件來恢復數據呢;
1 使用時間來恢復
例如
mysqlbinlog --start-date="2009-05-20 10:51:01" --stop-date="2009-05-20 11:52:12" /var/lib/mysql/binlog.000001 | mysql -uroot -p123456
將這2段時間之間對mysql 進行操作的sql 語句輸出給mysql 執行;這樣就恢復這段時間內的數據;
但是這裏的時間只精確到秒,那麼在同一秒內有許多sql 語句的話,就會出現問題了;因此,我們引入了更加精確的恢復的方法,如下;
2 使用位置號來恢復
例如
mysqlbinlog --start-position="457" --stop-position="1009" /var/lib/mysql/binlog.000001 | mysql -uroot -p123456
在mysql 二進制日誌中會設定一個唯一的log_pos;我們就利用這個唯一的position 進行恢復數據的操作;這種方法不會忽略掉任何的數據;

三 mysql 的AB 複製
mysql 的複製主要分爲2種:
1 同步複製——mysql-cluster
2 異步複製——mysql-m/s(主從複製)又稱爲雙擊熱備,mysql replication
這裏我們主要講的是異步複製;
master                                                                 slave
host1                                                                   host2
binlog —————————————————>   執行
主要原理是slave 請求連接master;master 開啓1個線程將自己的二進制文件傳輸給slave ;slave 開啓兩個線程,1個線程用於I/O,另外一個線程執行master 的binlog 中sql 語句,對庫進行同樣的操作;從而達到同步的目的。

下面以實驗介紹異步複製:
主庫 192.168.0.1 從庫 192.168.0.2
首先先配置一個單向的熱備;
主庫配置:
step 1 修改/etc/my.cnf
vim /etc/my.cnf 添加
log-bin=noah 打開二進制文件功能
server-id=1 爲了與從庫的區分開
step 2 授權用戶
mysql -uroot -p123456 進入mysql
grant replication slave,reload,super on *.* to [email protected] identified by "123456";
flush privileges;
建立完用戶後,可以在從庫主機上測試登錄
mysql -uslave -p123456 -h192.168.0.1
能登錄則說明用戶建立成功了。
step 3 與從庫的初始化同步
完全備份主庫的數據庫
mysqldump -uroot -p --all-databases > /tmp/alldb_bak.sql
將該文件複製到從庫
scp /tmp/alldb_bak.sql 192.168.0.2:/tmp
在從庫上恢復數據
mysql -uroot -p < /tmp/alldb_bak.sql
從庫配置:
step 1 停止mysql
service mysqld stop
step 2 修改/etc/my.cnf
添加如下
server-id=2
master-host=192.168.0.1
master-user=slave
master-password=123456
step 3 啓動mysql
service mysqld start
step 4 進行數據同步
slave start;
可以使用show slave status \G; 來查看slave 的狀態;如果2個線程都爲yes,說明成功了。
這樣,單向的熱備就配置好了。
測試一下,
在主庫創建一個新表;
create databases new;
在從庫上show databases; 看到new 則說明成功了。

接下來2臺主機互做主從複製,安裝discuz 論壇;實現一臺主機發帖另一臺上能看到。
step 1 二臺機器安裝以上的方法同時做主庫與從庫;
步驟同上;
step 2 在主庫上安裝discuz 論壇
具體步驟如下,摘自web服務與LAMP
本實驗的主要rpm 包和tar 包爲:
apache   httpd-2.2.3-11.el5.i386.rpm
httpd-devel-2.2.3-11.el5.i386.rpm
mysql     mysql-5.0.22-2.1.0.1.i386.rpm
mysql-server-5.0.22-2.1.0.1.i386.rpm
php         php-5.1.6-15.el5.i386.rpm
php-mysql-5.1.6-15.el5.i386.rpm
discuz.tar.gz 
ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz
安裝好所有rpm 包,LAMP環境即構建完成。
隨後我們配置MySql
首先重新啓動mysql 服務 service mysql restart
然後 輸入mysql,按如下配置
mysql> create database discuz;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on discuz.* to red@localhost identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges
-> ;
Query OK, 0 rows affected (0.00 sec)
退出,配置完成
之後把ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz 解壓出來 運行裏面的install.sh腳本 ,採用回車大法,將程序安裝完。
最後解壓discuz.tar.gz 包 將解壓出來的upload 移動到/var/www/html下並改名爲bbs,將html目錄的擁有者和擁有組都改爲apache,方便隨後的安裝。
重啓httpd服務
在瀏覽器中輸入192.168.0.1/bbs/install.php
開始安裝,填寫相關內容後,安裝完成
step 3 互相啓動mysql 後,slave start,同步後192.168.0.2 也有了discuz 數據庫;爲其授權一個用戶;
grant all on discuz.* to red@localhost identified by '123456';
flush privileges;
step 4 複製192.168.0.1機器上的/var/www/html/bbs 給192.168.0.2;用scp -rp 輕鬆實現;
step 5 訪問自己的discuz;192.168.0.1/bbs 192.168.0.2/bbs;各自在上面發帖;互相都能夠看到對方的帖子則說明配置成功了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章