Mysql 備份與恢復

備份類型介紹

備份類型能夠分爲物理備份和邏輯備份兩種html

物理備份是指經過拷貝數據庫文件的方式完成備份,這種備份方式適用於數據庫很大,數據重要且須要快速恢復的數據庫python

邏輯備份是指經過備份數據庫的邏輯結構(create database/table語句)和數據內容(insert語句或者文本文件)的方式完成備份。這種備份方式適用於數據庫不是很大,或者你 
須要對導出的文件作必定的修改,又或者是但願在另外的不一樣類型服務器上從新創建此數據庫的狀況
mysql

物理備份一般要求在數據庫關閉的狀況下執行,但若是是在數據庫運行狀況下執行,則要求備份期間數據庫不能修改sql

邏輯備份的速度要慢於物理備份,是由於邏輯備份須要訪問數據庫並將內容轉化成邏輯備份須要的格式;一般輸出的備份文件大小也要比物理備份大;另外邏輯備份也不包含數據庫的 
配置文件和日誌文件內容;備份和恢復的粒度能夠是全部數據庫,也能夠是單個數據庫,也能夠是單個表;邏輯備份須要再數據庫運行的狀態下執行;它的執行工具能夠是mysqldump或者是select … into outfile兩種方式
shell

備份又能夠分爲在線備份和離線備份兩種 
在線備份是指在數據庫運行的狀態下執行的備份 
而離線備份是指在數據庫關閉狀況下執行的備份
數據庫

備份還能夠分爲本地備份和遠程備份兩種緩存

本地備份是指備份是在和當前MySQL運行的相同主機上發起和執行 
而離線備份是指在數據庫關閉狀況下執行的備份
服務器

備份還能夠分爲本地備份和遠程備份兩種 
本地備份是指備份是在和當前MySQL運行的相同主機上發起和執行
app

遠程備份是指備份是在和當前MySQL運行的不一樣主機上發起和執行 
好比mysqldump命令能夠鏈接本機MySQL,也能夠鏈接遠程MySQL;在好比select …into outfile命令能夠經過本地或者遠程的MySQL客戶端執行,但生成的文件則會存放在MySQL實例運行的主機上
函數

對物理備份來講啓動備份的過程是MySQL實例主機,但備份的地址有多是遠程的某個 
存儲

 

備份還能夠分爲全量備份和增量備份兩種 
全量備份是指備份中包含全部的數據,而增量備份是指備份中僅包含在某個指定時間段內的變化狀況 
全量備份的方法正如以前說到的物理備份和邏輯備份方式 
而增量備份的方法在MySQL中須要藉助二進制日誌完成

 

MySQL備份方法

1. mysqldump命令執行備份

2. 經過拷貝物理表文件生成備份:當前存儲引擎下每一個表都有本身獨立的數據文件時就可使用拷貝物理表文件的方式。若是當前數據庫是運行狀態,則須要下對此表加上一個只讀鎖,防止備份期間的修改操做FLUSH TABLES tbl_list WITH READ LOCK;這種表級的備份方式對MyISAM存儲引擎支持很好,由於MyISAM的表天生就分紅了三個獨立的數據文件(.frm, .MYD, and *.MYI),但對InnoDB存儲引擎的表就不太支持

3.  經過select … into outfile方式生成文本文件:第一種方式是經過SELECT * INTO OUTFILE ‘file_name’ FROM tbl_name命令生成在服務器上的文本文件,另外一種方式是經過mysqldump命令加–tab參數生成文本文件; 但這種方式只會生成表數據,不會生成表結構

4. MySQL增量備份:將MySQL實例設置爲開啓log-bin參數,備份增量生成的二進制日誌到指定的備份地

5. Xtrabackup工具執行全量備份或增量備份

 

MySQL 物理拷貝文件

對MyISAM表來講:若是當前此表在拷貝過程當中沒有任何寫操做時,能夠直接拷貝

