MySQL數據庫5
mysqldump備份恢復數據庫
冷備份還原數據庫
邏輯卷快照備份還原數據庫
xtrabackup備份還原數據庫
1. 備份和恢復概述
2. 冷備份示例
實驗目標 冷備方法備份數據,還原數據到另外一臺主機上
實驗步驟
數據庫中止服務
[ root@hai7-6 hellodb] $systemctl stop mariadb
打包數據文件,並傳送給預還原主機
1. '打包數據庫工做目錄並壓縮'
[ root@hai7-8 data] $tar Jcvf /data/mysql.bak.` date +%F` .tar.xz /data/mysql/
2. '將數據發送到預還原主機上'
[ root@hai7-8 data] $scp /data/mysql.bak.2018-10-13.tar.xz 192.168.50.100:/data
3. '將配置文件發送到預還原主機'
[ root@hai7-8 data] $scp /etc/my.cnf 192.168.50.100:/data
將備份的配置文件覆蓋還原主機上的配置文件
[ root@hai7-8 mysql] $mv /data/my.cnf /etc/my.cnf
解壓文件到/var/lib/mysql目錄下,並重啓服務,還原完成
[ root@hai7-8 mysql] $tar xf mysql.2018-10-13.tar.xz
[ root@hai7-8 mysql] $mv * /var/lib/mysql
3. 基於LVM的備份
實驗目的
將數據庫數據文件和二進制文件分別存放
利用邏輯卷快照功能備份並恢復丟失數據
準備邏輯卷
拿現有乾淨分區sda7做爲物理卷
[ root@hai7-6 data] $pvcreate /dev/sda7
將物理卷加入卷組
[ root@hai7-6 data] $vgcreate vg_mysql /dev/sda7
創建兩個邏輯卷分別存放數據mysqldata和二進制文件mysqlbin
[ root@hai7-6 data] $lvcreate -n mysqldata -L 2G vg_mysql
[ root@hai7-6 data] $lvcreate -n mysqlbin -L 4G vg_mysql
格式化文件系統
[ root@hai7-6 data] $mkfs .xfs /dev/vg_mysql/mysqlbin
[ root@hai7-6 data] $mkfs .xfs /dev/vg_mysql/mysqldata
創建兩個掛載點,分別掛載mysqldata與mysqlbin
[ root@hai7-6 data] $mkdir /vg_data/{ mysqlbin,mysqldata} -pv
'將邏輯卷分別掛載到目錄上'
[ root@hai7-6 data] $mount /dev/vg_mysql/mysqlbin /vg_data/mysqlbin/
[ root@hai7-6 data] $mount /dev/vg_mysql/mysqldata /vg_data/mysqldata/
數據備份
修改以上邏輯卷掛載目錄權限,確保mysql程序有寫權限
[ root@hai7-6 data] $chown mysql.mysql /vg_data/
修改配置文件指定數據保存路徑,啓動服務
[ root@hai7-6 ~] $vim /etc/my.cnf
[ mysqld]
innodb_file_per_table
datadir= /vg_data/mysqldata <= 將數據庫路徑修改成剛纔創建的路徑
log_bin= /vg_data/mysql-bin <= 將二進制日誌保存路徑修改成以上創建的新目錄
'啓動服務'
[ root@hai7-6 data] $systemctl start mariadb
進入mysql,清空二進制日誌文件
MariaDB [ ( none) ] > reset master;
準備一些數據庫文件,這裏導入數據庫hellodb
[ root@hai7-6 data] $mysql < hellodb_innodb.sql
請求鎖定全部表
[ root@hai7-6 data] $mysql -e 'FLUSH TABLES WITH READ LOCK'
記錄二進制文件及事件位置,方便之後使用二進制日誌文件恢復備份時間點之後的文件
[ root@hai7-6 data] $mysql -e 'SHOW MASTER logs' > bin.log
[ root@hai7-6 data] $cat bin.log
Log_name File_size
mysql-bin.000001 7655 <= = 備份時二進制日誌位置
建立快照
[ root@hai7-6 mapper] $lvcreate -p r -s -n snap_mysql -L 1G /dev/mapper/vg_mysql-mysqld
釋放鎖
[ root@hai7-6 mapper] $mysql -e 'UNLOCK TABLES'
在mysql中增長几條記錄,後續使用二進制恢復到最新狀態
MariaDB [ hellodb] > INSERT teachers values( 6,'B' ,'30' ,'F' ) ;
MariaDB [ hellodb] > SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8059 | <= = 二進制日誌文件更新後大小
數據恢復 還原階段須要拒絕客戶訪問,保證數據不變,利用防火牆或者鎖等工具實現
掛載快照卷,執行數據備份
因爲UUID相同,因此掛載快照卷鬚要加-o nouuid,norecovery
[ root@hai7-6 vg_mysql] $mount -o nouuid,norecovery /dev/vg_mysql/snap_mysql /mnt
將快照下備份的數據拷貝到出來
[ root@hai7-6 vg_mysql] $cp -av /mnt/* /data/
備份完成後,刪除快照卷(快照會影響系統性能)
取消掛載
[ root@hai7-6 vg_mysql] $umount /mnt
刪除邏輯快照
[ root@hai7-6 vg_mysql] $lvremove /dev/vg_mysql/snap_mysql
模擬損壞,刪除存放數據庫的目錄下全部文件
[ root@hai7-6 vg_mysql] $rm -rf /vg_data/mysqldata/*
將備份的文件拷貝回數據庫目錄下,保留原屬性
[ root@hai7-6 vg_mysql] $cp -av /data/* /vg_data/mysqldata/
利用二進制日誌還原數據到最
'備份數據時已經記錄的二進制日誌位置爲mysql-bin.000001 7655 ,導出以後全部記錄,多個文件需追加到同一文件'
[ root@hai7-6 ~] $mysqlbinlog --start-position= 7655 /vg_data/mysql-bin.000001 > /root/binlong.sql
[ root@hai7-6 ~] $mysqlbinlog /vg_data/mysql-bin.000002 >> /root/binlong.sql
進入數據庫,暫時關閉二進制日誌記錄功能,防止導入數據時生成新的二進制日誌
MariaDB [ ( none) ] > SET sql_log_bin= off;
將導出的二進制日誌數據導入mysql中,在數據庫中直接進行,命令爲SOURCE
MariaDB [ ( none) ] > SOURCE /root/binlong.sql
啓動二進制日誌記錄功能,查看還原效果
MariaDB [ ( none) ] > SET sql_log_bin= on;
MariaDB [ hellodb] > SELECT * FROM teachers;
4. 邏輯備份工具(mysqldump, mydumper, phpMyAdmin)
4.1 mysqldump工具
語法格式 mysqldump [OPTIONS] database [tables] mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…] mysqldump [OPTIONS] --all-databases [OPTIONS]緩存
常見選項
-A
| --all-databases
:備份全部數據庫,含create database
-B
| --databases db_name…
:指定備份的數據庫,包括create database語句
-E
| --events
:備份相關的全部event scheduler(調度器),計劃任務之類的,-A包含-E
-R
| --routines
:備份全部存儲過程和自定義函數, -A包含
--triggers
:備份表相關觸發器,默認啓用,用--skip-triggers
,不備份觸發器
--default-character-set=utf8
:指定字符集
--master-data[=#]
: 此選項須啓用二進制日誌
所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1
記錄爲註釋的CHANGE MASTER TO語句 此選項會自動關閉–lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啓–single-transaction)
'記錄備份時,二進制日誌文件所在位置,說明在此位置以前的數據作了備份'
[ root@hai7-6 data] $mysqldump -A --master-data= 1 > all.sql
'查看備份數據'
[ root@hai7-6 data] $vim all.sql
'多出以下行,若是設置爲--master-data=2,只是將以下行註釋掉,僅作描述'
CHANGE MASTER TO MASTER_LOG_FILE= 'mysql-bin.000002' , MASTER_LOG_POS= 34742814;
-F, --flush-logs
:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction
或-x
,--master-data
一塊兒使用實現,此時只刷新一第二天志,添加此選項能夠區分備份前二進制文件和備份後二進制文件,不須要去文件中找備份位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. '當前二進制日誌文件是兩個1和2'
[ root@hai7-6 data] $mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742814 |
+------------------+-----------+
2. '備份兩個數據庫hi和mysql'
[ root@hai7-6 data] $mysqldump -F -B hi mysql > ba.back.sql
3. '生成2個新的日誌文件,也就是選項描述中-A、-B是會刷新屢次,和備份多少個數據庫有關'
[ root@hai7-6 data] $mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742857 |
| mysql-bin.000003 | 288 | <= = 刷新的二進制日誌文件
| mysql-bin.000004 | 245 | <= = 刷新的二進制日誌文件
+------------------+-----------+
--compact
: 去掉註釋,適合調試,導出的文件沒有註釋描述,不推薦使用,有可能丟失關鍵信息,好比master-data=2記錄的二進制備份位置
-d, --no-data
: 只備份表結構
-t, --no-create-info
: 只備份數據,不備份create table
-n,--no-create-db
: 不備份create database,可被-A或-B覆蓋
--flush-privileges
:備份系統數據庫mysql時須要使用
-f, --force
: 忽略SQL錯誤,繼續執行
--hex-blob
: 使用十六進制符號轉儲二進制列(例如,「abc」變爲0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT
-q, --quick
: 不緩存查詢,直接輸出,加快備份速度
備份還原示例
示例一: 默認設置讀取數據庫數據,並還原(不建議使用,須要手動建立數據庫,數據庫建立信息極可能不許確)
讀取數據庫hellodb數據,導出到文件hellodb_back.sql中
[ root@hai7-6 data] $mysqldump hellodb > /data/hellodb_bak.sql
模擬數據庫破壞,刪除hellodb數據庫
[ root@hai7-6 data] $mysql -e 'drop database hellodb'
使用默認選項讀出來的數據,並無建立數據庫命令,還原數據庫須要手動建立數據庫
1. '建立數據庫,極可能與原建立屬性不一樣'
[ root@hai7-6 data] $mysql -e 'create database hi'
2. '將數據導入新建的數據庫中(這裏必須指定數據庫),完成恢復'
[ root@hai7-6 data] $mysql hi < /data/hellodb_bak.sql
示例二:加上選項-A、-B備份,只要有的數據庫都會備份,使輸出的信息更完整包括建立命令
備份全部數據庫 選項-A
[ root@hai7-6 mysqldata] $mysqldump -A > /data/all'data+%F' .sql
查看導出的數據
[ root@hai7-6 mysqldata] $vim /data/alldata+%F.sql
CREATE DATABASE /*! 32312 IF NOT EXISTS*/ ` hi` /*! 40100 DEFAULT CHARACTER SET latin1 */;
USE ` hi` ; <= = 建立數據庫的SQL語句,只要有的數據庫都會輸出建立語句 選項-B
'能夠同時備份多個,例如hi和mysql兩個數據庫'
[root@hai7-6 mysqldata]$mysqldump -B hi mysql > /data/b'data+%F'.sql
模擬故障,刪除數據庫
[ root@hai7-6 mysqldata] $mysql -e 'drop database hi'
[ root@hai7-6 mysqldata] $mysql -e 'drop database mysql'
'查看刪除後數據庫保留狀況'
[ root@hai7-6 mysqldata] $mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| test |
+--------------------+
還原,因爲備份中已經有庫建立語句,能夠直接導入
[ root@hai7-6 mysqldata] $mysql < /data/bdata+%F.sql
[ root@hai7-6 mysqldata] $mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi |
| mysql |
| performance_schema |
| test |
+--------------------+
輸出備份數據時同時壓縮 壓縮工具默認是讀取屏幕輸出,壓縮導入指定文件,能夠配合mysqldump工具,直接壓縮備份文件
[ root@hai7-6 ~] $mysqldump -B hi | gzip > /data/a.sql.gz
編制腳本,實現將mysql中的數據庫分庫備份
數據庫庫信息輸出格式以下所示,首先挑出不須要備份的庫
[ root@hai7-6 data] $mysql -e 'show databases' | cat
Database <= = 表頭,不須要備份
information_schema <= = 狀態信息,不須要備份
hi
mysql
performance_schema <= = 狀態信息,不須要備份
test
實現方法 方法1:while…do…done
[ root@hai7-6 data] $mysql -e 'show databases' | grep -Ev 'Database|information|performance' | while read dbname ; do mysqldump -B $dbname | gzip > /data/${dbname} _bak` date +%F` .gz; done 方法2 :使用sed語句實現 bash能夠接收標準輸出,標準輸出是一個可執行的腳本就能夠執行
[ root@hai7-6 data] $mysql -e 'show databases' | grep -Ev '^Database|info|perfor' | sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1_bak` date +%F` .gz@' | bash 方法3:使用for循環
[ root@hai7-6 data] $for db in ` mysql -e 'show databases' | grep -Ev '^Database|info|perfor' ` ; do mysqldump -B $db | gzip > /data/${db} _bak` date +%F` .gz; done
4.2 MyISAM、InnoDB再mysqldump中特殊的備份選項
4.3 生產環境實戰備份策略
InnoDB建議備份策略
mysqldump -uroot -A -F -E -R --single-transaction --master-data= 1 --flush-privileges --triggers --default-character-set= utf8 --hex-blob > /backup/fullbak_$BACKUP_TIME .sql
MyISAM建議備份策略
mysqldump -uroot -A -F -E -R -x --master-data= 1 --flush-privileges --triggers --default-character-set= utf8 --hex-blob > /BACKUP/fullbak_$BACKUP_TIME .sql
示例
目的 模擬生產環境數據庫恢復,徹底備份,並還原至最新狀態
步驟
將數據文件和二進制日誌文件分開存放,修改配置文件,並啓動二進制日誌功能
[ root@hai7-6 ~] $vim /etc/my.cnf
datadir= /vg_data/mysqldata <= = 數據文件路徑
log_bin= /vg_data/mysqlbin/mysql_bin <= = 二進制日誌文件路徑
備份數據
[ root@hai7-6 ~] $mysqldump -A -F --single-transaction --master-data= 2 --hex-blob| gzip > /data/all_back.aql.gz
備份後,再建立幾條記錄,供二進制日誌還原使用
MariaDB [ hi] > INSERT teachers VALUES( 10,'A' ,40,'M' )
MariaDB [ hi] > INSERT teachers VALUES( 11,'B' ,50,'M' ) ;
模擬故障,刪除全部數據文件
[ root@hai7-6 data] $rm -rf /vg_data/mysqldata/*
開始還原數據,從這裏開始禁止用戶訪問,直到還原完成,中止mariadb服務,再啓動服務,生成系統數據庫文件,若是是自編譯安裝,須要運行系統腳本生成
[ root@hai7-6 mysqlbin] $systemctl stop mariadb
'啓動服務,讓系統自動生成系統數據庫'
[ root@hai7-6 mysqlbin] $systemctl start mariadb
解壓備份文件
[ root@hai7-6 data] $gzip -d all_back.aql.gz
中止二進制日誌服務,避免導入備份文件時生成大量二進制數據,影響備份時間點後的數據恢復,將備份文件導入mysql中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. '中止二進制日誌服務'
MariaDB [ ( none) ] > SET sql_log_bin= off;
2. '還原徹底備份數據'
MariaDB [ ( none) ] > source /data/all_back.aql
3. '查看徹底備份還原效果'
MariaDB [ hi] > SELECT * FROM teachers; <= = 沒有第3步添加的,備份後數據
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
+-----+---------------+-----+--------+
查看備份文件,確認二進制日誌文件備份位置,將備份後生成的數據位置導入文件,恢復到最新狀態,開放用戶訪問數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1. '查看備份文件,確認二進制日誌文件徹底備份時位置'
[ root@hai7-6 data] $vim all_back.aql
-- CHANGE MASTER TO MASTER_LOG_FILE= 'mysql_bin.000002' , MASTER_LOG_POS= 245;
2. '將245位置後的二進制日誌內容導入至文件in.sql中'
[ root@hai7-6 data] $mysqlbinlog --start-position= 245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql
3. '進入mysql,中止二進制日誌功能'
MariaDB [ ( none) ] > SET sql_log_bin= off;
4. '將備份後生成的二進制文件導入數據庫中'
MariaDB [ hi] > SOURCE /data/in.sql
5. '恢復二進制日誌記錄功能'
MariaDB [ hi] > SET sql_log_bin= on
6. '查看恢復效果'
MariaDB [ hi] > SELECT * FROM teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
| 10 | A | 40 | M | <= = 備份後數據,恢復成功
| 11 | B | 50 | M |
+-----+---------------+-----+--------+
4.4 誤刪除文件,致使系統問題
前面步驟相同,在恢復到備份文件點後,須要在二進制日誌文件中,找出誤刪除操做,註釋掉或者刪除,而後將備份後二進制日誌文件追加導出至指定文件,再導入系統
[ root@hai7-6 data
] $mysqlbinlog --start-position
= 245 /vg_data/mysqlbin/mysql_bin.000002
> in.sql
[ root@hai7-6 data
] $mysqlbinlog /vg_data/mysqlbin/mysql_bin.000003
>> in.sql
5. 專業恢復工具xtrabackup
5.1 概述
5.2 舊版(2.2以前)與新版xtrabackup區別
舊版
包括4個可執行文件:
innobackupex:Perl 腳本
腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一層封裝實現的
雖然目前通常不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,所以備份基本都經過 innobackupex 命令進行
xtrabackup:C/C++ 編譯的二進制 用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQL Server 沒有交互
xbcrypt:加解密
xbstream:支持併發寫的流文件格式
新版變化 xtrabackup版本升級到2.4後,相比以前的2.1有了比較大的變化
innobackupex 功能所有集成到 xtrabackup 裏面,只有一個 binary程序
爲了兼容考慮,innobackupex做爲 xtrabackup 的軟連接,即xtrabackup如今支持非Innodb表備份,
Innobackupex在下一版本中移除,建議經過xtrabackup替換innobackupex
5.3 xtrabackup語法選項
安裝xtrabackup
在EPEL源中 yum install percona-xtrabackup
最新版本下載安裝:下載格式爲rpm能夠直接使用yum安裝,須要依賴EPEL源中一些程序 https://www.percona.com/downloads/XtraBackup/LATEST/ 新版將xtrabackup和innobackupex組合在一塊兒,顯示爲軟鏈接
[ root@hai7-6 data] $ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Oct 14 18:23 /usr/bin/innobackupex -> xtrabackup
Xtrabackup備份
語法格式 innobackupex [option] BACKUP-ROOT-DIR
選項說明 https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
--user
該選項表示備份帳號
--password
該選項表示備份的密碼
--host
該選項表示備份數據庫的地址
--databases
該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要以空格隔開;如:「xtra_test dba_test」,同時,在指定某數據庫時,也能夠只指定其中的某張表。如:「mydatabase.mytable」。該選項對innodb引擎表無效,仍是會備份全部innodb表
--defaults-file
該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置
--incremental
該選項表示建立一個增量備份,須要指定–incremental-basedir
--incremental-basedir
該選項指定爲前一次全備份或增量備份的目錄,與–incremental同時使用
--incremental-dir
該選項表示還原時增量備份的目錄
--include=name
指定表名,格式:databasename.tablename
Xtrabackup準備階段(Prepare)
語法格式 innobackupex --apply-log [option] BACKUP-DIR
選項說明:
--apply-log
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態,最後一次還原須要作的,例以下圖中的T3回滾到T4,至關於零時目錄的扎口,說明數據補入到此完成
--use-memory
和--apply-log
選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G
--export
表示開啓可導出單獨的表以後再導入其餘Mysql中
--redo-only
此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併,用在T3以前的備份,確保事務不回滾,新版本爲--apply-log-only
Xtrabackup還原階段
語法格式 innobackupex --copy-back [選項] BACKUP-DIR innobackupex --move-back [選項] [–defaults-group=GROUP-NAME] BACKUP-DIR
選項說明
--copy-back
作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
--move-back
這個選項與–copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
--force-non-empty-directories
指定該參數時候,使得innobackupex --copy-back
或--move-back
選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是--copy-back
和--move-back
文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗
5.4 Xtrabackup還原原理
5.5 舊版Xtrabackup徹底備份及還原
在原主機
備份數據到目錄/backups下 innobackupex --user=root /backups
將備份數據傳送到目標主機 scp -r /backups/2018-02-23_11-55-57/ 目標主機:/data/
舊版會自動在備份目錄下生成以時間格式命名的目錄如2018-02-23_11-55-57
在目標主機
整理數據,將不完整的事務回滾 innobackupex --apply-log /data/2018-02-23_11-55-57/
中止服務 systemctl stop mariadb
刪除原數據庫數據 rm -rf /var/lib/mysql/*
將整理過的數據複製到數據庫工做目錄,系統會自動根據配置文件找到工做目錄 innobackupex --copy-back /data/2018-02-23_11-55-57/
修改權限是mysql具備寫權限 chown -R mysql.mysql /var/lib/mysql/
啓動服務 systemctl start mariadb
5.5 新版Xtrabackup徹底備份及還原
在原主機
作徹底備份到/data目錄下
[ root@hai7-6 ~] $xtrabackup --backup --target-dir= /data
將備份拷貝到目標目錄
[ root@hai7-6 ~] $scp -r /data 192.168.50.111:/data
在目標主機上
模擬故障,中止服務,清空數據庫
[ root@hai7-6 ~] $systemctl stop mariadb
[ root@hai7-6 ~] $rm -rf /var/lib/mysql/*
預準備:確保數據一致,提交完成的事務,回滾未完成的事務
[ root@hai7-8 data] $xtrabackup --prepare --target-dir= /data/data
複製到數據庫目錄 注意:數據庫目錄必須爲空,MySQL服務不能啓動
[ root@hai7-8 data] $xtrabackup --copy-back --target-dir= /data/data
還原屬性
'拷貝完成後的屬性'
[ root@hai7-8 ~] $ll /var/lib/mysql/
drwxr-x--- 2 root root 310 Oct 15 10:04 hi
'還原屬性'
[ root@hai7-8 ~] $chown -R mysql:mysql /var/lib/mysql
啓動服務 systemctl start mariadb
5.6 舊版Xtrabackup徹底,增量備份及還原
在原主機
徹底備份數據 innobackupex /backups
創建兩個目錄存放增量備份 mkdir /backups/inc{1,2}
修改數據庫內容,作第一增量備份,加--incremental
選項,表示爲增量備份
innobackupex --incremental /backups/inc1 --incremental-basedir= /backups/2018-02-23_14-21-42(徹底備份生成的路徑)
再次修改數據庫內容,基於inc1再次增量備份
innobackupex --incremental /backups/inc2 --incremental-basedir= /backups/inc1/2018-02-23_14-26-17 (上次增量備份生成的路徑)
所有備份後,將數據發送給目標端 scp -r /backups/* 目標主機:/data/
在目標主機
不啓動mariadb,刪除數據庫原工做目錄下全部文件 rm -rf /var/lib/mysql/*
第一次整理,徹底備份 innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
第二次整理,將增量備份與徹底備份整理在一塊兒
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir= /data/inc1/2018-02-23_14-26-17
第三次整理,將第三次增量與第二次整理結果整理在一塊兒
innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir= /data/inc2/2018-02-23_14-28-29/
將整理好的數據複製到數據庫工做目錄 innobackupex --copy-back /data/2018-02-23_14-21-42/
修改權限 chown -R mysql.mysql /var/lib/mysql/
啓動服務 systemctl start mariadb
5.6 新版Xtrabackup徹底,增量備份及還原
原主機,備份過程
備份過程,服務器必須啓動 創建3各目錄,分別存放徹底備份和2次增量備份
[ root@hai7-6 data] $mkdir { base,inc1,inc2}
徹底備份
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/base
第一次修改數據
[ root@hai7-6 data] $mysql -e 'use hi; INSERT teachers VALUES(12,"AB",25,"F")'
第一次基於徹底備份的增量備份inc1
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/inc1 --incremental-basedir= /data/base
第二次修改數據
[ root@hai7-6 data] $mysql -e 'use hi; INSERT teachers VALUES(13,"BB",31,"M")'
基於inc1的二次增量備份
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/inc2 --incremental-basedir= /data/inc1
拷貝備份文件到目標主機
[ root@hai7-6 data] $scp -r /data/ 192.168.50.111:/data
目標主機準備階段(prepare)
整理徹底備份,此選項–apply-log-only阻止回滾未完成的事務
[ root@hai7-8 data] $xtrabackup --prepare --apply-log-only --target-dir= /data/data/base
合併第1次增量備份到徹底備份
[ root@hai7-8 data] $xtrabackup --prepare --apply-log-only --target-dir= /data/data/base --incremental-dir= /data/data/inc1
合併第2次增量備份到徹底備份
:最後一次還原不須要加選項–apply-log-only
[ root@hai7-8 data] $xtrabackup --prepare --target-dir= /data/data/base --incremental-dir= /data/data/inc2
目標主機還原階段
複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動
[ root@hai7-8 data] $xtrabackup --copy-back --target-dir= /data/data/base
還原屬性,啓動服務
[ root@hai7-8 base] $chown -R mysql:mysql /var/lib/mysql
[ root@hai7-8 base] $systemctl start mariadb
5.7 Xtrabackup單表備份與還原
版本要求 mariadb在5.6以上版本
實驗目標 用Xtrabackup備份單表,並恢復
步驟
單表備份hellodb數據庫的students表: --include
表示指定哪一個表來備份,後跟導出目錄
[ root@hai7-8 ~] $innobackupex -uroot -p123456 --include= 'hellodb.students' /backups
備份表結構,備份文件內有描述信息,還原時須要刪除
[ root@hai7-8 ~] $mysql -p123456 -e 'SHOW CREATE TABLE hellodb.students' > students.sql
模擬誤操做,刪除表
[ root@hai7-8 ~] $mysql -pfree123456 -e 'DROP TABLE hellodb.students'
將備份的表設爲導出狀態,關鍵詞--export
'導出後會在備份目錄多出2個文件students.cfg和students.exp'
[ root@hai7-8 ~] $innobackupex --apply-log --export /backups/2018-10-15_11-19-23/
按照表結構建立表,參考步驟2中的表結構,從CREATE開始日後的內容,建立表後會生成表結構文件students.frm和空的數據文件students.ibd(直接拷貝文件到數據庫中,會報錯‘doesn’t exist in engine’,系統數據庫是識別不了的)
1
2
3
4
5
6
7
8
9
10
11
12
13
MariaDB [ hellodb] > CREATE TABLE ` students`
> ( \n ` StuID` int( 10) unsigned NOT NULL AUTO_INCREMENT,
> \n ` Name` varchar( 50) NOT NULL,
> \n ` Age` tinyint( 3) unsigned NOT NULL,
> \n ` Gender` enum( 'F' ,'M' ) NOT NULL,
> \n ` ClassID` tinyint( 3) unsigned DEFAULT NULL,
> \n ` TeacherID` int( 10) unsigned DEFAULT NULL,
> \n PRIMARY KEY ( ` StuID` ) ,
> \n KEY ` index_age` ( ` Age` ) ,
> \n KEY ` idx_name_age` ( ` Name` ,` Age` ) \n)
> ENGINE= InnoDB
> AUTO_INCREMENT= 26
> DEFAULT CHARSET= utf8;
刪除表空間,也就是students.ibd文件,不能直接覆蓋,須要執行SQL語句
MariaDB [ hellodb] > ALTER TABLE students DISCARD TABLESPACE;
將備份表下的cfg,exp,ibd三個文件,拷貝到對應數據庫工做目錄
[ root@hai7-8 ~] $cp /backups/2018-02-23_15-03-23/hellodb/students.{ cfg,exp,ibd} /data/mysql/hellodb/
修改權限屬性
[ root@hai7-8 hellodb] $ chown -R mysql.mysql /data/mysql/hellodb
將表空間數據文件恢復回去,只拷貝過去不識別
MariaDB [ hellodb] > ALTER TABLE hellodb.students IMPORT TABLESPACE;
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
</div>