mysql_7 备份恢复

mysql_7 备份恢复

标签(空格分隔): mysql


mysql数据损坏类型

物理损坏

硬盘损坏: 硬件 磁道 dd 格式化
文件损坏: 数据文件损坏 redo损坏

逻辑损坏

drop
delete
truncate
update

dba 、运维在备份、恢复的职责

设计备份和容灾的策略

备份策略

备份工具选择

备份周期设计

备份监控方法

容灾策略

备份:什么备份 主从  
架构: 高可用 演示从库 灾备库

定期的备份、容灾检查

备份软件 -> 带库

定期的故障恢复演练

数据损坏时的恢复且快速恢复

数据迁移工作

mysql 常用备份工具

  • 逻辑备份方式

mysqldump
mydumper
load data in file
主从方式

  • 物理备份方式
    MySQL Enterprise Backup(企业版)
    Percona Xtrabackup (PBK,XBK)

  • 架构备份方式

mysqldump mdp 应用

逻辑备份工具 备份的是sql语句
InnoDB 可以采取快照备份的方式。开启一个独立的事务,获取当前最新的一次性快照 放在临时表中 转换成sql语句(create database create table insert ) 保存到sql文件中

非innodb表
需要锁表备份 触发FTWARL 全局锁表 转换成sql语句(create database create table insert ) 保存到sql文件中

mysqldump 核心参数

连接参数
-u #用户
-p # 密码
-h #host
-P
-S #指定socket

备份参数
-A #全部备份
mysqldump -A -u root -p > /tmp/all.sql

-B 备份1或多个库
mysqldump -u root -p -B world test > /tmp/wt.sql

备份单表或多表
mysqldump -u root -p world city > /tmp/world_city.sql

备份高级参数

--master-data = 2

场景:
每周日 23:00 全备,周一到周六 binlog备份。所有备份时完整的。
周三时,有一个核心运维人员删库操作。

恢复全备 + 所有需要binlog恢复
痛点:binlog 的 截取 起点和终点
起点:寻找比较困难

 方法1: 最好备份的时间开启时,立即切割日志。  -F 刷新新的日志
 方法2: 备份开始时,自动记录日志文件信息 --master-data=2

终点:drop之前的位置点。

功能:
1.备份时自动记录binlog信息
2.自动锁表和解锁
3.配合single transaction 可以减少 锁表时间。

mysqldump -u root -p -A --master-data=2 > /tmp/full.sql

#会在备份文件上多出
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.00005', MASTER_LOG_POS=355

--single-transaction
对于innodb引擎表备份时,开启一个独立事务,获取一致性的快照进行备份。 最好和--master-data=2 一起使用

mysqldump -u root -p -A --master-data=2 --single-transaction > /tmp/full.sql


-R -E --triggers

-R #备份存储过程和函数
-E #备份事件
--triggers #触发器

mysqldump -u root -p -A --master-data=2 --single-transaction -R -E --triggers > /tmp/full.sql


--max_allowed_packet=64M

mysqldump -u root -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M > /tmp/full.sql

超出包的最大传输大小,注意:客户端和服务端都可以使用这个参数

备份案例

场景:
基础环境: centos 7.6 + mysql 5.7 LNMT 网址业务 数据量100G
备份策略: mysqldump每天全备, binlog定时备份
故障: 核心业务库被误删除

恢复思路:
1.挂维护页
2.找测试库
3.恢复周二全备
4.截取周二全备 然后恢复binlog日志
5.测试业务功能正常
6.恢复业务
方案1: 故障库导回到原生产
方案2: 直接用测试库充当生成库,先跑着。之后到导入到主业务库

1.创建数据
create database mdp charset utf8mb4;

2.模拟备份
mysqldump -u root -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M > /tmp/full_date + %F.sql

3.再插入一些数据

4.删除库
drop database mdp;

5.开始恢复
检查全备的开始id
vim full_时间.sql 找到下面开始的id
-- change master to master_log_file

6.恢复全备
set sql_log_bin=0
source /data/xxx.sql

7.截取binlog
起点:
change master to master_log_file='mysql-bin.000019', MASTER_LOG_POS=788;

终点

show master status;
show binlog events in 'mysql-bin.000020'
找到drop之前的位置点

position截取
mysqlbinlog --skip-gtids --start-position=788 --stop-position=1275 /data/binlog/mysql-bin.000019 mysql-bin.000020 > /tmp/binlog.sql

gtid截取
起点中记录了
set @@GLOBAL.GTID_PURGED='';

mysqlbinlog --skip-gtids --include-gtids="开始的gtids:17-19" /data/binlog/mysql-bin.000019 mysql-bin.000020 > /tmp/binlog.sql

8.恢复binlog
set sql_log_bin = 0
source /tmp/binlog.sql
set sql_log_bin = 1

比较

SAS 硬盘 做 RAID 10
磁盘阵列
从硬件层面提高了可用性 速度快 成本高


mysqldump 适合小数据量的
可读性比较强 压缩比 节省空间
备份时间相对较长 恢复时间长
分布式架构 数据量较大时候,可以采取分布式备份,也可以选择mysqldump


1、获得表结构
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  full.sql>createtable.sql
2、获得INSERT INTO 语句,用于数据的恢复
# grep -i 'INSERT INTO `city`'  full.sqll >data.sql &
3.获取单库的备份
# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql
posted @ 2021-03-24 10:18  gidos  阅读(60)  评论(0编辑  收藏  举报