mysql —備份和恢復

備份的目的

   災難恢復、硬件故障、軟件故障、天然災害、黑客攻擊、誤操做測試等數據 丟失場景 html

備份注意要點

  能容忍最多丟失多少數據 mysql

  恢復數據須要在多長時間內完成 sql

  須要恢復哪些數據數據庫

還原要點

  作還原測試,用於測試備份的可用性 vim

  還原演練緩存

備份類型:

徹底備份,部分備份

  徹底備份:整個數據集服務器

  部分備份:只備份數據子集,如部分庫或表併發

徹底備份、增量備份、差別備份

  增量備份:僅備份最近一次徹底備份或增量備份(若是存在增量)以來變化 的數據,備份較快,還原複雜app

  差別備份:僅備份最近一次徹底備份以來變化的數據,備份較慢,還原簡單 函數

注意:二進制日誌文件不該該與數據文件放在同一磁盤

冷、溫、熱備份

冷備:讀寫操做均不可進行

溫備:讀操做可執行;但寫操做不可執行

熱備:讀寫操做都可執行

   MyISAM:溫備,不支持熱備

   InnoDB: 都支持

物理和邏輯備份

物理備份:直接複製數據文件進行備份,與存儲引擎有關,佔用較多的空間, 速度快 

邏輯備份:從數據庫中「導出」數據另存而進行的備份,與存儲引擎無關, 佔用空間少,速度慢,可能丟失精度。

備份時須要考慮的因素

溫備的持鎖多久

備份產生的負載

備份過程的時長

恢復過程的時長

備份什麼

數據

二進制日誌、InnoDB的事務日誌

程序代碼(存儲過程、存儲函數、觸發器、事件調度器)

服務器的配置文件

備份的目標

一、數據庫數據,每一個表空間單獨存放

二、二進制日誌,須要和數據分開存儲

三、InnoDB的事務日誌

四、存儲過程、存儲函數、觸發器或事件調度器等

五、服務器的配置文件:/etc/my.cnf

備份工具

  • mysqlbackup工具:熱備份,MySQL Enterprise Edition組件
  • mysqlhotcopy工具:幾乎冷備,僅適用於MyISAM存儲引擎
  • 基於lvm快照備份:幾乎熱備,須要在拍快照前鎖表
  • tar + cp 等歸檔複製工具有份:徹底冷備

mysqldump工具:邏輯備份工具,適用全部存儲引擎溫備;支持徹底或部分備份;對InnoDB存儲引擎支持熱備;Schema(數據庫的定義)和數據存儲在一塊兒。

mysqldump參考:
https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
語法: 
 mysqldump [OPTIONS] database [tables] 
 mysqldump [OPTIONS] –B DB1 [DB2 DB3...]
 mysqldump [OPTIONS] –A [OPTIONS]
選項:
    -A:備份全部庫
    -B db_name1,[db_name2,...]:備份指定庫
    -E:備份相關的全部event scheduler
    -R:備份全部存儲過程和存儲函數
    --triggers:備份表相關觸發器,默認啓用,用--skip-triggers,不備份觸發器
    --master-data={1|2}:
         1:所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定默認爲1
         2:記錄爲註釋的CHANGE MASTER TO語句,注意:此選項會自動關閉--lock-tables功能,自動打開--lock-all-tables功能(除非開啓--single-transaction)
    -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會致使刷新屢次數據庫,在同一時刻執行轉儲和日誌刷新,
則應同時使用--flush-logs和-x,--master-data或-single-transaction,此時只刷新一次;建議:和-x,--master-data或 --single-transaction一塊兒使用 --compact 去掉註釋,適合調試,生產不使用 -d:只備份表結構 -t:只備份數據,不備份create table -n:不備份create database,可被-A或-B覆蓋 --flush-privileges:備份前刷新受權表,備份mysql庫或相關時須要使用 -f:忽略SQL錯誤,繼續執行 --hex-blob:使用十六進制符號轉儲二進制列(例如,「abc」變爲0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT -q:不緩存查詢,直接輸出,加快備份速度

MyISAM備份選項:支持溫備;不支持熱備,因此必須先鎖定要備份的庫,然後啓動備份操做
-x,--lock-all-tables:加全局讀鎖,鎖定全部庫的全部表,同時加--single-transaction--lock-tables選項會關閉此選項功能,注意:數據量大時,可能會致使長時間沒法併發訪問數據庫
-l,--lock-tables:對於須要備份的每一個數據庫,在啓動備份以前分別鎖定其全部表,默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會形成數據不一致

InnoDB備份選項:支持熱備,可用溫備但不建議用
--single-transaction:此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執
START TRANSACTION指令開啓事務此選項經過在單個事務中轉儲全部表來建立一致的快照。僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB能夠); 轉儲不保證與其餘存儲引擎保持一致。

