• MySQL的备份恢复


    MySQL的备份恢复

    通过现有备份,能够将数据库恢复到故障之前的时间点.

    备份工具

    mysqldump(MDP)
    percona Xtrabackup(XBK)
    MySQL Enterprise BACKUP(MEB)
    mysqlbinlog
    

    备份方式

    #逻辑备份
    全备 : mysqldump 
    增量 : binlog
    #物理备份
    全备 : XBK 
    增量 : XBK
    

    备份类型

    #热备
    在数据库正常业务时,备份数据,并且能够一致性恢复(只能是innodb)
    对业务影响非常小
    
    #温备
    锁表备份,只能查询不能修改(myisam)
    影响到写入操作
    
    #冷备
    关闭数据库业务,数据库没有任何变更的情况下,进行备份数据.
    业务停止
    

    备份工具使用

    逻辑备份-mysqldump

    #基础备份参数
    -A : 全备参数
    -B : 备份库或多个库
    库 表进行备份
    
    #全备
    [root@mysql ~]# mysqldump -uroot -p123456 -A >/backup/full.sql
    
    #分库备份
    [root@mysql ~]# mysql -uroot -p123456 -B world test opesn >/backup/db.sql
    
    #库 表备份
    [root@mysql ~]# mysqldump -uroot -p123456 world city country > /backup/tab.sql
    
    #特殊备份参数
    -R : 备份存储过程和函数
    -E : 备份事件
    --triggers : 备份触发器
    --master-data=2
    1. 自动记录备份时刻的binlog的文件名+位置点
    2. 自动进行锁表和解锁
    3. 如果配合--single-transaction,会有不一样的结果。
    	不加--single-transaction ,温备份
    	加了--single-transaction,对于InnoDB表不锁表备份(快照备份)
    
    ##扩展参数
    #在构建主从时,使用AUTO
    --set-gtid-purged=AUTO
    
    #仅是做普通的本机备份恢复时,可以添加
    --set-gtid-purged=OFF  
    
    #控制的是备份时传输数据包的大小.
    --max_allowed_packet=128M
    
    [root@mysql ~]# mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=128M >/backup/full_$(date +%F).sql
    

    物理备份-XBK

    #安装依赖包
    [root@mysql ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    [root@mysql ~]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
    #下载软件并安装
    [root@mysql ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
    [root@mysql ~]# yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
    
    
    innobackupex备份核心理念
    1. 备份的过程
    (1) innobackupex工具进行备份.会自动区分不同的存储引擎类型
    (2)	非InnoDB引擎表,自动锁表备份,FTWRL(Flush table with read lock),备份完自动解锁.
    (3) InnoDB引擎表,立即触发CKPT(将内存中已经提交的脏页,刷写到磁盘上),会立即记录LSN号,开始备份磁盘数据页
    (4) 在备份过程中产生的新的数据变化,XBK会自动备份过程中产生REDO日志.
    (5) 系统表空间也会被一次性备份走
    (6) 所有备份工作完成之后,再次记录最新的LSN号码.
    
    2. 恢复过程
    模拟了ACSR的全过程,在恢复之前,将数据的LSN号和redo LSN号追平
    恢复方法就是直接cp回去即可
    
    
    全量和增量备份
    #全量
    [root@mysql backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp /backup/full
    
    #增量
    [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1
    说明:
    --incremental    开关 
    --incremental-basedir=/backup/full 基于哪个备份进行增量
    /backup/inc1     增量备份的位置点
    
    #备份产生的文件介绍
    (1) xtrabackup_binlog_info
    记录备份时刻的二进制日志信息. 可以作为binlog截取的起点.
    (2) xtrabackup_checkpoints
    from : 备份中包含的LSN号的起点,全备:0,增量:上次备份的结束位置
    to 	 : ckpt 时的LSN
    last-9 : 备份结束时的LSN.下次增量备份的起始位置.
    
    模拟数据备份恢复
    #模拟数据
    mysql> create database full charset utf8mb4;
    mysql> use full;
    mysql> create table t1 (id int);
    mysql> insert into t1 values(1),(2),(3);
    mysql> commit;
    
    #进行每周全备
    [root@mysql backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --socket=/tmp/mysql.sock --no-timestamp /backup/full
    
    #模拟第一次的数据变化
    mysql> create database inc1 charset utf8mb4;
    mysql> use inc1
    mysql> create table t1 (id int);
    mysql> insert into t1 values(1),(2),(3);
    mysql> commit;
    
    #模拟第一次增量备份
    [root@mysql ~]# innobackupex   --user=root --password=123456 --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1
    
    #模拟第二次的数据变化
    mysql> create database inc2 charset utf8mb4;
    mysql> use inc2;
    mysql> create table t1 (id int);
    mysql> insert into t1 values(1),(2),(3);
    mysql> commit;
    
    #模拟第二次增量备份
    [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2
    
    #模拟第三次的数据变化
    mysql> create database inc3 charset utf8mb4;
    mysql> use inc3;
    mysql> create table t1 (id int);
    mysql> insert into t1 values(1),(2),(3);
    mysql> commit;
    
    #模拟数据库崩坏
    [root@mysql ~]# pkill mysqld
    [root@mysql ~]# rm -rf /data/mysql/data/*
    
    #进行恢复准备
    (1) 整理full
    [root@mysql ~]# innobackupex --apply-log --redo-only /backup/full
    (2) 合并inc1到full,并整理备份
    [root@mysql ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
    (3) 合并inc2到full,并整理备份
    [root@mysql ~]# innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
    (4) 最后一次整理full
    [root@mysql ~]# innobackupex --apply-log /backup/full
    
    #截取二进制日志
    [root@mysql ~]# cat /backup/full/xtrabackup_binlog_info 
    mysql-bin.000004	5277	d980595d-c934-11e9-bbfc-000c29d70b6d:1-29
    [root@mysql ~]# mysqlbinlog --skip-gtids --include-gtids='d980595d-c934-11e9-bbfc-000c29d70b6d:30-32' /data/binlog/mysql-bin.000004>/backup/binlog.sql
    
    #恢复数据
    [root@mysql ~]# cp -a /backup/full/* /data/mysql/data/
    [root@mysql ~]# chown -R mysql.mysql /data/mysql/data/*
    [root@mysql ~]# /etc/init.d/mysqld start
    [root@mysql ~]# mysql -uroot -p123456
    mysql> set sql_log_bin=0;
    mysql> source /backup/binlog.sql
    mysql> set sql_log_bin=1;
    

    mysql5.6迁移至mysql5.7

    #数据库备份
    [root@mysql5 ~]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction -R -E --triggers > /mnt/full.sql
    #数据迁移
    [root@mysql5 ~]# scp /mnt/full.sql 10.0.1.110:/data/3308/
    
    #数据恢复
    [root@mysql ~]# systemctl start mysqld3308
    [root@mysql ~]# mysql -S /data/3308/mysql.sock
    mysql> source /data/3308/full.sql;
    mysql> flush privileges;
    [root@mysql ~]# mysql_upgrade -uroot -p123456 -S /data/3308/mysql.sock
    
    
  • 相关阅读:
    Winform 控件开发,数据项重复
    input 价格自动补全 vue项目中的实际运用
    vue + element ui 的form表单中动态rules的设置
    整理全网文档管理系统,持续更新
    分享SpringBoot优秀教程、资源、仓库等
    分享SpringCloud的教程、资源、笔记
    整理全网最全K8S集群管理工具、平台
    git在本地忽略文件
    Python实现图片转字符画
    Pythonargparse用法
  • 原文地址:https://www.cnblogs.com/opesn/p/12994046.html
Copyright © 2020-2023  润新知