MySQL備份恢復

 

MySQL備份恢復

 

 

1. MySQL 的備份方式
2. 冷備
3. 熱備
3.1 邏輯備份之 - mysqldump
3.1.1 mysqldump語法以下
3.1.2 mysqldump常見的參數
3.1.3 mysqldump備份流程
3.1.4 mysqldump常見用法
3.2 邏輯備份之 - select ... into outfile
3.2.1 語法
3.2.2 參數
3.3.3 導出導入示例
3.3.4 SELECT OUTFILE + awk
3.4 邏輯備份之 - mysqlpump
3.5 邏輯備份之 - mydumper
3.5.1 安裝mydumper
3.5.2 mydumper和myloader重點參數介紹
3.5.3 mydumper與myloader的用法
3.6 物理備份之 - XtraBackup
3.6.1 XtraBackup備份原理
3.6.2 安裝XtraBackup
3.6.3 XtraBackup須要的權限
3.6.4 配置XtraBackup
3.6.5 xtrabackup 備份實踐
3.6.6 innobackupex 備份實踐javascript

 

 

本文檔主要圍繞生產中常用的mysqldump、mydumper、xtrabackup等工具來進行備份恢復的學習。php

1. MySQL 的備份方式

MySQL的備份方法,劃分爲以下三種:css

  • 冷備份
    冷備是指在數據庫關閉的狀況下進行備份,這種備份很是簡單,只需關閉數據庫,複製相關的物理文件便可。html

  • 溫備份
    溫備份也是在數據庫運行的過程當中進行備份,可是備份會對數據庫操做有所影響。java

  • 熱備份
    熱備份是指在數據庫運行的過程當中進行備份,對生產環境中的數據庫運行沒有任何影響。常見的熱備份方案是利用mysqldump、xtrabackup等工具進行備份。python

根據備份文件的類型,備份又能夠劃分以下兩種:mysql

  • 物理備份
    物理備份是指複製數據庫的物理文件,既能夠是在數據庫運行中複製(如xtrabackup這類工具),也能夠是在數據庫中止運行時直接的數據文件複製。linux

  • 邏輯備份
    邏輯備份是指備份文件的內容是可讀的,該文本通常是由一條條SQL語句或者表的實際數據組成。常見的邏輯備份方式有mysqldump、select * into outfile等方法。git

按照備份數據庫的內容來分,備份又能夠分爲:github

  • 徹底備份
    徹底備份是指對數據庫進行一個完整的備份。

  • 增量備份
    增量備份是指在上次徹底備份的基礎是,對於更改的數據進行備份。

  • 日誌備份
    日誌備份主要針對MySQL數據庫binlog的備份,經過對一個徹底備份進行binlog的重作(replay)來完成數據庫的point-in-time的恢復工做。MySQL數據庫複製(replication)的原理就是異步實時地將二進制日誌重作傳送並應用到(slave)數據庫。

2. 冷備

冷備就是在數據庫處於關閉狀態下的備份,好處能夠保證數據庫的晚自習,備份過程簡單而且恢復速度相對快一些。

冷備的備份與恢復過程:

1) 中止MySQL服務

 
# mysqladmin -S /tmp/mysql3306.sock shutdown
 

 

 

2) 備份數據目錄

 
# cd /data/mysql/
# tar -cvjpf mysql3306.tar.bz2 mysql3306   //-c爲建立一個打包文件,相應的-f後面接建立的文件的名稱,使用了.tar.bz2後綴,-j標誌使用bzip2壓縮,最後面爲具體的操做對象mysql3306目錄

# 查看
# tar -tvjf mysql3306.tar.bz2  //-t爲查看操做,則-f對應所查看的文件的名稱,文件後綴顯示使用bzip2進行壓縮,因此加入-j選項,-v會顯示詳細的權限信息
 

 

 

3) 恢復數據

 
# cd /data/mysql/
# rm -rf mysql3306
# tar -xvjf mysql3306.tar.bz2    //-x爲解壓操做,則-f指定的是解壓使用的文件,文件後綴顯示使用bzip2進行壓縮,因此加入-j選項,即便用bzip2解壓
 

 

 

3. 熱備

熱備是在數據庫處於運行狀態下的備份,不影響現有業務的正常進行。

熱備又分爲邏輯備份和物理備份。

3.1 邏輯備份之 - mysqldump

mysqldump客戶端實用程序執行邏輯備份,生成一組SQL語句,能夠執行這些語句來重現原始數據庫對象定義和表數據。 它轉儲一個或多個MySQL數據庫以備份或傳輸到另外一個SQL服務器。 mysqldump命令還能夠生成CSV,其餘分隔文本或XML格式的輸出。

3.1.1 mysqldump語法以下

 
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
 

3.1.2 mysqldump常見的參數

