数据备份

数据备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程。

重要性

由于对数据的威胁通常比较难于防范,毁坏数据的同时也会毁坏访问数据的系统。原因主要有平台故障,系统设计漏洞或者设计者本身预置的“黑洞”,硬件故障,人为失误,非法者的恶意破坏,系统供电故障等

计算机里面重要的数据、档案或历史纪录,不论是对企业用户还是对个人用户,都是至关重要的,一时不慎丢失,都会造成不可估量的损失。为了保障生产、销售、开发的正常运行,我们需要对数据进行备份、防范于未然。

备份方式

物理备份

  1. 热备:采用archivelog mode方式备份数据库的方法。为了保证服务不间断运行,两台机器正常运转,一台设备出现故障时,另一台设备马上开始进行服务。比如路由器的热备份协议(cisco的hsrp)
  2. 冷备:也叫cold backup,也被称为离线备份,是指在关闭数据库并且数据库不能更新的状况下进行的数据库完整备份。并可对数据进行指定恢复。例如:cp 、tar 

注意:适用于myisam 如果是innodb,必须备份整个数据库

备份操作

[root@mysql50 ~]cp -rp /var/lib/mysql    // 备份目录/文件名    
[root@mysql50 ~]tar -zcvf   xxx.tar.gz   /var/lib/mysql/*

恢复操作

[root@mysql50 ~]cp -rp 备份目录/文件名    /var/lib/mysql
[root@mysql50 ~]tar -zxvf  xxx.tar.gz  -C  /var/lib/mysql/*

缺点:跨平台性差,备份时间长,冗余备份、浪费存储空间

逻辑备份

[root@mysql50 ~]mysqldump  -uroot -p密码 库名 >  路径/xxx.sql   //备份数据

[root@mysql50 ~]mysql   -uroot  -p密码  库名  <  路径/xxx.sql   //恢复数据
 库名表示方式
 --all-databases 或 -A         所有库
 数据库名                       单个库
 数据库名     表名              单张表
 -B  数据库1 数据库2            多个库

注意事项

  •    无论备份还是恢复,都要验证用户权限
  •    恢复时,如果备份文件里没有建库的命令,需要写库名,需要建库
  •    多个库备份时,可以省去库名

缺点:

效率较低,备份和还原速度慢

备份过程中,数据插入和更新系统会被挂起

数据备份策略

  1. 完全备份    备份所有数据   缺点: 备份数据表是写锁,备份完才解锁       
  2. 增量备份    备份上次备份后,所有新产生的数据
  3. 差异备份    备份完全备份后,所有新产生的数据

binlog日志及其用途

binlog二进制日志是mysql中最重要的日志

好处

记录除查询之外的所有SQL命令

可用于数据恢复

配置mysql主从同步的必要条件

配置

vim /etc/my.cnf
[mysqld]
...
log_bin=[路径/文件名]             //启用binlog日志(可以指定文件路径)
server_id                       //指定id值(一般为0~255之间)

相关文件

主机名-bin.index                     //记录已有日志文件名

主机名-bin.000001                  //第一个二进制日志

......

手动生成新的日志的四种方式:

[root@mysql50 ~]# systemctl restart mysqld    //重启服务生成新的日志文件
[root@mysql50 ~]# mysqldump   --flush-logs    
[root@mysql50 ~]# mysql -uroot -p密码  -e  'flush logs'     
 mysql> flush  logs;

清理binlog

mysql> show master status;                   //显示当前正在使用的日志文件
mysql> purge  master logs to “日志文件名”;    //删除早于指定版本前的日志
mysql> reset master;                         //删除所有日志 重新建立新日志

分析binlog

mysql> show variables like "binlog_format";             //查看当前日志记录格式
+---------------+-------+
| Variable_name | Value |     
+---------------+-------+
| binlog_format | ROW   |                      
+---------------+-------+
//1.statement  每一条修改数据的sql命令都会记录在binlog日志中
  2.row        不记录sql语句上下文相关信息,仅保存那条记录被修改
  3.mixed      是以上两种格式的混合使用

[root@mysql50 ~]# vim /etc/my.cnf            
[mysqld]
...
binlog_format=mixed                                       //修改日志文件格式
[root@mysql50 ~]#systemctl  restart mysqld 
[root@mysql50 ~]#mysqlbinlog    [选项]  binlog日志文件名    //查看日志文件内容
常用选项 
--start-datetime=“yyyy-mm-dd hh:mm:ss”                   //起始时间点
--stop-...
--start-position=数字                                     //起始偏移量
--stop-...   
[root@mysql50 ~]# mysqlbinlog /var/lib/mysql/vm50-bin.000001
...    
# at 1551                                                //起始偏移量号
#181212 17:39:55 server id 50  end_log_pos 1650 CRC32 0xe320fe14 	Query	thread_id=4	exec_time=0	error_code=0              //前面为起始时间点
SET TIMESTAMP=1544607595/*!*/;
insert into b values("tom")                              //插入命令(除查询之外都有显示)
/*!*/;
# at 1650
#181212 17:39:55 server id 50  end_log_pos 1681 CRC32 0x53c06111 	Xid = 23
COMMIT/*!*/;                                             //结束时间点
# at 1681                                                //此条命令结束偏移量    
...

恢复数据

使用mysqlbinlog提取历史SQL操作  ,通过管道交给mysql命令执行

mysql> delete from user where name="tom";
[root@mysql50 ~]#mysqlbinlog --start-position=1551 --stop-position=1681   \
/var/lib/mysql/vm50-bin.000001   | mysql -uroot -p123456    //恢复数据"tom"(参看前面例子)