mysql數據備份

1、備份的目的html

作災難恢復:對損壞的數據進行恢復和還原
需求改變:因需求改變而須要把數據還原到改變之前
測試:測試新功能是否可用mysql

2、備份須要考慮的問題sql

能夠容忍丟失多長時間的數據;
恢復數據要在多長時間內完; 
恢復的時候是否須要持續提供服務;
恢復的對象,是整個庫,多個表,仍是單個庫,單個表。數據庫

3、備份的類型vim

一、根據是否須要數據庫離線安全

冷備(cold backup):須要關mysql服務,讀寫請求均不容許狀態下進行;
溫備(warm backup): 服務在線,但僅支持讀請求,不容許寫請求;
熱備(hot backup):備份的同時,業務不受影響。服務器

注:網絡

一、這種類型的備份,取決於業務的需求,而不是備份工具
二、MyISAM不支持熱備,InnoDB支持熱備,可是須要專門的工具session

二、根據要備份的數據集合的範圍
徹底備份:full backup,備份所有字符集。
增量備份: incremental backup 上次徹底備份或增量備份以來改變了的數據,不能單獨使用,要藉助徹底備份,備份的頻率取決於數據的更新頻率。
差別備份:differential backup 上次徹底備份以來改變了的數據。
建議的恢復策略:
徹底+增量+二進制日誌
徹底+差別+二進制日誌app

三、根據備份數據或文件

物理備份:直接備份數據文件

優勢:

備份和恢復操做都比較簡單,可以跨mysql的版本,
恢復速度快,屬於文件系統級別的

建議:

不要假設備份必定可用,要測試
mysql>check tables;檢測表是否可用
邏輯備份: 備份表中的數據和代碼

優勢:

恢復簡單、
備份的結果爲ASCII文件,能夠編輯
與存儲引擎無關
能夠經過網絡備份和恢復

缺點:

備份或恢復都須要mysql服務器進程參與
備份結果佔據更多的空間,
浮點數可能會丟失精度
還原以後,縮影須要重建

四:備份的對象

一、 數據;
二、配置文件;
三、代碼:存儲過程、存儲函數、觸發器
四、os相關的配置文件
五、複製相關的配置
六、二進制日誌

5、備份和恢復的實現

一、利用select into outfile實現數據的備份與還原
1.1把須要備份的數據備份出來

 

代碼以下:
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;

二、利用mysqldump工具對數據進行備份和還原

mysqldump 經常使用來作溫備,因此咱們首先須要對想備份的數據施加讀鎖,

2.1 施加讀鎖的方式:

1.直接在備份的時候添加選項

--lock-all-tables 是對要備份的數據庫的全部表施加讀鎖

--lock-table 僅對單張表施加讀鎖,即便是備份整個數據庫,它也是在咱們備份某張表的時候纔對該表施加讀鎖,所以適用於備份單張表

二、在服務器端書寫命令,

mysql> flush tables with read lock; 施加鎖,表示把位於內存上的表通通都同步到磁盤上去,而後施加讀鎖

mysql> flush tables with read lock;釋放讀鎖

但這對於InnoDB存儲引擎來說,雖然你也可以請求道讀鎖,可是不表明它的全部數據都已經同步到磁盤上,所以當面對InnoDB的時候,咱們要使用mysql> show engine innodb status; 看看InnoDB全部的數據都已經同步到磁盤上去了,才進行備份操做。

2.2備份的策略:

徹底備份+增量備份+二進制日誌

演示備份的過程;

2.3 先給數據庫作徹底備份:

 

