zoukankan      html  css  js  c++  java
  • MySQL备份

    第1章 DBA备份的职责

    1.1 设计备份策略

    备份周期
    备份工具
    备份方式
    

    1.2 日常备份检查可用性

    #查看定时任务
    crontab -l
    #通过定时找任务找到备份的脚本和路劲信息
    备份脚本
    备份路径
    #看备份日志
    检查备份文件(大小,内容)
    

    1.3 定期恢复演练(测试库)

    一季度或者半年
    

    1.4 故障恢复

    只要备份和日志是完整的,恢复到故障之前的时间点(快速)
    

    1.5 数据迁移

    操作系统不同的迁移
    mysql   ->  mysql 
    其他     ->  mysql 
    mysql   ->   其他
    考虑两大方面:
    1.停机时间
    2.回退方案
    

    第2章 备份的类型

    1.1 热备

    1.在数据库正常业务时,备份数据,并且能够一致性恢复(只能是innodb)
    2.对业务影响非常小
    

    1.2 温备

    1.锁表备份,只能查询不能修改(myisam)
    2.影响到写入操作
    

    1.3 冷备

    1.关闭数据库业务,数据库没有任何变更的情况下,进行备份数据.
    2.业务停止
    

    第3章 备份方式及工具的介绍

    1.1 备份工具

    第一种备份工具: mysqldump(逻辑备份)

    基于SQL语句进行备份
    mysqldump       
    mysqlbinlog
    

    第二种备份工具: XBK(物理备份)

    基于磁盘数据文件备份
    xtrabackup(XBK) :percona 第三方
    

    1.2 2种工具的比较

    mysqldump

    优点:
    1.不需要下载安装
    2.备份出来的是SQL,文本格式,可读性高,便于备份处理
    3.压缩比较高,节省备份的磁盘空间
    缺点:
    1.依赖于数据库引擎,需要从磁盘把数据读出
    2.然后转换成SQL进行转储,比较耗费资源,数据量大的话效率较低
    建议:
    100G以内的数据量级,可以使用mysqldump
    超过TB以上,我们也可能选择的是mysqldump,配合分布式的系统
    1EB  =1024 PB =1000000 TB
    

    XBK

    优点:
    1.类似于直接cp数据文件,不需要管逻辑结构,相对来说性能较高
    缺点:
    2.可读性差
    3.压缩比低,需要更多磁盘空间
    建议:
    >100G<TB
    

    第4章 mysqldump工具的使用

    1.1 备份用到的参数

    -A(全备参数)

    mysqldump -uroot -p123 -A|gzip >/backup/$(date +%F).sql.gz
    

    -B(备份多个单库)

    列子1:备份指定的库schoo和world

    mysqldump -uroot -p123 -B school world |gzip >backup/$(date +%F).sql.gz
    #注意
    -B 后面只能接上库的名字,不能接表的名字
    

    例子2:备份world库下的city表

    msyqldump -uroot -p123 world city |gzip >/backup/$(date +%F).sql.gz
    #注意
    备份单个表和多个表时,不用加上-B参数
    

    -R(存储过程) --triggers(触发器) -E(事件)

    例子

    mysqldump -uroot -p123 -A -R -E --triggers |gzip >/backup/$(date +%F).sql.gz
    

    --master-data=2

    此参数的作用
    (1)在备份时,会自动记录,二进制日志文件名和位置号
       0  默认值
       1  以change master to命令形式,可以用作主从复制
       2  以注释的形式记录备份时刻的文件名+postion号
    (2)自动锁表
    如果不加--single-transaction会全局锁表进行温备份
    如果加--single-transaction,对于innodb的表不锁表(快照备份),对于非innodb的表还是会锁表进行温备份
    #因为innodb存储引擎支持事务
    

    --single-transaction

    对于InnoDB的表,进行一致性快照备份,不锁表.只有innodb的表支持这个功能
    

    --set-gtid-purged

    auto,on 默认是auto
    off 
    使用场景:
    1. --set-gtid-purged=OFF,可以使用在日常备份参数中.
    mysqldump -uroot -p123 -A -R -E --triggers --master-data=2  --single-transaction --set-gtid-purged=OFF >/backup/$(date +%F).sql.gz
    2. auto,on:在构建主从复制环境时需要的参数配置
    mysqldump -uroot -p -A -R -E --triggers --master-data=2  --single-transaction --set-gtid-purged=ON >/backup/$(date +%F).sql.gz
    

    --max_allowed_packet

    #备份时服务端像客户端传输数据包的大小(针对很大的表)
    例子:
    mysqldump -uroot -p -A -R -E --triggers --master-data=2  --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M >/backup/$(date +%F).sql.gz
    注意报错:
    1153 - Got a packet bigger than 'max_allowed_packet' bytes 
    (1) 如果是mysql正常工作出现,调整[mysqld]的此参数
    (2) 如果是mysqldump备份时出现,mysqldump 命令行添加此参数
    

    第5章 模拟故障恢复

    1.1 模拟环境

    第一个里程: 模拟数据

    mysql>create database kk;
    mysql>use kk
    mysql>create table t1 (id int);
    mysql>insert into t1 values(1),(2),(3);
    mysql>commit;
    

    第二个里程: 周二23:00全备

    mysqldump -uroot -p123 -A -R -E --triggers --master-data=2 --single-transaction |gzip >/backup/$(date +%F).sql.gz
    

    第三个里程: 模拟周二23:00到周三10点之间数据变化

    mysql>use kk
    mysql>insert into t1 values(11),(22),(33);
    mysql>commit;
    mysql>create table t2 (id int);
    mysql>insert into t2 values(11),(22),(33);
    mysql>commit;
    

    第四个里程: 模拟故障,删除表

    drop database kk;
    

    1.2 恢复流程

    第一个里程: 停业务,挂维护页

    
    

    第二个里程: 把备份数据拷贝到临时库

    
    

    第三个里程: 截取二进制

    1. 先在备份文件中找到备份时的起点,下一个GTID号码就是记录备份以后的操作了
    [root@db01 ~]# sed -n '24p' /backup/2020-04-09.sql 
    SET @@GLOBAL.GTID_PURGED='53105cbc-725d-11ea-9859-000c29ceddde:1-14';
    2. 在二进制文件中找到终点
    show binlog events in 'mysql-bin.000005';
    SET @@SESSION.GTID_NEXT= '53105cbc-725d-11ea-9859-000c29ceddde:18'
    3. 截取二级制日志导入到sql文件
    cd /data/binlog
    mysqlbinlog --skip-gtids  --include-gtids='53105cbc-725d-11ea-9859-000c29ceddde:15-17' /data/binlog/mysql-bin.000005 >/backup/binlog.sql
    

    第四个里程: 恢复全备和截取的二进制到临时库

    mysql>set sql_log_bin=0;
    mysql>source /backup/2020-04-09.sql
    mysql>source /backup/binlog.sql
    mysql>set sql_log_bin=1;
    

    第五个里程: 将删除的库,从临时库导出,并恢复到生产中

    1. 先从临时库导出
    mysqldump -uroot -p123 -R -E -B backup --triggers --master-data=2 --single-transaction |gzip >/backup/backup.sql
    2. 在把数据拷贝到生产服务器上,导入到数据库中
    mysql>set sql_log_bin=0;
    mysql>source /backup/backup.sql
    mysql>set sql_log_bin=1;
    

    第六个里程: 检查数据时候恢复

    mysql>show databases;
    

    第6章 MySQL物理备份工具-xtrabackup(XBK)

    1.1 XBK的备份方式

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

    1.2 XBK的安装

    第一个里程: 安装依赖

    yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
    

    第二个里程: 上传软件包

    
    

    第三个里程: 安装软件包

    yum localinstall percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm -y
    

    第四个里程: 检查是否安装上了

    是否有innobackupex这个命令
    

    1.3 XBK在恢复innodb表的流程

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

    第7章 innobackupex使用

    1.1 全备

    innobackupex --user=root --password=123  /backup
    

    1.2 自定义备份路径名

    innobackupex --user=root --password=123 --no-timestamp /backup/$(date +%F)
    

    1.3 备份集中多出来的文件

    xtrabackup_binlog_info
    xtrabackup_checkpoints
    xtrabackup_info
    xtrabackup_logfile
    1. xtrabackup_binlog_info:(备份时刻的binlog位置点信息)
    [root@db01 2020-04-09]# cat xtrabackup_binlog_info 
    mysql-bin.000005	3615	53105cbc-725d-11ea-9859-000c29ceddde:1-18
    记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点
    2. xtrabackup_checkpoints
    [root@db01 2020-04-09]# cat xtrabackup_checkpoints
    backup_type = full-backuped (表示属于全备类型)
    from_lsn = 0                (上次所到达的LSN号对于全备就是从0开始,对于增量有别的显示方法)
    to_lsn = 5881360            (备份开始时间(ckpt)点数据页的LSN)
    last_lsn = 5881369          (备份结束后,redo日志最终的LSN)
    compact = 0
    recover_binlog_info = 0
    3. xtrabackup_info
    记录的是备份时的详细信息
    4. xtrabackup_logfile
    记录的是备份的redo,是二进制文件,看不了
    

    1.4 全备的恢复

    全备恢复的前提

    1、被恢复的目录是空
    2、被恢复的数据库的实例是关闭
    

    第一个里程: 用XBK进行全备

    nnobackupex --user=root --password=123 --no-timestamp /backup/full
    

    第二个里程: 关闭数据库

    systemctl stop mysqld
    

    第三个里程: 创建新的数据目录

    mkdir /data/mysql/data1
    

    第四个里程: 整理备份

    innobackupex --apply-log  /backup/full
    将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
    

    第五个个里程: 恢复备份

    cp -a /backup/$(date +%F)/* /data/mysql/
    

    第六个里程: 修改数据库配置文件中的数据路径

    vim /etc/my.cnf
    datadir=/data/mysql/data
    改为
    datadir=/data/mysql/data1
    

    第七个里程: 数据路径授权

    chown -R mysql:mysql /data/mysql/data1
    

    第八个里程: 启动数据库

    systemctl start mysqld
    

    1.5 XBK增量恢复实践

    增量恢复的前提

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

    第一个里程: 环境模拟

    1. 模拟周日全备
    innobackupex --user=root --password=123 --no-timestamp /backup/full &>/tmp/full.log
    2. 模拟周一数据的变化
    mysql>create database XBK charset utf8mb4;
    mysql>use XBK
    mysql>create table t1 (id int);
    mysql>insert into t1 values(1),(2),(3);
    mysql>commit;
    3. 第一次增量备份(周一)
    innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full  /backup/inc1 &>/tmp/inc1.log
    #说明
    --incremental:开启增量备份的功能
    --incremental-basedir=/backup/full :基于哪个备份进行增量
    /backup/inc1 :备份到哪里去
    4. 模拟周二的数据变化
    mysql>use XBK
    mysql>create table t2 (id int);
    mysql>insert into t2 values(1),(2),(3);
    mysql>commit;
    5. 第二次增量备份(周二)
    innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1  /backup/inc2 &>/tmp/inc2.log
    6. 模拟周三的数据变化
    mysql>use XBK
    mysql>create table t3 (id int);
    mysql>insert into t3 values(1),(2),(3);
    mysql>commit;
    mysql>drop database XBK;
    

    第二个里程:恢复的思路

    1. 停业务,挂维护页
    2. 查找可用的备份:full+inc1+inc2
    3. 截取binlog: inc2到误操作时间点的binlog
    4. 恢复全备+增量+binlog
    5. 验证数据
    6. 开启业务,撤掉维护页
    

    第三个里程: 恢复里程

    第一里程: 整理全备

    innobackupex --apply-log --redo-only /backup/full
    #说明--redo-only
    此参数,在整理全备和所有增量时都要应用,除了最后一次增量不用
    

    第二个里程: 合并inc1到full中

    innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
    #哪一个增量合并到全备中
    

    第三个里程: 合并inc2到full中

    innobackupex --apply-log  --incremental-dir=/backup/inc2 /backup/full
    

    第四个里程: 最后一次整理全备

    innobackupex --apply-log  /backup/full
    

    第五个里程: 截取binlog(inc2备份时刻的起点到drop之前的binlog)

    1. 获取开始位置
    cd /backup/inc2
    [root@db01 inc2]# cat xtrabackup_info
    ...
    binlog_pos = filename 'mysql-bin.000005', position '1470', GTID of the last change '53105cbc-725d-11ea-9859-000c29ceddde:1-7'
    ...
    2. 获取结束位置
    >show binlog events in 'mysql-bin.000005';
    SET @@SESSION.GTID_NEXT= '53105cbc-725d-11ea-9859-000c29ceddde:9' 
    3. 截取二进制
    cd /data/binlog
    mysqlbinlog --skip-gtids --include-gtids='53105cbc-725d-11ea-9859-000c29ceddde:8-9' /data/binlog/mysql-bin.000005 >/backup/binlog.sql
    

    第六个里程: 创建新的数据目录

    mkdir /data/mysql/data3
    

    第七个里程: 关闭数据库服务

    systemctl stop mysqld
    

    第八个里程: 拷贝整理好的备份库到新的数据目录下

    cp -a /backup/full/* /data/mysql/data3
    

    第九个里程: 修改数据库配置文件的数据目录

    vim /etc/my.cnf
    datadir=/data/mysql/data
    改为
    datadir=/data/mysql/data3
    

    第十个里程: 给新的数据目录授权权限

    chown -R mysql:mysql /data/mysql/data3
    

    第十一个里程: 启动数据库

    systemctl start mysqld
    

    第十二个里程: 把截取出来的binlog导入到数据库中

    mysql>set sql_log_bin=0;
    mysql>source /backup/binlog.sql
    mysql>set sql_log_bin=1;
    

    第十二个里程: 验证数据

    
    

    第八章 分库分表备份脚本

    1.1 分库备份脚本

    vim fenku.sh
    #!/bin/bash
    MYUSER=root
    MYPASS=123
    MYLOGIN="mysql -u$MYUSER -p$MYPASS"
    MYDUMP="mysqldump -u$MYUSER -p$MYPASS -R -E --triggers --master-data=2  --single-transaction -B"
    DBLIST=$($MYLOGIN -e "show databases;"|sed "1d"|egrep -v "_schema|mysql|sys")
    for dbname in $DBLIST
    do
    MYDIR=/backup/$dbname
    [ ! -d $MYDIR ] && mkdir -p $MYDIR
    $MYDUMP $dbname 2>&1|gzip >/$MYDIR/${dbname}_$(date +%F).sql.gz
    done
    #脚本说明
    DBLIST=$($MYLOGIN -e "show databases;"|sed 1d|egrep -v "_schema|mysql|sys")
    sed 1d:删除第一行
    egrep -v "_schema|mysql|sys":排除系统库
    

    1.2 分库+分表备份脚本

    脚本内容
      
    vim fenbiao.sh
    #!/bin/bash
    MYUSER=root
    MYPASS=123
    MYLOGIN="mysql -u$MYUSER -p$MYPASS"
    MYDUMP="mysqldump -u$MYUSER -p$MYPASS -R -E --triggers --master-data=2  --single-transaction"
    DBLIST=$($MYLOGIN -e "show databases;"|sed 1d|egrep -v "_schema|mysql|sys")
    for dbname in $DBLIST
    do
      TABLELIST=$($MYLOGIN -e "show tables from $dbname;"|sed "1d")
      for tname in $TABLELIST
      do
      MYDIR=/backup/$dbname
      [ ! -d $MYDIR ] && mkdir -p $MYDIR
      $MYDUMP $dbname ${tname} 2>&1|gzip >$MYDIR/${dbname}_${tname}_$(date +%F).sql.gz
      done
    done
      
    学习的进阶之路
  • 相关阅读:
    C++ 模板实现败者树,进行多路归并
    CentOS 7 使用 Realtek 8188eu 上网 (解决 Required key not available)
    C++ Concurrency in Action 读书笔记
    Linux操作系统是如何工作的
    大型项目使用Automake/Autoconf完成编译配置
    Socket 用于进程间通信 --- UNIX Domain Socket
    在Linux中实现类似windows中获取配置文 件的函数GetProfileString
    Linux Shell 1
    YAML
    ubuntu虚拟机如何连接到windows上安装的Navicat
  • 原文地址:https://www.cnblogs.com/yufenchi/p/12666790.html
Copyright © 2011-2022 走看看