栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

innodb数据恢复实战

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

innodb数据恢复实战

一、环境&工具

环境:

工具:
1.mysql-5.6.50-winx64(5.6即可)【r7q1】
2.InnoDBRestore(恢复工具)【r7q1】

二、实战场景描述

  公司某个线上项目mysql服务器被误操作:非正常关闭数据库(多次执行kill命令+stop命令)导致数据库innodb表空间损坏严重,如图:

三、线上环境操作

1.获取目标mysql的data文件

#whereis命令快速定位mysql安装路径
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp ~]# whereis mysql
mysql: /usr/bin/mysql /usr/lib64/mysql /usr/local/mysql /usr/share/mysql
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp ~]# cd /usr/local/mysql/
#可以看到mysql的data目录
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp mysql]# ls
bin    data    docs  include  lib  LICENSE  logs  man  README  run  share  support-files
#通过mysql配置文件my.cnf确认data
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp mysql]# cat  /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data  #data路径
basedir=/usr/local/mysql
socket=/usr/local/mysql/run/mysql.sock
...
#tar打包data目录
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp mysql]# tar -czf  data.tar.gz data
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfrpfk-9rs6Wp mysql]# ls
bin    data  data.tar.gz  docs  include  lib  LICENSE  logs  man  README  run  share  support-files

2.查看损坏程度
(注:需要从新安装一个新的数据库替换其data目录)

#替换data
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov ~]# cd /srv/program/mysql-3307/
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# ls
mysql-5.7  mysql-data #更换此data
#更换前备份data
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# mv mysql-data mysql-data.bak
#将之前取得的data上传解压
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]#  tar -xvzf  /home/user1/data/data.tar.gz  -C /srv/program/mysql-3307/
#更改名字
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]#  mv data mysql-data
#赋予权限
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# chown -R mysql.mysql mysql-data
#尝试启动(失败)
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# cd mysql-5.7/
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-5.7]# ./startup.sh
#报错处理(此报错是因为ibdata1文件大小跟新安装的数据库配置文件所设置的大小不一致,一定要等于或者小于当前文件大小)
[ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different size 4864 pages (rounded down to MB) than specified in the .cnf file:initial 65536 pages, max 0 (relevant if non-zero) pages!
#修改my3307.cnf中ibdata1文件大小设置
4864/64=76MB(当前文件大小76MB)
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-5.7]# vim my3307.cnf
...
innodb_data_file_path = ibdata1:76M:autoextend
...
:wq #保存并退出
#如下报错解决(innodb表结构损坏)
[ERROR] [FATAL] InnoDB: Tablespace id is 344 in the data dictionary but in file ./csdn_garbage_system/mdr_food_truck.ibd it is 1926!
#利用innodb_force_recovery强行启动
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-5.7]# ls
bin   include  libev-4.15-7.el7.x86_64.rpm  man                my3307.cnf  mysql.sock.lock                                README  shutdown.sh  support-files
docs  lib      LICENSE                      mdr_truck_gps.sql    percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm  share   startup.sh
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# vim my3307.cnf
[mysqld]
...
innodb_force_recovery=4  #此参数分为6个等级(1、2、3、45、6,强制恢复时,应始终从innodb_force_recovery=1开始,并仅根据需要逐步增加该值。)
...
:wq   #保存并退出 
##
#1 (SRV_FORCE_IGNORE_CORRUPT)
#允许服务器运行,即使它检测到损坏的页面。尝试跳过损坏的索引记录和页面,这有助于转储表。SELECt * FROM tbl_name

#2 (SRV_FORCE_NO_BACKGROUND)
#阻止主线程和任何清除线程运行。如果在清除操作期间发生意外退出,则此恢复值将阻止它。

#3 (SRV_FORCE_NO_TRX_UNDO)
#崩溃恢复后不运行事务回滚。

#4 (SRV_FORCE_NO_IBUF_MERGE)
#阻止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表统计信息。此值可能会永久损坏数据文件。使用此值后,请准备好删除并重新创建所有二级索引。设置为只读。InnoDB

#5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
#在启动数据库时不查看撤消日志:甚至将不完整的事务视为已提交。此值可能会永久损坏数据文件。设置为只读。InnoDBInnoDB

#6 (SRV_FORCE_NO_LOG_REDO)
#不执行与恢复相关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页处于过时状态,这反过来可能会在 B 树和其他数据库结构中引入更多的损坏。设置为只读。InnoDB

#启动mysql(成功)
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-3307]# cd mysql-5.7/
[root@SCXJJDXMB-SCTFXQCDZGQSZCSJS2020-2021NXDJHXMFWHT-YF-tfyqfk-jcBhov mysql-5.7]# ./startup.sh

检查损坏情况(共453个表,只有66表结构完好无损 但是没数据,其余数据表结构+数据都损坏)如图:

#mysqlcheck命令可查看表具体损坏情况
mysqlcheck  -S mysql.sock -A -u root -p123456

四、构建恢复环境(本地环境操作)

1.向下兼容net4.0(开启功能)

2.安装net4.0以及设置环境变量(百度安装即可)
安装步骤省略(全点下一步)
C:WindowsMicrosoft.NETframeworkv4.0.30319

3.安装mysql5.6
data:从线上数据库拷贝下来的损坏文件(本次修复目标)
mysql-5.6.50-winx64:mysql包
mysqlibd:修复innodb数据工具

win+R->cmd

进入mysql的bin目录

执行以下命令

#初始化
mysqld --initialize --user=mysql --console
#安装
mysqld –install mysql
#启动mysql
net start mysql


链接本地数据库以及修改localhost的root密码
(注:第一次链接不需要密码)

五、数据恢复(本地环境操作)

1.进入D:msyqltestmysqlibd
2.利用mysqlfrm将data下需要恢复的库目录下的*.frm文件反写成sql文件

查看D:msyqltestdatacsdn_garbage_system

3.InnoDBRestore.exe恢复数据
(注:参数解释,InnoDBRepair [username] [password] [port] [srcdir] [destDB])
[username]:用户
[password]:密码
[port]:端口
[srcdir]:损坏的data目录下库的绝对路径
[destDB]: 恢复后的库名

InnoDBRestore.exe root Csdn@123 3306 D:msyqltestdatacsdn_garbage_system  csdn_garbage_system


六、数据验证(本地环境操作)

1.navicat连接数据库查看table恢复情况

2.查看表内容恢复情况





总结:从navicat导出数据生成sql文件上传到线上新搭建的数据库即可恢复,总体来看恢复效果极佳!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/694770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号