环境:
工具:
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文件上传到线上新搭建的数据库即可恢复,总体来看恢复效果极佳!



