MySQL备份的三种方法

MySQL备份的主要作用是当出现硬件故障、软件故障、自然灾害、黑客攻击、人为误操作时能快速、高效、安全的解决问题,以免造成不必要的损失
MySQL备份时需要备份什么?
  1、需要用到的数据
  2、二进制日志、InnoDB事务日志
  3、存储代码;例如:存储过程、存储函数、触发器、时间调度器
  4、服务器的配置文件

MySQL备份时需要注意的要点:
  1、能容忍最多丢失多少数据
  2、恢复数据需要在多长时间内完成
  3、需要恢复那些数据
  4、做好备份之后,必须要做还原测试,用于测试备份的可用性

MySQL备份时需要考虑的因素
  1、持锁需要多长时间
  2、备份的过程时长
  3、在备份时,是否会增加系统业务的负载
  4、恢复过程的时长


MySQL备份的类型;
  以数据集角度来划分:

    完全备份:备份整个数据集
    部分备份:只备份数据子集
  以时间轴角度来划分:
    完全备份:备份整个数据集
    增量备份:备份最近一次完全备份或增量备份之后变化的数据
    差异备份:备份最近一次完全备份之后变化的数据
    注意:虽然增量备份比差异备份更节约磁盘空间,但是还原数据起来增量备份却比差异备份更麻烦

  根据服务器业务系统能否在线来划分:
    热备份:读写操作均可执行
    温备份:读操作可执行,但写操作不可执行
    冷备份:读写操作均不可执行
    注意:InnoDB存储引擎即支持热备份,也支持温备份;而MyISAM存储引擎只支持温备份,不支持热备份
  物理备份:直接复制数据文件进行备份
  逻辑备份:从数据库中导出数据从而进行备份;逻辑备份与存储引擎无关,如果备份的是InnoDB存储引擎,用在MyISAM存储引擎上也是可以的

MySQL备份的方式:
  1、mysqldump+复制binlog来实现:使用mysqldump来实现数据的完全备份,复制binlog中指定时间范围内的event来实现增量备份
  2、lvm2+复制binlog:利用lvm2快照以及使用cp等命令工具来实现物理备份、完全备份,复制binlog中指点事件范围内的event来实现增量备份
  3、xtrabackup:由Percona提供的备份工具;对InnoDB支持热备、完全备份和增量备份,MySIAM支持温备、完全备份

一、基于mysqldump+复制binlog来实现备份
准备环境:

节点1IP:172.18.42.100
节点2IP:172.18.42.111

1、部署节点1
(1)安装mysql服务,编辑其二进制文件并进行完全备份
[root@localhost ~]# yum install mysql-server -y  ##安装Mysql服务
[root@localhost ~]# vim /etc/my.cnf  ##编辑其配置文件
[mysqld]
innodb_file_per_table = ON
log_bin=mysql-bin  ##启用二进制文件
[root@localhost ~]# mysqldump -uroot --lock-tables --master-data=2 --databases Mydata > db1.sql  ##在未修改数据库之前做一次完全备份
## --lock-tables:锁定指定的数据库,建议在备份单个数据库是使用
## --lock-all-tables:锁定所有的数据库,建议在备份多个数据库时使用
## --master-data=1 | 2
  #1:记录为change master to语句,此语句不会被注释
  #2:记录为change master to语句,此语句会被注释 
## --databases:指定需要备份的数据库,当有多个数据库时中间可用空格隔开
[root@localhost ~]# less db1.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1106;  ##记录当前备份时的二进制日志,以及事件在二进制日志中所在位置

(2)修改数据库中的数据,并使用“mysqlbinlog”生成增量备份
mysql> select * from db1;  ##未修改数据之前查看一次数据
+----+------------+------+
| ID | Name    Age 
+----+------------+------+
|  1 | BaiGu jing  100 
|  2 | SunDa shen  200
|  3 | ZhuBa jie  150 
+----+------------+------+
mysql> insert into db1 (ID,Name,Age) values (4,'RuLai',999);
mysql> insert into db1 (ID,Name,Age) values (5,'YuDi',888);
mysql> select * from db1;  ##修改数据之后查看一次
+----+------------+------+
| ID | Name    Age 
+----+------------+------+
|  1 | BaiGu jing  100 
|  2 | SunDa shen  200 
|  3 | ZhuBa jie  150 
|  4 | RuLai    999 
|  5 | YuDi      888 
+----+------------+------+
[root@localhost ~]# mysqlbinlog -uroot --start-position=1106 /var/lib/mysql/mysql-bin.000003 > binary_log  ##生成增量备份
##--start-position:指明事件的pos
[root@localhost ~]# less binary_log  ##查看增量备份文件
insert into db1 (ID,Name,Age) values (4,'RuLai',999)  ##记录了修改表的相关操作
/*!*/;
# at 1223
#160612 21:44:35 server id 1  end_log_pos 1339  Query  thread_id=9    exec_time=0    error_code=0
SET TIMESTAMP=1465739075/*!*/;
insert into db1 (ID,Name,Age) values (5,'YuDi',888)
/*!*/;
# at 1339
#160612 21:45:41 server id 1  end_log_pos 1441  Query  thread_id=9    exec_time=0    error_code=0
SET TIMESTAMP=1465739141/*!*/;

2、部署节点2
(1)提供mysql服务,并将节点1的完全备份文件“db1.sql”和增量备份文件“binary_log”发送给节点2
[root@localhost ~]# yum install mysql-server -y
[root@localhost ~]# scp db1.sql binary_log [email protected]:/root

(2)节点2导入“db1.sql",并查看其数据
[root@localhost ~]# mysql < db1.sql 
mysql> select * from db1;
+----+------------+------+
| ID | Name    Age
+----+------------+------+
|  1 | BaiGu jing  100 
|  2 | SunDa shen  200 
|  3 | ZhuBa jie  150 
+----+------------+------+
##数据并不是我们修改之后的数据

(3)假设节点1挂掉了,需要让节点2恢复到节点1当前修改数据库时的数据,此时我们只需要节点2导入“binary_log”增量备份文件即可
[root@localhost ~]# mysql < binary_log 
mysql> select * from db1;    ##导入增量备份之后,节点2的数据和节点1修改数据库之后的数据一样
+----+------------+------+
| ID | Name    Age 
+----+------------+------+
|  1 | BaiGu jing  100 
|  2 | SunDa shen  200 
|  3 | ZhuBa jie  150 
|  4 | RuLai    999 
|  5 | YuDi    888 
+----+------------+------+

相关推荐