數據庫備份與恢復

                                               數據的備份與恢復
        數據的備份分爲邏輯備份與物理備份,
        邏輯備份是指備份對數據庫進行操作改變數據庫結構的語句,如insert create 等,以文本形式存儲,比較佔用磁盤空間,不過可對其進行壓縮存放。
        物理備份是指對數據庫中的數據進行備份,速度交邏輯備份快,直接將數據從一個地方複製出來即可。

        從恢復數據範圍上來說,又分爲完全備份,增量備份和差異備份,完全備份,是指將數據完全備份出來,增量備份是指將數據從上次完全備份或增量備份以來,對發生改變的數據進行的備份,叫做增量備份,差異備份是指從上次完全備份以來到此時對數據庫改變的的護具進行備份。
        兩種備份劃分沒有必然聯繫,可以產生交叉。
數據庫備份中的常見工具:
mysqldump  用作邏輯備份的重要備份工具,可對所有引擎進行備份。但對與innodb可進行 熱備份。
select into outfile 對某個數據庫中的一個表或表內的部分數據進行備份
ibbackup 同mysqldump一樣,可對所有引擎備份,對innodb熱備份
snapshot 快照備份 幾乎熱備份
mysqlhotcopy 對MyISAM 進行備份
那我們要對那些數據進行備份呢?一般有這幾項是需要備份的:
binary logs 二進制日誌用來即時點恢復
innodb log files 事件記錄
mysqld option file  數據庫的配置文件
slave position information(master.info) 從服務器中的主信息
relay logs 中繼日誌

        在備份中如果是innodb引擎,則可以熱備份,要是MyISAM則要先將所有表鎖住
mysqldump --all-databases > /back/alldatabase 一般有時只備份某個數據庫才鎖住表 ,否則要是所有表則進行關閉冷被備份以test數據庫爲例:
mysql> flush tables with read lock;
# mysqldump --database test > /back/test-`date +%F-%H-%M-%S`.sql
mysql> unlock tables;
或者:
# mysqldump --database test --lock-all-tables > /back/test-`date +%F-%H-%M-%S`.sql
在備份中,指定這這個時刻的位置,可以添加master-data=2;
進行熱備份:並指定位置指定smysqldump --database test --single-transaction --flush-log > /back/test-`date +%F-%H-%M-%S`.sql
備份後可將數據進行壓縮以節省空間:
bzip2 alldatabase-2012-04%.sql
對數據的恢復
mysql -uuser -h -p < test-*.sql
對於增量備份,可以用通過命令:mysqlbinlog mysql-bin.00000*
查看二進制 內容,從而可知要恢復到那個節點的內容。然後再將其保存至一個
文件內,列如:
mysqlnlinlog --stop-position=33456 mysql-bin.000003 > /back/incremental.sql
下面就可以導入這個文件所包含的數據內容了:
mysql < /back/test-*.sql
mysql < /back/incremental.sql
       其實恢復備份的時候,可以將二進制日誌關閉,恢復後再將其啓動,因爲恢復過程的記錄沒什麼用,反而浪費空間。
     最後還要提醒,一般二進制日誌需要從新弄一個磁盤存放,以防磁盤損壞的時候全軍覆沒!
   下面簡單給一個little腳本演示自動備份,如果你想讓其在夜間兩點完全備份,
那麼可以這樣寫:


#/bin/bash
backup_dir=/backup
mysqldump='/usr/bin/mysqldump -uroot -p'redhat'
date=`date +%F-%H-%M-S`
$mysqldump --database dataname --single-transaction --flush-logs --master-data=2 > /$backup_dir/database-$date.sql

寫入自動任務
[root@mail ~]# vim /etc/crontab 添加如下一行
0 2 * * * root /mysqldump.sh

       以上是基於邏輯備份的內容,下面說說關於物理備份的一種:基於幾乎熱備份的相關操作內容:基於邏輯快照的方式
      例如在數據庫中,我們要將數據庫data以快照的方式備份及還原。
#mysql -uuser -ppassword
mysql>use data
mysql>flush tables with read lock 停止數據的寫入
mysql>flush logs 刷新日誌
mysql>show master status 記錄日誌位置,以便恢復容易找到
mysql>\q  退出mysql,馬上進行快照
lvcreate -L 68M -s -n data-snap -p r /dev/myvg/mydata
#mysql -uuser -ppassword 連接到數據庫解鎖
mysql>unlock
mysql>\q
創建掛載點
mkdir /snap
mount -r /dev/myvg/data-snap /snap
cd /snap
ls 查看是否掛載好
爲節約空間,可以將其打包:
tar jcf /back/all_data-`date +%F-%H-%S'.tar.bz2 data/
備份好後,就可以卸載快照捲了
umount /snap
rm -rf /snap
lvremove --force /dev/myvg/data-snap
     若要將備份的數據進行恢復,怎樣進行呢?
     我們知道,物理備份的幾乎熱備份其實還是冷備份,只不過是快速冷備份。所以要將數據庫關掉之後,再進行備份恢復。具體操作命令如下:
service mysqld stop
     若最近的二進制日誌文件與數據在同一個路徑下,需要將其拷貝出來,另外存放,所以一般一開始就將其分離出來。
cd /mydata
rm -rf data/
tar xf /back/all_data-`date +%F-%H-%S'.tar.bz2 -C ./ 此時文件名中包含的日期時間已經有
ls 查看
重啓服務:service mysqld start
#mysql -uuser -ppassword 進入mysql查看
備份過程中的數據需要藉助二進制日誌來恢復,先通過命令mysqlbinlog 查看二進制日誌內容,並找到錯誤操作前的位置,記錄下position,如:
mysqlbinlog /root/mysql-bin.000033  記錄的錯誤位置爲123456則恢復過程如下:
mysqlbinlog --stop-position=123456 /root/mysql-bin.000033 > /back/data.sql
#mysql -uuser -ppassword
mysql>set SQL_LOG_BIN=0 恢復過程不需要啓動二進制日誌
mysql>source /back/data.sql
mysql>set SQL_LOG_BIN=1
最後別忘了再把二進制日誌開啓啊!然後就可以進入數據庫查看還原的數據了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章