使用Xtrabackup完整备份中恢复单表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL目前采取的备份策略都是xtrabackup全备+binlog备份,如果当某天某张表意外的删除,那么如何快速从xtrabackup全备中恢复单表呢?从MySQL 5.6版本开始,支持可传输表空间(Transportable Tablespace),那么利用这个功能就可以实现单表的恢复,同样利用这个功能还可以把innodb表移动到另外一台服务器上。
MySQL目前采取的备份策略都是xtrabackup全备+binlog备份,如果当某天某张表意外的删除,那么如何快速从xtrabackup全备中恢复单表呢?从MySQL 5.6版本开始,支持可传输表空间(Transportable Tablespace),那么利用这个功能就可以实现单表的恢复,同样利用这个功能还可以把innodb表移动到另外一台服务器上。
下面进行从xtrabackup全备恢复单表的测试。
环境介绍
  • 数据库版本:MySQL-5.7.22
前期准备:
1. 数据库要求:
  • innodb_file_per_table=1
  • 当导入表空间时,目的库的页大小要和源库的页大小相匹配。
  • DISCARD TABLESPACE 不支持分区表。如果你在分区表上使用命令 ALTER TABLE ... DISCARD TABLESPACE 你会看到如下错误: ERROR 1031 (HY000): 表引擎没有这个选项。
  • DISCARD TABLESPACE 命令不支持有父子关系的表。如果 FOREIGN_KEY_CHECKS 被设置成1. 在使用命令之前我们可以将这一参数设置为0. FOREIGN_KEY_CHECKS=0.
  • ALTER TABLE ... IMPORT TABLESPACE 命令在导入表时不会检查主外键关系。
2.安装工具mysql-utilities:
# yum install mysql-utilities -y
或者:
# wget -c https://downloads.mysql.com/archives/get/file/mysql-utilities-1.6.5.tar.gz
# tar -xvf mysql-utilities-1.6.5.tar.gz
# cd mysql-utilities-1.5.3
# python ./setup.py build
# python ./setup.py install
查看原表中的数据:
root@localhost : test:55: > select count(*) from sbtest2;
+----------+
| count(*) |
+----------+
|  8503320 |
+----------+
1 row in set (32.21 sec)
2.1 执行备份:
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /data/backup
apply-log:
# innobackupex --defaults-file=/etc/my.cnf --apply-log /data/backup
删除sbtest1表
mysql> drop table sbtest.sbtest1;
利用mysql-utilities工具读取表结构(不支持MariaDB哦)
2.2 mysqlfrm相关参数介绍:
--basedir :如 --basedir=/usr/local/percona-5.6.21
--server : 如 --server=user:password@192.168.1.100:3306
--diagnostic : 开启按字节模式来恢复frm结构
--user :启动MySQL用户,通常为mysql
[root@yuelei1 test]# mysqlfrm --diagnostic sbtest2.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for sbtest2.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `sbtest2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL,
  `c` char(360) NOT NULL,
  `pad` char(180) NOT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;

#...done.

[root@yuelei1 test]# mysqlfrm --basedir=/opt/mysql sbtest2.frm --user=root --port=3307
# Spawning server with --user=root.
# Starting the spawned server on port 3307 ... done.
# Reading .frm files
#
# Reading the sbtest2.frm file.
#
# CREATE statement for sbtest2.frm:
#

CREATE TABLE `sbtest2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) COLLATE utf8_bin NOT NULL DEFAULT '',
  `pad` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

#...done.

[root@yuelei1 test]# mysqlfrm --server=powdba:abc123@127.0.0.1:3306 sbtest2.frm --user=root --port=3307    
WARNING: Using a password on the command line interface can be insecure.
# Source on 127.0.0.1: ... connected.
# Spawning server with --user=root.
# Starting the spawned server on port 3307 ... done.
# Reading .frm files
#
# Reading the sbtest2.frm file.
#
# CREATE statement for sbtest2.frm:
#

CREATE TABLE `sbtest2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
   `c` char(120) COLLATE utf8_bin NOT NULL DEFAULT '',
  `pad` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

#...done.
注:
使用-- diagnostic比 --basedir和--server模式的3倍;这应该是mysqlfrm在使用-- diagnostic 模式时,无法进行字符编码校验所致引起的。
建议:
能用--server模式时,尽量使用--server同时保证提供mysqld环境与原生产环境的一致。
2.3 执行恢复
加一个写锁,确保安全
mysql> lock tables sbtest2 write;
丢弃表空间
mysql> alter table sbtest2 discard tablespace;  
Query OK, 0 rows affected (0.00 sec)
从备份中拷贝ibd文件,并且修改权限
# cp /data/backup/test/sbtest2.ibd /data/mysql/data/dba_test
# chown -R mysql.mysql /data/mysql/data
这里有警告,可以忽略。详情可以看: https://yq.aliyun.com/articles/59271
检验查询数据是否一致:
mysql> alter table sbtest2 import tablespace;
Query OK, 0 rows affected, 1 warning (0.08 sec)

root@localhost : dba_test:51: > select count(*) from sbtest2;
+----------+
| count(*) |
+----------+
|  8503320 |
+----------+
1 row in set (54.43 sec)
最后解锁:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

总结:
1、 通过xtrabackup全备中的ibd文件以及frm文件恢复数据成功,这样也就代表着xtrabackup就算备份失败,只要有部分ibd文件以及frm文件保证完好,MySQL也是可以进行数据恢复的,在极端情况下也能尽可能的减少损失。但是由于xtrabackup是通过记录redo日志的方式来保存备份过程中产生的增量数据,这一部分增量数据目前还没有办法恢复。
2、 在MySQL大表迁移方案提供了一种思路:直接拷贝ibd文件的方式
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 分布式计算 Hadoop
aws s3常用命令、hdfs dfs/hadoop fs常用命令
aws s3常用命令、hdfs dfs/hadoop fs常用命令
1585 0
|
12月前
|
关系型数据库 数据库 数据安全/隐私保护
Python Web开发
Python Web开发
491 63
|
存储 缓存 监控
深入了解MySQL内存管理:如何查看MySQL使用的内存
深入了解MySQL内存管理:如何查看MySQL使用的内存
1235 1
|
存储 安全 关系型数据库
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
1151 1
|
存储 Oracle 关系型数据库
关系型数据库Oracle备份策略
【7月更文挑战第20天】
345 2
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之遇到报错“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure”,该怎么办
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
1715 0
|
前端开发 UED 开发者
【前端秘籍】掌握 display: none 与 visibility: hidden 的奥秘,让你的网页设计更上一层楼!
【8月更文挑战第23天】在Web前端开发中,常需控制元素的可见性。本文详细对比了两种主流CSS隐藏方法:`display: none`和`visibility: hidden`。`display: none`彻底移除元素在页面布局中的位置,适用于无需保留空间的隐藏场景;而`visibility: hidden`仅使元素视觉上消失,仍保留其布局位置,适用于需要动画效果或保留布局结构的情况。通过具体示例展示了两种方法的实际应用,帮助开发者根据项目需求选择最合适的方式,提升用户体验。
408 0
|
编解码 程序员 开发者
【Python】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position 0: invalid start by
【Python】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position 0: invalid start by
10684 0
|
存储 SQL 关系型数据库
MySQL数据库——存储函数(介绍、案例)
MySQL数据库——存储函数(介绍、案例)
355 0
|
存储 Java
图文并茂:JVM 内存布局详解
图文并茂:JVM 内存布局详解
399 1