1. 程式人生 > >MySQL完整備份與增量備份

MySQL完整備份與增量備份

MySQL備份與恢復


資料備份的型別
1、物理備份
冷備份:在資料庫關閉狀態下進行的備份操作。
熱備份:在資料庫處於執行狀態時進行備份操作,該方法依賴於資料庫的日誌檔案。
溫備份:資料庫鎖定表格(不可寫入但可讀)的狀態下進行的備份操作。
2、邏輯備份
對資料庫邏輯元件(如表等資料庫物件)的備份,表示為邏輯資料庫結構(create database,create table語句)和
內容(insert語句或分割文字檔案)的資訊,這種型別的備份適用於可以編輯資料值或表結構較小的資料量,或者在不
同的機器體系結構上重新建立資料
3、從資料庫備份策略角度,資料庫的備份可分為完整備份

差異備份增量備份
1)完整備份:每次對資料庫進行完整的備份,即對整個資料庫的備份,資料庫結構和檔案結構的整體備份,是差異備份和增量備份的基礎;
2)差異備份:備份從上次完整備份之後被修改的所有檔案,備份的時間點是上次完整備份起,備份資料量會越來越大,恢復資料時,只需恢復上次的完整備份與最近的一次差異備份;
3)增量備份:只有在那些上次完整備份或增量備份後被修改的檔案才會被備份,以上次完整備份或增量備份的時間為時間點,僅備份這之
間的資料變化因而備份的資料量小,佔用的空間小,備份速度快,但恢復時需要將上一次完整備份到最後一次增量備份一次恢復
資料庫常見備份方法
1.物理冷備份
2.tar命令
3.專用備份工具
1) mysqldump
2) Mysqlhotcopy
4.二進位制日誌
5.第三方工具備份
1)Percona XtraBackup
2)Xtrabackup


一、資料庫完全備份操作


