MySQL备份与恢复之mysqldump工具(一)

1、备份的类型
冷备份:关闭数据、停止业务
温备份:加锁备份
热备份:在先备份,不会影响到也正常运行

2、备份方式
逻辑备份:基于SQL语句的备份
(1)mysqldump建库、建表、数据插入
(2)基于二进制日志:数据库的所有变化类的操作
(3)基于复制的备份:将二进制日志实时传送到另一台机器并且恢复
物理备份
(1)xtrabackup进行物理备份
(2)拷贝数据文件(冷备)

3、备份工具
(1)mysqldump
mysql原生自带很好用的逻辑备份工具
(2)mysqlbinlog
实现binlog备份的原生态命令
(3)xtrabackup
precona公司开发的性能很高的物理备份工具

4、mysqldump备份工具使用
优点:逻辑备份工具,都是SQL语句,都是文本格式,便于查看和编辑,更便于压缩
缺点:备份效率较慢

mysqldump常用参数:-u -p -h -S -P
(1)全库备份
-A,
例子:
mysqldump -uroot -p123 -A >/backup/full.sql

(2)单库备份
例子:
mysqldump -uroot -p123 -B lufei >/backup/lufei.sql
mysqldump -uroot -p123 lufei >/backup/lufei1.sql
注意:-B,增加建库(create)及“use库”的语句,在将来恢复时,不需要手工进行建库和use
不加-B,需要恢复时,先创建库,use库下再进行恢复

另外,-B选项还可以实现,同时备份多个库,备份到同一个文件中
mysqldump -uroot -p123 -B lufei oldboy>/backup/lufei_oldboy.sql

以下例子,如果不加-B去备份,他的功能是备份路飞数据库下的oldboy表
mysqldump -uroot -p123 lufei oldboy>/backup/lufei_oldboy.sql (mysqldump 库1 表1 表2 表3 >库1.sql)

***生产环境实例: mysqldump -uroot -p123 -A -R --triggers >/backup/full.sql
-R, 备份存储过程和函数数据
--triggers, 备份触发器数据

-F, --flush-logs 刷新binlog日志,为了方便将来二进制日志截取时的起点

mysqldump -uroot -p123 -A -F >/backup/full.sql

--master-data={1|2} 告诉你备份时刻的binlog位置,一般我们选择使用2,以注释的方式记录二进制日志位置

锁表:适合所有引擎(myisam,innodb) //这种温备份,不适合大并发数据业务环境,这种方式一般是给myisam表的
-x, --lock-all-tables
-l, --lock-tables

--single-transaction 对innodb引擎进行热备,对myisam表进行温备份;实际上就是通过快照的方式实现热备

***实站例子,压缩备份:
mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz


mysqldump备份的恢复
使用source命令进行恢复:
mysql>set sql_log_bin=0; //切记在恢复之前,要临时关闭二进制日志
mysql> source /opt/xxx.sql;


背景环境:
正在运行的网站系统,mysql数据库,数据量25G,日业务增量10-15M。
备份方式:
每天23:00点,计划任务调用mysqldump执行全备脚本
故障时间点:
上午10点,误删除了一个表
如何恢复?

思路:
1、断开业务,防止对数据库二次伤害,挂出维护页面
2、搭建备用库,恢复全备
3、截取昨天晚上23:00之后到上午10点误删除操作之前的二进制日志
4、恢复到备用库,验证数据可用性和完整性
5、两种方案恢复前端应用

    5.1 备用库导出误删除的表,导入到生产库,开启业务
    5.2 直接将应用切割到备用库,替代生产库,开启业务

模拟故障并恢复:
1、原始数据:
mysql> create database oldboy;
mysql> use oldboy
mysql> create table t1 (id int,name varchar(20));
mysql> insert into t1 values (1,‘zhang3‘);
mysql> insert into t1 values (2,‘li4‘);
mysql> insert into t1 values (3,‘wang5‘);
mysql> commit;
2、模拟前一天晚上23:00全备
mysqldump -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz

3、模拟白天(23:00-10:00)业务对数据的修改
mysql> insert into t1 values (4,‘zhang33‘);
mysql> insert into t1 values (5,‘li44‘);
mysql> insert into t1 values (6,‘wang54‘);
mysql> commit;
4、模拟故障
drop table t1;

5、恢复
(1)准备全备,并获取到备份文件中的binlog的截取起点

gunzip all_2018-04-04.sql.gz
-- CHANGE MASTER TO MASTER_LOG_FILE=‘my-bin.000004‘, MASTER_LOG_POS=731;
(2)截取二进制日志
mysqlbinlog --start-position=731 --stop-position=1126 /data/binlog/my-bin.000004 >/backup/binlog.sql

show binlog events in ‘my-bin.000004‘; ----》drop之前的position为1126

(3)恢复全备+binlog //切记,恢复数据的时候,需要把二进制日志临时关闭!!!

set sql_log_Bin=0;
source /backup/all_2018-04-04.sql;
source /backup/binlog.sql

MySQL备份与恢复之mysqldump工具(一)

上一篇:通过SE14重建数据库表


下一篇:以 csv 文件形式输出 ORACLE 数据库 sql 查询结果