MySQL备份与还原

一 理解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            #锁定表完成后,即进行日志刷新操作


示例:

[root@node1 ~]# 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
[root@node1 ~]# 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;   (此行未被注释)
[root@node1 ~]# 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;  (此行被注释)
[root@node1 ~]# 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;
[root@node1 mysql]# mysqlbinlog -j 245 mysql-bin.000002 > /tmp/hellodb.binlog.sql
备份到另一主机:
[root@node1 mysql]# scp /tmp/hellodb* root@172.18.67.12:/tmp/
[root@node2 ~]# mysql < /tmp/hellodb-2017-06-03.sql
[root@node2 ~]# 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
[root@node2 ~]# mysql < /tmp/hellodb.binlog.sql 
[root@node2 ~]# 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 buser@'172.18.67.%' IDENTIFIED BY 'bpass';
MariaDB [hellodb]> FLUSH PRIVILEGES;
[root@node2 ~]# mkdir /mydata/backup -pv
[root@node2 ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass --databases=hellodb /mydata/backup/
 备份hellodb库
[root@node2 ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass /mydata/backup/
 备份全部


恢复:

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

 

posted @ 2017-06-04 15:20  SimonLiu91  阅读(253)  评论(0编辑  收藏  举报