天天看点

MySQL备份与还原一 理解MySQL备份与恢复二 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* [email protected]:/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做增量备份;    

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 [email protected]:/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