溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中怎么進(jìn)行大數(shù)據(jù)的備份和還原

發(fā)布時(shí)間:2021-08-09 13:54:08 來(lái)源:億速云 閱讀:448 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“MySQL中怎么進(jìn)行大數(shù)據(jù)的備份和還原”,在日常操作中,相信很多人在MySQL中怎么進(jìn)行大數(shù)據(jù)的備份和還原問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL中怎么進(jìn)行大數(shù)據(jù)的備份和還原”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

大數(shù)據(jù)量備份與還原,始終是個(gè)難點(diǎn)。當(dāng)MYSQL超10G,用mysqldump來(lái)導(dǎo)出就比較慢了。在這里推薦xtrabackup,這個(gè)工具比mysqldump要快很多。

本文還參考了:http://blog.chinaunix.net/uid-20682026-id-3319204.html

xtrabackup備份恢復(fù)測(cè)試

一、Xtrabackup介紹

1、Xtrabackup是什么

Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品。

Xtrabackup有兩個(gè)主要的工具:xtrabackup、innobackupex

1、xtrabackup只能備份InnoDB和XtraDB兩種數(shù)據(jù)表,而不能備份MyISAM數(shù)據(jù)表
      2、 innobackupex是參考了InnoDBHotbackup的innoback腳本修改而來(lái)的.innobackupex是一個(gè)perl腳本封裝,封裝了xtrabackup。主要是為了方便的同時(shí)備份InnoDB和MyISAM引擎的表,但在處理myisam時(shí)需要加一個(gè)讀鎖。并且加入了一些使用的選項(xiàng)。如slave-info可以記錄備份恢復(fù)后,作為slave需要的一些信息,根據(jù)這些信息,可以很方便的利用備份來(lái)重做slave。

2、Xtrabackup可以做什么 :

在線(熱)備份整個(gè)庫(kù)的InnoDB、 XtraDB表

在xtrabackup的上一次整庫(kù)備份基礎(chǔ)上做增量備份(innodb only)
以流的形式產(chǎn)生備份,可以直接保存到遠(yuǎn)程機(jī)器上(本機(jī)硬盤空間不足時(shí)很有用)

MySQL數(shù)據(jù)庫(kù)本身提供的工具并不支持真正的增量備份,二進(jìn)制日志恢復(fù)是point-in-time(時(shí)間點(diǎn))的恢復(fù)而不是增量備份。
Xtrabackup工具支持對(duì)InnoDB存儲(chǔ)引擎的增量備份,工作原理如下:

(1)首先完成一個(gè)完全備份,并記錄下此時(shí)檢查點(diǎn)的LSN(Log Sequence Number)。
(2)在進(jìn)程增量備份時(shí),比較表空間中每個(gè)頁(yè)的LSN是否大于上次備份時(shí)的LSN,如果是,則備份該頁(yè),同時(shí)記錄當(dāng)前檢查點(diǎn)的LSN。
首先,在logfile中找到并記錄最后一個(gè)checkpoint(“l(fā)ast checkpoint LSN”),然后開(kāi)始從LSN的位置開(kāi)始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開(kāi)始拷貝全部的數(shù)據(jù)文件.ibd;在拷貝全部數(shù)據(jù)文件結(jié)束之后,才停止拷貝logfile。

因?yàn)閘ogfile里面記錄全部的數(shù)據(jù)修改情況,所以,即時(shí)在備份過(guò)程中數(shù)據(jù)文件被修改過(guò)了,恢復(fù)時(shí)仍然能夠通過(guò)解析xtrabackup_logfile保持?jǐn)?shù)據(jù)的一致。

因?yàn)閕nnobackupex支持innodb,myisam,所以本文說(shuō)一下,怎么使用innobackupex。

二,安裝xtrabackup

1、下載地址

http://www.percona.com/downloads/XtraBackup/

 

2、安裝

根據(jù)需求,選擇不同的版本,我選擇的是rpm安裝包,如果報(bào)以下錯(cuò)誤

代碼如下:


[root@localhost xtrabackup]# rpm -ivhpercona-xtrabackup-2.2.4-5004.el6.x86_64.rpm 
warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
perl(Time::HiRes) is needed by percona-xtrabackup-2.2.4-5004.el6.x86_64

解決辦法:

代碼如下:

[root@localhost xtrabackup]# yum -y install perl perl-devellibaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安裝依賴包  
[root@localhost xtrabackup]# rpm -ivhpercona-xtrabackup-2.2.4-5004.el6.x86_64.rpm   //重新安裝  
warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1Signature, key ID cd2efd2a: NOKEY  
Preparing... ########################################### [100%]  
1:percona-xtrabackup ########################################### [100%]  

注意:

xtrabackup 2.2.4不支持mysql 5.1.73,所以如果要用新的xtrabackup,就要用高版本的mysql數(shù)據(jù)庫(kù),不然就會(huì)報(bào)以下錯(cuò)誤:
innobackupex: Error: Unsupported server version: '5.1.73'

下載時(shí)選擇二進(jìn)制已經(jīng)編譯好的格式比較方便,解壓后直接使用,需要做如下操作:

tar zxvf xtrabackup-1.6.tar.gz

cp /xtrabackup-1.6/bin/innobackupex /usr/bin/innobackupex

cp /xtrabackup-1.6/bin/xtrabackup  /usr/bin/xtrabackup

cp/xtrabackup-1.6/bin/xtrabackup_51  /usr/bin/xtrabackup_51

這里需要注意的是xtrabackup_51中的51指的是mysql的版本5.1,這個(gè)根據(jù)mysql版本的不同拷貝不同的命令

二、修改my.cnf

查看一下mysqld下面有沒(méi)有datadir,如果沒(méi)有加上

代碼如下:


[mysqld]  
datadir=/var/lib/mysql (這個(gè)路徑是mysql初始化時(shí)候的路徑,安裝mysql不同路徑不同,我的路徑為/usr/local/mysql/data) 

不加的話,還原數(shù)據(jù)的時(shí)候,有可能會(huì)出現(xiàn)以下問(wèn)題:

代碼如下:


xtrabackup: Error: Please set parameter 'datadir'
innobackupex: fatal error: no 'mysqld' group in MySQL options
innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQLoptions

如果當(dāng)輸入innobackupex相關(guān)命令的時(shí)候報(bào)如下的錯(cuò)誤提示:

Can't locateTime/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at/usr/local/bin/pt-query-digest line 3187.

BEGINfailed--compilation aborted at /usr/local/bin/pt-query-digest line 3187.

解決方案:

.pm實(shí)際上是Perl的包,只需安裝如下軟件包即可:

yum install -yperl-Time-HiRes

三、全部數(shù)據(jù)庫(kù)備份與還原

1、全部數(shù)據(jù)庫(kù)備份

代碼如下:


# innobackupex --defaults-file=/etc/my.cnf --user=root /home/tank/backup

如果你的mysql庫(kù)有密碼就必須加一項(xiàng)—password=‘password’.

/  

如果報(bào)以下錯(cuò)誤:

代碼如下:


InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!
innobackupex: Error: The xtrabackup child process has died at/usr/bin/innobackupex line 2679.

解決辦法:在my.cnf的mysqld中加入以下內(nèi)容:

代碼如下:


[mysqld]  
innodb_log_file_size = 5M  

2、單數(shù)據(jù)庫(kù)備份

代碼如下:


# innobackupex --defaults-file=/etc/my.cnf --user=root --database=backup_test/home/tank/backup/  

經(jīng)驗(yàn)證,備份單個(gè)庫(kù)沒(méi)有問(wèn)題。存在的不足是,恢復(fù)的時(shí)候,數(shù)據(jù)目錄必須為空。也就是說(shuō),在恢復(fù)階段,需要將現(xiàn)有的數(shù)據(jù)目錄改名為臨時(shí)目錄;在恢復(fù)之后,將原數(shù)據(jù)目錄(現(xiàn)臨時(shí)目錄)下的其他庫(kù)的內(nèi)容拷貝到數(shù)據(jù)目錄下即可。

3、數(shù)據(jù)庫(kù)備份并壓縮

代碼如下:


# innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar /home/tank/backup | gzip > /home/tank/backup/`date+%F_%H-%M-%S`.tar.gz  

4、全數(shù)據(jù)還原

代碼如下:


# /etc/init.d/mysqld stop      //停掉mysql  
# mv /var/lib/mysql /var/lib/mysql_bak   //數(shù)據(jù)目錄備份  
# mkdir -p /var/lib/mysql  //重建數(shù)據(jù)目錄  
  