​ 在進行單事務轉儲時,要確保有效的轉儲文件(正確的表內容和二進制日誌位置),須要保證沒有其餘鏈接使用如下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE

​ 此選項和 --lock-tables(此選項隱含提交掛起的事務)選項是相互排斥備份大型表時,建議將--single-transaction選項和--quick結合一塊兒使用

InnoDB建議備份策略:
    mysqldump –uroot –A –F –E –R  --single-transaction --master-data=1 --flush-privileges  --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

MyISAM建議備份策略:
    mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges  --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

xtrabackup工具由Percona提供支持對InnoDB作熱備(物理備份)的工具,支持徹底備份、增量備份

由Percona公司提供的mysql數據庫備份工具,開源的可以對innodb和xtradb數據庫進行熱備的工具

xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表;

innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上作了一層封裝實現的;

雖然目前通常不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,所以備份基本都經過 innobackupex 命令進行;

xtrabackup版本升級到2.4後,相比以前的2.1有了比較大的變化:innobackupex 功能所有集成到 xtrabackup 裏面,只有一個 binary程序,另外爲了兼容考慮,innobackupex做爲 xtrabackup 的軟連接,即xtrabackup如今支持非Innodb表備份,而且Innobackupex在下一版本中移除,建議經過xtrabackup替換innobackupex。

參考手冊:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。
這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件:
1)xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。
LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的;
2)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置; 3)xtrabackup_info:innobackupex工具執行時的相關信息; 4)backup-my.cnf:備份命令用到的配置選項信息; 5)xtrabackup_logfile:備份生成的日誌文件。
用法:
    innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
選項:
    --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 --apply-log:通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。
所以,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態
--use-memory:該選項表示和--apply-log選項一塊兒使用,prepare 備份的時候,xtrabackup作crash recovery分配的內存大小,單位字節。也可(1MB,1M,1G,1GB),推薦1G --export:表示開啓可導出單獨的表以後再導入其餘Mysql中 --redo-only:此選項在prepare base full backup,往其中merge增量備份時候使用 --copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir --move-back:這個選項與--copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。
使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本

注意:

1)datadir目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,不然--copy-backup選項不會覆蓋;

2)在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中;

3)因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,chown -R mysql:mysql /data/mysqldb

備份方案

cp + tar == 物理冷備

將數據目錄打包壓縮備份,須要停服務,不推薦

​ 1)備份:

~]# mkdir /backup
~]# systemctl stop mariadb #中止服務
~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #打包壓縮
backup]# systemctl start mariadb

​ 2)還原:

~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf  #將損壞的庫刪除
~]# cd /backup/
backup]# tar xf mariadb_all.tar.xz  #解壓打包的數據庫文件
backup]# cp -av var/lib/mysql/ /var/lib/ #還原
backup]# systemctl start mariadb #啓動服務,恢復成功

lvm快照 + binlog == 幾乎物理熱備 + 增量備份

​ 1)備份:須要將數據庫目錄存放到lvm邏輯捲上

準備lvm環境:
~]# pvcreate /dev/sda5
~]# vgcreate vg0 /dev/sda5
~]# lvcreate -n lv_data -L 10G vg0
~]# lvcreate -n lv_binlog -L 10G vg0
~]# mkfs.xfs /dev/vg0/lv_data
~]# mkfs.xfs /dev/vg0/lv_binlog
~]# mkdir -pv /data/{mysqldb,binlog}  #建立數據目錄和二進制日誌存放目錄
~]# chown -R mysql:mysql /data/
~]# vim /etc/fstab
    UUID=4e3d726a-d420-4c1e-812b-da315012ba86 /data/mysqldb xfs defaults 0 0
    UUID=6dd98866-769f-4369-8738-291fbcc94ca1 /data/binlog xfs defaults 0 0 
