mysql之使用xtrabackup進行物理備份、恢復、在線克隆從庫、在線重做主從


注:圖片來自《深入淺出MySQL 數據庫開發 優化與管理維護 第2版

  

物理備份和恢復

1.冷備份:停掉mysql再備份,一般很少用,因為很多應用不允許長時間停機,停機備份的可以直接CP數據庫的數據目錄,在進行恢復前,停掉mysql,然后把數據目錄覆蓋掉,再重啟mysql。

 

2.熱備份

Myisam存儲引擎

可以使用mysqlhotcopy工具,如果此工具無法使用時,可以手工使用:flush tables with read lock;手動加讀鎖,然后復制mysiam表的文件做熱備。

 

innodb引擎

3.使用xtrabackup熱備工具,是percona公司的開源、免費、支持在線熱備、備份恢復、在線主從、備份和恢復速度快,占用磁盤空間小,並且支持不同情況下的多種備份形式。下載地址:http://www.percona.com/redir/downloads/XtraBackup

本文檔下載了rpm包進行安裝,需要安裝兩個依賴包:

yum install perl-Time-HiRes -y

yum -y install perl-DBD-MySQL.x86_64

  

安裝完成后:

主要有兩個命令:xtrabackup和innobackupex,兩者區別如下:

xtrabackup只能備份Innodb和xtradb兩種數據表,不能備份myisam表,且備份出來沒有表結構定義文件.frm,只是拷貝了datafile

innobackupex是一個封裝了xtrabackup和perl腳本,支持同時備份Innodb和myisam,但在對於myisam備份時需要加一個全局鎖。

示例:

下面是innobackupex命令備份全過程:

備份開始時會先開啟一個后台檢測進程,實時檢測mysql redo日志(事務日志)的變化,一旦發現redo日志中有新日志寫入,立刻記錄后台日志文件xtrabackup_log文件中,之后復制Innodb的數據文件和系統表空間文件ibdata1,復制結束后,執行flush tables with read lock操作,復制.frm.MYI.MYD等文件(執行flush tables with read lock的目的是為了防止讀取數據的時候發生DDL操作,並且在這一刻獲取binlog的位置),最后發出unlock tables,把表設置為可讀寫狀態,最終終止xtrabackup_log文件的寫入。

 

完備恢復:

恢復過程原理示意圖如下:

 

恢復階段會啟動xtrabackup內嵌的innodb實例,回放xtrabackup日志xtrabackup_log文件中的事務,將已經提交的事務變更應用到innodb數據文件、表空間,同時回滾未提交的事務,這一過程類似innodb實例的故障恢復

 

增量備份:

增量備份過程示意圖如下:

innobackupex增量備份過程中的增量處理,其實主要相對innodb而言,對myisam和其他存儲引擎而言,仍然是每次一個全備。增量備份過程主要是通過拷貝innodb有變更的頁,這些變更數據頁指的是LSN大於xtrabackup_checkpoints中給定的LSN,增量備份是基於全備的,第一次增量備份的數據必須要基於最近一次全備,之后每次增備都是基於上一次增備的基礎上進行。過程跟完備一樣,只是增備時在復制數據文件時復制的是上一次備份后從大於xtrabackup_checkpoints開始的改變的頁。

 

增量備份恢復

過程示意圖如下:

 

和全備恢復類似,也需要兩部,一部分數據文件的恢復,這里數據文件包括全備份、增量備份和xtrabackup_log文件中已提交事務的回放,第二部分是對未提交事務的回滾

 

4.innobackupex使用示例:

1)、安裝:

shell > yum install perl-Time-HiRes -y

shell > yum -y install perl-DBD-MySQL.x86_64

shell > wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.11/binary/redhat/6/x86_64/percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

shell > rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

 

2)、全量備份:

創建備份用戶:

mysql > grant reload,lock tables,replication client,create tablespace,super on *.* to 'backup'@'%' identified by '123456';

mysql > flush privileges; 

 

3)、創建備份路徑為:

shell > mkdir -p /data/backup/hotbackup,

創建innobackupex配置文件:

[mysqld]

datadir = /data/mysql/data

innodb_data_home_dir = /data/mysq/data/data1

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /data/mysql/data

innodb_log_files_in_group = 2

innodb_log_file_size = 536870912

 

4)、創建測試表:

mysql > use test

mysql > create table test(id int auto_increment not null primary key,name varchar(20));

mysql > insert into test(name) values(‘test1’);

mysql > insert into test(name) values(‘test2’);

mysql > insert into test(name) values(‘test3’);

mysql > insert into test(name) values(‘test4’);

 

5)、執行全備:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/full --no-timestamp