mysqldump的參數有不少,能夠經過使用mysqldump --help命令來查看全部參數,有些參數有縮寫形式,如--all-databases的縮寫形式爲-A。這裏列舉一些常見的參數。

  • -u, --user=name
    指定鏈接的用戶名

  • -p, --password[=name] 
    指定用戶的密碼,這裏能夠指定參數名,若不指定參數值,mysqldump隨後將提示輸入密碼,以保護帳戶口令的安全

  • -S, --socket=name 
    指定socket文件鏈接

  • -h, --host=name
    指定鏈接的服務器名

  • -P, --port=# 
    指定鏈接的服務器端口號

  • --tables
    導出指定的表對象,格式爲 'dbname tablename',如mysqldump -S /tmp/mysql3306.sock test t1,默認會覆蓋-B, --databases參數

  • --single-transaction
    在備份開始前,先執行start transaction命令,以此來得到備份的一致性,當前該參數只對InnoDB存儲引擎有效。當啓用該參數並進行備份時,確保沒有其餘任何的DDL語句執行(ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE),由於一致性讀並不能隔離DDL操做。啓用此參數時,參數--lock-tables將自動禁用。

  • -A, --all-databases
    備份全部數據庫

  • -B, --databases 
    備份指定的數據庫,如mysqldump -S /tmp/mysql3306.sock --database db1 db2

  • --default-character-set=name
    設置字符集,默認爲以服務器設置的字符集進行導出。

  • -l, --lock-tables
    以只讀方式依次鎖住每一個庫下的全部表,默認啓用。使用--skip-lock-tables禁用。不能保證全部庫下的表備份一致。

  • -x, --lock-all-tables
    在備份過程當中,對全部庫的全部表,同時鎖定。若指定了本參數,則會自動禁用--single-transaction-l, --lock-tables參數。

  • --add-drop-database 
    在任何建立庫語句前,附加drop database語句。

  • --add-drop-table
    在任何建表語句錢,附加drop table語句。默認啓用。若是不但願生成drop table語句,能夠經過--skip-add-drop-table參數禁用。

  • --add-drop-trigger
    建立任何觸發器前,附加drop trigger語句。

  • --add-locks
    在生成的insert語句錢附加lock語句,默認啓用。使用 --skip-add-locks來禁用。

  • --allow-keywords
    容許建立使用關鍵字的列名。

  • --master-data[=#]
    該參數有1和2兩個值,若是值等於1,就會在備份文件中添加一個change master語句。若是值爲2,就會在備份文件中添加一個帶有註釋符號的change master語句。

  • --dump-slave[=#]
    該參數用於在從庫備份數據,在線搭建新的從庫時使用。此參數也有1和2兩個值。值爲1時,在備份文件中添加一個change master語句。值爲2時,就會在備份文件中添加一個帶有註釋符號的change master語句。

  • -t, --no-create-info 
    備份過程當中,只備份表數據,不備份表結構

  • -d, --no-data
    備份過程當中,只備份表結構,不備份表數據

  • -c, --complete-insert 
    使用完整的insert語句會包含表中的列信息,這麼作能夠提升插入效率。

  • -q, --quick
    表示導出時不會先將數據加載至buffer中,而是直接輸出。默認啓用,使用 --skip-quick禁用。

  • -w, --where=name
    導出給定條件的數據。

3.1.3 mysqldump備份流程

開啓general_log以觀察備份流程。

 
mysql> set global general_log = 1;

# mysqldump -S /tmp/mysql3306.sock --master-data=2 --single-transaction test > /tmp/testdb.sql

mysql> set global general_log = 0;

mysql> show variables like '%gen%';
+------------------+-----------------------------------------+
| Variable_name    | Value                                   |
+------------------+-----------------------------------------+
| general_log      | OFF                                     |
| general_log_file | /data/mysql/mysql3306/data/mysqldb1.log |
+------------------+-----------------------------------------+


1. FLUSH /*!40101 LOCAL */ TABLES
2. FLUSH TABLES WITH READ LOCK
3. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
4. START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
5. SHOW VARIABLES LIKE 'gtid\_mode'
6. SHOW MASTER STATUS
7. UNLOCK TABLES
8. show databases;
9. show create database if not exists 'dbname';
10. SAVEPOINT sp
11. show tables
12. show table status like 'account'
13. SET SQL_QUOTE_SHOW_CREATE=1
14. SET SESSION character_set_results = 'binary'
15. show create table `account`
16. SET SESSION character_set_results = 'utf8'
17. show fields from `account`
18. SELECT /*!40001 SQL_NO_CACHE */ * FROM `account`
19. SET SESSION character_set_results = 'binary'
20. use `test`
21. select @@collation_database
22. SHOW TRIGGERS LIKE 'account'
23. SHOW CREATE TRIGGER `ins_sum`
24. SET SESSION character_set_results = 'utf8'
25. ROLLBACK TO SAVEPOINT sp
26. ...
27. ROLLBACK TO SAVEPOINT sp
28. RELEASE SAVEPOINT sp
 

 

 

3.1.4 mysqldump常見用法

  • 1) 全庫的備份恢復

     
      
    備份全庫
    
    mysqldump -S /tmp/mysql3306.sock --master-data=2 --single-transaction -A >alldb-`date +%Y%M%d`.sql
    恢復全庫
    
    mysql -S /tmp/mysql3306.sock < alldb-20180910.sql
     

     

     
  • 2) 指定庫的備份恢復

     
      
    備份指定庫
    
    mysqldump -S /tmp/mysql3306.sock --single-transaction -B test >db-`date +%Y%m%d`.sql
    恢復指定庫
    
    mysql -S /tmp/mysql3306.sock < db-20180910.sql
     

     

     
  • 3)指定表的備份與恢復

     
      
    備份t1與b表
    
    mysqldump -S /tmp/mysql3306.sock --single-transaction test t1 b >db-`date +%Y%m%d`.sql
    恢復t1與b表
    
    mysql -S /tmp/mysql3306.sock  test < db-20180910.sql
     

     

     
  • 4)只備份表的表結構信息

    備份test庫中t1與b表的表結構信息

     
      
    mysqldump -S /tmp/mysql3306.sock --single-transaction test t1 b -d >db-`date +%Y%m%d`.sql
    
    ...
    DROP TABLE IF EXISTS `b`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `b` (
     `b1` int(11) DEFAULT NULL,
     `name` varchar(10) NOT NULL DEFAULT 'w',
     KEY `idx_b1` (`b1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    /*!40101 SET character_set_client = @saved_cs_client */;
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2018-09-10 16:27:50
     

     

     
  • 5)只備份表的數據信息

    備份test庫中t1與b表的表數據信息

     
      
    mysqldump -S /tmp/mysql3306.sock --single-transaction test t1 b -t >db-`date +%Y%m%d`.sql
    
    ...
    LOCK TABLES `t1` WRITE;
    /*!40000 ALTER TABLE `t1` DISABLE KEYS */;
    INSERT INTO `t1` VALUES (1,'aaa'),(3,'aaa'),(4,'bbb'),(2,'ccc'),(5,'ccc'),(6,'zzz');
    /*!40000 ALTER TABLE `t1` ENABLE KEYS */;
    UNLOCK TABLES;
    
    --
    -- Dumping data for table `b`
    --
    
    LOCK TABLES `b` WRITE;
    /*!40000 ALTER TABLE `b` DISABLE KEYS */;
    INSERT INTO `b` VALUES (1,'w'),(2,'w'),(3,'w'),(4,'w'),(5,'w');
    /*!40000 ALTER TABLE `b` ENABLE KEYS */;
    UNLOCK TABLES;
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
     

     

     
  • 6)備份指定條件的數據

    備份test庫的t1表,而且大於5的數據。

     
      
    mysqldump -S /tmp/mysql3306.sock --single-transaction test t1 --where='id>5'
    
    -- MySQL dump 10.13  Distrib 5.7.23, for linux-glibc2.12 (x86_64)
    --
    -- Host: localhost    Database: test
    -- ------------------------------------------------------
    -- Server version    5.7.23-log
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    
    --
    -- Table structure for table `t1`
    --
    
    DROP TABLE IF EXISTS `t1`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `t1` (
     `id` int(11) NOT NULL,
     `name` varchar(10) DEFAULT NULL,
     PRIMARY KEY (`id`),
     KEY `idx_name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    /*!40101 SET character_set_client = @saved_cs_client */;
    
    --
    -- Dumping data for table `t1`
    --
    -- WHERE:  id>5
    
    LOCK TABLES `t1` WRITE;
    /*!40000 ALTER TABLE `t1` DISABLE KEYS */;
    INSERT INTO `t1` VALUES (6,'zzz');
    /*!40000 ALTER TABLE `t1` ENABLE KEYS */;
    UNLOCK TABLES;
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2018-09-10 16:03:29
     

3.2 邏輯備份之 - select ... into outfile

SELECT ... INTO 語句也是一種邏輯備份的方法,更準確地說是導出一張表中的數據。

3.2.1 語法

 
SELECT  [column 1],[column 2]... 
    INTO
    OUTFILE 'file_name'
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
 FROM TABLE WHERE ...
 

 

 

FIELDS TERMINATED BY 'string' :表示每一個列的分隔符。

[OPTIONALLY] ENCLOSED BY 'char :表示對於字符串的包含符

ESCAPED BY 'char' : 表示轉義符

STARTING BY 'string' : 表示每行的開始符號

TERMINATED BY 'string' : 表示每行的結束符號

若是沒有指定任何的FILEDS和LINES的選項,默認使用如下的設置:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

LINES STARTING BY '' TERMINATED BY '\n'

3.2.2 參數

要想支持select ... into 語法,首先得設置參數secure-file-priv,此參數的值有如下:

  • empty string
    若是爲空,則變量無效。這不是一個安全的設置。

  • null
    若是設置爲NULL,則服務器禁用導入和導出操做。

  • dirname
    若是設置爲目錄名稱,則服務器會將導入和導出操做限制爲僅適用於該目錄中的文件。目錄必須存在;服務器不會建立它。

3.3.3 導出導入示例

select ... into outfile導出數據與LOAD DATA導入數據示例

 
root@localhost [test] 09:41:38> select * from t1 into outfile '/tmp/t1.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

將參數設置爲:
secure_file_priv = /data/mysql/mysql3306/outfile

導出數據
mysql> select * from t1 into outfile '/data/mysql/mysql3306/outfile/t1.txt';

# cat t1.txt 
1    aaa
3    aaa
4    bbb
2    ccc
5    ccc
6    zzz

恢復數據

mysql> delete from t1;

mysql> LOAD DATA INFILE '/data/mysql/mysql3306/outfile/t1.txt' into table t1;

mysql> select * from t1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  3 | aaa  |
|  4 | bbb  |
|  2 | ccc  |
|  5 | ccc  |
|  6 | zzz  |
+----+------+
6 rows in set (0.00 sec)
 

 

 

3.3.4 SELECT OUTFILE + awk

 
導出數據
mysql> select * from t1 into outfile '/data/mysql/mysql3306/outfile/t1.txt';

mysql> delete from t1;

利用awk生成導入sql
# cat t1.txt |awk '{print "insert into test.t1 values("$1",'\''"$2"'\'');"}' > into_t1.sql

# cat into_t1.sql
insert into test.t1 values(1,'aaa');
insert into test.t1 values(3,'aaa');
insert into test.t1 values(4,'bbb');
insert into test.t1 values(2,'ccc');
insert into test.t1 values(5,'ccc');
insert into test.t1 values(6,'zzz');

導入數據
# mysql -S /tmp/mysql3306.sock < into_t1.sql

mysql> select * from test.t1;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  3 | aaa  |
|  4 | bbb  |
|  2 | ccc  |
|  5 | ccc  |
|  6 | zzz  |
+----+------+
6 rows in set (0.00 sec)
 

 

 

3.4 邏輯備份之 - mysqlpump

mysqlpump和mysqldump同樣,屬於邏輯備份,備份以SQL形式的文本保存。邏輯備份相對物理備份的好處是不關心undo log的大小,直接備份數據便可。它最主要的特色是:

  • 並行備份數據庫和數據庫中的對象的,加快備份過程。

  • 更好的控制數據庫和數據庫對象(表,存儲過程,用戶賬戶)的備份。

  • 備份用戶帳號做爲賬戶管理語句(CREATE USER,GRANT),而不是直接插入到MySQL的系統數據庫。

  • 備份出來直接生成壓縮後的備份文件。

  • 備份進度指示(估計值)。

  • 從新加載(還原)備份文件,先建表後插入數據最後創建索引,減小了

  • 索引維護開銷,加快了還原速度。

  • 備份能夠排除或則指定數據庫。

 
#mysqlpumpy壓縮備份 以lz4壓縮格式備份employees數據庫

mysqlpump -S /tmp/mysql3306.sock --single-transaction --default-character-set=utf8 --compress-output=LZ4 --default-parallelism=3 -B employees > /tmp/employees_db.sql.lz4

#mysqldump備份壓縮
mysqldump -S /tmp/mysql3306.sock --single-transaction -B employees | gzip > /tmp/employees.sql.gz
 

 

 

3.5 邏輯備份之 - mydumper

MySQL在備份方面包含了自身的mysqldump工具,但其只支持單線程工做,這就使得它沒法迅速的備份數據。而mydumper做爲一個實用工具,可以良好支持多線程工做,這使得它在處理速度方面十倍於傳統的mysqldump。其特徵之一是在處理過程當中須要對列表加以鎖定,所以若是咱們須要在工做時段執行備份工做,那麼會引發DML阻塞。但通常如今的MySQL都有主從,備份也大部分在從上進行,因此鎖的問題能夠不用考慮。這樣,mydumper能更好的完成備份任務。

3.5.1 安裝mydumper

 
# yum install https://github.com/maxbube/mydumper/releases/download/v0.9.5/mydumper-0.9.5-1.el7.x86_64.rpm
 

 

 

3.5.2 mydumper和myloader重點參數介紹

mydumper參數介紹

參數名 說明
-B, --database 須要備份的數據庫
-T, --tables-list 須要備份的表,多表間用逗號空格
-O, --omit-from-file 包含要跳過的database.table條目列表的文件,每行一個(在應用正則表達式選項以前跳過)
-o, --outputdir 輸出文件的目錄
-s, --statement-size 生成的insert語句的字節數,默認爲 1000000
-r, --rows 將表按行分塊時,指定的塊行數,指定這個選項時,會關閉--chunk-filesize
-F, --chunk-filesize 將表按大小分塊時,指定的塊大小,單位是MB
-c, --compress 壓縮輸出文件
-e, --build-empty-files 即便表沒有數據,仍是會產生一個空文件
-x, --regex 正則表達式匹配'db.table'
-i, --ignore-engines 忽略的存儲引擎,用逗號分隔
-N, --insert-ignore 使用INSERT IGNORE 備份數據
-m, --no-schemas 不導出表結構
-d, --no-data 不導出表數據
-G, --triggers 導出觸發器
-E, --events Dump events
-R, --routines Dump stored procedures and functions
-W, --no-views 不導出視圖
-k, --no-locks 不要執行臨時共享讀鎖定. 警告:這將致使備份不一致
--no-backup-locks 不要使用Percona備份鎖
--less-locking 最大限度地減小InnoDB表的鎖定時間。
-l, --long-query-guard 設置長查詢時間, 默認60s
-K, --kill-long-queries kill 長時間執行的查詢
-D, --daemon 啓用守護進程模式
-I, --snapshot-interval 每一個轉儲快照之間的間隔(以分鐘爲單位),須要--daemon模式下,默認爲60s
-L, --logfile 要使用的日誌文件名,默認狀況下使用stdout
--tz-utc 備份的時候容許備份Timestamp,這樣會致使不一樣時區的備份還原會出問題,默認關閉,參數:--skip-tz-utc to disable.
--skip-tz-utc
--use-savepoints 使用保存點來減小元數據鎖定問題,須要SUPER權限
--success-on-1146 Not increment error count and Warning instead of Critical in case of table doesn't exist
--lock-all-tables 使用LOCK TABLE代替FTWRL(FLUSH TABLE WITH READ LOCK)
-U, --updated-since 使用Update_time僅轉儲在過去天中更新的表
--trx-consistency-only 只包含一致性事務
--complete-insert 使用包含列名的完整INSERT語句
-h, --host The host to connect to
-u, --user Username with the necessary privileges
-p, --password User password
-a, --ask-password Prompt For User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 使用的線程數,默認是4個
-C, --compress-protocol Use compression on the MySQL connection
-V, --version Show the program version and exit
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
--defaults-file Use a specific defaults file
--ssl Connect using SSL
--key The path name to the key file
--cert The path name to the certificate file
--ca The path name to the certificate authority file
--capath The path name to a directory that contains trusted SSL CA certificates in PEM format
--cipher A list of permissible ciphers to use for SSL encryption

myloader參數介紹

參數名 註釋
-d, --directory 要導入的備份文件所在的目錄
-q, --queries-per-transaction 每次事務執行的查詢數量, default 1000
-o, --overwrite-tables 若是要恢復的表存在,則先drop表
-B, --database 指定須要還原數據到哪一個數據庫中
-s, --source-db 須要還原的數據庫
-e, --enable-binlog 啓用二進制日誌恢復數據
-h, --host The host to connect to
-u, --user Username with the necessary privileges
-p, --password User password
-a, --ask-password Prompt For User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 使用的線程數量, default 4
-C, --compress-protocol 鏈接上使用的壓縮協議
-V, --version Show the program version and exit
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
--defaults-file Use a specific defaults file

3.5.3 mydumper與myloader的用法

1)以壓縮備份備份全部數據庫,還原指定的sbtest庫

 
# mydumper -S /tmp/mysql3306.sock  -c /data/mysql/mysql3306/outfile/

# ls
export-20180911-152023

從備份文件中還原指定庫sbtest
# myloader -S /tmp/mysql3306.sock -s sbtest -B sbtest -d /data/mysql/mysql3306/outfile/export-20180911-152023/
 
【注意】:若是不加-s,會把全部庫的表,還原到sbtest庫中。

2)還原sbtest庫中的sbtest1,sbtest2表

 
mysql> drop table sbtest1;
mysql> drop table sbtest2;

