zoukankan      html  css  js  c++  java
  • MySQL 物理备份工具-xtrabackup

    安装

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
    yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
    

    备份方式——物理备份

    (1) 对于非Innodb表(比如 myisam)是,锁表cp数据文件,属于一种温备份。
    (2) 对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo一并备走,属于热备方式。

    xtrabackup 在innodb表备份恢复的流程

    (1) xtrabackup 备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
    (2) 备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
    (3) 在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用
    (4) 恢复过程是cp 备份到原来数据目录下

    innobackupex使用

    全备

    需要在 /etc/my.cnf 中指定 socket 位置

    [client]
    socket=/var/lib/mysql/mysql.sock
    
    innobackupex --user=root --password=Klvchen_123  /data/backup
    

    自主定制备份路径名

    innobackupex --user=root --password=Klvchen_123 --no-timestamp /data/backup/full
    

    备份集中多出来的文件

    cd /data/backup/full
    
    -rw-r----- 1 root root      104 Jan 11 23:23 xtrabackup_binlog_info
    -rw-r----- 1 root root      113 Jan 11 23:23 xtrabackup_checkpoints
    -rw-r----- 1 root root      598 Jan 11 23:23 xtrabackup_info
    -rw-r----- 1 root root     2560 Jan 11 23:23 xtrabackup_logfile
    
    cat xtrabackup_binlog_info 
    mysql-bin.000005        234     e4b4a809-3445-11ea-abe9-00155d1f4002:1-7,f10baaa9-3446-11ea-ba25-00155d1f4002:1-2
    # 记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点。
    
    cat xtrabackup_checkpoints
    backup_type = full-backuped
    from_lsn = 0                           # 上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法)
    to_lsn = 4072216                       # 备份开始时间(ckpt)点数据页的LSN 
    last_lsn = 4072225                     # 备份开始时间(ckpt)点数据页的LSN 
    compact = 0
    recover_binlog_info = 0
    (1) 备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
    (2) 备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
    (3) 在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。
    从to_lsn  ----》last_lsn 就是,备份过程中产生的数据变化。
    
    
    cat xtrabackup_info
    uuid = 55504fc5-3486-11ea-a184-00155d1f4002
    name = 
    tool_name = innobackupex
    tool_command = --user=root --password=... --no-timestamp /data/backup/full
    tool_version = 2.4.4
    ibbackup_version = 2.4.4
    server_version = 5.7.28-log
    start_time = 2020-01-11 23:23:20
    end_time = 2020-01-11 23:23:34
    lock_time = 0
    binlog_pos = filename 'mysql-bin.000005', position '234', GTID of the last change 'e4b4a809-3445-11ea-abe9-00155d1f4002:1-7,
    f10baaa9-3446-11ea-ba25-00155d1f4002:1-2'
    innodb_from_lsn = 0
    innodb_to_lsn = 4072216
    partial = N
    incremental = N
    format = file
    compact = N
    compressed = N
    encrypted = N
    
    # 备份的重做日志文件
    file xtrabackup_logfile 
    xtrabackup_logfile: data
    

    全备的恢复

    # 将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
    innobackupex --apply-log  /data/backup/full
    
    # 停止 mysql ,删除 data目录
    pkill mysql
    rm -rf /var/lib/mysql
    
    # 拷贝目录
    cp -rf /data/backup/full /var/lib/mysql
    chown -R mysql.mysql /var/lib/mysql
    
    # 启动
    systemctl start mysqld
    

    innobackupex 增量备份(incremental)

    (1) 增量备份的方式,是基于上一次备份进行增量。
    (2) 增量备份无法单独恢复。必须基于全备进行恢复。
    (3) 所有增量必须要按顺序合并到全备中。

    模拟数据变化(全备之前)

    create database klvchen;
    use klvchen;
    create table t1 (id int);
    insert into t1 values(1),(2),(3);
    

    全备

    innobackupex --user=root --password=Klvchen_123 --no-timestamp /data/backup/full
    

    模拟第一天数据

    use klvchen;
    create table t2 (id int);
    insert into t2 values(1),(2),(3);
    

    第一天的增量备份

    innobackupex --user=root --password=Klvchen_123 --no-timestamp --incremental --incremental-basedir=/data/backup/full  /data/backup/inc1
    

    模拟第二天数据

    use klvchen;
    create table t3 (id int);
    insert into t3 values(1),(2),(3);
    

    第二天的增量备份

    innobackupex --user=root --password=Klvchen_123 --no-timestamp --incremental --incremental-basedir=/data/backup/inc1  /data/backup/inc2
    

    模拟第三天数据

    use klvchen;
    create table t4 (id int);
    insert into t4 values(1),(2),(3);
    
    # 误删数据库 klvchen
    drop database klvchen;
    

    恢复到周三误drop之前的数据状态

    恢复思路:
    1. 增量不能单独恢复
    2. 增量必须按照顺序合并到全备(LSN号码)
    3. 所有备份都必须要 --apply-log 进行整理备份
    4. 部分备份需要只 redo 不 undo (--redo-only)
    

    没有合并之前全备整理 (--redo-only)

    innobackupex --apply-log --redo-only /data/backup/full/
    

    合并与整理 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/
    

    最后一次整理全备

    innobackupex --apply-log  /data/backup/full
    

    二进制日志截取

    # 判断起点
    cat /data/backup/inc2/xtrabackup_binlog_info 
    mysql-bin.000002        2455    512c7182-354a-11ea-9aa0-00155d1f4002:1-9
    
    # 判断终点
    show binlog events in 'mysql-bin.000002';
    

    # 截取 drop 之前的 binlog
    mysqlbinlog --skip-gtids --include-gtids='512c7182-354a-11ea-9aa0-00155d1f4002:10-11' /data/mysql-bin/mysql-bin.000002 >/data/backup/bin.sql
    

    进行恢复

    mkdir /data/3307/data -p
    cp -a /data/backup/full/* /data/3307/data/
    chown -R mysql.mysql /data/3307/
    
    # 把 /etc/my.cnf 下的 datadir 路径改为新的目录
    datadir=/data/3307/data
    
    # 重启 mysql
    systemctl restart mysqld
    
    # 恢复二进制日志
    set sql_log_bin=0;
    source /data/backup/bin.sql;
    set sql_log_bin=1;
    
    # 检查
    mysql -uroot -pKlvchen_123 -e "show databases"
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | klvchen            |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    # klvchen 数据库已经成功恢复
    
  • 相关阅读:
    ant design pro梳理
    JSON.stringify()
    数组小细节
    js this细节
    策略模式解决if-else过多
    使用useState的赋值函数异步更新问题
    Hook
    React Api
    Intent
    树的非递归遍历
  • 原文地址:https://www.cnblogs.com/klvchen/p/12181036.html
Copyright © 2011-2022 走看看