這里--socket選項可以不要,因為指定配置文件中可以找到socket文件位置,如果配置文件中配置了用戶名和密碼,那么--user和--password也可以不指定 

 

6)、恢復全備(回放事務日志):

shell > innobackupex --apply-log --use-memory=2G /data/backup/hotbackup/full

 

恢復全備(復制文件):這個過程要關閉mysql,重命名原來的數據目錄,將備份數據復制到數據目錄下命名為原來的數據目錄,修改權限,啟動mysql:

shell > mysqladmin -s /tmp/mysql.sock shut

shell > mv /data/mysql/data /data/mysql/data.bak

shell > mkdir /data/mysql/data

shell > innobackupex --defaults-file=/tmp/my.cnf --copy-backup --rsync /data/backup/hotbackup/full

shell > chown -R mysql.mysql /data/mysql/data

shell > service mysqld start

 

7)、登錄數據庫查詢數據:

 

8)、增量備份

注意:第一次增量備份是基於完備的基礎上,第二次增備是基於前一次增備的基礎上進行的。

創建基礎完備:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/base --no-timestamp

 

接着在test庫下對test表新增數據:

mysql > insert into test(name) values(‘test5’);

mysql > insert into test(name) values(‘test6’);

mysql > insert into test(name) values(‘test7’);

mysql > insert into test(name) values(‘test8’);

 

創建第一次增量備份:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --incremental /data/backup/hotbackup/incremental_one --incremental-basedir=/data/backup/hotbackup/base --no-timestamp --parallel=2

 

繼續插入test表數據:

mysql > insert into test(name) values(‘test9’);

mysql > insert into test(name) values(‘test10’);

 

創建第二次增量備份:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --incremental /data/backup/hotbackup/incremental_two --incremental-basedir=/data/backup/hotbackup/incremental_one --no-tiemstamp --parallel=2

 

9)、增量備份恢復

大體分為三個步驟:

A:恢復完備(需要使用--redo-only參數)

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/base

B:恢復增量備份到基礎備份的還原上(最后一次增量備份恢復外,其他增量備份恢復要加--redo-only參數,此參數表示僅僅只應用xtrabackup日志中已提交的事務,不回滾日志中未提交的事務)

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/base --incremental-dir=/data/backup/hotbackup/incremental_one

shell > innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/base --incremental-dir=/data/backup/hotbackup/incremental_two

C:對整體的基礎備份進行恢復,回滾哪些未提交的數據,前面兩個步驟中未提交的事務在這個步驟中才進行回滾

shell > innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/base

 

D:把恢復完的備份復制到mysql的數據文件目錄中,更改目錄權限,然后啟動mysql

shell > mysqladmin -s /tmp/mysql.sock shut

shell > mv /data/mysql/data/ /data/mysql/data.bak

shell > mkdir /data/mysql/data

shell > innobackupex --defaults-file=/tmp/my.cnf --copy-back --rsync /data/backup/hotbackup/base  #建議使用這個命令復制文件到數據目錄下,因為原始的恢復目錄中的xtrabackup_logfile可能很大,這個命令拷貝的沒有這個文件

shell > chown -R mysql.mysql /data/mysql/data

shell > service mysqld start

 

E:查看數據

 

10)、不完全恢復

前面介紹了使用mysqlbinlog命令提取二進制信息進行不完全恢復,這個方法對innobackup熱備的不完全恢復也適用

如:在14:00的時候誤刪除了數據,就可以進行基於位置和基於時間點一起來進行恢復

A:首先找到最近一次的完備,查看完備目錄中的xtrabackup_binlog_info文件中的備份結束時刻的binlog的日志名稱和position,並查看當前數據庫的binlog文件名和position(show master logs;),注意,如果兩個二進制日志文件不是同一個,那么這個跨度范圍內的日志后邊恢復的時候都要用到。

 

B:使用全備恢復數據庫,之后再從熱備(完備)結束時刻的binlog開始,恢復到誤操作時刻之前的binlog(直接使用mysqlbinlog命令提取當前正在使用的二進制日志文件中的信息,這里假設完備結束的位置是100,結束時間是):

shell > mysqlbinlog --start-position=100 --stop-datetime=’2015-05-26 13:59:59’ /data/mysql/data/mysql-bin.000001 /data/mysql/data/mysql-bin.000002 |mysql -uroot -p’xxx’

 

C:跳過故障點時間:

shell > mysqlbinlog --start-datetime=’2015-05-26 14:01:00’ /data/mysql/data/mysql-bin.000001 /data/mysql/data/mysql-bin.000002 |mysql -uroot -p’xxx’

 

11)、克隆slave庫

把現有的主從架構中的從庫克隆一個出來,新增一個從庫,克隆slave時,常用的參數是--slave-info和--safe-slave-backup