10.0.0.201 master01 
10.0.0.204 master02

沒有主從關係

建立一個myisam表插入數據進行模擬測試: 

CREATE TABLE `students_myisam` (
`sid` int(11) NOT NULL,
`sname` varchar(64) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`),
KEY `idx_sname` (`sname`),
KEY `idx_gender` (`gender`),
KEY `dept_id` (`dept_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into students_myisam values(1,'a',1,1),(2,'b',2,2),(3,'c',3,3);

  

把這個表相關的三個文件students_myisam.frm,students_myisam.MYD, students_myisam.MYI文件拷貝到另外 
的數據庫實例對應的數據庫目錄下
 
[root@master01 course]# scp students_myisam.* 10.0.0.204:/usr/local/mysql/data/course/

 

注意相關目錄下的權限改爲mysql 
[root@master02 course]# chown mysql.mysql students_myisam.*

 

對InnoDB表來講:即便是innodb_file_per_table=on的狀況下直接拷貝文件也不行

把這個表相關的兩個文件students.frm,students.ibd文件拷貝到另外的數據庫實例對應的數據庫目錄下

 

 

 查看錯誤日誌信息: 
2018-09-18T09:26:39.479752Z 5667 [Warning] InnoDB: Cannot open table test/students from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue. 
有一部分放在共享表空間ibdata裏面,因此不能直接拷貝文件

對InnoDB來講,能夠經過拷貝整個data目錄的方式來完成備份和恢復,拷貝到另外實例,上記得受權

Mysqldump 詳解

Mysqldump工具用來生成MySQL的邏輯備份文件,其文件內容就是構成數據庫對象和數據內容的可重複執行的SQL語句

Mysqldump工具使用的三種方式: 
shell> mysqldump [options] db_name [tbl_name …] #備份某個庫的那些表 
shell> mysqldump [options] –databases db_name … #備份那些苦 
shell> mysqldump [options] –all-databases #備份全部庫

 

 

options裏的關鍵參數: 
–host=host_name, -h host_name指定要導出的目標數據庫所在的主機,默認是localhost 
–user=user_name, -u user_name指定連接目標數據庫的數據庫用戶名 
–password[=password], -p[password]指定連接目標數據庫的數據庫密碼 
–port=port_num, -P port_num指定連接目標數據庫的端口 
–add-drop-database表示在使用–databases或者是–all-databases參數時在每一個create database命令前都加上drop database的命令 
–add-drop-table表示在每一個create table命令前加上drop table命令

–add-drop-trigger表示在每一個create trigger命令前加上drop trigger命令

–replace表示使用replace命令插入數據而不是使用insert命令 

--default-character-set=charset_name指定默認的字符集,默認是UTF8

–set-charset表示將SET NAMES default_character_set命令寫入到導出備份文件中,默認是開啓狀態

--dump-slave[=value]參數表示從複製的slave從庫導出備份,且其中包含了change master to語句,則利用此備份文件能夠直接創建另外一個複製從庫。 value參數若是不寫或者=1的狀況下,則change master to語句寫入到dump文件中,若是設置=2則表明也寫入到dump文件中,只是會註釋掉

--master-data[=value]參數表示從複製的主庫上導出備份,和–dump-slave參數配置相似,能夠利用此備份文件直接創建另外一個複製從庫。其value的取值含義也和dump-slave相同。使用該參數會自動打開—lock-all-table參數除非同時使--single-transaction參數

 

–tab=dir_name, -T dir_name參數表示將備份文件以文本文件的方式生成,dir_name指定了存放的文件路徑,每一個表會生成兩個文件,一個是.sql文件保存的表結構信息,一個是.txt文件保存的表數據信息

–all-databases, -A參數表明導出全部數據庫裏的全部的表

–databases, -B參數表明導出指定的一個或多個數據庫

–ignore-table=db_name.tbl_name參數表明導出過程當中忽略某個指定表的導出,若是要忽略多個表則這個參數要使用屢次

–no-data, -d參數表明不要導出數據,只導出表結構

–routines, -R參數表明也要把存儲過程和函數導出來

–triggers參數表明也要將觸發器導出來

–where=’where_condition’, -w ‘where_condition’ 參數表明僅導出符合條件的數據,好比 
–where=」user=’jimf’」 
-w」userid>1」 
-w」userid<1

 

–lock-all-tables, -x參數表明在導出過程當中對每一個數據庫的每一個表加上一個只讀鎖

–no-autocommit參數表明對每一個表的數據導出內容用set autocommit=0和commit兩個語句包圍

 

–single-transaction參數表明將事務隔離級別設置爲可重複讀並在導出開始時執行start transaction開啓一個新的事務,在dump的執行過程當中也不會阻止任何的讀寫操做, 通常都會加上改參數

 

數據導出:

導出一個數據庫:
[root@master01 ~]# mysqldump -u root -p -P 3306 --databases course>backup.sql
導出多個數據庫:
[root@master01 ~]# mysqldump -u root -p -P 3306 --databases course test>course.sql
#或則
[root@master01 ~]# mysqldump -u root -p -P 3306 -B course test>course.sql

導出全部數據庫:
[root@master01 ~]# mysqldump -u root -p -P 3306 --all-databases>course.sql

導出一個數據庫的某幾個表:
[root@master01 ~]# mysqldump -u root -p -P 3306 course students students_myisam>course.sql

僅導出course數據庫的數據而不包含表結構:
[root@master01 ~]# mysqldump -u root -p -P 3306 --no-create-info course>course.sql

僅導出course數據庫中的students和students_myisam兩個表的數據:
[root@master01 ~]# mysqldump -u root -p -P 3306 --no-create-info course students students_myisam>course.sq

僅導出course數據庫的表結構:
[root@master01 ~]# mysqldump -u root -p -P 3306 --no-data course>course.sql

導出course數據庫中除了teacher和score兩個表的其餘表結構和數據:
[root@master01 ~]# mysqldump -u root -p -P 3306 --ignore-table=course.teacher --ignoretable=course.score course>course.sql

導出course數據庫的表和存儲過程和觸發器:
[root@master01 ~]# mysqldump -u root -p -P 3306 --routine --trigger course>course.sql

導出course數據庫中符合where條件的數據:
[root@master01 ~]# mysqldump -u root -p -P 3306 --where="sid in (1,2)" course students
students_myisam>course.sql

遠程導出course數據庫,導出文件在發起導出命令的服務器上:
[root@master02 data]# mysqldump -u root -p -P 3306 -h 10.0.0.201 course > course.sql

  

關於備份鎖表的問題

FLUSH TABLES WITH READ LOCK簡稱(FTWRL),該命令主要用於備份工具獲取一致性備份(數據與binlog位點匹配)。由FTWRL總共須要持有兩把全局的MDL鎖,而且還須要關閉全部表對象,所以這個命令的殺傷性很大,執行命令時容易致使庫hang住 
FTWRL主要包括3個步驟: 
1.上全局讀鎖(lock_global_read_lock) 
2.清理表緩存(close_cached_tables) 
3.上全局COMMIT鎖(make_global_read_lock_block_commit)

FTWRL每一個操做的影響 
上全局讀鎖會致使全部更新操做都會被堵塞;關閉表過程當中,若是有大查詢致使關閉表等待,那麼全部訪問這個表的查詢和更新都須要等待;上全局COMMIT鎖時,會堵塞活躍事務提交

從主庫備份正確方式: 
[root@master ~]# mysqldump -u root -p -P 3306 –master-data=2 –single-transaction course >course.sql 
此備份方式會在備份開始之初在全部表上加一個只讀鎖(FLUSH TABLES WITH READ LOCK), 當成功獲取了該鎖並開始備份以後,此鎖就會當即釋放。然後續的dump過程當中不會影響其餘的讀寫操做

從主庫備份若是–dump-slave參數,則備份失敗: 
[root@master01 ~]# mysqldump -u root -p -P 3306 –dump-slave=2 –single-transaction course >course.sql 
Enter password: 
mysqldump: Couldn’t execute ‘START SLAVE’: The server is not configured as slave; fix in config file or with CHANGE MASTER TO (1200)

 

在從庫上備份數據: 
[root@slave1 course]# mysqldump -u root -p -P 330 –dump-slave –single-transaction test >course.sql

Mysql 導入備份文件

格式以下 
第一種mysql

SHELL> mysql -u root -p db_name < dbbackup.sql

  

第二種: 
也可使用source命令導入一個備份文件:

在sql的備份的那裏登陸 
mysql > use dbname; 
mysql > use dbbackup.sql;

使用mysqldump命令導出文本文件 
經過制定-tab=dir_name 參數來指定文本文件的導出路勁 
須要在my.cnf 中先配置 
secure_file_priv=/usr/local/mysql/backup/

好比導出course數據庫的全部表的文本文件到=/usr/local/mysql/backup/目錄下: 
這個目錄也須要mysql 權限才能導出

[root@master01 backup]# mysqldump -u root -p –tab=/usr/local/mysql/backup course

 

 

–fields-terminated-by=str參數指定每一個字段值之間的間隔符,默認是tab

–fields-enclosed-by=char參數指定每一個字段值使用什麼字符括起來,默認是沒有

–fields-optionally-enclosed-by=char參數指定對每一個非數字類型的字段值使用什麼字符括起來,默認沒有

–lines-terminated-by=str參數指定行之間的結束符,默認是newline

好比:

 [root@master01 backup]# mysqldump -u root -p –tab=/usr/local/mysql/backup –fields-terminated-by=, –fields-enclosed-by=’」’ –lines-terminated-by=0x0d0a course

 

 

針對文本文件(txt)到導入,分爲兩步, 先是導入表結構文件,再導入數據文件 
表結構文件的導入可使用mysql db1 < t1.sql或者source命令 
數據文件的導入可使用mysqlimport或者load data infile命令

模擬用文本文件導入數據,不刪除表,刪除表數據,再進行導入 

mysqlimport 方式:

mysql> delete from students;
mysql> exit;
[root@master01 backup]# mysqlimport -u root -p --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by=0x0d0a course /usr/local/mysql/backup/students.txt
Enter password: 
course.students: Records: 10  Deleted: 0  Skipped: 0  Warnings: 0

  

或者使用load data infile 方式

mysql> use course;
mysql> select * from students;
mysql> delete from students;
mysql> load data infile '/usr/local/mysql/backup/students.txt' into table students FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

  

自定義腳本定時備份

檢測全部用戶定義的數據庫,定時備份全部的數據庫,並上傳到備份服務器 
python腳本仍是shell 腳本,想怎麼寫隨你

樣例腳本以下:

#!/bin/sh
####################################
##Function: mysql_dump
##Version: 1.1
# #####################################
MYUSER=system
PORT=5001
DB_DATE=$(date +%F)
DB_NAME=$(uname -n)
MYPASS=********
MYLOGIN=" /data/application/mysql/bin/mysql -u$MYUSER -p$MYPASS -P$PORT 「
MYDUMP=" /data/application/mysql/bin/mysqldump -u$MYUSER -p$MYPASS -P$PORT -B 「
DATABASE=" $($MYLOGIN -e "show databases;" |egrep -vi
"information_schema|database|performance_schema|mysql") 「
for dbname in $DATABASE do
MYDIR=/server/backup/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
$MYDUMP $dbname --ignore-table=opsys.user_action|gzip
>$MYDIR/${dbname}_${DB_NAME}_${DB_DATE}_sql.gz
Done
find /server/backup/ -type f -name "*.gz" -mtime +3|xargs rm –rf
find /server/backup/* -type d -name "*" -exec rsync -avz {} data_backup:/data/backup/ \;

  

Select … into outfield 備份

select … into outfile命令能夠用來導出表中符合條件的數據到文本文件,不導出表結構,僅用來導出數據

SELECT INTO…OUTFILE語法:
select * from Table into outfile '/路徑/文件名'
fields terminated by ','
enclosed by '"'
lines terminated by ‘\r\n

  

outfile 輸出文件路勁必須在my.cnf 中配置secure_file_priv=/usr/local/mysql/backup/

 

TERMINATED BY用來指定字段值之間的符號,例如, 「TERMINATED BY ‘,’」指定了逗號做爲兩個字段值之間的標誌。

ENCLOSED BY子句用來指定包裹文件中字符值的符號,例如, 「ENCLOSED BY ’ 」 ‘」表示文件中字符值放在雙引號之間,若加上關鍵字OPTIONALLY表示全部的值都放在雙引號之間。

ESCAPED BY子句用來指定轉義字符,例如, 「ESCAPED BY ‘‘」將「」指定爲轉義字符,取代「\」, 如空格將表示爲「*N」。 
LINES子句:在LINES子句中使用TERMINATED BY指定一行結束的標誌,如「LINES TERMINATED BY ‘?’」表示一行以「?」做爲結束標誌

 

好比導出students表裏完整的數據:

rm -rf /usr/local/mysql/backup/*
好比導出students表裏完整的數據:
mysql> select * from students into outfile '/usr/local/mysql/backup/students.txt' fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

導出students表裏的部分數據:
mysql> select * from students where sid in (1,2) into outfile '/usr/local/mysql/backup/students2.txt' fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

導出表關聯以後的數據:
mysql> select * from students a inner join dept b on a.dept_id=b.id into outfile '/usr/local/mysql/backup/students3.txt' fields
terminated by ',' enclosed by '"' lines terminated by '\r\n';

  

對select … into outfile導出的文本文件,能夠經過load data infile命令導入到表裏 
基本語法:

load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]

  

terminated by分隔符:意思是以什麼字符做爲分隔符 
enclosed by字段括起字符 
escaped by轉義字符 
terminated by描述字段的分隔符,默認狀況下是tab字符(\t) 
enclosed by描述的是字段的括起字符。 
escaped by描述的轉義字符。默認的是反斜槓(backslash: \ ) 
lines 關鍵字指定了每條記錄的分隔符默認爲’\n’即爲換行符

 

若是指定local關鍵詞,則代表從客戶主機讀文件。若是local沒指定,文件必須位於服務器上。

 

replace和ignore關鍵詞控制對現有的惟一鍵記錄的重複的處理。若是你指定replace,新行將代替有相同的惟一鍵值的現有行 
。若是你指定ignore,跳過有惟一鍵的現有行的重複行的輸入。若是你不指定任何一個選項,當找到重複鍵時,出現一個錯誤 
,而且文本文件的餘下部分被忽略

好比將students.txt文件中的數據導入到表裏:

mysql> delte from students;
mysql> load data infile '/usr/local/mysql/backup/students2.txt' into table students fields terminated by ',' enclosed by '"' lines terminated by '\r\n';
導入過程當中忽略錯誤,繼續將符合條件的數據導入:
mysql> load data infile '/usr/local/mysql/backup/students.txt' ignore into table students fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

mysql> select * from students;

  

 

導入過程當中若是碰到惟一性約束衝突則執行替換語句:

mysql> load data infile '/usr/local/mysql/backup/students.txt' replace into table students fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

  

mysql 恢復

恢復類型分爲全量恢復和基於時間點恢復兩種 
全量恢復是指將備份文件中全部的數據都進行恢復,恢復完成以後的數據就是爲生成備份的那一刻的數據狀態 
基於時間點的恢復是指將數據庫恢復到指定的某個時間點的狀態,一般須要依賴二進制日誌將指定時間點前的全部數據庫操做都從新操做一遍

 

基於時間點恢復

基於時間點的恢復是將數據庫恢復到指定的時間點狀態,一般是先經過全量恢復的方式先將數據庫恢復到上一個全量 

恢復的時間點,而後再利用二進制日誌恢復到指定的時間點 
Mysqlbinlog工具能夠用來解析二進制日誌的內容,讓日誌能夠被執行或者是查看 
在數據庫中從新執行某個二進制日誌文件中的內容,可使用以下命令

shell> mysqlbinlog binlog_files | mysql -u root -p
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
或者是先把日誌文件內容解析出來,而後再執行
shell> mysqlbinlog binlog_files > tmpfile
shell> mysql -u root -p < tmpfile

  

模擬數據測試基於時間點恢復:

mysql> use course;
mysql> delte from students;
mysql> alter table students add tstamp timestamp;
mysql> flush logs; #刷新一下二進制日誌,新生成一個二進制日誌

#插入數據 ,flush logs新生成一個二進制文件
mysql> insert into students(sid,sname,gender,dept_id) values(1,'a',1,1),(2,'b',2,2);
mysql> flush logs;
mysql> insert into students(sid,sname,gender,dept_id) values(3,'c',3,3),(4,'d',4,3);
mysql> flush logs;
mysql>  insert into students(sid,sname,gender,dept_id) values(5,'e',5,3),(6,'f',6,3);
mysql> flush logs;
mysql> select * from students;

  

 

 刪除表裏所有數據,進行模擬恢復 
第一個的flush logs的時候alter table

 

 

插入a,b的那次數據的二進制日誌文件

 

 

 恢復第一個二進制日誌文件:插入a,b
 

 

mysql> truncate table students; ##先刪除表裏的所有數據

mysql> desc students;
恢復第一個二進制日誌文件:插入a,b
能夠經過mysqlbinlog 查詢一下二進制文件看看裏面的具體內容

[root@master01 data]# mysql -u root -p < /tmp/mysqlbinlog46.sql

  

 

 

恢復第二個二進制日誌文件:

[root@master01 data]# mysqlbinlog -v mysql-bin.000047 > /tmp/mysqlbinlog47.sql
[root@master01 data]# mysql -u root -p < /tmp/mysqlbinlog47.sql 
Enter password: 

  

若是是恢復某個日誌文件中的一部份內容,能夠經過指定—start-datetime或者是—stop-datetime參數來肯定開始恢復時間和中止恢復時間

 

好比將數據庫恢復到2018-09-19 19:06:08的時刻: 
涉及到mysql-bin.000048文件內容

[root@master01 data]# mysqlbinlog -v --stop-datetime="2018-09-19 19:06:46"  mysql-bin.000048 | mysql -u root -p
Enter password: 

  

 

基於時間點的恢復也能夠指定日誌文件中的位置經過設置–start-position和–stop-position兩個參數

 

mysql> truncate table students;
mysql> select * from students;
Empty set (0.00 sec)

  

看一下二進制的具體內容

 

 從一個完整的日誌位置恢復 或則commit 提交之後–stop-position位置恢復

也就是 
–start-position=’298’ –stop-position=’460’ #只恢復某個具體的binlog內容 
或則 
–stop-posionion=’460’ #恢復460日誌位置以前的binlog的內容

[root@master01 data]# mysqlbinlog -v    --start-position='298' --stop-position='460'  mysql-bin.000046 | mysql -u root -p
Enter password: 

  

 

Xtrabackup備份與恢復

Xtrabackup是一個對Mysql作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),Xtrabackup有兩個主要的工具:xtrabackup、 innobackupex,其中innobackupex已經逐漸被xtrabackup取代 
特色: 
(1)備份過程快速、可靠; 
(2)備份過程不會打斷正在執行的事務; 
(3)可以基於壓縮等功能節約磁盤空間和流量; 
(4)自動實現備份檢驗; 
(5)還原速度快

下載地址: 
https://www.percona.com/downloads/XtraBackup/LATEST/

 

安裝:

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

yum -y install libev
yum -y install perl-Digest-*
rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm 

  

全量備份:

mkdir -p  /data/backups/mysql
[root@master01 mysql]# xtrabackup --backup --target-dir=/data/backups/mysql/ -u root -p -P 3306 --host=10.0.0.201

  

全量恢復

恢復過程當中首先要執行prepare將全部的數據文件都準備到同一個時間點由於在備份過程當中全部的數據文件備份都是在不一樣的時間點,若是直接啓動可能會致使衝突

 

/etc/init.d/mysql stop
mv /usr/local/mysql/data /usr/local/mysql/data_bak
mkdir /usr/local/mysql/data
xtrabackup --prepare --target-dir=/data/backups/mysql
xtrabackup --copy-back --target-dir=/data/backups/mysql --datadir=/usr/local/mysql/data
chown  -R mysql:mysql /usr/local/mysql/data 
/etc/init.d/mysql start

  

  

增量備份:

建立一個初始完整備份

rm -rf /data/backups/mysql/*
#完整備份
[root@master01 mysql]# xtrabackup --backup --target-dir=/data/backups/mysql/base -u root -p123456 -P 3306 --host=127.0.0.1

  

進行模擬數據增長,進行增量備份

mysql -u root -p 

use course
insert into students values(11,'aa',1,1,current_timestamp);
insert into students values(12,'bb',2,2,current_timestamp);
exit
xtrabackup --backup --target-dir=/data/backups/mysql/inc1 --incremental-basedir=/data/backups/mysql/base -u root -p123456 --host=127.0.0.1

  

 

在加數據,進行第二次增量備份

mysql -u root -p 
use course;
insert into students values(13,'cc',3,3,current_timestamp);
insert into students values(14,'dd',4,3,current_timestamp);
exit
xtrabackup --backup --target-dir=/data/backups/mysql/inc2 --incremental-basedir=/data/backups/mysql/inc1 -u root -p123456 -P 3306 --host=127.0.0.1

  

 

 

增量備份恢復:

恢復第一次插入的數據

pkill mysql 
rm -rf /usr/local/mysql/data/

#準備上一次完整備份時間點
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/base --datadir=/usr/local/mysql/data
#準備恢復第一次插入的數據
xtrabackup --prepare --target-dir=/data/backups/mysql/base --incremental-dir=/data/backups/mysql/inc1 --datadir=/usr/local/mysql/data
xtrabackup --copy-back --target-dir=/data/backups/mysql/base --datadir=/usr/local/mysql/data
chown -R mysql.mysql /usr/local/mysql/data/
/etc/init.d/mysql start
mysql -u root -p

  

恢復第二次插入的數據

pkill mysql
rm -rf /usr/local/mysql/data
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/base --incrementaldir=/data/backups/mysql/inc1 --datadir=/usr/local/mysql/data
xtrabackup --prepare --target-dir=/data/backups/mysql/base --incremental-dir=/data/backups/mysql/inc2 --datadir=/usr/local/mysql/data
xtrabackup --copy-back --target-dir=/data/backups/mysql/base --datadir=/usr/local/mysql/data
chown -R mysql.mysql /usr/local/mysql/data
/etc/init.d/mysql start
mysql -u root -p
use course;
select * from students;

  

在準備增量備份時,必須跳過未提交事務的回滾,由於備份時未提交的事務可能正在進行,而且可能會在下一次增量備份中提交。使用–apply-log-only選項來防止回滾階段。 最後一次恢復的時候不用加–apply-log-only

相關文章
相關標籤/搜索