# myloader -S /tmp/mysql3306.sock -s sbtest -B sbtest -o sbtest1,sbtest2 -d /data/mysql/mysql3306/outfile/export-20180911-152023/

3.6 物理備份之 - XtraBackup

XtraBackup是Percona公司的開源的MySQL熱備工具,在備份的過程當中不會被鎖在數據庫中。該工具可以備份InnoDB、MyISAM表,甚至能夠備份Percona XtraDB Cluster。支持流方式、壓縮、加密和增量備份等。

XtraBackup的優勢以下:

  • 無須中止數據庫進行InnoDB熱備

  • 增量備份MySQL

  • 流壓縮傳輸到其餘服務器

  • 在線移動表

  • 可以比較容易地建立主從同步

  • 備份MySQL時不會增大服務器負載

3.6.1 XtraBackup備份原理

XtraBackup是基於InnoDB自身的崩潰恢復機制完成備份的。它首先複製全部InnoDB表數據文本副本,這樣致使了內部數據的不一致。可是,它後來執行崩潰恢復功能,使數據達到最終的一致,成爲可用的數據庫文件。

Percona XtraBackup 備份原理說明【轉】

3.6.2 安裝XtraBackup

 
# tar xfvz percona-xtrabackup-2.4.12-Linux-x86_64.libgcrypt11.tar.gz

