• mysql备份与恢复


    mysql备份与恢复

    1.mysql备份类型

    冷备份:关闭数据、停止业务
    温备份:加锁备份
    热备份:在先备份,不会影响到也正常运行
    

    2.mysql备份方式

    逻辑备份:基于SQL语句的备份
    (1)mysqldump建库、建表、数据插入
    (2)基于二进制日志:数据库的所有变化类的操作
    (3)基于复制的备份:将二进制日志实时传送到另一台机器并且恢复
    物理备份
    (1)xtrabackup进行物理备份
    (2)拷贝数据文件(冷备)
    

    3.mysql的备份工具

    (1)mysqldump
        mysql原生自带很好用的逻辑备份工具
    (2)mysqlbinlog
        实现binlog备份的原生态命令
    (3)xtrabackup
        precona公司开发的性能很高的物理备份工具
    

    4.mysqldump备份工具的使用

    优点:逻辑备份工具,都是SQL语句,都是文本格式,便于查看和编辑,更便于压缩
    缺点:备份效率较慢

    4.1 mysqldump备份工具常用参数

    -A, --all-databases:全库备份
    -B:增加建库(create)及“use库”的语句,可以直接接多个库名,同时    备份多个库***** -B 库1 库2
    -R, --routines:备份存储过程和函数数据
    --triggers:    备份触发器数据
    -F, --flush-logs :刷新binlog日志,为了方便将来二进制日志截取时的起点
    --master-data={1|2}:告诉你备份时刻的binlog位置,一般我们选择使用2,以注释的方式记录二进制日志位置
    --single-transaction:对innodb引擎进行热备
    

    4.2 mysqldump备分工具示例

    全库备份
    [root@db02 backup]# mysqldump -uroot -poldboy -A  >  /backup/mysql.sql
    单库备份
    [root@db02 backup]# mysqldump -B oldboy > /backup/oldboy.sql
    [root@db02 backup]# mysqldump  oldboy > /backup/oldboy.sql
    -B,增加建库(create)及“use库”的语句,在将来恢复时,不需要手工进行建库和use
    不加-B,需要恢复时,先创建库,use库下再进行恢复
    另外,-B选项还可以实现,同时备份多个库,备份到同一个文件中
    [root@db02 backup]#mysqldump -uroot -p123 -B lufei oldboy>/backup/lufei_oldboy.sql
    以下例子,如果不加-B,去备份,他的功能是备份路飞数据库下的oldboy表
    mysqldump -uroot -p123  lufei oldboy>/backup/lufei_oldboy.sql
    mysqldump 库1 表1 表2 表3 >库1.sql
    完整备份语句
    [root@db02 backup]# mysqldump -uroot -poldboy -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
    压缩备份语句
    mysqldump -uroot -p123 -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
    使用source命令进行恢复:
    mysql>set sql_log_bin=0; #临时关闭写入binlog写文件
    mysql> source /backup/all.sql; 进行恢复
    

    4.3 Mysqldump+Mysqlbinlog企业级增量备份恢复实战

    背景环境:
        正在运行的网站系统,mysql数据库,数据量25G,日业务增量10-15M。
    备份方式:
        每天23:00点,计划任务调用mysqldump执行全备脚本
    故障时间点:
        上午10点,误删除了一个表
    如何恢复?
    -------
    思路:
        1、断开业务,防止对数据库二次伤害,挂出维护页面
        2、搭建备用库,恢复全备
        3、截取昨天晚上23:00之后到上午10点误删除操作之前的二进制日志
        4、恢复到备用库,验证数据可用性和完整性
        5、两种方案恢复前端应用
            5.1 备用库导出误删除的表,导入到生产库,开启业务
            5.2 直接将应用切割到备用库,替代生产库,开启业务
    

    解决过程:

    模拟故障并恢复:
    1、原始数据:
    mysql> create database oldboy;
    mysql> use oldboy
    mysql> create table t1 (id int,name varchar(20));
    mysql> insert into t1 values (1,'zhang3');
    mysql> insert into t1 values (2,'li4');
    mysql> insert into t1 values (3,'wang5');
    2、模拟前一天晚上23:00全备
    mysqldump  -A  -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz
    3、模拟白天(23:00-10:00)业务对数据的修改
    mysql> insert into t1 values (4,'zhang33');
    mysql> insert into t1 values (5,'li44');
    mysql> insert into t1 values (6,'wang54');
    4、模拟故障
    drop table t1;
    5、恢复
    (1)准备全备,并获取到备份文件中的binlog的截取起点
        [root@db02 mysql]# gunzip all_2019-04-26.sql.gz 
         -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=660;
    (2)截取二进制日志
        show binlog events in 'my-bin.000001';  ----》drop之前的position为885
        [root@db02 mysql]# mysqlbinlog --start-position=660 --stop-position=885 mysql-bin.000001 > /tmp/mysql.sql
     (3)恢复全备+binlog
        mysql> set sql_log_bin=0;
        mysql> source /backup/all_2019-04-26.sql;
        mysql> source /tmp/mysql.sql
    

    5. xtrabackup备份工具

    percona公司的备份工具,性能比较高。物理备份工具。
    特点:
    物理备份工具,在同级数据量基础上,都要比逻辑备份性能要好的多。
    特别是在数据量比较大的时候,体现的更加明显。
    备份方式:
        1、拷贝数据文件
        2、拷贝数据页
    备份原理(innodb):
        1、对于innodb表,可以实现热备
            (1)在数据还有修改操作的时刻,直接将数据文件中的数据页备份
            此时,备份走的数据对于当前mysql来讲是不一致。
            (2) 将备份过程中的redo和undo一并备走。
            (3)为了恢复的时候,只要保证备份出来的数据页LSN能和redo LSN匹配,
                将来恢复的就是一致的数据。redo应用和undo的应用。
        2、对与myisam表,实现自动锁表拷贝文件。
    

    5.1 xtrabackup安装

    安装依赖
    wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
    下载软件包进行安装
    wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.13/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
    yum -y install percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
    

    5.2 xtrabackup备份实战

    全量备份
    innobackupex --user=root --password=oldboy --socket=/application/mysql/tmp/mysql.sock --no-timestamp  /server/bakcup/full
    --user:数据库账号
    --password:数据库密码
    --socket:mysql的mysql.sock文件位置
    --no-timestamp:以自己指定的文件位置进行备份
    全量恢复案例:
    1、恢复数据前的准备(合并xtabackup_log_file和备份的物理文件)
    innobackupex --apply-log --use-memory=32M /server/backup/full/
    2、模拟故障
    pkill mysqld # 关闭数据库
    ps -ef|grep mysql
    删除数据库
    cd /application/mysql/data
    rm -rf *
    3、恢复数据库
    cp -a /server/backup/full/*  /application/mysql/data
    或者
    innobackupex --copy-back  /server/backup/full/
    报错:这是因为在my.cnf配置文件里没有添加datadir数据文件路径,添加即可
    [root@db02 data]# innobackupex --copy-back /server/bakcup/full/
    xtrabackup: recognized server arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 
    xtrabackup: recognized client arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 
    190426 10:57:47 innobackupex: Starting the copy-back operation
    
    IMPORTANT: Please check that the copy-back run completes successfully.
               At the end of a successful copy-back run innobackupex
               prints "completed OK!".
    
    innobackupex version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c)
    Error: datadir must be specified.
    解决:
    vim /etc/my.cnf
    datadir=/application/mysql/data
    4、启动数据库
    /etc/init.d/mysqld start
    mysql -e "show database;"
    

    5.3 xtrabackup 实现增量备份及故障恢复

    背景:
    -某大型网站,mysql数据库,数据量500G,每日更新量100M-200M
    备份策略:
    -xtrabackup,每周六0:00进行全备,周一到周五及周日00:00进行增量备份。
    故障场景:
    –周三下午2点出现数据库意外删除表操作。
    如何恢复?

    全备
    innobackupex --user=root --password=123 --no-timestamp /backup/full/
    周一数据变化进行增量备份
    innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
    周二数据变化进行增量备份
    innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
    模拟数据破坏
    修改数据之后,不小心把表删除了
    进行数据恢复,将所有增量备份合并到一个备份中
    innobackupex --apply-log  --redo-only /backup/full 
    innobackupex --apply-log  --redo-only --incremental-dir=/backup/inc1 /backup/full
    innobackupex --apply-log  --incremental-dir=/backup/inc2 /backup/full
    innobackupex --apply-log  /backup/full
    关闭数据库,删除data中的数据
    pkill mysqld
    cd /application/mysql/data
    rm -rf *
    截取binlog文件
    mysqlbinlog --start-position=244 --stop-position=930 mysql-bin.000005 > /tmp/mysql.sql
    
    使用innobackup恢复
    innobackup --copy-back /backup/full
    /etc/init.d/mysqld start
    mysql> source /tmp/msyql.sql
    

    5.3 xtrabackup单表恢复

    为解决为了恢复1G表,需要将整个全备恢复

    drop table t1;
    需要创建表结构与原来表结构一模一样的表
    create table t1 (id int,name varchar(20));
    删除原来t1表中的ibd文件
    alter table t1 discard tablespace;
    复制备份中的ibd文件
    cd /application/mysql/data/oldboy
    cp /backup/full/oldboy/t1.ibd  ./
    修改所属组
    chown  -R mysql.mysql *
    导入ibd文件到数据库中
    alter table t1 import tablespace;
    
  • 相关阅读:
    [Java]用递归判断是否为递减数组
    android欢迎界面的编程实现[手相评分软件实例]
    工作两周年的感想
    最新基于adtbundlewindowsx86的android开发环境搭建
    新浪微博Failed to receive access token
    朋友
    房产中介
    房产中介
    与 Josh Bloch 探讨 Java 未来
    关于英语学习的一点思考
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10845696.html
Copyright © 2020-2023  润新知