zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10845696.html
Copyright © 2011-2022 走看看