//--apply-log選項(xiàng)的命令是準(zhǔn)備在一個(gè)備份上啟動(dòng)mysql服務(wù)  
# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log/home/tank/backup/2014-09-18_16-35-12  
  
//--copy-back 選項(xiàng)的命令從備份目錄拷貝數(shù)據(jù),索引,日志到my.cnf文件里規(guī)定的初始位置  
# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back/home/tank/backup/2014-09-18_16-35-12  
  
# chown -R mysql.mysql /var/lib/mysql  //改變文件所屬  
# /etc/init.d/mysqld stop  //啟動(dòng)mysql  

四、增量備份與還原

1、創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)和表

代碼如下:


create database backup_test;  //創(chuàng)建庫(kù)  
  
CREATE TABLE `backup` (  //創(chuàng)建表  
 `id` int(11) NOT NULL AUTO_INCREMENT ,  
 `name` varchar(20) NOT NULL DEFAULT '' ,  
 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,  
 `del` tinyint(1) NOT NULL DEFAULT '0',  
 PRIMARY KEY (`id`)  
) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  

2、增量備份

代碼如下:


mysql> INSERT INTO backup (name) VALUES ('tank'),('tank1');  //插入數(shù)據(jù)  
  
# innobackupex --defaults-file=/etc/my.cnf --user=root--incremental-basedir=/home/tank/backup/2014-09-18_16-35-12 --incremental/home/tank/backup/  

3、在增量的基礎(chǔ)上在進(jìn)行增量備份

代碼如下:


mysql> INSERT INTO backup (name) VALUES('tank2'),('tank3'),('tank4'),('tank5'),('tank6');  //在插入數(shù)據(jù)  
  
//2014-09-18_18-05-20這個(gè)目錄,上次增量備份產(chǎn)生的目錄  
# innobackupex --defaults-file=/etc/my.cnf --user=root--incremental-basedir=/home/tank/backup/2014-09-18_18-05-20 --incremental /home/tank/backup/  

查看增量備份記錄文件:

代碼如下:


[root@localhost 2014-09-18_16-35-12]# cat xtrabackup_checkpoints   //全備目錄下的文件  
backup_type = full-prepared  
from_lsn =0             //全備起始為0  
to_lsn = 23853959  
last_lsn = 23853959  
compact = 0  
  
[root@localhost 2014-09-18_18-05-20]# cat xtrabackup_checkpoints  //第一次增量備份目錄下的文件  
backup_type = incremental  
from_lsn = 23853959  
to_lsn = 23854112  
last_lsn = 23854112  
compact = 0  
  
[root@localhost 2014-09-18_18-11-43]# cat xtrabackup_checkpoints  //第二次增量備份目錄下的文件  
backup_type = incremental  
from_lsn = 23854112  
to_lsn = 23854712  
last_lsn = 23854712  
compact = 0  

增量備份做完后,把backup_test這個(gè)數(shù)據(jù)庫(kù)刪除掉,drop databasebackup_test;這樣可以對(duì)比還原后。

4、增量還原

代碼如下:


# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only/home/tank/backup/2014-09-18_16-35-12  
  
# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only/home/tank/backup/2014-09-18_16-35-12--incremental-dir=/home/tank/backup/2014-09-18_18-05-20 
  
# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only/home/tank/backup/2014-09-18_16-35-12--incremental-dir=/home/tank/backup/2014-09-18_18-11-43 

在這里有三個(gè)目錄:

1)、/home/tank/backup/2014-09-18_16-35-12,全備份目錄
2)、/home/tank/backup/2014-09-18_18-05-20,第一次增量備份產(chǎn)生的目錄
3)、/home/tank/backup/2014-09-18_18-11-43,第二次增量備份產(chǎn)生的目錄

到這里增量還原,還沒(méi)有結(jié)束,還有最重要一步,就是要進(jìn)行一次全量還原。停止數(shù)據(jù)庫(kù),刪除/var/lib/mysql,在還原。

增量備份的原理就是,,把增量目錄下的數(shù)據(jù),整合到全變量目錄下,然后在進(jìn)行,全數(shù)據(jù)量的還原。

總體來(lái)說(shuō),innobackupex速度快,支持innodb,myisam,用起來(lái)是還不是很方便,單庫(kù)還原,還是增量備份還原,都要進(jìn)行全部數(shù)據(jù)庫(kù)還原,這個(gè)不合理。