mysql < hellodb_innodb.sql #hellodb_innodb.sql導入數據庫,破壞students表
配置數據庫
~]# yum install mariadb-server -y
~]# vim /etc/my.cnf
    [mysqld]
    datadir = /data/mysqldb  #指定數據庫存放路徑
    log_bin = /data/binlog/mariadb-bin  #開啓二進制日誌記錄,而且存放到指定路徑
    innodb_file_per_table = ON  #開啓每一個表單獨的表空間
~]# systemctl start mariadb
~]# mysql  #鏈接數據庫,這裏省略了用戶名和密碼,如下都是如此
開始備份:
MariaDB [hellodb]> FLUSH TABLES WITH READ LOCK;  #備份前切記鎖表,防止用戶繼續寫入
MariaDB [hellodb]> FLUSH LOGS;  #滾動一下二進制日誌
MariaDB [hellodb]> SHOW MASTER LOGS;  #查看二進制日誌的位置
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |     30334 |
| mariadb-bin.000002 |   1038814 |
| mariadb-bin.000003 |  29178309 |
| mariadb-bin.000004 |       528 |
| mariadb-bin.000005 |       245 |  #將此出記錄下來,咱們後邊須要用到
+--------------------+-----------+
~]# lvcreate -L 5G -n lv_mysql_snap -s -p r /dev/vg0/lv_data  #須要再開一個終端建立快照,不要退出mysql終端
MariaDB [hellodb]> UNLOCK TABLES;  #建立快照後第一時間解鎖,當心用戶投訴
~]# mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt/  #將快照掛載到/mnt
~]# cp -av /mnt/ /backup  #拷貝數據到備份目錄
~]# umount /mnt/
~]# lvremove /dev/vg0/lv_mysql_snap  #拷貝完成後即時刪除快照,影響服務器性能,到此徹底備份完成~

 2)還原:

模擬數據庫損壞:
~]# rm -rf /data/mysqldb/*  #服務器崩潰,直接清空庫
~]# systemctl stop mariadb  #停服務
開始還原:
~]# cp -av /backup/* /data/mysqldb/  #將備份的文件cp到對應的庫目錄下
在/etc/my.cnf的[mysqld]下加上skip_networking,禁止用戶使用數據庫,防止恢復過程當中的數據寫入
~]# systemctl start mariadb  #啓動服務
~]# ls -1 /data/binlog/  #查看二進制日記的文件個數
    mariadb-bin.000001
    mariadb-bin.000002
    mariadb-bin.000003
    mariadb-bin.000004
    mariadb-bin.000005
    mariadb-bin.000006
    mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000005 > binlog.sql  #到出徹底備份時間點之後的數據
~]# mysqlbinlog /data/binlog/mariadb-bin.000006 >> binlog.sql  #將以後的全部數據都追加到同一sql文件中
~]# mysql < binlog.sql  #利用二進制日誌從咱們以前徹底備份的點開始增量還原

MariaDB [(none)]> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |#已恢復
| teachers |
| toc |
+-------------------+
7 rows in set (0.00 sec)

到/etc/my.cnf的[mysqld]下刪除skip_networking,重啓服務,到此還原完成~

mysqldump + InnoDB + binlog= 徹底邏輯熱備 + 增量備份

​ 1)備份

~]# mysqldump -A -F -E -R --single-transaction --master-data=2 --flush-privileges  > /backup/full-`date +%F-%T`.sql  #全庫徹底備份

​ 2)模擬故障:

MariaDB [(none)]>MariaDB [  CREATE DATABASE db1;  #建立一個庫
MariaDB [(none)]> CREATE DATABASE db2;  #再建立一個庫
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.00 sec)
MariaDB [none]> use  hellodb;
MariaDB [hellodb]> DROP TABLE students;  #誤操做,將students表刪除
 Query OK, 0 rows affected (0.01 sec)

 MariaDB [hellodb]> show tables; #students表已不在
 +-------------------+
 | Tables_in_hellodb |
  +-------------------+
 | classes |
 | coc |
 | courses |
 | scores |
 | teachers |
 | toc |
 +-------------------+
 6 rows in set (0.00 sec)

MariaDB [hellodb]> CREATE TABLE students (id INT(4) AUTO_INCREMENT PRIMARY KEY,name CHAR(30),age TINYINT);  #後續又有用戶建立了其餘的表
MariaDB [hellodb]> INSERT INTO students(name,age) VALUES ('user1',20);  #而且還加入了數據
 MariaDB [hellodb]> select * from students; #查看後續用戶建立的表裏的內容
 +----+-------+------+
 | id | name | age |
 +----+-------+------+
 | 1 | user1 | 20 |
 +----+-------+------+
 1 row in set (0.00 sec)

 3)還原:

此時,咱們發現了有一個表不見了,須要緊急恢復,開始吧
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;  #鎖表
MariaDB [(none)]> FLUSH LOGS;  #刷新滾動一次二進制日誌文件
MariaDB [(none)]> SHOW MASTER LOGS;  #查看當前的日誌狀態
 MariaDB [hellodb]> show master logs;
 +-------------------+-----------+
 | Log_name | File_size |
 +-------------------+-----------+
 | maridb-bin.000001 | 30370 |
 | maridb-bin.000002 | 1038814 |
 | maridb-bin.000003 | 7699 |
 | maridb-bin.000004 | 264 |
 | maridb-bin.000005 | 289 |
 | maridb-bin.000006 | 567 |
 | maridb-bin.000007 | 264 |
 | maridb-bin.000008 | 30370 |
 | maridb-bin.000009 | 1038814 |
 | maridb-bin.000010 | 522115 |
 | maridb-bin.000011 | 264 |
 | maridb-bin.000012 | 245 |
 | maridb-bin.000013 | 289 |
 | maridb-bin.000014 | 796 |
 | maridb-bin.000015 | 245 |
 +-------------------+-----------+
 15 rows in set (0.00 sec)

~]# systemctl stop mariadb #中止服務,準備修復

~]# head -30 /backup/full-2018-06-16-13\:05\:17.sql |grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='maridb-bin.000014', MASTER_LOG_POS=245;#找到徹底備份的日誌點,在mariadb-bin.000014的245

~]# ls -l /data/binlog/
total 2656
-rw-rw---- 1 mysql mysql 30370 Jun 15 03:54 maridb-bin.000001
-rw-rw---- 1 mysql mysql 1038814 Jun 15 03:54 maridb-bin.000002
-rw-rw---- 1 mysql mysql 7699 Jun 15 03:56 maridb-bin.000003
-rw-rw---- 1 mysql mysql 264 Jun 15 04:01 maridb-bin.000004
-rw-rw---- 1 mysql mysql 289 Jun 15 04:07 maridb-bin.000005
-rw-rw---- 1 mysql mysql 567 Jun 15 04:10 maridb-bin.000006
-rw-rw---- 1 mysql mysql 264 Jun 15 04:10 maridb-bin.000007
-rw-rw---- 1 mysql mysql 30370 Jun 15 04:12 maridb-bin.000008
-rw-rw---- 1 mysql mysql 1038814 Jun 15 04:12 maridb-bin.000009
-rw-rw---- 1 mysql mysql 522115 Jun 15 04:15 maridb-bin.000010
-rw-rw---- 1 mysql mysql 264 Jun 15 04:16 maridb-bin.000011
-rw-rw---- 1 mysql mysql 245 Jun 15 04:19 maridb-bin.000012
-rw-rw---- 1 mysql mysql 289 Jun 16 13:05 maridb-bin.000013
-rw-rw---- 1 mysql mysql 796 Jun 16 13:20 maridb-bin.000014
-rw-rw---- 1 mysql mysql 264 Jun 16 13:24 maridb-bin.000015
-rw-rw---- 1 mysql mysql 465 Jun 16 13:20 maridb-bin.index

~]#  mysqlbinlog --start-position=245 /data/binlog/maridb-bin.000014 > /backup/binlog.sq1 #將徹底備份以後的二進制日誌導出來

mysqlbinlog /data/binlog/maridb-bin.000015 >> /backup/binlog.sql #導入徹底備份後的二進制日誌,自動執行增量備份的二進制日誌

~]# vim /backup/binlog.sql #修改導出的sql文件,把誤操做的SQL語句刪除

刪除"DROP TABLE `testtb` /* generated by server */"這行

導入備份: ~]# rm -rf /data/mysqldb/* #先清空故障庫

~]# vim /etc/my.cnf #編輯配置文件 在[mysqld]加入skip_networking,防止用戶寫入數據

~]# systemctl start mariadb #啓動服務

~]# mysql < /backup/full-2018-06-16-13\:05\:17.sql

~]# mysql < /backup/binlog.sq1

MariaDB [hellodb]> show databases; #查看一下咱們的數據是否成功恢復
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 4
Current database: hellodb

+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 | #已恢復
| db2 | #已恢復
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.00 sec)

MariaDB [hellodb]> use hellodb
Database changed
MariaDB [hellodb]> select * from students; #原先hellodb表中的students表已恢復
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
| 1 | Shi Zhongyu | 22 | M | 2 | 3 |
| 2 | Shi Potian | 22 | M | 1 | 7 |
| 3 | Xie Yanke | 53 | M | 2 | 16 |
| 4 | Ding Dian | 32 | M | 4 | 4 |
| 5 | Yu Yutong | 26 | M | 3 | 1 |
| 6 | Shi Qing | 46 | M | 5 | NULL |
| 7 | Xi Ren | 19 | F | 3 | NULL |
| 8 | Lin Daiyu | 17 | F | 7 | NULL |
| 9 | Ren Yingying | 20 | F | 6 | NULL |
| 10 | Yue Lingshan | 19 | F | 3 | NULL |
| 11 | Yuan Chengzhi | 23 | M | 6 | NULL |
| 12 | Wen Qingqing | 19 | F | 1 | NULL |
| 13 | Tian Boguang | 33 | M | 2 | NULL |
| 14 | Lu Wushuang | 17 | F | 3 | NULL |
| 15 | Duan Yu | 19 | M | 4 | NULL |
| 16 | Xu Zhu | 21 | M | 1 | NULL |
| 17 | Lin Chong | 25 | M | 4 | NULL |
| 18 | Hua Rong | 23 | M | 7 | NULL |
| 19 | Xue Baochai | 18 | F | 6 | NULL |
| 20 | Diao Chan | 19 | F | 7 | NULL |
| 21 | Huang Yueying | 22 | F | 6 | NULL |
| 22 | Xiao Qiao | 20 | F | 1 | NULL |
| 23 | Ma Chao | 23 | M | 4 | NULL |
| 24 | Xu Xian | 27 | M | NULL | NULL |
| 25 | Sun Dasheng | 100 | M | NULL | NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)

 到如今爲止,已經完成恢復,把配置文件中的skip_networking刪除,重啓服務,就ok!

Xtrabackup + InnoDB == 徹底熱備+ 增量備份

​ 1)徹底備份

~]# innobackupex --user=root /backup/  #這裏省略了密碼

​ 2)增刪數據

MariaDB [hellodb]>  INSERT INTO students(stuid,name,age,gender,classid) VALUES (26,'bai',27,'F',3);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
|    26 | bai           |  27 | F      |       3 |      NULL |#此行爲新增的
+-------+---------------+-----+--------+---------+-----------+
26 rows in set (0.00 sec)

3)增量備份

~]# mkdir /backup/inc{1,2}  #建立增量備份的目錄
~]# innobackupex --incremental /backup/inc1/ --incremental-basedir=/backup2018-06-16_14-06-02/ #指定在徹底備份的基礎上增量備份

​ 4)增刪數據

MariaDB [(none)]> CREATE DATABASE db3; 
MariaDB [(none)]> DROP TABLE school.students;  #誤操做刪除了表 MariaDB [(none)]> use hellodb
MariaDB [hellodb]>  INSERT INTO teachers(tid,name,age,gender) VALUES (5,'yuan',27,'F');#後續又有人修改
Query OK, 1 row affected (0.01 sec)

MariaDB [hellodb]> 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 | yuan          |  27 | F      |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)MariaDB [hellodb]> SELECT * FROM students; #到此出發現students表不見了,怎麼辦? 

ERROR 1146 (42S02): Table 'school.students' doesn't exist

5)故障出現

~]# rm -rf /data/mysqldb/*  #還原前清空數據目錄
MariaDB [(none)]> show databases;  #此時數據庫已經沒了
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

​ 6)緊急還原

恢復徹底備份和增量備份:
~]# systemctl stop mariadb  #中止服務
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/  #整理徹底備份的數據,由於須要保留沒有作完的事務日誌因此必定要記得加"--redo-only"選項
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/ --incremental-dir=/backup/inc1/2018-06-14_10-52-05/  #在徹底備份的基礎上將增量備份導入到一塊,這裏是最新的增量備份,"--redo-only"選項能夠不加,加上也能夠,爲了誤操做我就都加了
~]# ls /data/mysqldb/  #確認一下數據庫目錄是否爲空
~]# innobackupex --copy-back /backup/2018-06-14_10-44-57/  #導入備份數據
~]# chown -R mysql:mysql /data/mysqldb/  #記得修改數據的所屬組和所屬者
~]# vim my.cnf 加入skip_networking,防止此時用戶操做數據
~]# systemctl start mariadb  #啓動服務,此時已經恢復到了最新的備份時的狀態了
依靠二進制日誌,恢復最新增量備份到now的數據:
~]# cat /backup/2018-06-14_10-44-57/xtrabackup_binlog_info  #查看一下備份時的二進制日誌記錄點
    mariadb-bin.000011      35740416
~]# ls -1 /data/binlog/  #看看咱們的二進制日誌文件記錄到哪裏了
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.000009
mariadb-bin.000010
mariadb-bin.000011
mariadb-bin.000012
mariadb-bin.000013
mariadb-bin.index
~]# mysqlbinlog --start-position=35740416 /data/binlog/mariadb-bin.000011 > /backup/binlog.sql  #將最新增量備份以後的二進制日誌記錄的數據導出來
~]# mysqlbinlog /data/binlog/mariadb-bin.000012 >> /backup/binlog.sql
~]# mysqlbinlog /data/binlog/mariadb-bin.000013 >> /backup/binlog.sql
編輯 /backup/binlog.sql 文件,將 "DROP TABLE `school`.`students` /* generated by server */" 刪除,撤銷誤刪除操做
MariaDB [(none)]> SET sql_log_bin=0;  #先臨時關閉二進制日記記錄功能
MariaDB [(none)]> source /backup/binlog.sql  #導入增量備份以後的最新數據
查看確認一下數據有沒有恢復完整,把my.cnf中的skip_networking刪除,重啓服務
到此ok!

使用Xtrabackup實現單表備份

​ 1)備份單表

~]# innobackupex --include="testdb.testlog" /backup  #備份表數據
~]# mysql -e 'SHOW CREATE TABLE testdb.testlog' > /backup/desc_testdb_testlog.sql  #備份表空間
~]# mysql -e 'DROP TABLE testdb.testlog'  #模擬故障,刪除testlog表

​ 2)還原單表

~]# innobackupex --apply-log --export /backup/2018-06-14_17-47-02/  #整理表數據
~]# vim /backup/desc_testdb_testlog.sql  #編輯建立表空間的語句,刪除如下字段
    Table   Create Table
    testlog
~]# mysql testdb < /backup/desc_testdb_testlog.sql  #導入表空間
~]# mysql testdb -e 'DESC testlog'  #查看是否導入成功
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(30) | YES  |     | NULL    |                |
| age   | int(11)  | YES  |     | 20      |                |
+-------+----------+------+-----+---------+----------------+
~]# mysql -e 'ALTER TABLE testdb.testlog DISCARD TABLESPACE'  #清除表空間
~]# cd /backup/2018-06-14_17-47-02/testdb/
testdb]# cp testlog.cfg testlog.exp testlog.ibd /var/lib/mysql/testdb/  #將表數據複製到庫目錄
~]# chown -R mysql:mysql /var/lib/mysql/testdb/  #修改所屬者和所屬組
~]# mysql -e 'ALTER TABLE testdb.testlog IMPORT TABLESPACE'  #導入表空間
相關文章
相關標籤/搜索