# cd /usr/local

# ln -s /opt/percona-xtrabackup-2.4.12-Linux-x86_64 xtrabackup

# echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >> /etc/profile

# source /etc/profile

3.6.3 XtraBackup須要的權限

  • RELOAD,LOCK TABLES
    在備份時,須要執行 FLUSH TABLES WITH READ LOCK和 FLUSH ENGINE LOGS,而後開始複製數據。而且在使用 Backup Locks時,須要執行LOCK TABLES FOR BACKUP和 LOCK BINLOG FOR BACKUP。除非備份時,執行--no-lock選項,這樣便不須要這兩個權限了。

  • REPLICATION CLIENT
    在備份時須要得到二進制日誌的位置信息,須要該權限

  • CREATE TABLESPACE
    使用 XtraBackup進行恢復獨立表空間的時候,須要使用導入表空間,這時候須要該權限。

  • PROCESS
    XtraBackup在備份的時候,利用該權限能夠查看全部正在服務器端運行的線程狀況。

  • SUPER
    用在複製環境中開啓和關閉 SLAVE線程。

  • CREATE
    CREATE權限用於建立 PERCONA_SCHEMA.xtrabackup_ history數據庫和表。

  • INSERT
    INSERT權限用於將寫入歷史記錄到 PERCONA_SCHEMA. xtrabackup_history數據庫和表。

  • SELECT
    當 innobackupex使用--incremental-history-name--incremental-history-uuid選項時,可使用 SELECT權限查詢 PERCONA_SCHEMA. xtrabackup_history表的 innodb_to_lsn的值來知足該特性。

