我叫張賀,貪財好色。一名合格的LINUX運維工程師,專注於LINUX的學習和研究,曾負責某中型企業的網站運維工作,愛好佛學和跑步。
個人博客:傳送陣
筆者微信:zhanghe15069028807
percona-xtrabackup
開源免費支持mysql
熱備的軟件,支持增量、差異備份。
yum -y install https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0-8/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.8-1.el7.x86_64.rpm
[root@mysql02 ~]# rpm -ql percona-xtrabackup-80.x86_64
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-80-8.0.8
/usr/share/doc/percona-xtrabackup-80-8.0.8/LICENSE
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
1、數據庫完整備份與恢復
系統版本 | MYSQL版本 | 安裝方式 |
---|---|---|
centos7 | 5.7 | 二進制安裝 |
(1)環境准備
[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
basedir=/soft/mysql
datadir=/soft/mysql/data
default_password_lifetime=0
socket=/tmp/mysql.sock
[root@mysql02 ~]# /etc/init.d/mysqld restart
[root@mysql02 ~]# mysql -uroot -pcba-123 -e "create database test1;"
[root@mysql02 ~]# mysql -uroot -pcba-123 -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 | #注意這里
+--------------------+
[root@mysql02 ~]#yum -y install
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
[root@mysql02 ~]# innobackupex --user=root --password="cba-123" -S /tmp/mysql.sock /xtrabackup
[root@mysql02 ~]# ls /xtrabackup/
2019-11-29_08-53-04
(2)完全備份恢復流程
[root@mysql02 ~]# /etc/init.d/mysqld stop
[root@mysql02 ~]# rm -rf /soft/mysql/data/*
[root@mysql02 ~]# innobackupex --apply-log /xtrabackup/2019-11-29_08-53-04/ #重演
[root@mysql02 ~]# innobackupex --copy-back /xtrabackup/2019-11-29_08-53-04/ #恢復
[root@mysql02 ~]# chown -R mysql:mysql /soft/mysql/data #恢復后加上權限
[root@mysql02 ~]# /etc/init.d/mysqld start
[root@mysql02 ~]# mysql -pcba-123 -e "show databases;" #test1庫回來了
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
2、數據庫增量備份與恢復
在做增量或差異備份恢復的項目之前,我們一定要先明確增量備份與差異備份之間的區別,類比來說。
(1)增量和差異概述
無論是增量還是差異備份,基礎都是全量備份
我們要先上幼兒園,小學、然后上初中,再然后是高中,最后是大學。中學是在小學的基礎上,高中是在初中的基礎上,大學是在高中的基礎上,當前的“事務”依賴於前一個階段的“事務”,此謂增量。假設說我們現在失憶了,我們要先恢復幼兒園(全量)的記憶,然后小學,初中,再然后高中,最后才是大學,順序非常重要,如果順序錯亂了,那么記憶之間的銜接就會錯亂。
差異備份的思路就比較詭異了,我們上述的增量備份依賴於前一階段的備份,而差異備份對比的並不是前一階段的備份,對比的是第一次的全備。第一次是全備,第二備份的時候時會與全備做一個對比,只備份差異的部分,第三次備份的時候同樣還會與全備做對比,只備份差異的部分,依次類推。
用腳想一下就可以做出這樣的結論,差異備份與增量備份相比要備份的數據量更大,但是好處也很明顯,恢復的時候只需要全備和最近的一次差異備份,操作相比於增量備份簡單了。
(2)增量備份和恢復
第一步:准備數據
//周三的數據
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t1(id int,name varchar(20));
mysql> insert into t1 values (3,'day3');
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
+------+------
第二步:使用物理全備
[root@mysql02 ~]# yum -y install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
basedir=/soft/mysql
datadir=/soft/mysql/data
default_password_lifetime=0
socket=/tmp/mysql.sock
server-id=241
log-bin=/log/mysql/bin_log
[root@mysql02 ~]# mkdir /log/mysql -p ; touch /log/mysql/bin_log ; chown -R mysql:mysql /log/mysql/
[root@mysql02 ~]# mkdir /xtrabackup ; chown -R mysql:mysql /xtrabackup
[root@mysql02 ~]# /etc/init.d/mysqld restart
[root@mysql02 ~]# innobackupex --username=root --password=cba-123 -S /tmp/mysql.sock /xtrabackup/
[root@mysql02 ~]# ls /xtrabackup/
2019-11-29_09-47-55
第三步:周四,全備完成之后繼續插入數據
[root@mysql02 ~]# date -s '2018-11-30'
[root@mysql02 ~]# mysql -pcba-123
mysql> insert into bgxdb.t1 values (4,'day4');
mysql> select * from bgxdb.t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
+------+------+
//下面的操作關鍵了,是增量備份
[root@mysql02 ~]# innobackupex --user=root --password='cba-123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2019-11-29_09-47-55 -S /tmp/mysql.sock
上面的這個操作需要解釋一下,"incremental"是增量的意思。上述的命令的含義就是使用增量備份,備份到/xtrabackup這個目錄里面,基於周三的全備做增量,最后指明了套接字。
第四步:周五,繼續插入數據
[root@mysql02 ~]# date -s '2019-12-01'
[root@mysql02 ~]# mysql -pcba-123
mysql> insert into bgxdb.t1 values (5,'da');
mysql> select * from bgxdb.t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
| 5 | da |
+------+------+
//基於周四的基礎上進行增備
[root@mysql02 ~]# innobackupex --user=root --password='cba-123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2018-11-30_00-06-20 -S /tmp/mysql.sock
[root@mysql02 ~]# cat /xtrabackup/2019-12-01_00-07-51/xtrabackup_binlog_info
bin_log.000001 668
第五步:模擬故障
[root@mysql02 ~]# /etc/init.d/mysqld stop
[root@mysql02 ~]# rm -rf /soft/mysql/data/*
第六步:依次重演
//恢復周三的全備數據
[root@mysql02 ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-11-29_09-47-55/
//恢復周三的增量數據
[root@mysql02 ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-11-29_09-47-55 --incremental-dir=/xtrabackup/2018-11-30_00-06-20
//恢復周五的增量數據
[root@mysql02 ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-11-29_09-47-55 --incremental-dir=/xtrabackup/2019-12-01_00-07-51
注意,文件的順序不要搞錯。
第七步:執行回滾
//恢復對應數據
[root@mysql02 ~]# innobackupex --copy-back /xtrabackup/'2019-11-29_09-47-55'
[root@mysql02 ~]# chown -R mysql:mysql /soft/mysql/data
[root@mysql02 ~]# /etc/init.d/mysqld restart
[root@mysql02 ~]# mysql -pcba-123 -e "select * from bgxdb.t1;"
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
| 5 | da |
+------+------+
3、數據庫差異備份與恢復
系統版本 | MYSQL版本 | 安裝方式 |
---|---|---|
centos7 | MYSQL5.7 | YUM安裝 |
第一步:打開二進制日志並准備周三的數據
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
datadir=/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
server-id = 240
log-bin=/log/mysql/bin_log
[root@mysql01 ~]# mkdir /log/mysql -p ; touch /log/mysql/bin_log ; chown -R mysql:mysql /log/mysql
[root@mysql01 ~]# systemctl restart mysqld
[root@mysql01 ~]# date -s '2018-05-08'
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t2(id int);
mysql> insert into t2 values(3);
mysql> select * from t2;
+------+
| id |
+------+
| 3 |
+------+
第二步:對周三物理全備
[root@mysql01 ~]# mmkdir /xtrabackup ; chown -R mysql:mysql /xtrabackup
[root@mysql01 ~]# yum -y install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
[root@mysql01 ~]# yum -y install ./percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
[root@mysql01 ~]# innobackupex --user=root --password='cba-123' /xtrabackup
[root@mysql01 ~]# cat /xtrabackup/2018-05-08_00-00-10/xtrabackup_checkpoints
backup_type = full-backuped #全備
from_lsn = 0
to_lsn = 2671547
last_lsn = 2671556
compact = 0
recover_binlog_info = 0
第三步:周四增加數據,並做增備
[root@mysql01 ~]# date -s '2018-05-09'
[root@mysql01 ~]# mysql -uroot -pcba-123 -e "insert into bgxdb.t2 values(4);"
[root@mysql01 ~]# mysql -uroot -pcba-123 -e "select * from bgxdb.t2;"
+------+
| id |
+------+
| 3 |
| 4 |
+------+
[root@mysql01 ~]# innobackupex --user=root --password='cba-123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2018-05-08_00-00-10
[root@mysql01 ~]# ls /xtrabackup/ #多了一個9號的
2018-05-08_00-00-10 2018-05-09_00-03-43
第四步:周五增加數據,並做增備
[root@mysql01 ~]# date -s '2018-05-10'
[root@mysql01 ~]# mysql -u root -pcba-123 -e "insert into bgxdb.t2 values(5);"
[root@mysql01 ~]# mysql -u root -pcba-123 -e "select * from bgxdb.t2;"
+------+
| id |
+------+
| 3 |
| 4 |
| 5 |
+------+
[root@mysql01 ~]# innobackupex --user=root --password='cba-123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2018-05-08_00-00-10
[root@mysql01 ~]# ls /xtrabackup/
2018-05-08_00-00-10 2018-05-09_00-03-43 2018-05-10_00-00-23
第四步:周六增加數據,並做增備
[root@mysql01 ~]# date -s "2018-05-11"
[root@mysql01 ~]# mysql -u root -pcba-123 -e "insert into bgxdb.t2 values(6);"
[root@mysql01 ~]# mysql -u root -pcba-123 -e "select * from bgxdb.t2;"
+------+
| id |
+------+
| 3 |
| 4 |
| 5 |
| 6 |
+------+
[root@mysql01 ~]# innobackupex --user=root --password='cba-123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2018-05-08_00-00-10
[root@mysql01 ~]# ls /xtrabackup/
2018-05-08_00-00-10 2018-05-09_00-03-43 2018-05-10_00-00-23 2018-05-11_00-07-25
第五步:保持當前時間,模塊錯誤操作
mysql> create database Linux;
mysql> drop database Linux;
第六步:開始差異恢復
//停止數據庫
[root@mysql01 ~]# systemctl stop mysqld
//清理環境
[root@mysql01 ~]# ls /mysql/
auto.cnf ca.pem ib_buffer_pool ib_logfile1 private_key.pem server-key.pem
bgxdb client-cert.pem ibdata1 mysql public_key.pem sys
ca-key.pem client-key.pem ib_logfile0 performance_schema server-cert.pem
[root@mysql01 ~]# rm -rf /mysql/*
//重演回滾,將差異備份應用至完整備份上
[root@mysql01 ~]# innobackupex --apply-log --redo-only /xtrabackup/2018-05-08_00-00-10/
//重演回滾,將差異備份應用至完整備份上
[root@mysql01 ~]# innobackupex --apply-log --redo-only /xtrabackup/2018-05-08_00-00-10/ --incremental-dir=/xtrabackup/2018-05-11_00-07-25
//應用數據
[root@mysql01 ~]# innobackupex --copy-back /xtrabackup/2018-05-08_00-00-10/
//修改權限
[root@mysql01 ~]# chown -R mysql:mysql /mysql/
//啟動數據庫
[root@mysql01 ~]# systemctl start mysqld
//查看數據庫
mysql> select * from bgxdb.t2;
+------+
| id |
+------+
| 3 |
| 4 |
| 5 |
| 6 |
+------+
mysql> show databases; #被刪除的那個數據庫依然沒有找到
+--------------------+
| Database |
+--------------------+
| information_schema |
| bgxdb |
| mysql |
| performance_schema |
| sys |
+--------------------+
第七步:恢復被誤刪除的數據庫
//哪天刪除的就查看哪天的二進制日志
[root@mysql01 ~]# cat /xtrabackup/2018-05-11_00-07-25/xtrabackup_binlog_info
bin_log.000001 654
[root@mysql01 ~]# mysqlbinlog --start-position=654 --base64-output="decode-rows" -v bin_log.000001 bin_log.000002 >db.sql
[root@mysql01 mysql]# mysqlbinlog --start-position=654 --stop-position=816 bin_log.000001 | mysql -uroot -p'cba-123'
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Linux |
| bgxdb |
| mysql |
| performance_schema |
| sys |
+--------------------+
4、簡單命令進行物理備份
使用簡單命令進行備份時,無法保證數據的可用性,可能需要停止服務,慎用!
系統版本 | MYSQL版本 | 安裝方式 |
---|---|---|
centos7 | MYSQL5.7 | YUM安裝 |
//查看一下數據庫的存放位置
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
datadir=/mysql
socket=/var/lib/mysql/mysql.sock
//打包備份
[root@mysql01 ~]# tar -cf /backup/`date +%F`-mysql-all.tar /mysql
[root@mysql01 ~]# ls /backup
2019-11-30-mysql-all.tar
//停止數據庫
[root@mysql01 ~]# systemctl stop mysqld
[root@mysql01 ~]# rm -rf /mysql/*
[root@mysql01 ~]# tar xf /backup/2019-11-30-mysql-all.tar -C /
[root@mysql01 ~]# ls /mysql
auto.cnf ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
bgx client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
[root@mysql01 ~]# systemctl start mysqld;
5、實際生產環境
- 實際的生產環境上通常都周末全備,周一到周六都是增備。
- 中小型企業,一般還是使用
mysqldump
居多,而大型企業都是xtrabakcup
居多,當然也有的企業使用專業的存儲設備進行備份。