1. 程式人生 > >MySQL的備份還原(xtrabackup)

MySQL的備份還原(xtrabackup)

修改 yum 回滾 ble data msyql 單獨 通過 sun

MySQL的備份還原(xtrabackup)

xtrabackup簡介

xtrabackup是percona提供的MySQL數據庫的備份工具,是唯一開源的能對innodb和xtradb數據庫進行熱備的工具

xtrabackup的特點

1.備份還原過程快、可靠
2.備份過程不會打斷正在執行的事務
3.能夠基於壓縮等功能介於磁盤空間和流量
4.自動實現備份檢驗
5.開源免費

xtrabackup備份過程

技術分享圖片

xtrabackup安裝

xtrabackup在centos的EPEL源中,可以在配置完EPEL源後使用yum安裝

[[email protected] ~]# yum install -y percona-xtrabackup

也可以去官網下載最新版本的xtrabackup
https://www.percona.com/downloads/XtraBackup/LATEST

xtrabackup使用

xtrabackup [option] BACKUP-ROOT-DIR
選項 說明
--user 備份時連接到MySQL的賬號
--password 備份時連接到MySQL所使用的賬號的密碼
--host 備份數據庫的地址
--databases 所要備份的數據庫名,如果有多個數據庫可以使用","隔開,如果備份表則使用"DATABASE.TABLE"來指明
--incremental 表示創建一個增量備份
--incremental-basedir 指定前一次完全備份或者增量備份的目錄
--incremental-dir 指定還原時增量備份的目錄
--apply-log 備份完成後的數據不能直接用於恢復操作,因為備份的數據中可能包含尚未提交的事務或已經提交但尚未同步的至數據庫中過的事務,此時數據仍處於不一致狀態,此選項作用是通過回滾提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態
--apply-log-only 恢復時阻止回滾未完成的事務,在有增量備份時使用
--export 開啟可導出單獨的表之後再導入其他MySQL中
--redo-only 合並增量備份時使用,不包括最後一個增量備份的合並
--copy-back 做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
--move-back 作用和copy-back想用區別在於此選項是用來移動備份的數據

xtrabackup完全,增量備份及還原

完全備份及還原

在完全備份之前需要創建一個備份的目錄作為存放備份使用

[[email protected] ~]# mkdir /data/backup

數據庫內存放的數據

[[email protected] ~]# mysql -e ‘SHOW DATABASES;‘
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

一、完全備份

[[email protected] ~]# mariabackup --backup --target-dir=/data/backup  --user=root --password=‘‘

二、對數據庫破壞

[[email protected] ~]# rm -rf /data/mysql/*

三、恢復

3.1在恢復數據庫前需要先將數據庫內數據清理,然後停止mysql服務

[[email protected] ~]# rm -rf /data/mysql/*
[[email protected] ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]

3.2對備份目錄做整理

[[email protected] ~]# mariabackup --prepare --target-dir=/data/backup

3.3將整理好的備份數據還原至數據庫

[[email protected] ~]# mariabackup --copy-back --target-dir=/data/backup

3.4此時還原回去的數據屬性還有問題,需要將其修改

[[email protected] ~]# ll /data/mysql/
total 12320
-rw-r----- 1 root root    16384 May  6 21:28 aria_log.00000001
-rw-r----- 1 root root       52 May  6 21:28 aria_log_control
drwx------ 2 root root      272 May  6 21:28 hellodb
-rw-r----- 1 root root      942 May  6 21:28 ib_buffer_pool
-rw-r----- 1 root root 12582912 May  6 21:28 ibdata1
drwx------ 2 root root     4096 May  6 21:28 mysql
drwx------ 2 root root       20 May  6 21:28 performance_schema
drwx------ 2 root root       20 May  6 21:28 test
-rw-r----- 1 root root      527 May  6 21:28 xtrabackup_info

[[email protected] ~]# chown -R mysql.mysql /data/mysql/

四、啟動服務測試

