MySQL5

MySQL数据库5

  • mysqldump备份恢复数据库
  • 冷备份还原数据库
  • 逻辑卷快照备份还原数据库
  • xtrabackup备份还原数据库

1. 备份和恢复概述

  • 适用场景
    硬件故障、软件故障、天然灾害、黑客攻击、误操做测试等数据丢失场景php

  • 备份注意要点css

    1. 能容忍最多丢失多少数据
    2. 恢复数据须要在多长时间内完成
    3. 须要恢复哪些数据
    4. 还原要点
    5. 作还原测试,用于测试备份的可用性
    6. 还原演练
  • 备份类型
    二进制日志文件不该该与数据文件放在同一磁盘html

    1. 按备份范围
      1. 彻底备份:整个数据集
      2. 部分备份:只备份数据子集,如部分库或表
    2. 按备份时间
      1. 增量备份:仅备份最近一次彻底备份或增量备份(若是存在增量)以来变化的数据,备份较快,还原复杂,备份的是二进制文件
      2. 差别备份:仅备份最近一次彻底备份以来变化的数据,备份较慢,还原简单
  • 冷、温、热备份mysql

    1. 冷备
      读写操做均不可进行,相似复制文件操做, 数据库对应的数据文件,二进制日志、InnoDB的事务日志, 服务器的配置文件
    2. 温备
      读操做可执行;但写操做不可执行
    3. 热备
      读写操做都可执行
  • 经常使用存储引擎支持备份类型web

    1. MyISAM:温备,不支持热备
    2. InnoDB:都支持
  • 备份方法sql

    1. 物理备份
      直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快,可能将没有释放空间的空数据文件一块儿备份,占用空间
    2. 逻辑备份
      从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度,经过mysql协议链接到mysql的数据库,执行命令将数据查出来,导出到备份主机上,有什么数据拿什么数据。
  • 备份时须要考虑的因素shell

    1. 温备的持锁多久
    2. 备份产生的负载
    3. 备份过程的时长
    4. 恢复过程的时长
  • 备份什么数据库

    1. 数据
    2. 二进制日志、InnoDB的事务日志
    3. 程序代码(存储过程、函数、触发器、事件调度器)
    4. 服务器的配置文件
  • 备份工具vim

    1. cp, tar等复制归档工具:
      物理备份工具,适用全部存储引擎;只支持冷备;彻底和部分备份
    2. LVM的快照:
      为保证数据一致性,先对真个实例加锁,作快照后解锁,几乎热备;借助文件系统工具进行备份
    3. mysqldump
      逻辑备份工具,适用全部存储引擎,温备;支持彻底或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
    4. xtrabackup:
      由Percona公司提供支持对InnoDB作热备(物理备份)的工具,支持彻底备份、增量备份
    5. MariaDB Backup:
      从MariaDB 10.1.26开始集成,基于Percona XtraBackup 2.3.8实现
    6. mysqlbackup:
      热备份, MySQL Enterprise Edition(企业版)组件
    7. mysqlhotcopy:
      PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库

2. 冷备份示例

  • 实验目标
    冷备方法备份数据,还原数据到另外一台主机上
  • 实验步骤
    1. 数据库中止服务
             
             
             
             
             
      • 1
      [root@hai7-6 hellodb]$systemctl stop mariadb
    2. 打包数据文件,并传送给预还原主机
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      1. '打包数据库工做目录并压缩' [root@hai7-8 data]$tar Jcvf /data/mysql.bak.`date +%F`.tar.xz /data/mysql/ 2. '将数据发送到预还原主机上' [root@hai7-8 data]$scp /data/mysql.bak.2018-10-13.tar.xz 192.168.50.100:/data 3. '将配置文件发送到预还原主机' [root@hai7-8 data]$scp /etc/my.cnf 192.168.50.100:/data
    3. 将备份的配置文件覆盖还原主机上的配置文件
             
             
             
             
             
      • 1
      [root@hai7-8 mysql]$mv /data/my.cnf /etc/my.cnf
    4. 解压文件到/var/lib/mysql目录下,并重启服务,还原完成
             
             
             
             
             
      • 1
      • 2
      [root@hai7-8 mysql]$tar xf mysql.2018-10-13.tar.xz [root@hai7-8 mysql]$mv * /var/lib/mysql

3. 基于LVM的备份

  • 实验目的
    1. 将数据库数据文件和二进制文件分别存放
    2. 利用逻辑卷快照功能备份并恢复丢失数据
  • 准备逻辑卷
    1. 拿现有干净分区sda7做为物理卷
             
             
             
             
             
      • 1
      [root@hai7-6 data]$pvcreate /dev/sda7
    2. 将物理卷加入卷组
             
             
             
             
             
      • 1
      [root@hai7-6 data]$vgcreate vg_mysql /dev/sda7
    3. 创建两个逻辑卷分别存放数据mysqldata和二进制文件mysqlbin
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$lvcreate -n mysqldata -L 2G vg_mysql [root@hai7-6 data]$lvcreate -n mysqlbin -L 4G vg_mysql
    4. 格式化文件系统
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqlbin [root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqldata
    5. 创建两个挂载点,分别挂载mysqldata与mysqlbin
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-6 data]$mkdir /vg_data/{mysqlbin,mysqldata} -pv '将逻辑卷分别挂载到目录上' [root@hai7-6 data]$mount /dev/vg_mysql/mysqlbin /vg_data/mysqlbin/ [root@hai7-6 data]$mount /dev/vg_mysql/mysqldata /vg_data/mysqldata/
  • 数据备份
    1. 修改以上逻辑卷挂载目录权限,确保mysql程序有写权限
             
             
             
             
             
      • 1
      [root@hai7-6 data]$chown mysql.mysql /vg_data/
    2. 修改配置文件指定数据保存路径,启动服务
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      [root@hai7-6 ~]$vim /etc/my.cnf [mysqld] innodb_file_per_table datadir=/vg_data/mysqldata <=将数据库路径修改成刚才创建的路径 log_bin=/vg_data/mysql-bin <=将二进制日志保存路径修改成以上创建的新目录 '启动服务' [root@hai7-6 data]$systemctl start mariadb
    3. 进入mysql,清空二进制日志文件
             
             
             
             
             
      • 1
      MariaDB [(none)]> reset master;
    4. 准备一些数据库文件,这里导入数据库hellodb
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql < hellodb_innodb.sql
    5. 请求锁定全部表
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'FLUSH TABLES WITH READ LOCK'
    6. 记录二进制文件及事件位置,方便之后使用二进制日志文件恢复备份时间点之后的文件
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-6 data]$mysql -e 'SHOW MASTER logs' > bin.log [root@hai7-6 data]$cat bin.log Log_name File_size mysql-bin.000001 7655 <==备份时二进制日志位置
    7. 建立快照
             
             
             
             
             
      • 1
      [root@hai7-6 mapper]$lvcreate -p r -s -n snap_mysql -L 1G /dev/mapper/vg_mysql-mysqld
    8. 释放锁
             
             
             
             
             
      • 1
      [root@hai7-6 mapper]$mysql -e 'UNLOCK TABLES'
    9. 在mysql中增长几条记录,后续使用二进制恢复到最新状态
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      MariaDB [hellodb]> INSERT teachers values(6,'B','30','F'); MariaDB [hellodb]> SHOW BINARY LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8059 | <==二进制日志文件更新后大小
  • 数据恢复
    还原阶段须要拒绝客户访问,保证数据不变,利用防火墙或者锁等工具实现
    1. 挂载快照卷,执行数据备份
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      因为UUID相同,因此挂载快照卷须要加-o nouuid,norecovery [root@hai7-6 vg_mysql]$mount -o nouuid,norecovery /dev/vg_mysql/snap_mysql /mnt 将快照下备份的数据拷贝到出来 [root@hai7-6 vg_mysql]$cp -av /mnt/* /data/
    2. 备份完成后,删除快照卷(快照会影响系统性能)
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      取消挂载 [root@hai7-6 vg_mysql]$umount /mnt 删除逻辑快照 [root@hai7-6 vg_mysql]$lvremove /dev/vg_mysql/snap_mysql
    3. 模拟损坏,删除存放数据库的目录下全部文件
             
             
             
             
             
      • 1
      [root@hai7-6 vg_mysql]$rm -rf /vg_data/mysqldata/*
    4. 将备份的文件拷贝回数据库目录下,保留原属性
             
             
             
             
             
      • 1
      [root@hai7-6 vg_mysql]$cp -av /data/* /vg_data/mysqldata/
    5. 利用二进制日志还原数据到最
             
             
             
             
             
      • 1
      • 2
      • 3
      '备份数据时已经记录的二进制日志位置为mysql-bin.000001 7655 ,导出以后全部记录,多个文件需追加到同一文件' [root@hai7-6 ~]$mysqlbinlog --start-position=7655 /vg_data/mysql-bin.000001 > /root/binlong.sql [root@hai7-6 ~]$mysqlbinlog /vg_data/mysql-bin.000002 >> /root/binlong.sql
    6. 进入数据库,暂时关闭二进制日志记录功能,防止导入数据时生成新的二进制日志
             
             
             
             
             
      • 1
      MariaDB [(none)]> SET sql_log_bin=off;
    7. 将导出的二进制日志数据导入mysql中,在数据库中直接进行,命令为SOURCE
             
             
             
             
             
      • 1
      MariaDB [(none)]> SOURCE /root/binlong.sql
    8. 启动二进制日志记录功能,查看还原效果
             
             
             
             
             
      • 1
      • 2
      MariaDB [(none)]> SET sql_log_bin=on; MariaDB [hellodb]> SELECT * FROM teachers;

4. 逻辑备份工具(mysqldump, mydumper, phpMyAdmin)

  • 备份原理
    在mysql正常工做的状况下,利用mysql协议,就像mysql客户端同样,直接链接到mysql数据库上,发出查询指令,把全部的数据库读出来
  • 参考资料
    https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
  • 缺点
    schema和数据存储在一块儿、巨大的SQL语句、单个巨大的备份文件

4.1 mysqldump工具

  • 语法格式
    mysqldump [OPTIONS] database [tables]
    mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…]
    mysqldump [OPTIONS] --all-databases [OPTIONS]缓存

  • 常见选项

    1. -A| --all-databases :备份全部数据库,含create database

    2. -B| --databases db_name… :指定备份的数据库,包括create database语句

    3. -E| --events:备份相关的全部event scheduler(调度器),计划任务之类的,-A包含-E

    4. -R| --routines:备份全部存储过程和自定义函数, -A包含

    5. --triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器

    6. --default-character-set=utf8 :指定字符集

    7. --master-data[=#]: 此选项须启用二进制日志

      1. 所备份的数据以前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
      2. 记录为注释的CHANGE MASTER TO语句
        此选项会自动关闭–lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启–single-transaction)
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        '记录备份时,二进制日志文件所在位置,说明在此位置以前的数据作了备份' [root@hai7-6 data]$mysqldump -A --master-data=1 > all.sql '查看备份数据' [root@hai7-6 data]$vim all.sql '多出以下行,若是设置为--master-data=2,只是将以下行注释掉,仅作描述' CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=34742814;
    8. -F, --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会致使刷新屡次数据库。建议在同一时刻执行转储和日志刷新,可经过和--single-transaction-x--master-data一块儿使用实现,此时只刷新一第二天志,添加此选项能够区分备份前二进制文件和备份后二进制文件,不须要去文件中找备份位置

             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      1. '当前二进制日志文件是两个1和2' [root@hai7-6 data]$mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8078 | | mysql-bin.000002 | 34742814 | +------------------+-----------+ 2. '备份两个数据库hi和mysql' [root@hai7-6 data]$mysqldump -F -B hi mysql > ba.back.sql 3. '生成2个新的日志文件,也就是选项描述中-A、-B是会刷新屡次,和备份多少个数据库有关' [root@hai7-6 data]$mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8078 | | mysql-bin.000002 | 34742857 | | mysql-bin.000003 | 288 | <==刷新的二进制日志文件 | mysql-bin.000004 | 245 | <==刷新的二进制日志文件 +------------------+-----------+
    9. --compact: 去掉注释,适合调试,导出的文件没有注释描述,不推荐使用,有可能丢失关键信息,好比master-data=2记录的二进制备份位置

    10. -d, --no-data: 只备份表结构

    11. -t, --no-create-info: 只备份数据,不备份create table

    12. -n,--no-create-db: 不备份create database,可被-A或-B覆盖

    13. --flush-privileges:备份系统数据库mysql时须要使用

    14. -f, --force: 忽略SQL错误,继续执行

    15. --hex-blob: 使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT

    16. -q, --quick: 不缓存查询,直接输出,加快备份速度

  • 备份还原示例

    1. 示例一: 默认设置读取数据库数据,并还原(不建议使用,须要手动建立数据库,数据库建立信息极可能不许确)
      1. 读取数据库hellodb数据,导出到文件hellodb_back.sql中
                 
                 
                 
                 
                 
        • 1
        [root@hai7-6 data]$mysqldump hellodb > /data/hellodb_bak.sql
      2. 模拟数据库破坏,删除hellodb数据库
                 
                 
                 
                 
                 
        • 1
        [root@hai7-6 data]$mysql -e 'drop database hellodb'
      3. 使用默认选项读出来的数据,并无建立数据库命令,还原数据库须要手动建立数据库
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        1. '建立数据库,极可能与原建立属性不一样' [root@hai7-6 data]$mysql -e 'create database hi' 2. '将数据导入新建的数据库中(这里必须指定数据库),完成恢复' [root@hai7-6 data]$mysql hi < /data/hellodb_bak.sql
    2. 示例二:加上选项-A、-B备份,只要有的数据库都会备份,使输出的信息更完整包括建立命令
      1. 备份全部数据库
        选项-A
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        [root@hai7-6 mysqldata]$mysqldump -A > /data/all'data+%F'.sql 查看导出的数据 [root@hai7-6 mysqldata]$vim /data/alldata+%F.sql CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hi` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `hi`; <==建立数据库的SQL语句,只要有的数据库都会输出建立语句
        选项-B
                 
                 
                 
                 
                 
        • 1
        • 2
        '能够同时备份多个,例如hi和mysql两个数据库' [root@hai7-6 mysqldata]$mysqldump -B hi mysql > /data/b'data+%F'.sql
      2. 模拟故障,删除数据库
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 mysqldata]$mysql -e 'drop database hi' [root@hai7-6 mysqldata]$mysql -e 'drop database mysql' '查看删除后数据库保留状况' [root@hai7-6 mysqldata]$mysql -e 'show databases' +--------------------+ | Database | +--------------------+ | information_schema | | performance_schema | | test | +--------------------+
      3. 还原,因为备份中已经有库建立语句,能够直接导入
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 mysqldata]$mysql < /data/bdata+%F.sql [root@hai7-6 mysqldata]$mysql -e 'show databases' +--------------------+ | Database | +--------------------+ | information_schema | | hi | | mysql | | performance_schema | | test | +--------------------+
  • 输出备份数据时同时压缩
    压缩工具默认是读取屏幕输出,压缩导入指定文件,能够配合mysqldump工具,直接压缩备份文件

         
         
         
         
         
    • 1
    [root@hai7-6 ~]$mysqldump -B hi |gzip > /data/a.sql.gz
  • 编制脚本,实现将mysql中的数据库分库备份

    1. 数据库库信息输出格式以下所示,首先挑出不须要备份的库
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      [root@hai7-6 data]$mysql -e 'show databases' |cat Database <==表头,不须要备份 information_schema <==状态信息,不须要备份 hi mysql performance_schema <==状态信息,不须要备份 test
    2. 实现方法
      方法1:while…do…done
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'show databases' | grep -Ev 'Database|information|performance'|while read dbname ;do mysqldump -B $dbname|gzip > /data/${dbname}_bak`date +%F`.gz;done
      方法2 :使用sed语句实现
      bash能够接收标准输出,标准输出是一个可执行的脚本就能够执行
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'show databases'|grep -Ev '^Database|info|perfor'|sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1_bak`date +%F`.gz@'|bash
      方法3:使用for循环
             
             
             
             
             
      • 1
      [root@hai7-6 data]$for db in `mysql -e 'show databases'|grep -Ev '^Database|info|perfor'`;do mysqldump -B $db |gzip > /data/${db}_bak`date +%F`.gz;done

4.2 MyISAM、InnoDB再mysqldump中特殊的备份选项

  • MyISAM
    支持温备;不支持热备,因此必须先锁定要备份的库,然后启动备份操做
    锁定方法以下:

    1. -x,--lock-all-tables:加全局读锁,锁定全部库的全部表,同时加–single-transaction或–lock-tables选项会关闭此选项功能
      注意:数据量大时,可能会致使长时间没法并发访问数据库
    2. -l,--lock-tables:对于须要备份的每一个数据库,在启动备份以前分别锁定其全部表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会形成数据不一致
      注:以上选项对InnoDB表同样生效,实现温备,但不推荐使用
  • InnoDB备份选项
    支持热备,可用温备但不建议用温备

    1. 选项
      --single-transaction:单事务转储
      此选项Innodb中推荐使用,不适用MyISAM
      备份大型表时,建议将–single-transaction选项和–quick结合一块儿使用
    2. 做用
      此选项会开始备份前,先执行START TRANSACTION指令开启事务,经过在单个事务中转储全部表来建立一致的快照;仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB能够); 转储不保证与其余存储引擎保持一致。
    3. 注意实现
      1. 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其余链接使用如下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE(清空表),由于事务开启时默认级别3,可重复读状态对DDL语言起不到彻底隔离做用,只有读过的表才会上锁,没有读的表,其余事务是能够作删除等操做的,再去读取数据就会不一样。
      2. 此选项和–lock-tables(此选项隐含提交挂起的事务)选项是相互排斥

4.3 生产环境实战备份策略

  • InnoDB建议备份策略
         
         
         
         
         
    • 1
    mysqldump -uroot -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/backup/fullbak_$BACKUP_TIME.sql
  • MyISAM建议备份策略
         
         
         
         
         
    • 1
    mysqldump -uroot -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/BACKUP/fullbak_$BACKUP_TIME.sql
  • 示例
  1. 目的
    模拟生产环境数据库恢复,彻底备份,并还原至最新状态
  2. 步骤
    1. 将数据文件和二进制日志文件分开存放,修改配置文件,并启动二进制日志功能
             
             
             
             
             
      • 1
      • 2
      • 3
      [root@hai7-6 ~]$vim /etc/my.cnf datadir=/vg_data/mysqldata <==数据文件路径 log_bin=/vg_data/mysqlbin/mysql_bin <==二进制日志文件路径
    2. 备份数据
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$mysqldump -A -F --single-transaction --master-data=2 --hex-blob|gzip > /data/all_back.aql.gz
    3. 备份后,再建立几条记录,供二进制日志还原使用
             
             
             
             
             
      • 1
      • 2
      MariaDB [hi]> INSERT teachers VALUES(10,'A',40,'M') MariaDB [hi]> INSERT teachers VALUES(11,'B',50,'M');
    4. 模拟故障,删除全部数据文件
             
             
             
             
             
      • 1
      [root@hai7-6 data]$rm -rf /vg_data/mysqldata/*
    5. 开始还原数据,从这里开始禁止用户访问,直到还原完成,中止mariadb服务,再启动服务,生成系统数据库文件,若是是自编译安装,须要运行系统脚本生成
             
             
             
             
             
      • 1
      • 2
      • 3
      [root@hai7-6 mysqlbin]$systemctl stop mariadb '启动服务,让系统自动生成系统数据库' [root@hai7-6 mysqlbin]$systemctl start mariadb
    6. 解压备份文件
             
             
             
             
             
      • 1
      [root@hai7-6 data]$gzip -d all_back.aql.gz
    7. 中止二进制日志服务,避免导入备份文件时生成大量二进制数据,影响备份时间点后的数据恢复,将备份文件导入mysql中
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      1. '中止二进制日志服务' MariaDB [(none)]> SET sql_log_bin=off; 2. '还原彻底备份数据' MariaDB [(none)]> source /data/all_back.aql 3. '查看彻底备份还原效果' MariaDB [hi]> SELECT * FROM teachers; <==没有第3步添加的,备份后数据 +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | a | 20 | M | | 6 | B | 30 | F | | 8 | c | 100 | M | +-----+---------------+-----+--------+
    8. 查看备份文件,确认二进制日志文件备份位置,将备份后生成的数据位置导入文件,恢复到最新状态,开放用户访问数据库
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      1. '查看备份文件,确认二进制日志文件彻底备份时位置' [root@hai7-6 data]$vim all_back.aql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000002', MASTER_LOG_POS=245; 2. '将245位置后的二进制日志内容导入至文件in.sql中' [root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql 3. '进入mysql,中止二进制日志功能' MariaDB [(none)]> SET sql_log_bin=off; 4. '将备份后生成的二进制文件导入数据库中' MariaDB [hi]> SOURCE /data/in.sql 5. '恢复二进制日志记录功能' MariaDB [hi]> SET sql_log_bin=on 6. '查看恢复效果' MariaDB [hi]> SELECT * FROM teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | a | 20 | M | | 6 | B | 30 | F | | 8 | c | 100 | M | | 10 | A | 40 | M | <==备份后数据,恢复成功 | 11 | B | 50 | M | +-----+---------------+-----+--------+

4.4 误删除文件,致使系统问题

前面步骤相同,在恢复到备份文件点后,须要在二进制日志文件中,找出误删除操做,注释掉或者删除,而后将备份后二进制日志文件追加导出至指定文件,再导入系统

   
   
   
   
   
  • 1
  • 2
[root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql [root@hai7-6 data]$mysqlbinlog /vg_data/mysqlbin/mysql_bin.000003 >> in.sql

5. 专业恢复工具xtrabackup

5.1 概述

  • 官方网站
    xtrabackup是由Percona公司开发的工具
    官网:https://www.percona.com
    手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

  • 简介
    percona提供的mysql数据库备份工具,唯一开源的可以对innodb和xtradb数据库进行热备的工具

  • 特色:

    1. 备份还原过程快速、可靠
    2. 备份过程不会打断正在执行的事务
    3. 可以基于压缩等功能节约磁盘空间和流量
    4. 自动实现备份检验
    5. 开源,免费
  • Xtrabackup备份过程
    在这里插入图片描述

    1. 开启innobackupex 脚本,打开调用xtrabackup
    2. xtrabackup二进制程序建立一些对应线程,redo拷贝线程,来拷贝事务日志
    3. 开启另一个线程ibd拷贝线程来拷贝数据库文件,待数据库文件拷贝完成,结束线程,通知innobackupex 脚本,数据库文件拷贝完成
    4. innobackupex 脚本收到通知,立刻加一个全局锁,开始复制MyISAM 数据库存储引擎的相关数据,当MyISAM 数据库相关数据拷贝结束,发出中止redo拷贝的指令,xtrabackup收到指令后中止redo拷贝线程
    5. 解锁,而后等待子进程xtrabackup结束退出,整个备份结束

5.2 旧版(2.2以前)与新版xtrabackup区别

  • 旧版
    1. 包括4个可执行文件:
      1. innobackupex:Perl 脚本
        1. 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一层封装实现的
        2. 虽然目前通常不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,所以备份基本都经过 innobackupex 命令进行
      2. xtrabackup:C/C++ 编译的二进制
        用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互
      3. xbcrypt:加解密
      4. xbstream:支持并发写的流文件格式
  • 新版变化
    xtrabackup版本升级到2.4后,相比以前的2.1有了比较大的变化
    1. innobackupex 功能所有集成到 xtrabackup 里面,只有一个 binary程序
    2. 为了兼容考虑,innobackupex做为 xtrabackup 的软连接,即xtrabackup如今支持非Innodb表备份,
    3. Innobackupex在下一版本中移除,建议经过xtrabackup替换innobackupex

5.3 xtrabackup语法选项

  • 安装xtrabackup

    1. 在EPEL源中
      yum install percona-xtrabackup
    2. 最新版本下载安装:下载格式为rpm能够直接使用yum安装,须要依赖EPEL源中一些程序
      https://www.percona.com/downloads/XtraBackup/LATEST/
      新版将xtrabackup和innobackupex组合在一块儿,显示为软链接
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$ll /usr/bin/innobackupex lrwxrwxrwx 1 root root 10 Oct 14 18:23 /usr/bin/innobackupex -> xtrabackup
  • Xtrabackup备份

    1. 语法格式
      innobackupex [option] BACKUP-ROOT-DIR
    2. 选项说明
      https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
      1. --user
        该选项表示备份帐号
      2. --password
        该选项表示备份的密码
      3. --host
        该选项表示备份数据库的地址
      4. --databases
        该选项接受的参数为数据库名,若是要指定多个数据库,彼此间须要以空格隔开;如:“xtra_test dba_test”,同时,在指定某数据库时,也能够只指定其中的某张表。如:“mydatabase.mytable”。该选项对innodb引擎表无效,仍是会备份全部innodb表
      5. --defaults-file
        该选项指定从哪一个文件读取MySQL配置,必须放在命令行第一个选项位置
      6. --incremental
        该选项表示建立一个增量备份,须要指定–incremental-basedir
      7. --incremental-basedir
        该选项指定为前一次全备份或增量备份的目录,与–incremental同时使用
      8. --incremental-dir
        该选项表示还原时增量备份的目录
      9. --include=name
        指定表名,格式:databasename.tablename
  • Xtrabackup准备阶段(Prepare)

    1. 语法格式
      innobackupex --apply-log [option] BACKUP-DIR
    2. 选项说明:
      1. --apply-log
        通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处理不一致状态。此选项做用是经过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态,最后一次还原须要作的,例以下图中的T3回滚到T4,至关于零时目录的扎口,说明数据补入到此完成
      2. --use-memory
        --apply-log选项一块儿使用,当prepare 备份时,作crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
      3. --export
        表示开启可导出单独的表以后再导入其余Mysql中
      4. --redo-only
        此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并,用在T3以前的备份,确保事务不回滚,新版本为--apply-log-only
  • Xtrabackup还原阶段

    1. 语法格式
      innobackupex --copy-back [选项] BACKUP-DIR
      innobackupex --move-back [选项] [–defaults-group=GROUP-NAME] BACKUP-DIR
    2. 选项说明
      1. --copy-back
        作数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
      2. --move-back
        这个选项与–copy-back类似,惟一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须当心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
      3. --force-non-empty-directories
        指定该参数时候,使得innobackupex --copy-back--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。若是--copy-back--move-back文件须要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

5.4 Xtrabackup还原原理

在这里插入图片描述

  • Xtrabackup使用这个过程分为三个阶段

    1. 备份阶段
    2. 准备阶段:整理数据
    3. 还原阶段
  • 还原工做原理

    1. Xtrabackup在备份时会执行redo进程将事务日志进行备份,可能出现事务日志不彻底备份状况,如上图所示事务A和B,在2次增量备份中各备份了一半
    2. Xtrabackup在准备阶段会找一个零时目录,在目录中将T一、T二、T3都还原进去,凑齐完整数据,以后再进行还原阶段操做
      1. 在准备阶段,先进行彻底备份还原T1(假设T1没有不完整事务,实际工做中晚彻底备份也可能存在不完整事务,原理相同)
      2. 还原增量备份T2,因为存在不完整事务,须要增长--apply-log-only或--read-only,使其处于中间状态,在还原T3时,凑齐另外一半,尽量的保证数据完整
      3. 还原增量备份T3(后续没有备份),只能还原事务B的一半,当系统工做时事务B就会回滚,因此真实还原的时间点为回滚后的T4
      4. 若是二进制日志没有丢能够经过二进制日志找回事务B
  • 还原注意事项

    1. datadir目录必须为空。
      除非指定innobackupex --force-non-empty-directorires选项指定(强制使用非空目录 ),不然–copy-backup选项不会覆盖
    2. 在restore以前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
    3. 因为文件属性会被保留,大部分状况下须要在启动实例以前将文件的属主改成mysql,这些文件将属于建立备份的用户
      chown -R mysql:mysql /data/mysql
      以上须要在用户调用innobackupex以前完成
  • 备份生成的相关文件
    使用innobakupex备份时,其会调用xtrabackup备份全部的InnoDB表,复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中建立以下文件:

    1. xtrabackup_info:innobackupex
      工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
    2. xtrabackup_checkpoints
      备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息。数据库存放数据一样是以块(InnoDB页)为单位(16k大小),每一个块都会包含一个日志序列号,即LSN,系统备份会根据LSN记录这次备份位置,在下次增量备份时,以此位置的LSN序列号向后备份都最新数据。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的
    3. xtrabackup_binlog_info
      MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
    4. backup-my.cnf
      备份命令用到的配置选项信息
    5. xtrabackup_logfile
      备份生成的日志文件,xtrabackip还原过程的日志

5.5 旧版Xtrabackup彻底备份及还原

  • 在原主机
    1. 备份数据到目录/backups下
      innobackupex --user=root /backups
    2. 将备份数据传送到目标主机
      scp -r /backups/2018-02-23_11-55-57/ 目标主机:/data/
      旧版会自动在备份目录下生成以时间格式命名的目录如2018-02-23_11-55-57
  • 在目标主机
    1. 整理数据,将不完整的事务回滚
      innobackupex --apply-log /data/2018-02-23_11-55-57/
    2. 中止服务
      systemctl stop mariadb
    3. 删除原数据库数据
      rm -rf /var/lib/mysql/*
    4. 将整理过的数据复制到数据库工做目录,系统会自动根据配置文件找到工做目录
      innobackupex --copy-back /data/2018-02-23_11-55-57/
    5. 修改权限是mysql具备写权限
      chown -R mysql.mysql /var/lib/mysql/
    6. 启动服务
      systemctl start mariadb

5.5 新版Xtrabackup彻底备份及还原

  • 在原主机

    1. 作彻底备份到/data目录下
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$xtrabackup --backup --target-dir=/data
    2. 将备份拷贝到目标目录
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$scp -r /data 192.168.50.111:/data
  • 在目标主机上

    1. 模拟故障,中止服务,清空数据库
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 ~]$systemctl stop mariadb [root@hai7-6 ~]$rm -rf /var/lib/mysql/*
    2. 预准备:确保数据一致,提交完成的事务,回滚未完成的事务
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data
    3. 复制到数据库目录
      注意:数据库目录必须为空,MySQL服务不能启动
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data
    4. 还原属性
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '拷贝完成后的属性' [root@hai7-8 ~]$ll /var/lib/mysql/ drwxr-x--- 2 root root 310 Oct 15 10:04 hi '还原属性' [root@hai7-8 ~]$chown -R mysql:mysql /var/lib/mysql
    5. 启动服务
      systemctl start mariadb

5.6 旧版Xtrabackup彻底,增量备份及还原

  • 在原主机
    1. 彻底备份数据
      innobackupex /backups
    2. 创建两个目录存放增量备份
      mkdir /backups/inc{1,2}
    3. 修改数据库内容,作第一增量备份,加--incremental选项,表示为增量备份
             
             
             
             
             
      • 1
      innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(彻底备份生成的路径)
    4. 再次修改数据库内容,基于inc1再次增量备份
             
             
             
             
             
      • 1
      innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量备份生成的路径)
    5. 所有备份后,将数据发送给目标端
      scp -r /backups/* 目标主机:/data/
  • 在目标主机
    1. 不启动mariadb,删除数据库原工做目录下全部文件
      rm -rf /var/lib/mysql/*
    2. 第一次整理,彻底备份
      innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
    3. 第二次整理,将增量备份与彻底备份整理在一块儿
             
             
             
             
             
      • 1
      innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17
    4. 第三次整理,将第三次增量与第二次整理结果整理在一块儿
             
             
             
             
             
      • 1
      innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/
    5. 将整理好的数据复制到数据库工做目录
      innobackupex --copy-back /data/2018-02-23_14-21-42/
    6. 修改权限
      chown -R mysql.mysql /var/lib/mysql/
    7. 启动服务
      systemctl start mariadb

5.6 新版Xtrabackup彻底,增量备份及还原

  • 原主机,备份过程
    1. 备份过程,服务器必须启动
      创建3各目录,分别存放彻底备份和2次增量备份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mkdir {base,inc1,inc2}
    2. 彻底备份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/base
    3. 第一次修改数据
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(12,"AB",25,"F")'
    4. 第一次基于彻底备份的增量备份inc1
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc1 --incremental-basedir=/data/base
    5. 第二次修改数据
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(13,"BB",31,"M")'
    6. 基于inc1的二次增量备份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
    7. 拷贝备份文件到目标主机
             
             
             
             
             
      • 1
      [root@hai7-6 data]$scp -r /data/ 192.168.50.111:/data
  • 目标主机准备阶段(prepare)
    1. 整理彻底备份,此选项–apply-log-only阻止回滚未完成的事务
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base
    2. 合并第1次增量备份到彻底备份
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base --incremental-dir=/data/data/inc1
    3. 合并第2次增量备份到彻底备份:最后一次还原不须要加选项–apply-log-only
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data/base --incremental-dir=/data/data/inc2
  • 目标主机还原阶段
    1. 复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data/base
    2. 还原属性,启动服务
             
             
             
             
             
      • 1
      • 2
      [root@hai7-8 base]$chown -R mysql:mysql /var/lib/mysql [root@hai7-8 base]$systemctl start mariadb

5.7 Xtrabackup单表备份与还原

  • 版本要求
    mariadb在5.6以上版本
  • 实验目标
    用Xtrabackup备份单表,并恢复
  • 步骤
    1. 单表备份hellodb数据库的students表: --include表示指定哪一个表来备份,后跟导出目录
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$innobackupex -uroot -p123456 --include='hellodb.students' /backups
    2. 备份表结构,备份文件内有描述信息,还原时须要删除
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$mysql -p123456 -e 'SHOW CREATE TABLE hellodb.students'> students.sql
    3. 模拟误操做,删除表
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$mysql -pfree123456 -e 'DROP TABLE hellodb.students'
    4. 将备份的表设为导出状态,关键词--export
             
             
             
             
             
      • 1
      • 2
      '导出后会在备份目录多出2个文件students.cfg和students.exp' [root@hai7-8 ~]$innobackupex --apply-log --export /backups/2018-10-15_11-19-23/
    5. 按照表结构建立表,参考步骤2中的表结构,从CREATE开始日后的内容,建立表后会生成表结构文件students.frm和空的数据文件students.ibd(直接拷贝文件到数据库中,会报错‘doesn’t exist in engine’,系统数据库是识别不了的)
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      MariaDB [hellodb]> CREATE TABLE `students` > (\n `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT, > \n `Name` varchar(50) NOT NULL, > \n `Age` tinyint(3) unsigned NOT NULL, > \n `Gender` enum('F','M') NOT NULL, > \n `ClassID` tinyint(3) unsigned DEFAULT NULL, > \n `TeacherID` int(10) unsigned DEFAULT NULL, > \n PRIMARY KEY (`StuID`), > \n KEY `index_age` (`Age`), > \n KEY `idx_name_age` (`Name`,`Age`)\n) > ENGINE=InnoDB > AUTO_INCREMENT=26 > DEFAULT CHARSET=utf8;
    6. 删除表空间,也就是students.ibd文件,不能直接覆盖,须要执行SQL语句
             
             
             
             
             
      • 1
      MariaDB [hellodb]> ALTER TABLE students DISCARD TABLESPACE;
    7. 将备份表下的cfg,exp,ibd三个文件,拷贝到对应数据库工做目录
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /data/mysql/hellodb/
    8. 修改权限属性
             
             
             
             
             
      • 1
      [root@hai7-8 hellodb]$ chown -R mysql.mysql /data/mysql/hellodb
    9. 将表空间数据文件恢复回去,只拷贝过去不识别
             
             
             
             
             
      • 1
      MariaDB [hellodb]> ALTER TABLE hellodb.students IMPORT TABLESPACE;
</div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
            </div>
相关文章
相关标签/搜索