1、物理冷備份與恢復:
使用tar命令直接打包資料庫資料夾,在備份之前需要使用停止mysql服務;

	備份資料庫;建立一個/backup目錄作為備份資料庫路徑,使用tar建立備份檔案。整個資料庫資料夾備份屬於完全備份
	[[email protected] ~]# systemctl stop mysqld.service
	[[email protected] ~]# mkdir /backup
	[[email protected] ~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
	[
[email protected]
~]# ls -l /backup/ 總用量 736 -rw-r--r-- 1 root root 751542 8月 15 08:40 mysql_all-2018-08-15.tar.gz 恢復資料庫;執行下面操作將資料庫檔案/usr/local/mysql/data/轉移至bak目錄下,模擬故障。 [[email protected] ~]# mkdir /bak [[email protected] ~]# mv /usr/local/mysql/data/ /bak/ 執行下面操作可以從備份檔案恢復資料 [[email protected] ~]# mkdir restore/ [[email protected] ~]# tar zxf /backup/mysql_all-2018-08-15.tar.gz -C restore/ [[email protected] ~]# mv restore/usr/local/mysql/data/ /usr/local/mysql/ [[email protected] ~]# systemctl start mysqld.service

2、mysqldump備份與恢復 :
備份資料庫;使用mysqldump命令匯出資料時,預設會直接在終端顯示,若要儲存到檔案,還需要結合shell的‘>’重定向輸出操作。

格式1;備份指定資料庫中的部分表

mysqldump [選項] 庫名 [表名1] [表名2] … > /備份路徑/備份檔名

格式2;備份一個或多個完整的庫(包含其中所有的表)

mysqldump [選項] --databases 庫名1 [庫名2] … > /備份路徑/備份檔名

格式3;備份mysql資料庫中的所有庫

mysqldump [選項] --all-databases > /備份路徑/備份檔名

其中,常用的選項包括“-u”“-p”,分別用於指定資料庫的使用者名稱,密碼。

例如,以下操作分別使用格式1,格式2,將mysql庫中的user表匯出為mysql-user.sql,將整個benet庫匯出為benet.sql檔案,所有操作均以root使用者身份驗證.

[[email protected] ~]# mysqldump -u root -p mysql user >mysql-user.sql
	Enter password:																		##mysql中root密碼
	
	[[email protected] ~]# mysqldump -u root -p --databases benet > benet.sql
	Enter password:																		##mysql中root密碼

若需要備份整個mysql伺服器中的所有庫,應使用格式3。當匯出的資料量較大時,可以新增“–opt”選項以優化執行速度。
例如;執行以下操作將建立備份檔案all-data.sql,其中包含MySQL伺服器中的所有庫。

[[email protected] ~]# mysqldump -u root -p --opt --all-databases > all-databases.sql
	Enter password:																		##mysql中root密碼

檢視備份檔案
通過mysqldump工具匯出的SQL指令碼文字檔案,其中“//”部分或以–開頭的行表示註釋資訊。使用grep、less、cat等文字工
具都可以檢視檔案內容。
例如;執行以下操作可以過濾出benet.sql指令碼中的資料庫操作語句

[[email protected] ~]# grep -v "^--" benet.sql | grep -v "^/" | grep -v "^$"
	CREATE DATABASE /*!32312 IF NOT EXISTS*/ `benet` /*!40100 DEFAULT CHARACTER SET utf8 */;
	USE `benet`;
	DROP TABLE IF EXISTS `users`;
	CREATE TABLE `users` (
	`user_name` char(15) NOT NULL,
	`user_passwd` char(100) DEFAULT '',
	PRIMARY KEY (`user_name`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	LOCK TABLES `users` WRITE;
	INSERT INTO `users` VALUES ('lisi','123123'),('zhangsan','*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1');
	UNLOCK TABLES;

恢復資料庫
使用mysqldump命令匯出的SQL備份指令碼,在需要恢復時可以通過mysql命令對其進行匯入操作,
命令格式如下。
mysql [選項] [庫名] [表名] < /備份路徑/備份檔名
當備份檔案中只包含表的備份,而不包含建立庫的語句時,執行匯入操作時必須制定庫名,且目標庫必須存在。
例如;以下操作可以從備份檔案mysql-user.sql中將表匯入test庫。其中“-e”選項是用於指定連線MySQL執行後的命令,
命令執行後自動退出。

  [[email protected] ~]# mysql -u root -p test < mysql-user.sql 
  Enter password:																		##mysql中root密碼   	
  [[email protected] ~]# mysql -u root -p -e ' show tables from test;'
  Enter password: 																	##mysql中root密碼
    +----------------+
    | Tables_in_test |
    +----------------+
    | user           |
    +----------------+

若備份檔案中已經包含完整的資料庫資訊,則執行匯入操作時無需指定庫名。
例如指定一下操作可以從備份檔案benet.sql恢復到benet庫。

[[email protected] ~]# mysql -u root -p -e ' drop database benet;'						##刪除benet庫,模擬資料庫故障
Enter password: 
[[email protected] ~]# mysql -u root -p -e ' show databases;'							##檢視到benet庫已經不存在了
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[[email protected] ~]# mysql -u root -p < ~/benet.sql
Enter password: 
[[email protected] ~]# mysql -u root -p -e ' show databases;'
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| benet              |
| mysql              |
| performance_schema |
| test               |
+--------------------+	

二、增量備份


特點:
與完整備份不同,增量備份沒有重複資料,備份量不大,時間短,但恢復麻煩,需要上次完整備份及完整備份之後的增量備份才能恢復,而且要對所有增量備份進行逐個反推恢復,mysql中沒有提供直接增量備份的方法,可以通過MySQL提供的我二進位制日誌(binary logs)間接實現增量備份。
二進位制日誌:
要進行MySQL的增量備份,首先要開啟二進位制功能,開啟MySQL的二進位制日誌功能的實現方法有很多種,最常用的是在MySQL配置檔案的mysqld項下加入“log-bin=/檔案路徑/檔名”字首,如;log-bin=/usr/local/mysql/mysql-bin,然後重啟mysqld.service服務,就可以看到指定路徑下的二進位制檔案檔案了。預設情況下,二進位制日誌檔案的副檔名是一個六位的數字,如;mysql-bin.000001

[[email protected] ~]# vim /etc/my.cnf			
##修改配置檔案,啟用二進位制功能
log-bin=/usr/local/mysql/mysql-bin
:wq!	
[[email protected] ~]# systemctl restart mysqld.service 
[[email protected] ~]# ls -l /usr/local/mysql/mysql-bin.*
-rw-rw---- 1 mysql mysql 120 8月  15 10:35 /usr/local/mysql/mysql-bin.000001
-rw-rw---- 1 mysql mysql  34 8月  15 10:35 /usr/local/mysql/mysql-bin.index

MySQL增量恢復:
常用的增量恢復方法有三種:
一般恢復,基於位置的恢復,基於時間點的恢復

一般恢復:
將所有備份的二進位制日誌內容全部恢復,格式命令如下

mysqlbinlog [–no-defaults] 增量備份檔案 | mysql -u root -p

基於位置的恢復:
資料庫管理員在操作資料庫時可能在同一時間點既有錯誤的操作也有正確的操作,通過基於位置進行恢復可以更加精準,
命令格式如下所示。
格式一:恢復資料到指定位置

mysqlbinlog --stop-position=‘459’ 二進位制日誌 | mysql -u root -p ******

格式二:從指定的位置開始恢復資料

mysqlbinlog --start-position=‘459’ 二進位制日誌 | mysql -u root -p ******

基於時間點的恢復:
跳過某個發生錯誤的時間點實現資料恢復,而基於時間點的恢復可以分成三種情況。
格式1:從日誌開頭截止到某個時間點恢復

mysqlbinlog [–no-defaults] --stop-datetime=‘年-月-日 小時:分鐘:秒’ 二進位制日誌 | mysql -u 使用者 -p 密碼

格式2:從某個時間點到日誌結尾恢復

mysqlbinlog [–no-defaults] --start-datetime=‘年-月-日 小時:分鐘:秒’ 二進位制日誌 | mysql -u 使用者 -p 密碼

格式3:從某個時間點到某個時間點恢復

mysqlbinlog [–no-defaults] --start-datetime=‘年-月-日 小時:分鐘:秒’ --stop-datetime=‘年-月-日 小時:分鐘:秒’ 二進位制日誌 | mysql -u 使用者 -p 密碼