建立備份用戶

 
mysql> create user 'backup'@'localhost' identified by 'mysql';

mysql> grant reload,lock tables,replication client,CREATE TABLESPACE,PROCESS,SUPER,CREATE,INSERT,SELECT on *.* to 'backup'@'localhost';
 

 

 

3.6.4 配置XtraBackup

在my.cnf配置文件,增長如下參數

 
[xtrabackup]
target_dir = /data/backup/
 

若沒在my.cnf配置文件增長xtrabackup參數,能夠在備份時指定備份目錄,如:

 
xtrabackup -S /tmp/mysql3306.sock -ubackup -pmysql --backup --target-dir=/data/backup/
 

3.6.5 xtrabackup 備份實踐

全備份

 
1)xtrabackup備份
xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/

2)prepare備份 xtrabackup --prepare --target-dir=/data/backup/

3) 恢復 #恢復時,需MySQL數據目錄爲空。 xtrabackup --copy-back --target-dir=/data/backup/ #恢復完成後,更改MySQL數據目錄權限屬主 chown -R mysql:mysql data 啓動不了,錯誤日誌提示 2018-09-12T06:54:49.020755Z 0 [ERROR] InnoDB: Unable to open undo tablespace 'undolog/undo001'. 2018-09-12T06:54:49.020815Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error 查看undolog目錄,發現undolog並無恢復。。。 手動cp過來 而後在從新啓動,就好了。 爲何undolog不還原呢? 配置文件中my.cnf的innodb_undo_directory參數須要指定絕對路徑 innodb_undo_directory = /data/mysql/mysql3306/data/undolog 這樣恢復就好了
 

 

 

