zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    puppeteer 模拟登录淘宝
    基于Istio构建微服务安全加固平台的探索
    试着给VuePress添加全局禁止爬取支持,基于vuepress-plugin-robots
    关于Word转Markdown的工具Typora安装及使用
    关于基于Nexus3和Docker搭建私有Nuget服务的探索
    关于Kubernetes(简称K8S)的开启及基本使用,基于Docker Desktop & WSL2
    关于WLS2中Ubuntu启用SSH远程登录功能,基于Xshell登录,支持Root
    关于Ubuntu开启ifConfig和Ping命令的支持,查看本机Ip地址和检查外部连接
    关于.Net Core使用Elasticsearch(俗称ES)、Kibana的研究说明
    关于使用Draw.io画数据库E-R图的说明
  • 原文地址:https://www.cnblogs.com/hywhyme/p/14631382.html
Copyright © 2011-2022 走看看