[[email protected] ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]
[[email protected] ~]# mysql -e "SHOW DATABASES;SHOW TABLES FROM hellodb;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+

完全備份+增量備份及還原

在備份之前先創建出完全備份的目錄以及增量備份的目錄

[[email protected] ~]# mkdir -pv /dataa/backup/{full,inc1,inc2}
mkdir: created directory ‘/data/backup’
mkdir: created directory ‘/data/backup/full’
mkdir: created directory ‘/data/backup/inc1’
mkdir: created directory ‘/data/backup/inc2’

數據庫內所存放的數據

[[email protected] ~]# mysql -e ‘SHOW DATABASES;‘
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

一、對數據進行完全備份

[[email protected] ~]# mariabackup --backup --target-dir=/data/backup/full --user=root --password=‘‘

二、此時數據庫內數據發生變化

[[email protected] ~]# mysql -e "INSERT hellodb.teachers VALUE(5,‘Li Xiaolong‘,30,‘M‘);"
[[email protected] ~]# mysql -e "SELECT * FROM hellodb.teachers WHERE tid>4;"
+-----+-------------+-----+--------+
| TID | Name        | Age | Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |
+-----+-------------+-----+--------+

三、對數據庫進行增量備份

[[email protected] ~]# mariabackup --user=root --password=‘‘ --backup --incremental-basedir=/data/backup/full --target-dir=/data/backup/inc1

四、數據庫內數據再次發生變化

[[email protected] ~]# mysql -e "INSERT hellodb.students(stuid,age,name) VALUE (26,35,‘Sun Wukong‘);"
[[email protected] ~]# mysql -e "SELECT * FROM hellodb.students WHERE stuid>25;"
+-------+------------+-----+--------+---------+-----------+
| StuID | Name       | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
|    26 | Sun Wukong |  35 | F      |    NULL |      NULL |
+-------+------------+-----+--------+---------+-----------+

五、再次對數據庫做增量備份

[[email protected] ~]# mariabackup --user=root --password=‘‘ --backup --incremental-basedir=/data/backup/inc1 --target-dir=/data/backup/inc2

六、破壞數據庫

[[email protected] ~]# rm -rf /data/mysql/*

七、恢復數據庫

7.1先對數據庫做清理,並停止數據庫服務

[[email protected] ~]# rm -rf /data/mysql/*
[[email protected] ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]

7.2對完全備份做預整理
因為後續還有增量備份,所以此處需要使用apply-log-only選項來阻止事務的回滾。

[[email protected] ~]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full

7.3合並第一次的增量備份
此為第一個增量備份後續還有第二個增量所以需要使用apply-log-only阻止回滾事務

[[email protected] backup]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc1

7.3合並第二次的增量備份
此為最後個增量備份無需再使用apply-log-only阻止回滾事務

[[email protected] backup]# mariabackup --prepare --target-dir=/data/backup/full --incremental-dir=/data/backup/inc2

7.4整理完畢將備份復制回數據庫

[[email protected] backup]# mariabackup --copy-back --target-dir=/data/backup/full

7.5將數據庫內的屬主和屬組進行更改

[[email protected] backup]# chown -R mysql.mysql /data/mysql/

八、重啟服務測試

[[email protected] backup]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

[[email protected] backup]# msyql
MariaDB [hellodb]> select *from students where stuid>25;
+-------+------------+-----+--------+---------+-----------+
| StuID | Name       | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
|    26 | Sun Wukong |  35 | F      |    NULL |      NULL |
+-------+------------+-----+--------+---------+-----------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select *from teachers where tid>4;
+-----+-------------+-----+--------+
| TID | Name        | Age | Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |
+-----+-------------+-----+--------+
1 row in set (0.00 sec)

其他的註意事項

1.在數據恢復之前必須先要停止MySQL服務
2.在還原時MySQL的數據庫目錄必須為空,否則不會覆蓋
3.數據庫內容還原後,其屬主和屬組為root需要手動將其全部改為mysql

MySQL的備份還原(xtrabackup)