增量備份

 
1) 建立基礎備份(全備份)
# mkdir /data/backup/base
# mkdir /data/backup/incre
# mkdir /data/backup/incre2
# chown mysql:mysql /data/backup/*

xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/base/

# more xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 4105224763
last_lsn = 4105224772
compact = 0
recover_binlog_info = 0

2) 建立增量備份1 mysql> create database incre; mysql> use incre; mysql> create table t1 (id int); xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/incre/ --incremental-basedir=/data/backup/base/ # more xtrabackup_checkpoints backup_type = incremental from_lsn = 4105224763 to_lsn = 4105229436 last_lsn = 4105229445 compact = 0 recover_binlog_info = 0
2) 建立增量備份2 mysql> create table t2 (id int); mysql> insert into t2 select 2; xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/incre2/ --incremental-basedir=/data/backup/incre/ # more xtrabackup_checkpoints backup_type = incremental from_lsn = 4105229436 to_lsn = 4105233934 last_lsn = 4105233943 compact = 0 recover_binlog_info = 0
3) prepare 增量備份 xtrabackup --prepare --apply-log-only --target-dir=/data/backup/base 日誌顯示: xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 4105224781 InnoDB: Number of pools: 1 180912 15:42:08 completed OK! #應用第一個增量備份 xtrabackup --prepare --apply-log-only --target-dir=/data/backup/base/ --incremental-dir=/data/backup/incre/ #應用第二個增量備份 xtrabackup --prepare --target-dir=/data/backup/base/ --incremental-dir=/data/backup/incre2/ 日誌顯示: InnoDB: Shutdown completed; log sequence number 4105234472 180912 15:51:27 completed OK! # more /data/backup/base/xtrabackup_checkpoints backup_type = full-prepared from_lsn = 0 to_lsn = 4105233934 last_lsn = 4105233943 compact = 0 recover_binlog_info = 0
4)恢復備份 # mysqladmin -S /tmp/mysql3306.sock shutdown # mv data data_bak # mkdir data # chown mysql:mysql data xtrabackup --copy-back --target-dir=/data/backup/base/ # chown -R mysql:mysql /data/mysql/mysql3306/data # mysqld --defaults-file=/etc/my3306.cnf & mysql> use incre mysql> select * from t1; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.01 sec) mysql> select * from t2; +------+ | id | +------+ | 2 | +------+ 1 row in set (0.01 sec) 能夠看到增量備份1與增量備份2的備份都恢復出來了。
 

