从完整备份恢复单个innodb表
现在大多数同学在线上采取的备份策略都是xtrabackup全备+binlog备份,那么当某天某张表意外的删除那么如何从xtrabackup全备中恢复呢?从mysql 5.6版本开始,支持可移动表空间(Transportable Tablespace)那么利用这个功能就可以实现单表的恢复,同样利用这个功能还可以把innodb表移动到另外一台服务器上。可以参考:https://yq.aliyun.com/articles/59271
下面进行从xtrabackup全备恢复单表的测试。
1. 开启了参数innodb_file_per_table
2. 安装工具:mysql-utilities,其中mysqlfrm可以读取表结构。
yum install mysql-utilities -y
查看原表中的数据:
mysql> select * from yayun.t1; +------+------+ | id | name | +------+------+ | 1 | aa | | 2 | bb | | 3 | cc | | 4 | dd | +------+------+ 4 rows in set (0.00 sec) mysql>
执行备份:
innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --sock=/data/mysql/3306/mysqltmp/mysql.sock /data/
apply-log
innobackupex --defaults-file=/data/mysql/3306/my.cnf --apply-log /data/2017-03-22_16-13-00/
删除t1表:
mysql> use yayun Database changed mysql> drop table t1; Query OK, 0 rows affected (0.13 sec) mysql>
读取表结构
mysqlfrm --diagnostic /data/2017-03-22_16-13-00/yayun/t1.frm
输出:
# Reading .frm file for /data/2017-03-22_16-13-00/yayun/t1.frm: # The .frm file is a TABLE. # CREATE TABLE Statement: CREATE TABLE `yayun`.`t1` ( `id` int(11) DEFAULT NULL, `name` char(180) DEFAULT NULL ) ENGINE=InnoDB; #...done.
建表:
mysql> use yayun Database changed mysql> CREATE TABLE `yayun`.`t1` ( -> `id` int(11) DEFAULT NULL, -> `name` char(180) DEFAULT NULL -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.08 sec) mysql>
加一个写锁,确保安全
mysql> lock tables t1 write; Query OK, 0 rows affected (0.00 sec) mysql>
丢弃表空间:
mysql> alter table t1 discard tablespace; Query OK, 0 rows affected (0.07 sec) mysql>
从备份中拷贝ibd文件,并且修改权限
[root@db_server_yayun_01 ~]# cp /data/2017-03-22_16-13-00/yayun/t1.ibd /data/mysql/3306/data/yayun/ [root@db_server_yayun_01 ~]# chown -R mysql.mysql /data/mysql/3306/data/yayun/t1.ibd
载入表空间:
mysql> alter table t1 import tablespace; Query OK, 0 rows affected, 1 warning (0.15 sec) mysql> show warnings; +---------+------+------------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './yayun/t1.cfg', will attempt to import without schema verification | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
这里有警告,可以忽略。详情可以看:https://yq.aliyun.com/articles/59271
查询数据是否一致:
mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | aa | | 2 | bb | | 3 | cc | | 4 | dd | +------+------+ 4 rows in set (0.00 sec) mysql>
最后解锁:
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) mysql>
参考文章:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2014-03-22 Redis安装以及主从实现