mysql數據庫熱備份


使用Percona XtraBackup

先安裝依賴包

yum install -y perl-DBD-MySQL perl-DBI  perl-Time-HiRes libaio*

到Percona官網下載Percona XtraBackup,安裝

然后執行熱備份,官網有詳細教程:http://www.percona.com/doc/percona-xtrabackup/2.1/howtos/setting_up_replication.html

最后面的參數是備份的目錄;

#使用默認的 /etc/my.cnf 配置文件

innobackupex --user=xxx --password=xxx  /home/data/bak_mysql/  

由於我們使用的是單機多實例,所以配置文件里面修改了[mysqld]項,xtrabackup無法正確識別datadir,所以復制了一份,使用原來單數據庫的格式,將默認的數據庫datadir改為我們的主數據庫datadir

#自定義配置文件

innobackupex --user=xxx --password=xxx --defaults-file=/home/data/xtrabackup.my.cnf /home/data/bak_mysql/  

innobackupex備份速度非常快,完成后會顯示:innobackupex: completed OK!

--apply-log操作

innobackupex --user=yourDBuser --password=xxx --apply-log /path/to/backupdir/$TIMESTAMP/

這一步會將ibdata1與ib_logfile0,ib_logfile1的log sequence number對應起來,否則可能會出現表空間和事務日志不一致的情況,

InnoDB: Error: page xxx log sequence number xxx InnoDB: is in the future! Current system log sequence number xxx.

雖然數據庫有重建innodb日志的功能,但是,還是避免的好...

 

下面可以直接用這個備份來做一個Mysql_multi的單機多實例,並且,不需要關閉原來的mysql;

將備份的目錄$DATETIME目錄改名為mysql2,

mv /home/data/bak_mysql/xxx /home/data/mysql2

chown -R mysql.mysql /home/data/mysql2

cp /etc/my.cnf /home/data/my.cnf

vim /home/data/my.cnf

#修改my.cnf,改為 多實例,參考mysqld_multi --example輸出的例子; 

啟動新增的實例; 

mysqld_multi --defaults-file=/home/data/my.cnf start 2

 

附上一些代碼:

#!/bin/bash

DB_CONFIG=/data2/data/xtrabackup.my.cnf
DB_USER=xxx
DB_PASS_FILE='/etc/db/'$DB_USER
BACKUP_HOME=/data2/data

# get database password
function getDbPass()
{
    RET=`cat $DB_PASS_FILE`
    echo $RET
}
DB_PASS=$(getDbPass)

cd $BACKUP_HOME
# partial backup 
function partial_backup(){
    innobackupex --defaults-file=$DB_CONFIG \
                                 --user=$DB_USER --password=$DB_PASS \
                                 --databases=/xxx/dump.tables \
                                 $BACKUP_HOME
    YEAR=`date +"%Y"`
    timestamp=`ls |grep 2014 |head -n 1`  #得到時間戳名字
    
    innobackupex --user=$DB_USER -password=$DB_PASS --apply-log --export $BACKUP_HOME/$timestamp/
    chown -R mysql.mysql $BACKUP_HOME/$timestamp/
}

#full backup , can be used as a slave , or base backup
function full_backup(){
    innobackupex --defaults-file=$DB_CONFIG \
                                 --user=$DB_USER --password=$DB_PASS \
                                 $BACKUP_HOME
    timestamp=`ls |grep 2014 |head -n 1`  #得到時間戳名字
    innobackupex --defaults-file=$DB_CONFIG --user=$DB_USER --password=$DB_PASS --apply-log $BACKUP_HOME/$timestamp/
    chown -R mysql.mysql $BACKUP_HOME/$timestamp/
}

#incremental backup , can be used as a slave , or base backup
function incremental_backup(){
    timestamp=`ls |grep 2014 |head -n 1`  #得到時間戳名字
    INCREMENTAL_BASE_DIR=/data2/data/mysql3/
    BACKUP_DIR=/data2/data/backups/
    innobackupex --user=$DB_USER --password=$DB_PASS \
                        --incremental $BACKUP_DIR \
                        --incremental-basedir=$INCREMENTAL_BASE_DIR
    #同樣可以使用LSN來進行增量備份
    #innobackupex --incremental $BACKUP_DIR --incremental-lsn=XXX
}

full_backup

 

 

 

 

 

 


免責聲明!

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



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