壓縮備份

使用--compress選項進行壓縮備份

 
1) 備份數據庫
# mkdir compress
# chown mysql:mysql compress

xtrabackup --backup --compress -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/compress/

若是要加速壓縮,可使用並行壓縮,可使用xtrabackup --compress-threads選項啓用。 如下示例將使用四個線程進行壓縮:

xtrabackup --backup --compress  --compress-threads=4 -S /tmp/mysql3306.sock -ubackup -pmysql --target-dir=/data/backup/compress/


2prepare 備份 # 解壓備份 xtrabackup --decompress --target-dir=/data/backup/compress/ # xtrabackup --parallel可與xtrabackup --decompress選項一塊兒使用,以同時解壓縮多個文件。如: xtrabackup --decompress --parallel=4 --target-dir=/data/backup/compress/ 注意:使用--parallel選項時,須要先安裝qpress插件,不然解壓時,報以下錯誤: sh: qpress: command not found sh: qpress: command not found sh: qpress: command not found cat: write error: Broken pipe sh: qpress: command not found cat: write error: Broken pipe cat: write error: Broken pipe Error: decrypt and decompress thread 0 failed. Error: decrypt and decompress thread 1 failed. Error: decrypt and decompress thread 2 failed. Error: decrypt and decompress thread 3 failed. 安裝qpress # wget http://www.quicklz.com/qpress-11-linux-x64.tar # tar xvf qpress-11-linux-x64.tar # cp qpress /usr/bin prepare備份 xtrabackup --prepare --target-dir=/data/backup/compress/

3) 恢復備份 xtrabackup --copy-back --target-dir=/data/backup/compress/
 

 

 

加密備份

 
1) 建立密鑰
# openssl rand -base64 24
SuwhhXvOcYsqLQBd/C2cj5aR495A9LC8

或者

# openssl rand -base64 24
A0fYOUej9Vq66JWqfRnvENjtHa7ipNmy 

# echo -n "A0fYOUej9Vq66JWqfRnvENjtHa7ipNmy" > /data/backup/encry/keyfile


2) 建立加密備份 xtrabackup -S /tmp/mysql3306.sock -ubackup -pmysql --backup --target-dir=/data/backup/encry --encrypt=AES256 --encrypt-key="SuwhhXvOcYsqLQBd/C2cj5aR495A9LC8" 或者 xtrabackup -S /tmp/mysql3306.sock -ubackup -pmysql --backup --target-dir=/data/backup/encry --encrypt=AES256 --encrypt-key-file=/data/backup/encry/keyfile

3) prepare 備份 解密備份 xtrabackup --decrypt=AES256 --encrypt-key="SuwhhXvOcYsqLQBd/C2cj5aR495A9LC8" --target-dir=/data/backup/encry 加上--remove-original參數能夠在解密備份文件後,刪除加密文件。 xtrabackup --decrypt=AES256 --encrypt-key="SuwhhXvOcYsqLQBd/C2cj5aR495A9LC8" --target-dir=/data/backup/encry --remove-original 也能夠加上 --parallel參數來提升解密文件速度 prapare備份 xtrabackup --prepare --target-dir=/data/backup/encry

4)恢復備份 xtrabackup --copy-back --target-dir=/data/backup/encry
 

 

 

3.6.6 innobackupex 備份實踐

全備份

 
1) 備份
備份到 /data/backup/當前時間/ 目錄下
innobackupex --defaults-file=/etc/my3306.cnf --user=backup --password=mysql /data/backup


或者指定--no-timestamp參數,將備份到指定backup-dir目錄

innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql  /data/backup/backup-dir --no-timestamp


2)prepare備份 innobackupex --apply-log /data/backup/2018-09-13_10-29-10/

