Xtrabackup之innobackupex線上熱備mysql資料庫

來源:互聯網
上載者:User

標籤:xtrabackup innobackupex

XtraBackup簡介

Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。

Xtrabackup有兩個主要的工具:xtrabackup、innobackupex

(1)xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表

(2)innobackupex-1.5.1則封裝了xtrabackup,是一個指令碼封裝,所以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖


PERCONA

官網地址:http://www.percona.com/

軟體:http://www.percona.com/downloads/XtraBackup/LATEST/binary/tarball/percona-xtrabackup-2.2.3-4982-Linux-x86_64.tar.gz

部署軟體版本

CentOS 6.4 64bit

xtrabackup版本:percona-xtrabackup-2.2.3-4982-Linux-x86_64.tar.gz 

mysql版本:mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz


一、安裝解壓XtraBackup

1、安裝percona-xtrabackuprpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm ***非必須***{yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt libgcrypt-devel }yum -y install perl-Time-HiRes perl-DBD-MySQLtar xf percona-xtrabackup-2.2.3-4982-Linux-x86_64.tar.gz cp percona-xtrabackup-2.2.3-Linux-x86_64/bin/* /usr/bin/2、安裝資料庫安裝mysql這裡不再累述:請參考我之前的部落格,謝謝.....[[email protected] ~]# mysql --versionmysql  Ver 14.14 Distrib 5.6.12, for linux-glibc2.5 (x86_64) using  EditLine wrapper預設的儲存引擎是InnoDB需要注意一下 rm -rf /etc/my.cnf(安裝perl-DBD-MySQL的時候預設會安裝上mysql-libs內建/etc/my.cnf)ln -s /usr/local/mysql/my.cnf /etc/3、建立資料庫# mysqladmin -uroot password -p 1234# mysql -uroot -p1234mysql> create database security;mysql> use security;mysql> create table t_user(usename char(20),password char(10),tel char(11));mysql> desc t_user;mysql> insert into t_user values(‘zhengyansheng‘,‘1234‘,‘13260071987‘);mysql> insert into t_user values(‘wangyuzhi‘,‘1234‘,‘13260071987‘);mysql> insert into t_user values(‘wangqiyu‘,‘1234‘,‘13260071987‘);mysql> insert into t_user values(‘Allentuns‘,‘1234‘,‘13260071987‘);mysql> select * from t_user;+---------------+----------+-------------+| usename       | password | tel         |+---------------+----------+-------------+| zhengyansheng | 1234     | 13260071987 || wangyuzhi     | 1234     | 13260071987 || wangqiyu      | 1234     | 13260071987 || Allentuns     | 1234     | 13260071987 |+---------------+----------+-------------+{basedir = /usr/local/mysql/datadir = /mydata/datasocket = /tmp/mysql.sock}

二、xtrabackup線上熱備資料庫

1、建立備份目錄並備份全部資料庫mkdir /backup2、對資料庫進行全備1> 對資料庫進行全備份# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock /backup輸出以下表示成功:innobackupex: Backup created in directory ‘/backup/2014-08-31_00-51-48‘140831 00:51:52  innobackupex: Connection to database server closed140831 00:51:52  innobackupex: completed OK!2> 查看備份目錄[[email protected] ~]# ll /backup/總用量 4drwxr-xr-x 6 root root 4096 8月  31 00:51 2014-08-31_00-51-48  #全備3> 查看備份的lsn號[[email protected] ~]# cat /backup/2014-08-31_00-51-48/xtrabackup_checkpoints backup_type = full-backupedfrom_lsn = 0to_lsn = 1648701last_lsn = 1648701compact = 03、對資料庫進行增量備份+1 (在全備的基礎上做增量備份)解釋幾個參數:--incremental-basedir  :指明上次完整備份或者增量備份檔案的位置--incremental:指明增量備份,這裡增量備份只針對InnoDB,對於MyISAM來說,還是完整備份1> 首先向資料庫添加資料mysql> create table t_user_one as select * from t_user;2> 對資料庫進行增量備份+1# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --incremental-basedir=/backup/2014-08-31_00-51-48/ --incremental /backup輸出以下表示成功:innobackupex: Backup created in directory ‘/backup/2014-08-31_00-53-36‘140831 00:53:40  innobackupex: Connection to database server closed140831 00:53:40  innobackupex: completed OK!3> 查看備份目錄[[email protected] ~]# ll /backup/總用量 8drwxr-xr-x 6 root root 4096 8月  31 00:51 2014-08-31_00-51-48  #全備drwxr-xr-x 6 root root 4096 8月  31 00:53 2014-08-31_00-53-36  #增量備份+14> 查看備份的lsn號[[email protected] ~]# cat /backup/2014-08-31_00-53-36/xtrabackup_checkpoints backup_type = incrementalfrom_lsn = 1648701to_lsn = 1661966last_lsn = 1661966compact = 04、對資料庫進行增量備份+2 (在增量的基礎上再做增量備份)1> 首先向資料庫添加資料mysql> create table t_user_two as select * from t_user;2> 對資料庫進行增量備份+2# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --incremental-basedir=/backup/2014-08-31_00-53-36/ --incremental /backup# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --incremental-basedir=/backup/2014-08-30_13-08-33/ --incremental /backup 輸出以下表示成功:innobackupex: Backup created in directory ‘/backup/2014-08-31_00-53-36‘140831 00:53:40  innobackupex: Connection to database server closed140831 00:53:40  innobackupex: completed OK!3> 查看備份目錄[[email protected] ~]# ll /backup/總用量 12drwxr-xr-x 6 root root 4096 8月  31 00:51 2014-08-31_00-51-48  #全備drwxr-xr-x 6 root root 4096 8月  31 00:53 2014-08-31_00-53-36  #增量備份+1drwxr-xr-x 6 root root 4096 8月  31 00:59 2014-08-31_00-59-10  #增量備份+24> 查看備份的lsn號[[email protected] ~]# cat /backup/2014-08-31_00-59-10/xtrabackup_checkpoints backup_type = incrementalfrom_lsn = 1661966to_lsn = 1679546last_lsn = 1679546compact = 05、恢複備份資料(這些資料是在做增量備份之前被刪除的)假設情境:1》誤操作刪除的重要的資料庫,比如security2》誤操作刪除的資料檔案,比如rm -rf /mydata/data/*****誤刪除security資料庫***mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || security           || test               |+--------------------+mysql> drop database security;Query OK, 3 rows affected (0.04 sec)mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               |+--------------------+增量恢複:增量備份恢複的步驟和完整備份恢複的步驟基本一致,只是應用日誌的過程稍有不同。增量備份恢複時,是先將所有的增量備份挨個應用到完整備份的資料檔案中,然後再將完整備份中的資料恢複到資料庫中。1、停止資料庫service mysqld stop2、備份資料庫cd /mydatacp -a data data_bak3、再次備份對Database Backup的檔案cp -a /backup /backup24、在我們的環境中我們來執行如下操作,因為我們只有兩次的增量備份如下即可:# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2014-08-31_00-51-48/# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2014-08-31_00-51-48/ --incremental-dir=/backup/2014-08-31_00-53-36/# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log  /backup/2014-08-31_00-51-48/ --incremental-dir=/backup/2014-08-31_00-59-10/5、復原未完成的日誌(需要注意的是恢複的時候,我們只恢複全備份檔案就可以了)# innobackupex --apply-log /backup/2014-08-31_00-51-48/# innobackupex --copy-back /backup/2014-08-31_00-51-48/輸出以下錯誤資訊:InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oyand Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.This software is published underthe GNU GENERAL PUBLIC LICENSE Version 2, June 1991.Get the latest version of Percona XtraBackup, documentation, and help resources:http://www.percona.com/xb/pIMPORTANT: Please check that the copy-back run completes successfully.           At the end of a successful copy-back run innobackupex           prints "completed OK!".innobackupex: Error: Original data directory ‘/mydata/data‘ is not empty! at /usr/bin/innobackupex line 2163.解決辦法:清空mysql資料目錄cd /mydata/datamkdir /tmp/data_bak20140831mv * /tmp/data_bak20140831/然後再次執行以上語句,就會成功了# innobackupex --copy-back /backup/2014-08-31_00-51-48/6、授權啟動mysql資料庫chown -R mysql.mysql /mydata/data/service mysqld start7、檢查資料是否一致mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || security #已經找回 || test               |+--------------------+Successfull !!!!****誤刪除rm -rf /mydata/data/****1、停止資料庫,刪除全部資料檔案service mysqld stoprm -rf /mydata/data/*2、在我們的環境中我們來執行如下操作,因為我們只有兩次的增量備份如下即可:(只需執行一次,將增量備份增加到全備資料庫中)# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2014-08-31_00-51-48/# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2014-08-31_00-51-48/ --incremental-dir=/backup/2014-08-31_00-53-36/# innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=localhost --user=root --password=1234 --socket=/tmp/mysql.sock --apply-log  /backup/2014-08-31_00-51-48/ --incremental-dir=/backup/2014-08-31_00-59-10/3、復原未完成的日誌(需要注意的是恢複的時候,我們只恢複全備份檔案就可以了)# innobackupex --apply-log /backup/2014-08-31_00-51-48/# innobackupex --copy-back /backup/2014-08-31_00-51-48/4、授權啟動mysql資料庫chown -R mysql.mysql /mydata/data/service mysqld start5、檢查資料是否一致mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || security #已經找回 || test               |+--------------------+

三、備份策略及指令碼

#!/bin/bash#time 2014-08-31#this‘s script is Allentuns#Tel 13260071987#Qq 467754239# 每周日全量,周一到周六增量備份Data_Path="/backup"Conf_Path="/usr/local/mysql/"Weeks=`date +%Y-%U`UserName="root"Password="1234"Host="127.0.0.1"# create directory if [ ! -d ${Data_Path}/${Weeks} ]then        mkdir -p ${Data_Path}/${Weeks}else        echo "目錄已經存在"fi#full backupif [ ${Week} -eq  7 ];then        echo -e " #################################################"        echo -e " #$(date +%F_%T) full backup of all databases     #"        echo -e " #################################################"        echo "$(date +%F_%T) 開始全備份..."     /usr/bin/innobackupex --user=$UserName --password=$Password --host=$Host --defaults-file=${Conf_Path}/my.cnf --no-timestamp  --slave-info  ${Data_Path}/${Weeks}/full    /usr/bin/innobackupex --user=$UserName --password=$Password --host=$Host --defaults-file=${Conf_Path}/my.cnf --no-timestamp  --slave-info --incremental --incremental-basedir=${Data_Path}/${Weeks}/full ${Data_Path}/${Weeks}/inc_${Week}    echo "$(date +%F_%T) 全備完畢..."else        echo -e " ####################################################"        echo -e " #$(date +%F_%T) incremental backup of all databases#"        echo -e " ####################################################"        echo "$(date +%F_%T) 開始增量備份..."    /usr/bin/innobackupex --user=$UserName --password=$Password --host=$Host  --defaults-file=${Conf_Path}/my.cnf --no-timestamp  --slave-info --incremental --incremental-basedir=${Data_Path}/${Weeks}/inc_${Week_Ago}  ${Data_Path}/${Weeks}/inc_${Week}        echo "$(date +%F_%T) 增量備份完畢..."fi#此指令碼參考博文,稍作修改http://chenwenming.blog.51cto.com/327092/1075532 #指令碼為了節約空間可以使用壓縮和刪除find /data/mysql/backups -mtime +7 |xargs rm -rf

四、遇到的問題以及解決方案

錯誤匯總:第一個錯誤:永遠想不到的錯誤是因為yum -y install mysql-libs問題1:140831 00:16:44  innobackupex: Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup;host=localhost;mysql_socket=/tmp/mysql.sock‘ as ‘root‘  (using password: YES).innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /usr/bin/innobackupex line 3006.解決辦法:yum -y install mysql-libs或者yum -y install perl-Time-HiRes perl-DBD-MySQL問題2:140831 10:04:51  innobackupex: Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup‘ as ‘root‘  (using password: YES).innobackupex: Error: Failed to connect to MySQL server: DBI connect(‘;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup‘,‘root‘,...) failed: Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2) at /usr/bin/innobackupex line 2995解決辦法:mkdir /var/lib/mysql/ln -s /tmp/mysql.sock /var/lib/mysql/

五、附圖,備份指令碼的展示

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/47/E2/wKioL1QCnKOANmIeAAJhAS1sjqs929.jpg" title="innobackup.png" alt="wKioL1QCnKOANmIeAAJhAS1sjqs929.jpg" />

本文出自 “鄭彥生” 部落格,請務必保留此出處http://467754239.blog.51cto.com/4878013/1547067

Xtrabackup之innobackupex線上熱備mysql資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.