Msyqldump和Xtrabackup全備與增量備份mysql數據庫

Msyqldump和Xtrabackup全備與增量備份mysql數據庫

1、概述:mysql

數據備份的介紹,類型,及具;sql

msyqldump備份的實現和數據恢復;(4GB)shell

Xtrabackup備份的實現和數據恢復;(G)數據庫

備份和恢復(數據):bash

 2、介紹服務器

★備份:存儲的數據副本;session

原始數據:持續改變;(考慮問題)app

★恢復:把副本應到線上系統;socket

僅能恢復備份操做時刻的數據狀態;ide

★時間點恢復:

bin-logs;進制志)

★爲何備份?

災難恢復:硬件故障(冗餘)、軟件故障(bug)、然災害、客***、誤操做、...

測試;

★備份時應該注意事項:

能容忍最多丟失多少數據;

恢復數據須要在多時間內完成;

須要恢復哪些數據;

☉作恢復演練:

測試備份的可性;

加強恢復操做效率;

3、備份類型

★備份的數據的集範圍:

☉徹底備份和部分備份

徹底備份:整個數據集;

部分備份:數據集的部分,如部分表;

★徹底備份、增量備份、差別備份:

徹底備份

增量備份:僅備份次徹底備份或增量備份以來變量的那部分數據;

差別備份:僅備份次徹底備份以來變量的那部數據;

★物理備份、邏輯備份:

物理備份:複製數據件進備份;

邏輯備份:從數據庫導出數據另存在個或多個件中;

★根據數據服務是否在線:

熱備:讀寫操做都可進的狀態下所作的備份;

 

溫備:可讀但不可寫狀態下進的備份;

冷備:讀寫操做均不可進的狀態下所作的備份;

鎖分爲讀鎖和寫鎖:

(1)讀鎖,,不能寫,能夠重複讀

(2)寫鎖,不能讀寫。

(3)備份須要考慮的因素、備份策略及備分內容

★備份策略:

徹底+差別+時間點還原(進制binlog

徹底+增量+時間點還原 (進制binlog

注意:

事務志和進制志應該放在有冗餘能的磁盤上,RAID10最好

備份具:

 

 

4、備份具---mysqldump:

mysql服務帶的備份具;邏輯備份具;

徹底、部分備份;

InnoDB:熱備;

MyISAM:溫備;

★mysqldumper:比mysqldump快上好幾十倍

★做:

邏輯備份、徹底備份、部分備份;

##假如咱們的備份策略爲徹底+增量+binlog備份,要使binlog進制志重讀,就要肯定從備份那刻開始,binlog的起始件位置,這時就要使--master-data=[#]選

項,(確保進制志是開啓的)

(1)開啓log-bin日誌作備份恢復:

##在mysql配置文件裏面加上一下兩句開啓log-bin日誌功能

[root@cml5~]# cat /etc/my.cnf
[mysqld]
log_bin=/usr/local/mysql/mydata/mysql-bin


server-id=1    ##5.7版本以後要加上server-id最好是惟一值

進入數據庫查看:

mysql>show variables like 'log_bin%';

bb2b60cf1b97cedfe3f656e12b219b30.png

查看mydata目錄已經有一個mysql-bin.000004二進制日誌文件:

[root@cml5mydata]# ls

a.sh      bin_log cml5.err        ibdata1      ibtmp1 mysqlbak.log     performance_schema  sys

auto.cnf  chen    cml5.pid        ib_logfile0  my.cnf mysql-bin.000004  qqq                 yy

backup    cml     ib_buffer_pool  ib_logfile1  mysql  mysql-bin.index   rrr

(2)進入數據庫建立一個數據庫cml:

386ed653182aca02c72d16d61964f83d.png

模擬刪除數據庫:

1e1fa218eab229652f04fba5ed057c86.png

##恢復到建立了cml這個數據庫以前的結點:

##查看mysql-bin.000004二進制日誌文件:

[root@cml5mydata]# mysqlbinlog mysql-bin.000004
# at154
#17111120:16:01 server id 1  end_log_pos 219CRC32 0xa11ff2b3         Anonymous_GTID      last_committed=0      sequence_number=1        rbr_only=no
SET@@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#17111120:16:01 server id 1  end_log_pos 310CRC32 0x0285112a  Query        thread_id=4      exec_time=0      error_code=0
SET TIMESTAMP=1510402561/*!*/;
SET@@session.pseudo_thread_id=4/*!*/;
SET@@session.foreign_key_checks=1, @@session.sql_auto_is_null=0,@@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET@@session.sql_mode=1436549152/*!*/;
SET@@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\Cutf8 *//*!*/;
SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET@@session.lc_time_names=0/*!*/;
SET@@session.collation_database=DEFAULT/*!*/;
create database cml
/*!*/;
# at 310
#17111120:22:02 server id 1  end_log_pos 375CRC32 0x2ec9b66d         Anonymous_GTID      last_committed=1      sequence_number=2        rbr_only=no
SET@@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 375
#17111120:22:02 server id 1  end_log_pos 458CRC32 0x51fb74e9  Query        thread_id=5      exec_time=0      error_code=0
SETTIMESTAMP=1510402922/*!*/;
drop database cml
/*!*/;
SET@@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER;
# Endof log file
/*!50003SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


##恢復到從219到310的節點:

[root@cml5 mydata]# mysqlbinlog --start-position="219"--stop-position="310" mysql-bin.000004 | mysql -uroot -predhat
mysql:[Warning] Using a password on the command line interface can be insecure.


##進入數據庫查看cml數據庫上是否已經恢復:

6f7dcd22db01913c3a451cf9ae660756.png

##起始點還原:

##刪除cml數據庫使用起始點還原:

0a43f6cfad763606a829f8be8632d052.png

[root@cml5 mydata]# mysqlbinlog --start-datetime="2017-11-11 20:40:37"--stop-datetime="2017-11-11 20:40:55" mysql-bin.000004 | mysql -uroot-predhat
mysql:[Warning] Using a password on the command line interface can be insecure.


##查看數據庫是否已經還原數據庫cml:

8b1950955e20cdd889f1e28d91f43fe8.png

##關閉當前的二進制日誌文件並建立一個新文件,新的二進制日誌文件的名字在當前的二進制文件的編號上加1。

mysql>flush logs;
QueryOK, 0 rows affected (0.00 sec)


 

5、Mysqldump備份:

(1)備份單個庫:

[root@cml5~]#  mysqldump -uroot -predhat --single-transaction -R --triggers -E --master-data--flush-logs --databases data_test >`date +%F"-%H:%M"`.sql


單備份某個庫:

[root@cml5~]#  mysqldump -uroot -predhat --single-transaction -R --triggers -E --master-data--flush-logs -databases data_test >`date +%F"-%H:%M"`.sql


 

(2)備份全部的庫:

[root@cml5~]#  mysqldump -uroot -predhat --single-transaction-R --triggers -E --masterdata --flush-logs --all-databases >`date+%F"-%H:%M"`.sql


(3)恢復全部的數據:

[[root@cml5~]# mysql -uroot -predhat < 2017-11-07-17\:01.sql


 

(4)恢復單個庫:

[[root@cml5~]# mysql -uroot -predhat data_test< 2017-11-07-17\:01.sql


(5)備份數據作全備份,而後倒入從:

[root@cml5 mydata]# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > cml.sql
[root@cml5 mydata]# mysql -uroot -predhat < cml.sql 
mysql:[Warning] Using a password on the command line interface can be insecure.



(6)那麼基於線上沒可能收到備份因此寫一個shell腳原本自動備份:

[root@cml5~]# cat mysqlback.sh 
#!/bin/bash
##date=2017-11-7
##name=cml
##email=********@qq.com
##title=mysqldumpbackup
 
EMAIL="*******@qq.com"
mysqlbak_dir=/usr/local/mysql/mydata
mysqlbak_log=/usr/local/mysql/mydata/mysqlbak.log
DATE=`date+%Y%m%d`
TIME=`date+"%y-%m %H:%M:%S"`
DUMPBAK=$DATE.sql
GZDUMPBAK=$DATE.sql.gz
WEEK=`date+%w`
cd$mysqlbak_dir
USER=root
PASSWD=redhat
bin_log=`ls-tr mysql-bin.0*| head -1`
bin_log_dir=/usr/local/mysql/mydata/bin_log
 
if [ !-f $bin_log_dir ];then
        mkdir $bin_log_dir
fi
 
echo"--------------------------$TIME-----------------------------">> $mysqlbak_log
 
 
if [$WEEK == 0 ];then     ##日期是星期天的時候執行
##week=0~6
        cd $mysqlbak_dir
        /usr/local/mysql/bin/mysqldump -u$USER-p$PASSWD --single-transaction -R --triggers -E --master-data --flush-logs--all-databases > $DUMPBAK 2>&1
        echo "mysqldump backupsuccess!!" >> $mysqlbak_log
        tar -czvf $GZDUMPBAK $DUMPBAK >>$mysqlbak_log 2>&1
        echo "$GZDUMPBAK backupsuccess!!" >> $mysqlbak_log
#      if [ -f $GZDUMPBAK ];then
#              echo "$GZDUMPBAK BACKUPSUCCESS!!" |mail -s "mysqldump backup" $EMAIL
#      fi
        rm -rf $DUMPBAK
        rm -rf $bin_log
##上面步驟是全備過程
else
        cd $mysqlbak_dir
        /usr/local/mysql/bin/mysqladmin -u$USER-p$PASSWD flush-logs
        cp -p $bin_log $bin_log_dir
        echo "copy $bin_log to$bin_log_dir" >> $mysqlbak_log
        rm -rf $bin_log
        echo "backup bin_logsuccess!!" >> $mysqlbak_log
#      echo "backup bin_log $bin_logSUCCESS!" | mail -s "backup bin_log" $EMAIL
##下面是增備過程
fi


 

[root@cml5~]# cd /usr/local/src/script/
[root@cml5script]# ls
mysqlback.sh
[root@cml5script]# chmod a+x mysqlback.sh
 
crontab-e
1 0 * ** /usr/local/src/script/mysqlback.sh


 


6
、備份具---Xtrabackup:

(1)介紹及安裝

★簡介:

·Xtrabackup是由percona提供的mysql數據庫備份具,據官介

紹,這也是世界上唯款開源的可以對innodb和xtradb數據庫進

熱備的具。

★特色:

·物理備份,備份過程快速、可靠;

·備份過程不會打斷正在執的事務;

·可以基於壓縮等功能節約磁盤空間和流量;

·動實現備份檢驗;

·還原速度快;

★持的存儲引擎功能

·MyISAM:溫備,不持增量備份;

·InnoDB:熱備,增量;

★安裝:

·其最新版的軟件可從http://www.percona.com/software/

percona-xtrabackup/得到。

·本基於CentOS 7.2的系統,所以,直接下載相應版本的rpm包安裝便可。

(2)在因此數據庫主機上安裝xtrabackup工具

[root@cml2src]# wget  https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm
[root@cml2src]# yum localinstall percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm


(3)使用xtrabackup工具作全備:

##先查看數據庫的databases:

4d864c05f1400f763569d2cbd6164a2d.png

 

##建立一個/data備份目錄:

[root@cml5 ~]# mkdir /data/


##把數據庫全備到/data目錄下:

[root@cml5 ~]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1 /data/


79022a45d8a4c776a77a4a1fea0f2aa8.png

##看到completed ok表示已經全備完

##查看備份生成的文件:

[root@cml5 2017-11-11_21-42-13]# pwd
/data/2017-11-11_21-42-13
[root@cml5 2017-11-11_21-42-13]# cat xtrabackup_binlog_info 
mysql-bin.000008     524
[root@cml5 2017-11-11_21-42-13]# ls
backup-my.cnf  cml   ibdata1  performance_schema  rrr xtrabackup_binlog_info xtrabackup_info     yy
chen  ib_buffer_pool  mysql  qqq  sys  xtrabackup_checkpoints  xtrabackup_logfile


(4)在另外一臺主機cml6上作一次全備的還原(模擬數據庫的主機down掉加入新一臺主機)

##先在cml5主機把主備文件copy到對端目錄下:

[root@cml5 2017-11-11_21-42-13]# scp -r * cml6:/data/


##在對端cml6主機上建立data目錄給權限:

[root@cml6 ~]# mkdir /data
[root@cml6 ~]# chown -R mysql:mysql /data/


 

##準備一個數據,保證數據沒有提交的事務,提交或者回滾:

[root@cml6 data]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat--host=127.0.0.1 --apply-log /data/


6ab00cd9137d86aa1b555e7eba883434.png

##出現comleted ok表示已經成功

 

##直接恢復,先暫停mysql服務器:

[root@cml6 data]# /etc/init.d/mysqld stop
Shuttingdown MySQL. SUCCESS!
[root@cml6data]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat--host=127.0.0.1 --copy-back /data/
17111005:39:37 innobackupex: Starting the copy-back operation
 
IMPORTANT:Please check that the copy-back run completes successfully.
           At the end of a successful copy-backrun innobackupex
           prints "completed OK!".
 
innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7)
Originaldata directory /usr/local/mysql/mydata is not empty!


 

##修改my.cnf的matadir和給權限:

[root@cml6 data]# cat /etc/my.cnf
[mysqld]
datadir=/data
socket=/usr/local/mysql/mysql.sock
log_bin=/usr/local/mysql/mydata/mysql-bin
server-id=2
#skip-grant-tables
[root@cml6 data]# chown -R mysql:mysql /data/


##直接啓動mysql便可:

[root@cml6 data]# /etc/init.d/mysqld start
StartingMySQL.Logging to '/data/cml6.err'.
 SUCCESS!


##查看數據庫是否與cml5一致:

332d2c6f27e331475e9792ac8bbf9dd1.png

 

執行的時候加上壓縮參數。

[root@cml5 data]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=redhat --stream=tar /data/backup | gzip > /data/backup1/`date +%F_%H-%M-%S`.tar.gz


 

(5)使用xtrabackup工具作增量備份:

##先在mysql數據庫上增長一個數據庫cml2:

73c9c51d468d5fdeacb94aa5e7d5e284.png

##而後建立目錄備份的件錄:

[root@cml5 ~]# mkdir /data/zhengliang1
[root@cml5 ~]# mkdir /data/zhengliang2


 

##使用xtrabackup作增量備份:

[root@cml5 ~]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1--incremental /data/zhengliang1/--incremental-basedir=/data/2017-11-11_21-42-13/


1f486f443326cfc7d867a78c7870f67e.png

##出現completed ok!表示已經成功:

 

##查看備份的數據:

[root@cml5 ~]# cd /data/zhengliang1/2017-11-12_00-06-04/
[root@cml5 2017-11-12_00-06-04]# ls
backup-my.cnf  cml2            ibdata1.meta        qqq xtrabackup_binlog_info xtrabackup_logfile
chen           ib_buffer_pool  mysql               rrr  xtrabackup_checkpoints  yy
cml            ibdata1.delta   performance_schema  sys xtrabackup_info
[root@cml5 2017-11-12_00-06-04]# cat xtrabackup_binlog_info 
mysql-bin.000008     683


 

##scpzhengliang1的目錄到對端cml6的任意一個目錄下:

[root@cml5 2017-11-12_00-06-04]# scp -r /data/zhengliang1/ cml6:/usr/local/src/


 

「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:

須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。(重放這步驟必定不能忘記)

基於全部的備份將未提交的事務進行「回滾」。

 

##這兒步驟意識是把本地的數據庫「重放」

[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --apply-log --redo-only/data/


 

##這步驟是合併全備和增備的日誌:

[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/--incremental-dir=/usr/local/src/zhengliang1/2017-11-12_00-06-04/


##而後在全目錄下恢復「回滾」:

[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --copy-back/data/
17111006:10:44 innobackupex: Starting the copy-back operation
 
IMPORTANT:Please check that the copy-back run completes successfully.
           At the end of a successful copy-backrun innobackupex
           prints "completed OK!".
 
innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id:97330f7)
Originaldata directory /data is not empty!


##查看本地數據庫是否與cml5的對應:(注意整個備份恢復都不用關閉mysql或重啓mysql)

1aa8d8754b4f151f86435d8858fbd087.png

##已經多了cml2的數據庫了

 

##在cml5在作一次增量備份的時候,假如加入一臺新的主機的話備份就先要作(全備恢復à第一次增量備份恢復à第二次增量備份恢復à……)

##在操做一次以上步驟:

##加入新的數據

6dac584d8926c66b4890218ce2b7504d.png

##備份到zhengliang2目錄:

[root@cml5 data]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1--incremental /data/zhengliang2/--incremental-basedir=/data/zhengliang1/2017-11-12_00-06-04/


 

##查看備份數據:

[root@cml5 data]# cd zhengliang2/2017-11-12_00-28-50/
[root@cml5 2017-11-12_00-28-50]# ls
backup-my.cnf  cml3            mysql               sys                     xtrabackup_logfile
chen           ib_buffer_pool  performance_schema  xtrabackup_binlog_info  yy
cml            ibdata1.delta   qqq                 xtrabackup_checkpoints
cml2           ibdata1.meta    rrr                 xtrabackup_info
[root@cml5 2017-11-12_00-28-50]# cat xtrabackup_binlog_info 
mysql-bin.000008     842


 

##scp到對端主機:

[root@cml5 2017-11-12_00-28-50]# scp -r /data/zhengliang2/ cml6:/usr/local/src/


 

##在對端主機上恢復備份:

##回放

[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/


##合併日誌:

[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/ --incremental-dir=/usr/local/src/zhengliang2/2017-11-12_00-28-50/


##回滾:

[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --copy-back/data/
17111006:29:50 innobackupex: Starting the copy-back operation
 
IMPORTANT:Please check that the copy-back run completes successfully.
           At the end of a successful copy-back runinnobackupex
           prints "completed OK!".
 
innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id:97330f7)
Originaldata directory /data is not empty!


##查看數據庫:

7020dccf1f79ef1b66737fcdc2a4f5c9.png

相關文章
相關標籤/搜索