--slave-info:將master的binlog的文件名和position保存到xtrabackup_slave_info文件中。

--safe-slave-backup:會暫停slave的SQL線程,直到沒有打開的臨時表的時候開始備份,待備份結束后SQL線程自動啟動,這樣操作的目的主要是確保一致性的復制狀態。

 

示例:

master:192.168.1.1

slave:192.168.1.2

slave:192.168.1.3

 

A:在原slave上進行備份:(備份前先創建用戶密碼,創建備份目錄)

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --slave-info --safe-slave-backup /data/backup/hotbackup/cloneslave --no-timestamp --parallel=2

 

B:在原slave的主機上對備份的目錄進行applog:

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/cloneslave

 

C:將還原后的文件復制到新從庫上:

shell > rsync -avprP -e ssh /data/backup/hotbackup/cloneslave newslave:/data/mysql/data

 

D:在原master上對新slave的同步數據帳號進行授權,當然也可以使用與原slave相同的帳號,不過為了區分,最好采用不同的同步帳號。

 

E:在新slave上復制原slave的my.cnf文件,並修改server-id參數,修改完畢后,啟動新slave

shell > scp salve:/usr/local/services/mysql/my.cnf /usr/local/services/mysql/my.cnf

修改server-id

 

F:查找原slave備份后生成的xtrabackup_salve_info文件,提取其中的master_log_file和master_log_pos信息,然后在新slave上進行change maser to操作。

mysql > change master to MASTER_HOST=’master_ip’,MASTER_USER=’xx’,MASTER_PASSWORD=’123456’,MASTER_LOG_FILE=’xxx.xxx’,MASTER_LOG_POS=1000;

 

G:啟動從庫:

mysql > start slave;

 

12)、如果已有的主從架構中,從庫損壞或者需要更換從庫,那么可以使用xtrabackup在線重做主從:

主庫:192.168.100.77

從庫:192.168.100.76

 

xtrabackup部署mysql主從

A:首先在主從庫上都安裝xtrabackup

 

B:主庫機器要做的事情

a、添加防火牆規則

shell > iptables -I INPUT -p tcp -s 192.168.100.76  --dport=3306 -j ACCEPT

shell > /etc/init.d/iptables save

 

b、添加mysql用戶用於復制binlog

shell > /usr/local/mysql/bin/mysql -uroot -p -S /data/mysql-3306/mysql.sock

mysql > select host,user,password from mysql.user;

mysql > grant replication slave on *.* to backup@'192.168.100.76' identified by '123456';

mysql > flush privileges;

 

主和從的my.cnf中的server-id要不相同,主啟動二進制日志記錄。

用命令備份mysql的datadir下的所有文件

shell > innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --port=3306 /data/backup/dbbackup/

將備份文件夾scp傳輸到從庫機器上,備份出來后是整個文件夾,如2015-04-25_16-14-21

shell > rsync -avprP -e ssh /data/backup/dbbackup/2015-04-25_16-14-21 192.168.100.76:/data/backup/dbbackup  #確保/data/backup/dbbackup目錄在從庫上存在

   

c、從庫上用命令先把事務日志恢復(--apply-log),然后再復制到從庫的datadir(--copy-back)

shell > innobackupex --defaults-file=/usr/local/mysql-slave/my.cnf --user=root --password=123456 --port=3307 --apply-log /data/backup/dbbackup/2015-04-25_16-14-21/

shell > innobackupex --defaults-file=/usr/local/mysql-slave/my.cnf --user=root --password=123456 --port=3307 --copy-back --rsync /data/backup/dbbackup/2015-04-25_16-14-21/

注意:

1)datadir文件夾不存在時會報錯

Warning: option 'innodb_autoextend_increment': unsigned value 33554432 adjusted to 1000

Original data directory does not exist! at /usr/bin/innobackupex line 546.

2)一定要把從庫原來datadir下的所有文件刪除掉再進行上面第二條命令的復制(--copy-back),不然會報錯

 

d、刪除datadir下的事務日志log文件(innodb引擎才會有)

shell > cd /data/mysql-slave/data

shell > rm -rf ib_logfile*

 

e、設置權限,啟動從庫mysql

shell > chown -R mysqlslave:mysqlslave /data/mysql-slave/data

shell > /usr/local/mysql-slave/start_mysql.sh

 

查看備份時的binlog-file

shell >  cat /data/backup/dbbackup/2015-04-27_17-28-16/xtrabackup_binlog_info

mysql-bin.000003        170301293

 

f、再change master to就可以了

shell > /usr/local/mysql-slave/bin/mysql -uroot -p -S /data/mysql-slave/mysql.sock

mysql > change master to master_host='192.168.100.77',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=170301293;

mysql > start slave;

mysql > show slave status\G


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM