mysql_8 其他备份恢复

mysql_8 其他备份恢复

标签(空格分隔): mysql


Percona Xtrabackup

安装依赖包

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev

https://www.percona.com
下载percona

yum -y install percona-xtrabackup-24-2.4.4-1.e17.x86_64.rpm

介绍

物理备份工具 拷贝数据文件 200M/s
INNODB表: 支持热备份的
1.checkpoint 将已提交的数据页刷新至磁盘。记录一个LSN
2.拷贝INNODB表相关的文件(ibdata1,frm,ibd)
3.备份期间产生新的数据变化的redo也会被备份走

非INNODB表: 温备份
1.FTWRL 触发全局锁
2.拷贝非INNODB表的数据
3.解锁

再次统计LSN 写入到专用文件
记录二进制日志位置记录下来
所有备份文件统一存放在一个目录下

XBK使用

前提
数据库启动
能连接上数据库
[client]
socket = /tmp/mysql.sock
默认会读取mysqld ---> datadir=xxxx
服务器端工具


全备

innobackupex --user=root --password=123 /data/xbk

innobackupex --user=root --password=123 --no-timestamp /data/xbk/full_'date + %F'

备份结果查看
xtrabackup_binlog_info # 记录备份后binlog位置点信息,binlog的截取起点
xtrabackup_checkpoints #备份过程中LSN记录,方面做增量备份

全备的恢复演练
pkill mysqld
rm -rf /data/mysql/*

备份处理 prepare

redo 前滚 undo 回滚 模仿csr过程
innobackupex --apply-log /data/xbk/full_2020-02-27/

cd /删除的目录
cp -a /data/备份的位置 /data/mysql
chown -R mysql.mysql /data/mysql
systemctl restart mysqld


用户授权
socket ---> client ----> socket = /tmp/mysql.sock
数据 ---> mysqld ----> 相关参数

备份:
innobackupex --user=root --password=123 --no-timestamp /data/xbk/full_'date + %F'
xtrabackup_binlog_info # 记录备份后binlog位置点信息,binlog的截取起点
xtrabackup_checkpoints #备份过程中LSN记录,方面做增量备份
恢复:
1.prepare
innobackupex --apply-log /data/xbk/full_2020-02-27/
2.copy-back
cp -r /data/备份的位置 /data/mysql
chown -R mysql.mysql /data/mysql
systemctl restart mysqld

增量备份

第一天 第二天 第三天
100G 125G 150G
增量依赖于全备份
每次增量都是参照上次备份的LSN号码 xtrabackup_checkpoints 在此基础上变化的数据页,备份走
而且,会将备份过程中产生的新的变化的redo一并备份走

恢复时:
将所有需要inc备份,按顺序合并到全备中
并且需要将每个备份进行prepare

实践:

模拟全备
innobackupex --user=root --password=123 --no-timestamp /data/xbk/full

模拟变化
插入一些新的数据

模拟增量备份
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/xbk/full /data/backup/inc1

--incremental
    增量备份的开关
--incremental-basedir
    增量备份的基目录 上次备份

模拟变化2
插入一些新的数据

模拟增量备份2
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/inc1 /data/backup/inc2

确认备份完整性
cat inc1/xtrabackup_checkpoints
cat inc2/xtrabackup_checkpoints
cat full/xtrabackup_checkpoints

from_lsn=0
to_lsn= 337979814
last_lsn= 337979823

to_lsn last_lsn 相差9个 相当于没变化
from_lsn 就是上次备份的to_lsn

xbk full + inc + binlog 备份恢复手段
恢复思路
1.合并,prepare 所有inc备份到全备
2.恢复数据,启动数据库
3.截取binlog日志
4.恢复binlog日志

恢复过程
1.合并,prepare 所有inc备份到全备
基础全备整理
innobackupex --apply-log --redo-only /data/backup/full

最后一次增量不加 --redo-only  其他都要添加

#合并 inc1到full
innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full

#合并 inc2到full
innobackupex --apply-log --incremental-dir=/data/backup/inc2 /data/backup/full

#整体再次prepare整个备份
innobackupex --apply-log /data/backup/full

cp -r /data/备份的位置        /data/mysql
chown -R mysql.mysql /data/mysql 
systemctl restart mysqld

或则直接把my.cnf 的 datadir 变为备份地址

截取日志并修复数据库
起点在:
cat /data/backup/inc2/xtrabackup_binlog_info 起点就在前天备份的binlog里面

终点就是文件的最后一个

mysqlbinlog --skip-gtids --start-position="" /data/binlog/mysql-bin.00002 > /tmp/bin.sql

set sql_log_bin=0
source /tmp/bin.sql
set sql_log_bin=1

案例2

总数量3T 10个业务 drop掉了一个核心库20G 导致无法运行
周日full 周一到周五incinlog完整

如何快速恢复,还不影响业务

alter table t1 discard tablespace
alter table t1 import tablespace

1.合并备份到最新的备份

2.恢复单表 需要表结构和数据

获取表结构
yum -y install mysql-utilities

mysqlfrm --diagnostic t2.frm 获取建表语句

3.创建新表

丢弃表空间
alter table t1 discard tablespace

4.还原数据
将表中数据cp 回数据库数据目录
cp t2.ibd /data/3306/
chown mysql:mysql /data/3306/t2.ibd

导入表空间
alter table t1 import tablespace

切割binlog日志 到删库前 > sql

恢复binlog

set sql_log_bin=0
source /tmp/bin.sql
set sql_log_bin=1

原文地址:https://www.cnblogs.com/hywhyme/p/14631382.html