此處可以寫個(gè)腳本做備份(backup.sh)

      #!/bin/sh

      echo "開(kāi)始備份..."`date`

      log=zztx01_`date+%y%m%d%H%M`.log

      str=zztx01_`date +%y%m%d%H%M`.tar.gz

      innobackupex--user=root --password=123456 --defaults-file=/etc/my.cnf --database=zztx--stream=tar /data/back_data/ 2>/data/back_data/$log | gzip1>/data/back_data/$str

      echo "備份完畢..."`date`

說(shuō)明:
      --database=zztx 單獨(dú)對(duì)zztx數(shù)據(jù)庫(kù)做備份,若是不添加此參數(shù)那就那就是對(duì)全庫(kù)做備份
     2>/data/back_data/zztx.log  輸出信息寫入日志中
     1>/data/back_data/zztx.tar.gz 打包壓縮存儲(chǔ)到該文件中

五、innobackup 常用參數(shù)說(shuō)明

--defaults-file
同xtrabackup的--defaults-file參數(shù)

--apply-log
對(duì)xtrabackup的--prepare參數(shù)的封裝

--copy-back
做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir ;

--remote-host=HOSTNAME
通過(guò)ssh將備份數(shù)據(jù)存儲(chǔ)到進(jìn)程服務(wù)器上;

--stream=[tar]
備份文件輸出格式, tar時(shí)使用tar4ibd , 該文件可在XtarBackupbinary文件中獲得.如果備份時(shí)有指定--stream=tar,則tar4ibd文件所處目錄一定要在$PATH中(因?yàn)槭褂玫氖莟ar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在使用參數(shù)stream=tar備份的時(shí)候,你的xtrabackup_logfile可能會(huì)臨時(shí)放在/tmp目錄下,如果你備份的時(shí)候并發(fā)寫入較大的話xtrabackup_logfile可能會(huì)很大(5G+),很可能會(huì)撐滿你的/tmp目錄,可以通過(guò)參數(shù)--tmpdir指定目錄來(lái)解決這個(gè)問(wèn)題。

--tmpdir=DIRECTORY
當(dāng)有指定--remote-hostor --stream時(shí), 事務(wù)日志臨時(shí)存儲(chǔ)的目錄, 默認(rèn)采用MySQL配置文件中所指定的臨時(shí)目錄tmpdir

--redo-only --apply-log,
強(qiáng)制備份日志時(shí)只redo ,跳過(guò)rollback。這在做增量備份時(shí)非常必要。

--use-memory=#
該參數(shù)在prepare的時(shí)候使用,控制prepare時(shí)innodb實(shí)例使用的內(nèi)存量

--throttle=IOS
同xtrabackup的--throttle參數(shù)
--sleep=是給ibbackup使用的,指定每備份1M數(shù)據(jù),過(guò)程停止拷貝多少毫秒,也是為了在備份時(shí)盡量減小對(duì)正常業(yè)務(wù)的影響,具體可以查看ibbackup的手冊(cè);

--compress[=LEVEL]
對(duì)備份數(shù)據(jù)迚行壓縮,僅支持ibbackup,xtrabackup還沒(méi)有實(shí)現(xiàn);

--include=REGEXP
對(duì) xtrabackup參數(shù)--tables的封裝,也支持ibbackup。備份包含的庫(kù)表,例如:--include="test.*",意思是要備份 test庫(kù)中所有的表。如果需要全備份,則省略這個(gè)參數(shù);如果需要備份test庫(kù)下的2個(gè)表:test1和test2,則寫成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。

--databases=LIST
列出需要備份的databases,如果沒(méi)有指定該參數(shù),所有包含MyISAM和InnoDB表的database都會(huì)被備份;

--uncompress
解壓備份的數(shù)據(jù)文件,支持ibbackup,xtrabackup還沒(méi)有實(shí)現(xiàn)該功能;

--slave-info,
備份從庫(kù), 加上--slave-info備份目錄下會(huì)多生成一個(gè)xtrabackup_slave_info 文件, 這里會(huì)保存主日志文件以及偏移, 文件內(nèi)容類似于:CHANGE MASTER TOMASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET
指定mysql.sock所在位置,以便備份進(jìn)程登錄mysql.

到此,關(guān)于“MySQL中怎么進(jìn)行大數(shù)據(jù)的備份和還原”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI