袁党生博客

  • 主页
  • linux基础
  • SHELL
  • WEB
  • 负载
  • 企业级应用
  • 数据库
  • KVM
  • Docker
  • K8S
  • 监控
  • 存储
  • 博客搭建问题
  1. 首页
  2. 数据库
  3. 正文

十一、MySql备份还原

2020年4月23日 1043点热度 0人点赞 0条评论


MySql备份还原

  • 为什么要备份
      灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景

  • 备份注意要点
      能容忍最多丢失多少数据
      恢复数据需要在多长时间内完成
      需要恢复哪些数据

  • 还原要点
      做还原测试,用于测试备份的可用性
      还原演练

  • 备份类型:
      完全备份,部分备份
        完全备份:整个数据集
        部分备份:只备份数据子集,如部分库或表
      完全备份、增量备份、差异备份
        增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
        差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单

  • 注意:二进制日志文件不应该与数据文件放在同一磁盘

  • 冷、温、热备份
      冷备:读写操作均不可进行
      温备:读操作可执行;但写操作不可执行
      热备:读写操作均可执行
        MyISAM:温备,不支持热备
        InnoDB:都支持

  • 物理和逻辑备份
      物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
      逻辑备份:从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度

  • 备份时需要考虑的因素
      温备的持锁多久
      备份产生的负载
      备份过程的时长
      恢复过程的时长

  • 备份什么
      数据
      二进制日志、InnoDB的事务日志
      程序代码(存储过程、函数、触发器、事件调度器)
      服务器的配置文件

  • 备份工具
      cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全备份和部分备份
      LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
      mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
      xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
      MariaDB Backup: 从MariaDB 10.1.26开始集成,基于Percona XtraBackup 2.3.8实现
      mysqlbackup:热备份, MySQL Enterprise Edition组件
      mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库

cp、tar工具备份

  • 使用cp,tar工具进行冷备
    注意:mariadb数据库建议把数据文件和表定义文件分开存放,即在配置文件中添加innodb_file_per_table选项。
    另外,两台服务器的数据库版本要一致

示例:备份整个数据库

关闭数据库服务
systemctl  stop mariadb
把数据库整个目录/var/lib/mysql打包
tar Jcvf /data/mysql.bak.tar.xz  /var/lib/mysql
注意:要把数据库配置文件也要做备份
把备份文件复制到第二台服务器
scp /data/mysql.bak.tar.xz  192.168.32.131:/data
scp   /etc/my.cnf   192.168.32.131:/etc/     
第二台服务器:
关闭数据库服务
systemctl  stop mariadb
删除数据库文件(模拟数据库文件损坏)
rm -rf /var/lib/mysql/*
解压备份文件
cd /data
tar xf  /data/mysql.bak.tar.xz 
cp -ar /data/var/lib/mysql/*  /var/lib/mysql/
注意:文件权限问题
启动服务
systemctl start mariadb

示例:备份部分数据库

关闭数据库服务
systemctl stop mariadb
进入数据库目录,把需要备份的部分数据库文件以及事务日志打包
cp -av  /var/lib/mysql/{hellodb2,ib_log*}  /data
注意:要把数据库配置文件进行备份
把备份文件打包并压缩
tar Jcvf /data/mysql1.bak.tar.xz  /var/lib/mysql/{hellodb2,ib_log*}
复制传给第二台服务器
scp mysql1.bak.tar.xz  192.168.32.131:/data

第二台服务器:
关闭数据库服务
systemctl  stop mariadb
解压备份文件并复制到/var/lib/mysql目录下
cd /data
tar xf  /data/mysql1.bak.tar.xz 
cp -ar /data/var/lib/mysql/*  /var/lib/mysql/
启动服务
systemctl start mariadb

基于LVM的备份

  • (1) 请求锁定所有表
      mysql> FLUSH TABLES WITH READ LOCK;
  • (2) 记录二进制日志文件及事件位置
      mysql> FLUSH LOGS;
      mysql> SHOW MASTER STATUS;
      mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE
  • (3) 创建快照
      lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME
  • (4) 释放锁
      mysql> UNLOCK TABLES;
  • (5) 挂载快照卷,执行数据备份
  • (6) 备份完成后,删除快照卷
  • (7) 制定好策略,通过原卷备份二进制日志

示例:逻辑卷快照备份

注意:前提是数据库放到逻辑卷中,关闭selinux
准备工作:
创建分区/dev/sda6  分区类型为lvm类型,即8e
创建逻辑卷
    pvcreate /dev/sda6
    vgcreate vg_data /dev/sda6
创建两个逻辑卷分别存放数据库数据和二进制日志文件
    lvcreate -n lv_mysqldata -L 2G vg_data   
    lvcreate -n lv_binlog -L 4G vg_data
格式化分区
    mkfs.xfs /dev/vg_data/lv_mysqldata 
    mkfs.xfs /dev/vg_data/lv_binlog
挂载逻辑卷
    mkdir /vg_data/{mysqldata,binlog} -pv
    mount /dev/vg_data/lv_mysqldata /vg_data/mysqldata/
    mount /dev/vg_data/lv_binlog /vg_data/binlog/
写入/etc/fstab
    vim /etc/fstab
    /vg_data/lv_mysqldata                    /vg_data/mysqldata    xfs     defaults  0 0
    /vg_data/lv_binlog                       /vg_data/binlog    xfs     defaults  0 0
更改逻辑卷权限
    chown -R mysql.mysql /vg_data   

更改配置文件
    vim /etc/my.cnf
    [mysqld]
    datadir=/vg_data/mysqldata
    log_bin=/vg_data/binlog/mysql-bin
    innodb_file_per_table=on
    systemctl restart mariadb

根据逻辑卷快照备份恢复数据库数据:
请求锁定所有表
    mysql> FLUSH TABLES WITH READ LOCK;
记录二进制日志文件及事件位置
    mysql> FLUSH LOGS;
    mysql> SHOW MASTER STATUS;
    mysql -e 'SHOW MASTER STATUS' > /root/bin.log
    [root@centos7 ~]# cat bin.log
    Log_name  File_size
    mysql-bin.000001  7655
在做完快照备份后,会写入新的数据,记录创建快照备份时的二进制日志文件及事件位置,便于根据二进制日志中的事件位置信息恢复从创建快照备份到现在这一段时间内的数据
创建快照,进行数据备份,
    lvcreate -s -p r -n snap_mysql -L 1G /dev/vg_data/lv_mysqldata
进入数据库释放锁
    mysql> UNLOCK TABLES;
挂载快照卷,执行数据备份
    mount -o nouuid,norecovery  /dev/vg_data/snap_mysql /mnt
    由于快照逻辑卷和数据库数据逻辑卷uuid一样,因此挂载时要使用-o nouuid,norecovery选项
打包并压缩备份文件到/data/目录下
    tar Jcvf /data/mysql.bak.xz  /mnt 
备份完毕删除快照(逻辑卷快照会影响服务器系统性能,因此使用完毕,立即删除)
    umount /mnt
    lvremove /dev/vg_data/snap_mysql

逻辑卷快照备份后数据的修改(为了实验而故意做的修改,便于实验结果的验证)
    insert teachers values(5,'aa',30,'M');
    insert teachers values(6,'bb',20,'M');

模拟破坏数据
    rm -rf /vg/data/mysqldata/*

还原快照备份的数据
解压备份文件并复制到数据库存放数据目录下
    cd /data
    tar xf mysql.bak.xz
    cp -ar /data/mnt/* /vg_data/mysqldata/
此时数据库中的数据为逻辑卷快照备份的数据
使用二进制日志把数据库数据恢复到当前最新状态
为了防止数据库恢复过程中其他用户访问生成新的数据库文件,可以使用防火墙或锁防止其他人访问
在做备份时,当时的事件位置信息为7655,我们对二进制日志进行分析,把日志中7655后的所有二进制日志文件导出来
    [root@centos7 ~]# cat bin.log
    Log_name  File_size
    mysql-bin.000001  7655
查看最新的日志位置编号
    mysql -e 'show master logs'   
重启服务,根据事件位置导出所需的二进制日志文件
    systemctl restart mariadb
    mysqlbinlog --start-position=7655 mysql-bin.000001 > /root/binlog.sql
    mysqlbinlog mysql-bin.000002 >> /root/binlog.sql 
为了防止在导入二进制日志文件时生成新的二进制日志文件,需要暂时关闭二进制日志功能
    MariaDB [(none)]> set sql_log_bin=off;
导入二进制日志恢复数据
    MariaDB [(none)]> source /root/binlog.sql
开启二进制日志功能,开始正常记录日志
    MariaDB [(none)]> set sql_log_bin=on;

备份和恢复

  • 逻辑备份工具:mysqldump, mydumper, phpMyAdmin
  • Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件
  • mysqldump工具:客户端命令,通过mysql协议连接至mysql服务器进行备份
    该工具会把结果默认在屏幕打印出来,需要重定向到其他文件中该工具会把结果默认在屏幕打印出来,需要重定向到其他文件中
    示例:

    mysqldump hellodb   把hellodb数据库创建表的过程在屏幕打印出来
    mysqldump hellodb > /data/hellodb_bak.sql   结合重定向进行备份

需要注意的是:

查看备份文件/data/hellodb_bak.sql可以发现,该备份文件中并没有创建数据库的命令,如果直接导入数据库备份文件,会出现错误
如:
[root@centos7 ~]# mysql < /data/hellodb_bak.sql 
ERROR 1046 (3D000) at line 22: No database selected
因此在还原之前要先把数据库创建出来,创建出来的数据库名称可以不用与原数据库名称一致
mysql -e 'create database hi'    创建数据库
mysql hi < /data/hellodb2_bak.sql   导入数据库

缺点:这种方法虽然可以恢复数据库数据,但是在不知道原有数据库属性的情况下(如原有数据库字符集为utf8,新创建数据库字符集为latin1),创建数据库导入数据库备份文件,可能会导致数据不一致。因此这种备份方式不推荐使用。
  • 语法:
      mysqldump [OPTIONS] database [tables]
      mysqldump [OPTIONS] –B DB1 [DB2 DB3...]
      mysqldump [OPTIONS] –A [OPTIONS]
  • mysqldump参考: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
  • mysqldump常见选项:
      -A, --all-databases 备份所有数据库,含create database,而且数据库属性也会备份下来
      -B , --databases db_name… 指定备份的数据库,包括create database语句
      注意:一般情况下,备份数据库需要输入数据库用户名密码

示例:

备份数据库
mysqldump -uroot -p -B hi hellodb2 > /data/bak_B.sql   这里我们方便做实验,为空口令登录
还原数据库
mysql < /data/bak_B.sql

为了节省空间,可以在备份的同时压缩备份文件,使用gzip,xz工具进行压缩
mysqldump -B hi |gzip > /data/hi_bak.sql.gz

  -E, --events:备份相关的所有event scheduler
  -R, --routines:备份所有存储过程和自定义函数
  --triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
  --default-character-set=utf8 指定字符集
  --master-data[=#]: 此选项须启用二进制日志
    1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
    2:记录为注释的CHANGE MASTER TO语句
    此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--single-transaction)

示例:

在备份日志中标明二进制日志位置
mysqldump -A --master-data=1 > /data/all.sql
less /data/all.mysql   查看日志内容
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=29085596;  
#在所备份的数据之前加一条记录为CHANGE MASTER TO语句,该语句默认不存在,还原时不能直接拿来用,因此加上该语句后可以直接拿来就用,便于使用
备份时的日志位置为mysql-bin.000001文件中的29085596位置;当使用二进制日志还原时,可以从此位置还原到当前最新状态
如:在教师表插入一条数据
mysql -e 'use hi;insert teachers values(5,"a",30,"m")'
此时二进制日志最新位置为29085796 
当数据丢失后,在备份的基础上,只需还原从29085596到现在位置(即29085796 )的二进制日志即可。

  -F, --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,--master-data 一起使用实现,此时只刷新一次日志

示例:

[root@centos7 ~]# mysqldump -A -F > all_F.sql
[root@centos7 ~]# mysql -e 'show master logs'
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |  29085839 |
| mysql-bin.000002 |       288 |
| mysql-bin.000003 |       288 |
| mysql-bin.000004 |       288 |
| mysql-bin.000005 |       288 |
| mysql-bin.000006 |       288 |
| mysql-bin.000007 |       245 |
+------------------+-----------+
由于有6个数据库,因此刷新6次,出现6个新的日志
可通过和--single-transaction或-x,--master-data 一起使用时刷新一次日志

  --compact 紧致格式,去掉注释内容,只留下二进制日志数据,一般情况下不推荐使用该选项

示例:

[root@centos7 ~]# mysqldump -B hi  > /data/hi_bak.sql  未添加该选项
[root@centos7 ~]# wc -l /data/hi_bak.sql
240 /data/hi_bak.sql

[root@centos7 ~]# mysqldump -B hi --compact > /data/hi_bak.sql  添加该选项
[root@centos7 ~]# wc -l /data/hi_bak.sql
89 /data/hi_bak.sql

  -d, --no-data 只备份表结构
  -t, --no-create-info 只备份数据,不备份create table
  -n,--no-create-db 不备份create database,可被-A或-B覆盖
  --flush-privileges 备份mysql或相关时需要使用
  -f, --force 忽略SQL错误,继续执行
  --hex-blob 使用十六进制符号转储二进制列,当有包括BINARY, VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
  -q, --quick 不缓存查询,直接输出,加快备份速度

  • MyISAM备份选项:
      支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
      锁定方法如下:
        -x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能
        注意:数据量大时,可能会导致长时间无法并发访问数据库
        -l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致
        注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
  • InnoDB备份选项: 支持热备,可用温备但不建议用
      --single-transaction
        此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
        此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
        此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥
        备份大型表时,建议将--single-transaction选项和--quick结合一起使用

示例1:完全备份还原至最新状态

恢复虚拟机到初始状态,以新的机器进行试验
安装mariadb-server
mkdir /data/binlog
chown mysql.mysql  /data/binlog

(1)准备工作:
vim /etc/my.cnf
[mysqld]
log-bin=/data/binlog/mysql-bin   启用二进制日志并指定路径
建议数据库数据和二进制日志分离存放
重启数据库

(2)备份:对数据库进行备份并压缩
mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/all`date +%F`.sql.gz
解压数据库备份文件
cd /datta
gzip -d all.sql.gz
查看备份文件中备份时的位置信息
less all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=245;

对数据库增加新的数据,模拟备份后新增加数据
MariaDB [hellodb]> insert teachers values(5,'a',20,'M');
MariaDB [hellodb]> insert teachers values(6,'b',30,'M');

(3)模拟破坏数据库
rm -rf /var/lib/mysql/*
停止服务
systemctl stop mariadb

注意:从还原开始,禁止用户访问数据库,防止用户看到还原产生的“脏数据”
(4)还原:还原到备份时状态
在新的服务器重装系统,安装数据库(注意数据库版本要一致)
启动服务,自动生成空的数据库文件。如果是二进制安装,则需要执行生成数据库的脚本来生成数据库文件,进而导入备份数据库文件
systemctl start mariadb
由于启动数据库服务,导入备份数据库文件会产生二进制日志,那么二进制日志位置将会产生变化,产生变化后无法再使用二进制日志把数据库恢复的最新状态,因此需要关闭暂时二进制日志功能
msql
MariaDB [(none)]> set sql_log_bin=off;
注意:由于当前对二进制功能的设置为会话级,因此不能退出当前数据库会话,否则会失效,因此需要另外开启一个会话进行后续设置;如果退出当前会话,则需要分析二进制日志文件找到导入备份数据库文件前的位置,导出所需的二进制日志

导入数据库备份文件
cd /data/
gzip -d all.sql.gz  解压备份文件
mysql < /data/all.sql 
此时,数据库恢复到备份时的状态,

(5)还原到数据库最新状态
grep "CHANGE MASTER" /data/all.sql  查看position位置信息:mysql-bin.000002  245
通过分析查看二进制日志,导出恢复数据库所需的二进制日志文件,如果有多个日志文件,需要全部导出,注意导出时使用追加而不是重定向
mysqlbinlog --start-position=245 /data/logbin/mysql-bin.000002 > /data/incr.sql
mysqlbinlog  /data/logbin/mysql-bin.000003 >> /data/incr.sql
mysqlbinlog  /data/logbin/mysql-bin.000004 >> /data/incr.sql
进入数据库,关闭二进制功能,
mysql
MariaDB [(none)]> set sql_log_bin=off;
MariaDB [(none)]> source /data/logbin/incr.sql  导入恢复数据所需的二进制日志文件
MariaDB [hellodb]> set sql_log_bin=on;   开启二进制日志继续记录日志

(6)还原完毕,开放用户访问数据库

示例2:恢复误删除的表

恢复虚拟机到初始状态
删除二进制日志,删除备份
rm -rf /data/logbin/incr.sql
rm -rf /data/all.sql

(1)准备工作:
启用二进制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=/data/logbin/mysql-bin 
(2)对数据库做完全备份:
mysqldump -A -F --single-transaction --master-data=2|gzip > /data/all.sql.gz

(3)备份后,模拟新增数据修改表
MariaDB [hellodb]> insert teachers values(7,'c',30,'F');
MariaDB [hellodb]> insert teachers values(8,'d',30,'M');
call  testlog   调用存储过程,生成testlog表

(4)模拟破坏数据,删除表
MariaDB [hellodb]> drop table testlog;
(5)删除表以后,继续增加数据

(6)禁止用户访问数据库
还原时,为了安全,增加一个全局锁,防止数据库被更改
MariaDB [(none)]> flush tables with read lock;
注意:此时要禁止用户访问数据库,使用防火墙等

(7)还原到备份时状态
注意:使用完全备份还原必须从初始化状态还原
systemctl stop mariadb   关闭服务
rm -rf /var/lib/mysql/*   删除数据库文件
systemctl start mariadb   开启服务,生成数据库文件
关闭二进制功能
mysql
MariaDB [(none)]> set sql_log_bin=off;
注意:此会话不能退出也不能关闭,后续操作开启两一个会话进行
解压备份文件
cd /data
gzip -d all.sql
导入数据库备份,恢复数据库到备份时状态
mysql
MariaDB [(none)]> source /data/all.sql;

(8)分析二进制日志,找到drop table 指令 
查看备份时位置信息mysql-bin.000002  245
less  /data/all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=245;
导出mysql-bin.000002日志文件中从245开始的所有二进制日志,分析二进制日志,找到日志中误删除数据库的命令,删除该命令
cd /data/logbin      
mysqlbinlog --start-position=245 mysql-bin.000002 > /data/incr.sql 
vim /data/incr.sql
#DROP TABLE `testlog` /* generated by server */  注释掉误删除命令保存并退出
把更改后的二进制日志导出
mysqlbinlog --start-position=245 mysql-bin.000002 > /data/incr.sql 
mysqlbinlog  mysql-bin.000003 >> /data/incr.sql
mysqlbinlog  mysql-bin.000004 >> /data/incr.sql

(9)还原数据库到最新状态
把导出的二进制日志导入数据库
mysql
MariaDB [test]> set sql_log_bin=off;
MariaDB [test]> source /data/incr.sql;
MariaDB [test]> set sql_log_bin=on;
(10)检查数据库数据是否完全恢复
(11)如果数据库数据完全无误,开放用户访问数据库

生产环境实战备份策略

  • InnoDB建议备份策略
      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建议备份策略
      mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

Xtrabackup

  • Percona
      官网:www.percona.com
      percona-server
      InnoDB --> XtraDB
  • Xtrabackup
      percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具
      手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
  • 特点:
      备份还原过程快速、可靠
      备份过程不会打断正在执行的事务
      能够基于压缩等功能节约磁盘空间和流量
      自动实现备份检验
      开源,免费
  • Xtrabackup2.2版之前包括4个可执行文件:
    innobackupex: Perl 脚本
    xtrabackup: C/C++ 编译的二进制
    xbcrypt: 加解密
    xbstream: 支持并发写的流文件格式
  • xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互
  • innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上做了一层封装实现的
  • 虽然目前一般不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行

Xtrabackup备份过程

Xtrabackup的新版变化

  • xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:
    innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex
  • xtrabackup安装:
      yum install percona-xtrabackup 在EPEL源中
      最新版本下载安装:
      https://www.percona.com/downloads/XtraBackup/LATEST/

Xtrabackup

  • 备份:innobackupex [option] BACKUP-ROOT-DIR
  • 选项说明:https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
      --user:该选项表示备份账号
      --password:该选项表示备份的密码
      --host:该选项表示备份数据库的地址
      --databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_testdba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
      --defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
      --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
      --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
      --incremental-dir:该选项表示还原时增量备份的目录
      --include=name:指定表名,格式:databasename.tablename
  • Prepare:innobackupex --apply-log [option] BACKUP-DIR
  • 选项说明:
      --apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
      --use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
      --export:表示开启可导出单独的表之后再导入其他Mysql中
      --redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
  • 还原:innobackupex --copy-back [选项] BACKUP-DIR
  • innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR
  • 选项说明:
      --copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
      --move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
  • 还原注意事项:
      1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖
      2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
      3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户
      chown -R mysql:mysql /data/mysql
      以上需要在用户调用innobackupex之前完成
      --force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

注意:

增量备份时,事务跨备份存在,如:一个事务在前一次备份中执行了一部分,在下一次备份中执行剩余部分
还原时,如果数据库正常工作,会把前一次备份中执行了一部分的事务进行回滚,那么下一次的备份还原时则无法正常还原,因为事务的前一部分执行动作被回滚
xtrabackup还原时,保持备份时的状态,使其不回滚

xtrabackup还原时,把完全备份和增量备份的数据还原到临时目录中,等数据全部还原完毕,再把临时目录下的数据复制到数据库存目录下
注意:还原时,数据库一定要处于关闭状态

LSN  日志序列号
数据库基础单位:块,16k大小
序列号随着数据的增加而变大,备份时会记录备份文件中序列号的最大值,下一次备份时,以最大值为基础,只需备份序列号大于此最大值的部分即可
如第一次备份时记录的最大值为10000,序列号随着数据的增加而变大,第二次备份时备份序列号大于10000的即可,备份完毕后记录下此次备份序列号的最大值,方便第三次备份

备份生成的相关文件

  • 使用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能够表明此页面最近是如何发生改变的
      (3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
      (4)backup-my.cnf:备份命令用到的配置选项信息
      (5)xtrabackup_logfile:备份生成的日志文件

示例1:旧版Xtrabackup完全备份及还原

1、在原主机
    innobackupex --user=root /backups
    scp -r /backups/2018-02-23_11-55-57/ 目标主机:/data/
2、在目标主机
    innobackupex --apply-log /data/2018-02-23_11-55-57/
    systemctl stop mariadb
    rm -rf /var/lib/mysql/*
    innobackupex --copy-back /data/2018-02-23_11-55-57/
    chown -R mysql.mysql /var/lib/mysql/
    systemctl start mariadb

示例2:新版Xtrabackup完全备份及还原

1 在原主机做完全备份到/data/backups
    xtrabackup --backup --target-dir=/backups/
    scp -r /backups/* 目标主机:/backups
2 在目标主机上
    1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务
    xtrabackup --prepare --target-dir=/backups/
    2)复制到数据库目录
    注意:数据库目录必须为空,MySQL服务不能启动
    xtrabackup --copy-back --target-dir=/backups/
    3)还原属性
    chown -R mysql:mysql /var/lib/mysql
    4)启动服务
    systemctl start mariadb

示例3:旧版Xtrabackup完全、增量备份及还原

1、在原主机
    innobackupex /backups
    mkdir /backups/inc{1,2}
修改数据库内容
    innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(完全备份生成的路径)
再次修改数据库内容
    innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量备份生成的路径)
    scp -r /backups/* 目标主机:/data/

2、在目标主机
    不启动mariadb
    rm -rf /var/lib/mysql/*
    innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
    innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17
    innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/
    ls /var/lib/mysql/
    innobackupex --copy-back /data/2018-02-23_14-21-42/
    chown -R mysql.mysql /var/lib/mysql/
    systemctl start mariadb

示例4:新版Xtrabackup完全、增量备份及还原

1 备份过程
    1)完全备份:xtrabackup --backup --target-dir=/backups/base
    2)第一次修改数据
    3)第一次增量备份
    xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/base
    4)第二次修改数据
    5)第二次增量
    xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1
    6)scp -r /backups/* 目标主机:/backups/
备份过程生成三个备份目录
    /backups/{base,inc1,inc2}

2还原过程
    1)预准备完成备份,此选项--apply-log-only阻止回滚未提完成的事务
        xtrabackup --prepare --apply-log-only --target-dir=/backups/base
    2)合并第1次增量备份到完全备份,
        xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1
    3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only
        xtrabackup --prepare --target-dir=/backups/base --incremental-dir=/backups/inc2
    4)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
        xtrabackup --copy-back --target-dir=/data/backups/base
    5)还原属性:chown -R mysql:mysql /var/lib/mysql
    6)启动服务:systemctl start mariadb

示例5:Xtrabackup单表导出导入

1 单表备份
    innobackupex --include='hellodb.students' /backups
2 备份表结构
    mysql -e 'show create table hellodb.students' > student.sql
3 删除表
    mysql -e 'drop table hellodb.students‘
4 innobackupex --apply-log --export /backups/2018-02-23_15-03-23/
5 创建表
    mysql>CREATE TABLE `students` (
    `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `Name` varchar(50) NOT NULL,
    `Age` tinyint(3) unsigned NOT NULL,
    `Gender` enum('F','M') NOT NULL,
    `ClassID` tinyint(3) unsigned DEFAULT NULL,
    `TeacherID` int(10) unsigned DEFAULT NULL,
    PRIMARY KEY (`StuID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
6 删除表空间
    alter table students discard tablespace;
7 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/
8 chown -R mysql.mysql /var/lib/mysql/hellodb/
9 mysql>alter table students import tablespace;
标签: 暂无
最后更新:2024年2月20日

袁党生

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 linux学习. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备18039507号-1