Mysql 備份與恢復


備份類型介紹

備份類型可以分為物理備份和邏輯備份兩種

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

邏輯備份是指通過備份數據庫的邏輯結構(create database/table語句)和數據內容(insert語句或者文本文件)的方式完成備份。這種備份方式適用於數據庫不是很大,或者你 
需要對導出的文件做一定的修改,又或者是希望在另外的不同類型服務器上重新建立此數據庫的情況

物理備份通常要求在數據庫關閉的情況下執行,但如果是在數據庫運行情況下執行,則要求備份期間數據庫不能修改

邏輯備份的速度要慢於物理備份,是因為邏輯備份需要訪問數據庫並將內容轉化成邏輯備份需要的格式;通常輸出的備份文件大小也要比物理備份大;另外邏輯備份也不包含數據庫的 
配置文件和日志文件內容;備份和恢復的粒度可以是所有數據庫,也可以是單個數據庫,也可以是單個表;邏輯備份需要再數據庫運行的狀態下執行;它的執行工具可以是mysqldump或者是select … into outfile兩種方式

備份又可以分為在線備份和離線備份兩種 
在線備份是指在數據庫運行的狀態下執行的備份 
而離線備份是指在數據庫關閉情況下執行的備份

備份還可以分為本地備份和遠程備份兩種

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

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

遠程備份是指備份是在和當前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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM