1. 程式人生 > >MySQL備份與還原

MySQL備份與還原

事務 總結 自然 rop systemctl 操作 示例 校驗 perl

一 理解MySQL備份與恢復

備份:存儲的數據副本;原始數據,持續改變。

恢復:把副本應用到線上系統;僅能恢復至備份操作時刻的數據狀態。

時間點恢復:binary logs。

為什麽備份?
1.災難恢復:硬件故障(冗余)、軟件故障(bug)、自然災害、黑客攻擊、誤操作、...
2.用於測試。

備份時應該註意事項:
1.能容忍最多丟失多少數據;
2.恢復數據需要在多長時間內完成;
3.需要恢復哪些數據;
4.做恢復演練:
測試備份的可用性;
增強恢復操作效率;
...

備份類型:
1.備份的數據的集範圍:
完全備份和部分備份
完全備份:整個數據集;
部分備份:數據集的一部分,比如部分表;
2.完全備份、增量備份、差異備份:
完全備份
增量備份:僅備份自上一次完全備份或 增量備份以來變量的那部數據;
差異備份:僅備份自上一次完全備份以來變量的那部數據;
3.物理備份、邏輯備份:
物理備份:復制數據文件進行備份;
邏輯備份:從數據庫導出數據另存在一個或多個文件中;
4.根據數據服務是否在線:
熱備:讀寫操作均可進行的狀態下所做的備份;
溫備:可讀但不可寫狀態下進行的備份;
冷備:讀寫操作均不可進行的狀態下所做的備份。

備份需要考慮因素:
1.鎖定資源多長時間?
2.備份過程的時長?
3.備份時的服務器負載?
4.恢復過程的時長?

備份策略:
1.全量+差異
2.全量+增量
3.備份手段:物理、邏輯

備份什麽?
數據、二進制日誌、InnoDB的事務日誌、代碼(存儲過程、存儲函數、觸發器、事件調度器)、服務器的配置文件。

備份工具:
1.mysqldump:mysql服務自帶的備份工具;邏輯備份工具:
完全、部分備份;
InnoDB:熱備;
MyISAM:溫備。
2.xtrabackup:
由Percona提供,開源工具,支持對InnoDB做熱備,物理備份工具:
全量備份、部分備份;
全量備份、增量備份;
全量備份、差異備份;

備份策略:
1.完全+差異+binlog
2.完全+增量+binlog
3.備份,多久一次?
數據變化量
可用的備份存儲空間

二 MySQL備份與恢復工具介紹

1.mysqldump:
邏輯備份、完全備份、部分備份;
二次封裝工具:
mydumper(perl腳本)
phpMyAdmin
msyqldump Usage:

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


選項:
MyISAM存儲引擎:支持溫備,備份時要鎖定表:

-x, --lock-all-tables          #鎖定所有庫的所有表,讀鎖
-l, --lock-tables           #鎖定指定庫所有表


InnoDB存儲引擎:支持溫備和熱備:

--single-transaction          #創建一個事務,基於此快照執行備份;


其它選項:

-R, --routines            #存儲過程和存儲函數;
--triggers             #備份觸發器
-E, --events            #備份調度器
--master-data[=#]
  1:記錄為CHANGE MASTER TO語句,此語句不被註釋
  2:記錄為CHANGE MASTER TO語句,此語句被註釋
--flush-logs            #鎖定表完成後,即進行日誌刷新操作


示例:

[[email protected] ~]# mysqldump -hlocalhost -uroot --databases hellodb > /tmp/hellodb-$(date +%F).sql
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 |
+-------+---------------+-----+--------+---------+-----------+
MariaDB [hellodb]> DELETE FROM students WHERE StuID=14;
MariaDB [hellodb]> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       489 |
+------------------+-----------+
MariaDB [hellodb]> exit
[[email protected] ~]# mysqldump -hlocalhost -uroot --master-data=1 --databases hellodb > /tmp/hellodb-$(date +%F).sql
CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001‘, MASTER_LOG_POS=489;   (此行未被註釋)
[[email protected] ~]# mysqldump -hlocalhost -uroot --master-data=2 --databases hellodb > /tmp/hellodb-$(date +%F).sql
-- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001‘, MASTER_LOG_POS=489;  (此行被註釋)
[[email protected] ~]# mysqldump -hlocalhost -uroot --master-data=2 --flush-logs --single-transaction --databases hellodb > /tmp/hellodb-$(date +%F).sql
MariaDB [(none)]> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       532 |
| mysql-bin.000002 |       245 |
+------------------+-----------+
MariaDB [hellodb]> DELETE FROM students WHERE StuID=10;
MariaDB [hellodb]> DROP DATABASE hellodb;
MariaDB [(none)]> exit;
[[email protected] mysql]# mysqlbinlog -j 245 mysql-bin.000002 > /tmp/hellodb.binlog.sql
備份到另一主機:
[[email protected] mysql]# scp /tmp/hellodb* [email protected]:/tmp/
[[email protected] ~]# mysql < /tmp/hellodb-2017-06-03.sql
[[email protected] ~]# mysql
MariaDB [(none)]> use hellodb;
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 |
+-------+---------------+-----+--------+---------+-----------+
MariaDB [hellodb]> exit
[[email protected] ~]# mysql < /tmp/hellodb.binlog.sql 
[[email protected] ~]# mysql
MariaDB [(none)]> use hellodb;
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 |
|    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 |
+-------+---------------+-----+--------+---------+-----------+

實現了時間點還原,刪除的第10行沒被還原
註意:
(1) 腳本化、周期性進行(進行充分測試);
(2) 備份結果要另存,建議異地存儲;對備份的結果做測試;
(3) 配置mysqldump使用binlog做增量備份;

2.xtrabackup:
MyISAM:溫備,不支持增量備份;
InnoDB:熱備,增量;
物理備份,速率快、可靠;備份完成後自動校驗備份結果集是否可用;還原速度快;

Usage: [innobackupex [--defaults-file=#] --backup | innobackupex [--defaults-file=#] --prepare] [OPTIONS]
The  innobackupex tool is a Perl script that acts as a wrapper for the xtrabackup C program.


備份 --> 應用日誌 --> 還原
完全備份:
完全+binlog(總結):
備份:innobackupex --user --password= --host= /PATH/TO/BACKUP_DIR
準備:innobackupex --apply-log /PATH/TO/BACKUP_DIR
恢復:innobackupex --copy-back
註意:--copy-back需要在mysqld主機本地進行,mysqld服務不能啟動;
innodb_log_file_size可能要重新設定;
總結:完全+增量+binlog
備份:完全+增量+增量+...
完全+差異
準備:

innobackupex --apply-log --redo-only BASEDIR 
innobackupex --apply-log --redo-only BASEDIR  --incremental-dir=INCREMENTAL-DIR


恢復:
innobackupex --copy-back BASEDIR
備份單庫:
--databases
總結:
mysqldump+binlog
lvm2+cp/tar+binlog
xtrabackup(innodb)+binlog
示例:
備份:

MariaDB [hellodb]> GRANT ALL ON *.* TO [email protected]%‘ IDENTIFIED BY ‘bpass‘;
MariaDB [hellodb]> FLUSH PRIVILEGES;
[[email protected] ~]# mkdir /mydata/backup -pv
[[email protected] ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass --databases=hellodb /mydata/backup/
 備份hellodb庫
[[email protected] ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass /mydata/backup/
 備份全部


恢復:

[[email protected] ~]# rm /var/lib/mysql/* -rf
[[email protected] backup]# scp -rp 2017-06-04_14-09-37 [email protected]:/tmp/
[[email protected] ~]# systemctl stop mariadb
[[email protected] ~]# innobackupex --user=root --host=localhost --copy-back /tmp/2017-06-04_14-09-37/
[[email protected] ~]# chown -R mysql.mysql /var/lib/mysql/
[[email protected] ~]# systemctl start mariadb

MySQL備份與還原