備份的本質就是將數據集另存一個副本,但是原數據會不停的發生變化,所以利用備份只能回覆到數據變化之前的數據。那變化之後的呢?所以制定一個好的備份策略很重要。
一、備份的目的
備份的本質就是將數據集另存一個副本,但是原數據會不停的發生變化,所以利用備份只能回覆到數據變化之前的數據。那變化之後的呢?所以制定一個好的備份策略很重要。
一、備份的目的
做災難恢復:對損壞的數據進行恢復和還原
需求改變:因需求改變而需要把數據還原到改變以前
測試:測試新功能是否可用
二、備份需要考慮的問題
可以容忍丟失多長時間的數據;
恢復數據要在多長時間內完;
恢復的時候是否需要持續提供服務;
恢復的對象,是整個庫,多個表,還是單個庫,單個表。
三、備份的類型
1、根據是否需要數據庫離線
冷備(cold backup):需要關mysql服務,讀寫請求均不允許狀態下進行;
溫備(warm backup): 服務在線,但僅支持讀請求,不允許寫請求;
熱備(hot backup):備份的同時,業務不受影響。
注:1、這種類型的備份,取決於業務的需求,而不是備份工具
2、MyISAM不支持熱備,InnoDB支持熱備,但是需要專門的工具
2、根據要備份的數據集合的範圍
完全備份:full backup,備份全部字符集。
增量備份: incremental backup 上次完全備份或增量備份以來改變了的數據,不能單獨使用,要藉助完全備份,備份的頻率取決於數據的更新頻率。
差異備份:differential backup 上次完全備份以來改變了的數據。
建議的恢復策略:
完全+增量+二進制日誌
完全+差異+二進制日誌
3、根據備份數據或文件
物理備份:直接備份數據文件
優點:
備份和恢復操作都比較簡單,能夠跨mysql的版本,
恢復速度快,屬於文件系統級別的
建議:
不要假設備份一定可用,要測試
mysql>check tables;檢測表是否可用
邏輯備份: 備份表中的數據和代碼
優點:
恢復簡單、
備份的結果爲ASCII文件,可以編輯
與存儲引擎無關
可以通過網絡備份和恢復
缺點:
備份或恢復都需要mysql服務器進程參與
備份結果佔據更多的空間,
浮點數可能會丟失精度
還原之後,縮影需要重建
四:備份的對象
1、 數據;
2、配置文件;
3、代碼:存儲過程、存儲函數、觸發器
4、os相關的配置文件
5、複製相關的配置
6、二進制日誌
五、備份和恢復的實現
1、利用select into outfile實現數據的備份與還原
1.1把需要備份的數據備份出來
1 2 3 | mysql> use hellodb; //打開hellodb庫 mysql> select * from students; 查看students的屬性 mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt’ ; //將年齡大於三十的同學的信息備份出來 |
注意:
備份的目錄路徑必須讓當前運行mysql服務器的用戶mysql具有訪問權限
備份完成之後需要把備份的文件從tmp目錄複製走,要不就失去備份的目的了
回到tmp目錄下查看剛纔備份的文件
[root@www ~]# cd /tmp
[root@www tmp]# cat stud.txt
3Xie Yanke53M216
4Ding Dian32M44
6Shi Qing46M5\N
13Tian Boguang33M2\N
25Sun Dasheng100M\N\N
[root@www tmp]#
你會發現是個文本文件。所以不能直接導入數據庫了。需要使用load data infile 恢復
回到mysql服務器端,刪除年齡大於30的用戶,模擬數據被破壞
mysql> delete from students where Age > 30;
mysql> load data infile '/tmp/stud.txt' into table students;
2、利用mysqldump工具對數據進行備份和還原
mysqldump 常用來做溫備,所以我們首先需要對想備份的數據施加讀鎖,
2.1 施加讀鎖的方式:
1.直接在備份的時候添加選項
--lock-all-tables 是對要備份的數據庫的所有表施加讀鎖
--lock-table 僅對單張表施加讀鎖,即使是備份整個數據庫,它也是在我們備份某張表的時候纔對該表施加讀鎖,因此適用於備份單張表
2、在服務器端書寫命令,
mysql> flush tables with read lock; 施加鎖,表示把位於內存上的表統統都同步到磁盤上去,然後施加讀鎖
mysql> flush tables with read lock;釋放讀鎖
但這對於InnoDB存儲引擎來講,雖然你也能夠請求道讀鎖,但是不代表它的所有數據都已經同步到磁盤上,因此當面對InnoDB的時候,我們要使用mysql> show engine innodb status; 看看InnoDB所有的數據都已經同步到磁盤上去了,才進行備份操作。
2.2備份的策略:
完全備份+增量備份+二進制日誌
演示備份的過程;
2.3 先給數據庫做完全備份:
1 2 3 4 5 | [root@www ~]# mysqldump -uroot --single-transaction --master-data= 2 --databases hellodb > /backup/hellodb_`date +%F`.sql --single-transaction: 基於此選項能實現熱備InnoDB表;因此,不需要同時使用--lock-all-tables; --master-data= 2 記錄備份那一時刻的二進制日誌的位置,並且註釋掉, 1 是不註釋的 --databases hellodb 指定備份的數據庫 然後回到mysql服務器端, |
2.4回到mysql服務器端更新數據
1 2 | mysql> create table tb1(id int ); 創建表 mysql> insert into tb1 values ( 1 ),( 2 ),( 3 ); 插入數據,這裏只做演示,隨便插入了幾個數據 |
2.5先查看完全備份文件裏邊記錄的位置:
1 2 | [root@www backup]# cat hellodb_2013- 09 - 08 .sql | less -- CHANGE MASTER TO MASTER_LOG_FILE= 'mysql-bin.000013' , MASTER_LOG_POS= 15684 ; 記錄了二進制日誌的位置 |
2.6 在回到服務器端:
1 2 3 4 5 6 7 | mysql> show master status; 顯示此時的二進制日誌的位置 從備份文件裏邊記錄的位置到我們此時的位置,即爲增量的部分 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. 000004 | 15982 | | | +------------------+----------+--------------+------------------+ |
2.7做增量備份
1 2 | [root@www backup]# mysqlbinlog --start-position= 15694 --stop-position= 15982 /mydata/data/mysql-bin. 000013 > /backup/hellodb_`date +$F_%H`.sql |
2.8再回到服務器
1 2 | mysql> insert into tb1 values ( 4 ),( 5 ); 在插入一些數值 mysql> drop database hellodb; 刪除hellodb庫 |
2.9導出這次得二進制日誌:
1 2 | [root@www backup]# mysqlbinlog --start-position= 15982 /mydata/data/mysql-bin. 000013 查看刪除操作時二進制日誌的位置 [root@www backup]# mysqlbinlog --start-position= 15982 --stop-position= 16176 /mydata/data/mysql-bin. 000013 > /tmp/hellodb.sql //導出二進制日誌 |
2.10先讓mysql離線
1 2 3 | 回到服務器端: mysql> set sql_log_bin= 0 ; 關閉二進制日誌 mysql> flush logs; 滾動下日誌 |
2.11模擬數據庫損壞
1 | mysql> drop database hellodb; |
2.12開始恢復數據:
1 2 3 | [root@www ]# mysql < /backup/hellodb_2013- 09 - 08 .sql //導入完全備份文件 [root@www ]# mysql < /backup/hellodb_2013- 09 -08_05.sql //導入增量備份文件 [root@www ]# mysql< hellodb.sql //導入二進制文件 |
驗證完成,顯示結果爲我們預想的那樣
注:
1、真正在生產環境中,我們應該導出的是整個mysql服務器中的數據,而不是單個庫,因此應該使用--all-databases
2、在導出二進制日誌的時候,可以直接複製文件即可,但是要注意的是,備份之前滾動下日誌。
3、利用lvm快照實現幾乎熱備的數據備份與恢復
3.1策略:
完全備份+二進制日誌;
3.2準備:
注:事務日誌必須跟數據文件在同一個LV上;
3.3創建lvm Lvm的創建這裏就不多說了,想了解話點擊http://limian.blog.51cto.com/7542175/1256660
3.4 修改mysql主配置文件存放目錄內的文件的權限與屬主屬組,並初始化mysql
1 2 3 4 5 | [root@www ~]# mkdir /mydata/data //創建數據目錄 [root@www ~]# chown mysql:mysql /mydata/data //改屬組屬主 [root@www ~]# [root@www ~]# cd /usr/local/mysql/ //必須站在此目錄下 [root@www mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data //初始化mysql |
3.5修改配置文件:
1 2 3 | vim /etc/my.cof datadir=/mydata/data 添加數據目錄 sync_binlog = 1 開啓此功能 |
3.6 啓動服務
1 2 3 | [root@www mysql]# service mysqld start mysql> set session sql_log_bin= 0 ; 關閉二進制日誌 mysql> source /backup/all_db_2013- 09 - 08 .sql 讀取備份文件 |
3.7回到mysql服務器:
1 2 3 4 5 6 7 8 9 10 | mysql> FLUSH TABLES WITH READ LOCK; 請求讀鎖 注:不要退出,另起一個終端: mysql> SHOW MASTER STATUS; 查看二進制文件的位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. 000004 | 107 | | | +------------------+----------+--------------+------------------+ 1 row in set ( 0.00 sec) mysql> FLUSH LOGS; 建議滾動下日誌。這樣備份日誌的時候就會很方便了 |
3.8導出二進制文件,創建個目錄單獨存放
1 2 3 | [root@www ~]# mkdir /backup/limian [root@www ~]# mysql -e 'show master status;' > /backup/limian/binlog.txt [root@www ~]# |
3.9爲數據所在的卷創建快照:
1 | [root@www ~]# lvcreate -L 100M -s -p r -n mysql_snap /dev/myvg/mydata |
回到服務器端,釋放讀鎖
1 2 3 4 | mysql> UNLOCK TABLES; [root@www ~]# mount /dev/myvg/mysql_snap /mnt/data [root@www data]# cp * /backup/limian/ [root@www data]#lvremove /dev/myvg/mylv_snap |
3.10更新數據庫的數據,並刪除數據目錄先的數據文件,模擬數據庫損壞
1 2 3 4 5 6 7 | mysql> create table limiantb (id int ,name CHAR( 10 )); mysql> insert into limiantb values ( 1 , 'tom' ); [root@www data]# mysqlbinlog --start-position= 187 mysql-bin. 000003 > /backup/limian/binlog.sql [root@www backup]# cd /mydata/data/ [root@www data]# rm -rf * [root@www ~]# cp -a /backup/limian/* /mydata/data/ [root@www data]# chown mysql:mysql * |
3.11測試
啓動服務
1 2 3 4 5 6 7 | [root@www data]# service mysqld start [root@www data]# mysql 登陸測試 mysql> SHOW DATABASES; mysql> SET sql_log_bin= 0 mysql> source/backup/limian/binlog.sql; #二進制恢復 mysql> SHOW TABLES; #查看恢復結果 mysql> SET sql_log_bin= 1 ; #開啓二進制日誌 |
注:此方式實現了接近於熱備的方式備份數據文件,而且數據文件放在lvm中可以根據數據的大小靈活改變lvm的大小,備份的方式也很簡單。
4、基於Xtrabackup做備份恢復
官方站點:www.percona.com
優勢:
1、快速可靠的進行完全備份
2、在備份的過程中不會影響到事務
3、支持數據流、網絡傳輸、壓縮,所以它可以有效的節約磁盤資源和網絡帶寬。
4、可以自動備份校驗數據的可用性。
安裝Xtrabackup
1 | [root@www ~]# rpm -ivh percona-xtrabackup- 2.1 . 4 - 656 .rhel6.i686.rpm |
其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 獲得
注意:在備份數據庫的時候,我們應該具有權限,但需要注意的是應該給備份數據庫時的用戶最小的權限,以保證安全性,
4.1前提:
應該確定採用的是單表一個表空間,否則不支持單表的備份與恢復。
在配置文件裏邊的mysqld段加上
innodb_file_per_table = 1
4.2備份策略
完全備份+增量備份+二進制日誌
4.3準備個目錄用於存放備份數據
1 | [root@www ~]# makdir /innobackup |
4.4做完全備份:
1 | [root@www ~]# innobackupex --user=root --password=mypass /innobackup/ |
注:
1、只要在最後一行顯示 innobackupex: completed OK!,就說明你的備份是正確的。
2、另外要注意的是每次備份之後,會自動在數據目錄下創建一個以當前時間點命名的目錄用於存放備份的數據,那我們去看看都有什麼
[root@www 2013-09-12_11-03-04]# ls
backup-my.cnf ibdata1 performance_schema xtrabackup_binary xtrabackup_checkpoints
hellodb mysql test xtrabackup_binlog_info xtrabackup_logfile
[root@www 2013-09-12_11-03-04]#
xtrabackup_checkpoints :備份類型、備份狀態和LSN(日誌序列號)範圍信息;
xtrabackup_binlog_info :mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
xtrabackup_logfile :非文本文件,xtrabackup自己的日誌文件
xtrabackup_binlog_pos_innodb :二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
backup-my.cnf :備份時數據文件中關於mysqld的配置
4.5回到mysql服務器端對數據進行更新操作
1 2 | mysql> use hellodb; mysql> delete from students where StuID>= 24 ; |
4.6增量備份
1 2 3 | innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental 指定備份類型 --incremental-basedir= 指定這次增量備份是基於哪一次備份的,這裏是完全備份文件,這樣可以把增量備份的數據合併到完全備份中去 |
4.7第二次增量
先去修改數據
1 2 3 | mysql> insert into students (Name,Age,Gender,ClassID,TeacherID) values ( 'tom' , 33 , 'M' , 2 , 4 ); innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 37 - 01 / 這裏只須要把最後的目錄改爲第一次增量備份的數據目錄即可 |
4.8最後一次對數據更改但是沒做增量備份
1 | mysql> delete from coc where id= 14 ; |
4.9把二進制日誌文件備份出來,(因爲最後一次修改,沒做增量備份,要依賴二進制日誌做時間點恢復)
1 | [root@www data]# cp mysql-bin. 000003 /tmp/ |
4.10模擬數據庫崩潰
1 2 | [root@www data]# service mysqld stop [root@www data]# rm -rf * |
恢復前準備
4.11對完全備份做數據同步
1 | [root@www ~]# innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / |
4.12對第一次增量做數據同步
1 | innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 37 - 01 / |
4.13對第二次增量做數據同步
1 2 | innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 45 - 53 / --apply-log 的意義在於把備份時沒commit的事務撤銷,已經commit的但還在事務日誌中的應用到數據庫 |
注:
對於xtrabackup來講,它是基於事務日誌和數據文件備份的,備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據庫文件中的事務,還應該對其做預處理,把已提交的事務同步到數據文件,未提交的事務要回滾。因此其備份的數據庫,不能立即拿來恢復。
預處理的過程:
首先對完全備份文件只把已提交的事務同步至數據文件,要注意的是有增量的時候,不能對事務做數據回滾,不然你的增量備份就沒有效果了。
然後把第一次的增量備份合併到完全備份文件內,
以此類推,把後幾次的增量都合併到前一次合併之後的文件中,這樣的話,我們只要拿着完全備份+二進制日誌,就可以做時間點恢復。
4.14數據恢復
1 2 3 4 | [root@www ~]# service mysqld stop [root@www data]# rm -rf * 模擬數據庫崩潰 [root@www ~]# innobackupex --copy-back /innobackup/ 2013 - 09 -12_11- 03 - 04 / --copy-back數據庫恢復,後面跟上備份目錄的位置 |
4.15檢測:
1 2 3 | [root@www ~]# cd /mydata/data/ [root@www data]# chown mysql:mysql * [root@www data]#service mysqld start |
檢測結果數據正常。
做災難恢復:對損壞的數據進行恢復和還原
需求改變:因需求改變而需要把數據還原到改變以前
測試:測試新功能是否可用
二、備份需要考慮的問題
可以容忍丟失多長時間的數據;
恢復數據要在多長時間內完;
恢復的時候是否需要持續提供服務;
恢復的對象,是整個庫,多個表,還是單個庫,單個表。
三、備份的類型
1、根據是否需要數據庫離線
冷備(cold backup):需要關mysql服務,讀寫請求均不允許狀態下進行;
溫備(warm backup): 服務在線,但僅支持讀請求,不允許寫請求;
熱備(hot backup):備份的同時,業務不受影響。
注:1、這種類型的備份,取決於業務的需求,而不是備份工具
2、MyISAM不支持熱備,InnoDB支持熱備,但是需要專門的工具
2、根據要備份的數據集合的範圍
完全備份:full backup,備份全部字符集。
增量備份: incremental backup 上次完全備份或增量備份以來改變了的數據,不能單獨使用,要藉助完全備份,備份的頻率取決於數據的更新頻率。
差異備份:differential backup 上次完全備份以來改變了的數據。
建議的恢復策略:
完全+增量+二進制日誌
完全+差異+二進制日誌
3、根據備份數據或文件
物理備份:直接備份數據文件
優點:
備份和恢復操作都比較簡單,能夠跨mysql的版本,
恢復速度快,屬於文件系統級別的
建議:
不要假設備份一定可用,要測試
mysql>check tables;檢測表是否可用
邏輯備份: 備份表中的數據和代碼
優點:
恢復簡單、
備份的結果爲ASCII文件,可以編輯
與存儲引擎無關
可以通過網絡備份和恢復
缺點:
備份或恢復都需要mysql服務器進程參與
備份結果佔據更多的空間,
浮點數可能會丟失精度
還原之後,縮影需要重建
四:備份的對象
1、 數據;
2、配置文件;
3、代碼:存儲過程、存儲函數、觸發器
4、os相關的配置文件
5、複製相關的配置
6、二進制日誌
五、備份和恢復的實現
1、利用select into outfile實現數據的備份與還原
1.1把需要備份的數據備份出來
1 2 3 | mysql> use hellodb; //打開hellodb庫 mysql> select * from students; 查看students的屬性 mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt’ ; //將年齡大於三十的同學的信息備份出來 |
注意:
備份的目錄路徑必須讓當前運行mysql服務器的用戶mysql具有訪問權限
備份完成之後需要把備份的文件從tmp目錄複製走,要不就失去備份的目的了
回到tmp目錄下查看剛纔備份的文件
[root@www ~]# cd /tmp
[root@www tmp]# cat stud.txt
3Xie Yanke53M216
4Ding Dian32M44
6Shi Qing46M5\N
13Tian Boguang33M2\N
25Sun Dasheng100M\N\N
[root@www tmp]#
你會發現是個文本文件。所以不能直接導入數據庫了。需要使用load data infile 恢復
回到mysql服務器端,刪除年齡大於30的用戶,模擬數據被破壞
mysql> delete from students where Age > 30;
mysql> load data infile '/tmp/stud.txt' into table students;
2、利用mysqldump工具對數據進行備份和還原
mysqldump 常用來做溫備,所以我們首先需要對想備份的數據施加讀鎖,
2.1 施加讀鎖的方式:
1.直接在備份的時候添加選項
--lock-all-tables 是對要備份的數據庫的所有表施加讀鎖
--lock-table 僅對單張表施加讀鎖,即使是備份整個數據庫,它也是在我們備份某張表的時候纔對該表施加讀鎖,因此適用於備份單張表
2、在服務器端書寫命令,
mysql> flush tables with read lock; 施加鎖,表示把位於內存上的表統統都同步到磁盤上去,然後施加讀鎖
mysql> flush tables with read lock;釋放讀鎖
但這對於InnoDB存儲引擎來講,雖然你也能夠請求道讀鎖,但是不代表它的所有數據都已經同步到磁盤上,因此當面對InnoDB的時候,我們要使用mysql> show engine innodb status; 看看InnoDB所有的數據都已經同步到磁盤上去了,才進行備份操作。
2.2備份的策略:
完全備份+增量備份+二進制日誌
演示備份的過程;
2.3 先給數據庫做完全備份:
1 2 3 4 5 | [root@www ~]# mysqldump -uroot --single-transaction --master-data= 2 --databases hellodb > /backup/hellodb_`date +%F`.sql --single-transaction: 基於此選項能實現熱備InnoDB表;因此,不需要同時使用--lock-all-tables; --master-data= 2 記錄備份那一時刻的二進制日誌的位置,並且註釋掉, 1 是不註釋的 --databases hellodb 指定備份的數據庫 然後回到mysql服務器端, |
2.4回到mysql服務器端更新數據
1 2 | mysql> create table tb1(id int ); 創建表 mysql> insert into tb1 values ( 1 ),( 2 ),( 3 ); 插入數據,這裏只做演示,隨便插入了幾個數據 |
2.5先查看完全備份文件裏邊記錄的位置:
1 2 | [root@www backup]# cat hellodb_2013- 09 - 08 .sql | less -- CHANGE MASTER TO MASTER_LOG_FILE= 'mysql-bin.000013' , MASTER_LOG_POS= 15684 ; 記錄了二進制日誌的位置 |
2.6 在回到服務器端:
1 2 3 4 5 6 7 | mysql> show master status; 顯示此時的二進制日誌的位置 從備份文件裏邊記錄的位置到我們此時的位置,即爲增量的部分 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. 000004 | 15982 | | | +------------------+----------+--------------+------------------+ |
2.7做增量備份
1 2 | [root@www backup]# mysqlbinlog --start-position= 15694 --stop-position= 15982 /mydata/data/mysql-bin. 000013 > /backup/hellodb_`date +$F_%H`.sql |
2.8再回到服務器
1 2 | mysql> insert into tb1 values ( 4 ),( 5 ); 在插入一些數值 mysql> drop database hellodb; 刪除hellodb庫 |
2.9導出這次得二進制日誌:
1 2 | [root@www backup]# mysqlbinlog --start-position= 15982 /mydata/data/mysql-bin. 000013 查看刪除操作時二進制日誌的位置 [root@www backup]# mysqlbinlog --start-position= 15982 --stop-position= 16176 /mydata/data/mysql-bin. 000013 > /tmp/hellodb.sql //導出二進制日誌 |
2.10先讓mysql離線
1 2 3 | 回到服務器端: mysql> set sql_log_bin= 0 ; 關閉二進制日誌 mysql> flush logs; 滾動下日誌 |
2.11模擬數據庫損壞
1 | mysql> drop database hellodb; |
2.12開始恢復數據:
1 2 3 | [root@www ]# mysql < /backup/hellodb_2013- 09 - 08 .sql //導入完全備份文件 [root@www ]# mysql < /backup/hellodb_2013- 09 -08_05.sql //導入增量備份文件 [root@www ]# mysql< hellodb.sql //導入二進制文件 |
驗證完成,顯示結果爲我們預想的那樣
注:
1、真正在生產環境中,我們應該導出的是整個mysql服務器中的數據,而不是單個庫,因此應該使用--all-databases
2、在導出二進制日誌的時候,可以直接複製文件即可,但是要注意的是,備份之前滾動下日誌。
3、利用lvm快照實現幾乎熱備的數據備份與恢復
3.1策略:
完全備份+二進制日誌;
3.2準備:
注:事務日誌必須跟數據文件在同一個LV上;
3.3創建lvm Lvm的創建這裏就不多說了,想了解話點擊http://limian.blog.51cto.com/7542175/1256660
3.4 修改mysql主配置文件存放目錄內的文件的權限與屬主屬組,並初始化mysql
1 2 3 4 5 | [root@www ~]# mkdir /mydata/data //創建數據目錄 [root@www ~]# chown mysql:mysql /mydata/data //改屬組屬主 [root@www ~]# [root@www ~]# cd /usr/local/mysql/ //必須站在此目錄下 [root@www mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data //初始化mysql |
3.5修改配置文件:
1 2 3 | vim /etc/my.cof datadir=/mydata/data 添加數據目錄 sync_binlog = 1 開啓此功能 |
3.6 啓動服務
1 2 3 | [root@www mysql]# service mysqld start mysql> set session sql_log_bin= 0 ; 關閉二進制日誌 mysql> source /backup/all_db_2013- 09 - 08 .sql 讀取備份文件 |
3.7回到mysql服務器:
1 2 3 4 5 6 7 8 9 10 | mysql> FLUSH TABLES WITH READ LOCK; 請求讀鎖 注:不要退出,另起一個終端: mysql> SHOW MASTER STATUS; 查看二進制文件的位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. 000004 | 107 | | | +------------------+----------+--------------+------------------+ 1 row in set ( 0.00 sec) mysql> FLUSH LOGS; 建議滾動下日誌。這樣備份日誌的時候就會很方便了 |
3.8導出二進制文件,創建個目錄單獨存放
1 2 3 | [root@www ~]# mkdir /backup/limian [root@www ~]# mysql -e 'show master status;' > /backup/limian/binlog.txt [root@www ~]# |
3.9爲數據所在的卷創建快照:
1 | [root@www ~]# lvcreate -L 100M -s -p r -n mysql_snap /dev/myvg/mydata |
回到服務器端,釋放讀鎖
1 2 3 4 | mysql> UNLOCK TABLES; [root@www ~]# mount /dev/myvg/mysql_snap /mnt/data [root@www data]# cp * /backup/limian/ [root@www data]#lvremove /dev/myvg/mylv_snap |
3.10更新數據庫的數據,並刪除數據目錄先的數據文件,模擬數據庫損壞
1 2 3 4 5 6 7 | mysql> create table limiantb (id int ,name CHAR( 10 )); mysql> insert into limiantb values ( 1 , 'tom' ); [root@www data]# mysqlbinlog --start-position= 187 mysql-bin. 000003 > /backup/limian/binlog.sql [root@www backup]# cd /mydata/data/ [root@www data]# rm -rf * [root@www ~]# cp -a /backup/limian/* /mydata/data/ [root@www data]# chown mysql:mysql * |
3.11測試
啓動服務
1 2 3 4 5 6 7 | [root@www data]# service mysqld start [root@www data]# mysql 登陸測試 mysql> SHOW DATABASES; mysql> SET sql_log_bin= 0 mysql> source/backup/limian/binlog.sql; #二進制恢復 mysql> SHOW TABLES; #查看恢復結果 mysql> SET sql_log_bin= 1 ; #開啓二進制日誌 |
注:此方式實現了接近於熱備的方式備份數據文件,而且數據文件放在lvm中可以根據數據的大小靈活改變lvm的大小,備份的方式也很簡單。
4、基於Xtrabackup做備份恢復
官方站點:www.percona.com
優勢:
1、快速可靠的進行完全備份
2、在備份的過程中不會影響到事務
3、支持數據流、網絡傳輸、壓縮,所以它可以有效的節約磁盤資源和網絡帶寬。
4、可以自動備份校驗數據的可用性。
安裝Xtrabackup
1 | [root@www ~]# rpm -ivh percona-xtrabackup- 2.1 . 4 - 656 .rhel6.i686.rpm |
其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 獲得
注意:在備份數據庫的時候,我們應該具有權限,但需要注意的是應該給備份數據庫時的用戶最小的權限,以保證安全性,
4.1前提:
應該確定採用的是單表一個表空間,否則不支持單表的備份與恢復。
在配置文件裏邊的mysqld段加上
innodb_file_per_table = 1
4.2備份策略
完全備份+增量備份+二進制日誌
4.3準備個目錄用於存放備份數據
1 | [root@www ~]# makdir /innobackup |
4.4做完全備份:
1 | [root@www ~]# innobackupex --user=root --password=mypass /innobackup/ |
注:
1、只要在最後一行顯示 innobackupex: completed OK!,就說明你的備份是正確的。
2、另外要注意的是每次備份之後,會自動在數據目錄下創建一個以當前時間點命名的目錄用於存放備份的數據,那我們去看看都有什麼
[root@www 2013-09-12_11-03-04]# ls
backup-my.cnf ibdata1 performance_schema xtrabackup_binary xtrabackup_checkpoints
hellodb mysql test xtrabackup_binlog_info xtrabackup_logfile
[root@www 2013-09-12_11-03-04]#
xtrabackup_checkpoints :備份類型、備份狀態和LSN(日誌序列號)範圍信息;
xtrabackup_binlog_info :mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
xtrabackup_logfile :非文本文件,xtrabackup自己的日誌文件
xtrabackup_binlog_pos_innodb :二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
backup-my.cnf :備份時數據文件中關於mysqld的配置
4.5回到mysql服務器端對數據進行更新操作
1 2 | mysql> use hellodb; mysql> delete from students where StuID>= 24 ; |
4.6增量備份
1 2 3 | innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental 指定備份類型 --incremental-basedir= 指定這次增量備份是基於哪一次備份的,這裏是完全備份文件,這樣可以把增量備份的數據合併到完全備份中去 |
4.7第二次增量
先去修改數據
1 2 3 | mysql> insert into students (Name,Age,Gender,ClassID,TeacherID) values ( 'tom' , 33 , 'M' , 2 , 4 ); innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 37 - 01 / 這裏只須要把最後的目錄改爲第一次增量備份的數據目錄即可 |
4.8最後一次對數據更改但是沒做增量備份
1 | mysql> delete from coc where id= 14 ; |
4.9把二進制日誌文件備份出來,(因爲最後一次修改,沒做增量備份,要依賴二進制日誌做時間點恢復)
1 | [root@www data]# cp mysql-bin. 000003 /tmp/ |
4.10模擬數據庫崩潰
1 2 | [root@www data]# service mysqld stop [root@www data]# rm -rf * |
恢復前準備
4.11對完全備份做數據同步
1 | [root@www ~]# innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / |
4.12對第一次增量做數據同步
1 | innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 37 - 01 / |
4.13對第二次增量做數據同步
1 2 | innobackupex --apply-log --redo-only /innobackup/ 2013 - 09 -12_11- 03 - 04 / --incremental-basedir=/innobackup/ 2013 - 09 -12_11- 45 - 53 / --apply-log 的意義在於把備份時沒commit的事務撤銷,已經commit的但還在事務日誌中的應用到數據庫 |
注:
對於xtrabackup來講,它是基於事務日誌和數據文件備份的,備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據庫文件中的事務,還應該對其做預處理,把已提交的事務同步到數據文件,未提交的事務要回滾。因此其備份的數據庫,不能立即拿來恢復。
預處理的過程:
首先對完全備份文件只把已提交的事務同步至數據文件,要注意的是有增量的時候,不能對事務做數據回滾,不然你的增量備份就沒有效果了。
然後把第一次的增量備份合併到完全備份文件內,
以此類推,把後幾次的增量都合併到前一次合併之後的文件中,這樣的話,我們只要拿着完全備份+二進制日誌,就可以做時間點恢復。
4.14數據恢復
1 2 3 4 | [root@www ~]# service mysqld stop [root@www data]# rm -rf * 模擬數據庫崩潰 [root@www ~]# innobackupex --copy-back /innobackup/ 2013 - 09 -12_11- 03 - 04 / --copy-back數據庫恢復,後面跟上備份目錄的位置 |
4.15檢測:
1 2 3 | [root@www ~]# cd /mydata/data/ [root@www data]# chown mysql:mysql * [root@www data]#service mysqld start |
檢測結果數據正常。
本文出自http://www.cnblogs.com/paul8339/p/8023779.html