3) 恢復備份 innobackupex --defaults-file=/etc/my3306.cnf --copy-back /data/backup/2018-09-13_10-29-10/ # chown -R mysql:mysql /data/mysql/mysql3306/data
 

 

 

增量備份

 
1)建立base備份
innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql /data/backup/base

# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 4105235515
last_lsn = 4105235524
compact = 0
recover_binlog_info = 0


2) 建立增量備份1 mysql> use incre mysql> create table t3 (id int); mysql> insert into t3 select 3; innobackupex --defaults-file=/etc/my3306.cnf --incremental -ubackup -pmysql /data/backup/incre --incremental-basedir=/data/backup/base/2018-09-13_10-51-46 # cat xtrabackup_checkpoints backup_type = incremental from_lsn = 4105235515 to_lsn = 4105240026 last_lsn = 4105240035 compact = 0 recover_binlog_info = 0

3) 建立增量備份2 mysql> use incre mysql> create table t4 (id int); mysql> insert into t4 select 4; innobackupex --defaults-file=/etc/my3306.cnf --incremental -ubackup -pmysql /data/backup/incre --incremental-basedir=/data/backup/incre/2018-09-13_10-58-04/ # cat xtrabackup_checkpoints backup_type = incremental from_lsn = 4105240026 to_lsn = 4105244515 last_lsn = 4105244524 compact = 0 recover_binlog_info = 0 也可使用參數--incremental-lsn進行增量備份,如 innobackupex --defaults-file=/etc/my3306.cnf --incremental -ubackup -pmysql /data/backup/incre --incremental-lsn=4105235515 innobackupex --defaults-file=/etc/my3306.cnf --incremental -ubackup -pmysql /data/backup/incre --incremental-lsn=4105244515

4prepare 增量備份 #prepare base備份 innobackupex --apply-log --redo-only /data/backup/base/2018-09-13_10-51-46/ #日誌顯示 InnoDB: Shutdown completed; log sequence number 4105235533 InnoDB: Number of pools: 1 180913 11:14:03 completed OK! #prepare 增量備份1 innobackupex --apply-log --redo-only /data/backup/base/2018-09-13_10-51-46 --incremental-dir=/data/backup/incre/2018-09-13_10-58-04 #prepare 增量備份2 innobackupex --apply-log /data/backup/base/2018-09-13_10-51-46 --incremental-dir=/data/backup/incre/2018-09-13_11-02-11 innobackupex --apply-log /data/backup/base/2018-09-13_10-51-46/

5) 恢復備份 innobackupex --defaults-file=/etc/my3306.cnf --copy-back /data/backup/base/2018-09-13_10-51-46/ # chown -R mysql:mysql /data/mysql/mysql3306/data
 

 

 

流式化備份

 
1) 打包備份
innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql --stream=tar ./ > /data/backup/dbbackup`date +%Y%m%d_%H%M%S`.tar

或者

xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --stream=tar --target-dir=/data/backup/ > /data/backup/db.tar


#解壓到指定目錄
mkdir db20180913_141603
tar -xvf db20180913_141603.tar -C ./db20180913_141603

peapare備份
innobackupex --apply-log /data/backup/db20180913_141603


2) 帶壓縮的打包備份 innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql --stream=tar ./ |gzip - > /data/backup/dbbackup`date +%Y%m%d_%H%M%S`.tar.gz 或者 xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --stream=tar --target-dir=/data/backup/ |gzip - > /data/backup/db.tar.gz # mkdir dbbackup20180913_150942 # tar -xvzf dbbackup20180913_150942.tar.gz -C ./dbbackup20180913_150942 peapare備份 innobackupex --apply-log /data/backup/dbbackup20180913_150942

3) 基於SSH遠程 innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql --stream=tar ./ |ssh root@mysqldb2 "cat - > /data/backup/dbback`date +%Y%m%d_%H%M%S`.tar" 或者 xtrabackup --backup -S /tmp/mysql3306.sock -ubackup -pmysql --stream=tar |ssh root@mysqldb2 "cat - > /data/backup/db.tar"
 

 

 

備份指定數據庫

 
#備份指定數據庫 用--database參數,以下:備份employees 與sbtest數據庫
innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql --database='employees sbtest' /data/backup

#prepare備份
innobackupex --apply-log /data/backup/2018-09-13_16-13-47/


#恢復備份
copy,由於是部分備份,不能直接用--copy-back,只能手動來複制須要的庫,也要複製ibdata(數據字典)

cp -r sbtest /data/mysql/mysql3306/data/
cp -r employees /data/mysql/mysql3306/data/
cp ibdata* /data/mysql/mysql3306/data/
chown -R mysql:mysql /data/mysql/mysql3306/data

備份指定表,如備份employees.dept與sbtest.sbtest1表:
innobackupex --defaults-file=/etc/my3306.cnf -ubackup -pmysql --database='employees.dept sbtest.sbtest1' /data/backup
相關文章
相關標籤/搜索