代碼以下:
[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服務器端更新數據

 

代碼以下:
mysql> create table tb1(id int); 建立表 
mysql> insert into tb1 values (1),(2),(3);  插入數據,這裏只作演示,隨便插入了幾個數據

 

2.5先查看徹底備份文件裏邊記錄的位置:

 

代碼以下:
[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 在回到服務器端:

 

代碼以下:
mysql> show master status; 顯示此時的二進制日誌的位置 
 從備份文件裏邊記錄的位置到咱們此時的位置,即爲增量的部分 
+------------------+----------+--------------+------------------+ 
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+------------------+----------+--------------+------------------+ 
| mysql-bin.000004 |      15982 |              |                  | 
+------------------+----------+--------------+------------------+

 

2.7作增量備份

 

代碼以下:
[root@www backup]# mysqlbinlog --start-position=15694 --stop-position=15982
/mydata/data/mysql-bin.000013 > /backup/hellodb_`date +$F_%H`.sql

 

2.8再回到服務器

 

代碼以下:
mysql> insert into tb1 values (4),(5); 在插入一些數值 
mysql> drop database hellodb;   刪除hellodb庫 

 

2.9導出此次得二進制日誌:

 

代碼以下:
[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離線

回到服務器端:

 

代碼以下:
mysql> set sql_log_bin=0;  關閉二進制日誌 
mysql> flush logs; 滾動下日誌
 

 

2.11模擬數據庫損壞

 

代碼以下:
mysql> drop database hellodb;

 

2.12開始恢復數據:

 

代碼以下:
[root@www ]# mysql < /backup/hellodb_2013-09-08.sql  //導入徹底備份文件 
[root@www ]# mysql < /backup/hellodb_2013-09-08_05.sql //導入增量備份文件 
[root@www ]# mysql< hellodb.sql //導入二進制文件 

 

驗證完成,顯示結果爲咱們預想的那樣

注:

一、真正在生產環境中,咱們應該導出的是整個mysql服務器中的數據,而不是單個庫,所以應該使用--all-databases
二、在導出二進制日誌的時候,能夠直接複製文件便可,可是要注意的是,備份以前滾動下日誌。
三、利用lvm快照實現幾乎熱備的數據備份與恢復

3.1策略:

徹底備份+二進制日誌;

3.2準備:

注:事務日誌必須跟數據文件在同一個LV上;

3.3建立lvm Lvm的建立這裏就很少說了,想了解話點擊//www.jb51.net/LINUXjishu/105937.html

3.4 修改mysql主配置文件存放目錄內的文件的權限與屬主屬組,並初始化mysql

 

代碼以下:
[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修改配置文件:

 

代碼以下:
vim /etc/my.cof 
datadir=/mydata/data   添加數據目錄 
sync_binlog = 1  開啓此功能 

 

3.6 啓動服務

 

代碼以下:
[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服務器:

 

代碼以下:
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導出二進制文件,建立個目錄單獨存放

 

代碼以下:
[root@www ~]# mkdir /backup/limian 
[root@www ~]# mysql -e 'show master status;' > /backup/limian/binlog.txt 
[root@www ~]#

 

3.9爲數據所在的卷建立快照:

 

代碼以下:
[root@www ~]# lvcreate -L 100M -s -p r -n mysql_snap /dev/myvg/mydata

 

回到服務器端,釋放讀鎖

 

代碼以下:
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更新數據庫的數據,並刪除數據目錄先的數據文件,模擬數據庫損壞

 

代碼以下:
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測試

啓動服務

 

代碼以下:
[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的大小,備份的方式也很簡單。

四、基於Xtrabackup作備份恢復

官方站點:www.percona.com

優點:

一、快速可靠的進行徹底備份
二、在備份的過程當中不會影響到事務
三、支持數據流、網絡傳輸、壓縮,因此它能夠有效的節約磁盤資源和網絡帶寬。
四、能夠自動備份校驗數據的可用性。

安裝Xtrabackup

 

代碼以下:
[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準備個目錄用於存放備份數據

 

代碼以下:
[root@www ~]# makdir /innobackup

 

4.4作徹底備份:

 

代碼以下:
[root@www ~]# innobackupex --user=root --password=mypass /innobackup/

 

注:

一、只要在最後一行顯示 innobackupex: completed OK!,就說明你的備份是正確的。
二、另外要注意的是每次備份以後,會自動在數據目錄下建立一個以當前時間點命名的目錄用於存放備份的數據,那咱們去看看都有什麼

[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服務器端對數據進行更新操做

 

代碼以下:
mysql> use hellodb; 
mysql> delete from students where StuID>=24;

 

4.6增量備份

 

代碼以下:
innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-12_11-03-04/ 
--incremental  指定備份類型 
--incremental-basedir= 指定此次增量備份是基於哪一次備份的,這裏是徹底備份文件,這樣能夠把增量備份的數據合併到徹底備份中去

 

4.7第二次增量

先去修改數據

 

代碼以下:
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最後一次對數據更改可是沒作增量備份

 

複製代碼代碼以下:
mysql> delete from coc where id=14;

 

4.9把二進制日誌文件備份出來,(由於最後一次修改,沒作增量備份,要依賴二進制日誌作時間點恢復)

 

複製代碼代碼以下:
[root@www data]# cp mysql-bin.000003 /tmp/

 

4.10模擬數據庫崩潰

 

複製代碼代碼以下:
[root@www data]# service mysqld stop 
[root@www data]# rm -rf * 
 

恢復前準備

4.11對徹底備份作數據同步

 

複製代碼代碼以下:
[root@www ~]# innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/

 

4.12對第一次增量作數據同步

 

複製代碼代碼以下:

innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/

 

4.13對第二次增量作數據同步

 

複製代碼代碼以下:
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數據恢復

 

複製代碼代碼以下:

[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檢測:

 

複製代碼代碼以下:

[root@www ~]# cd /mydata/data/ 
[root@www data]# chown mysql:mysql * 
[root@www data]#service mysqld start

 

檢測結果數據正常。

轉自:https://www.jb51.net/article/41570.htm

相關文章
相關標籤/搜索