【问题原因】服务器突然断电

【故障报告】数据库表结构损坏

【解决思路】进入强制恢复模式,备份库表及数据重建

故障发现

周末公司断电,周一启动数据库就直接报错了



查看日志

上面标记的log,明确表示是非正常关机(InnoDB: Database was not shutdown normally!)导致表结构损坏了,并且在最后给出了三种修复建议:

1)权限问题。我的文件无此类问题,略过该方案

2)跳过当前表恢复。我出错的表比较重要,全额无法通过备份恢复,所以该方案也不合适

3)调整强制恢复级别,强制修复表结构。我后续的处理,使用了选择了该方案。

备注:断电时往往数据结构都还是好的,只是mysql事务未完成,有坏的数据在这里,所以有错误。 理论上只要修复表结构、去除坏的数据,mysql就可以正常恢复了。

处理故障

如上所述,权衡之后,我采用了强制启动+导出数据重建的方式。

调整强制恢复级别

找到配置进入编辑模式:# vim /etc/my.cnf

在[mysqld]配置项下面配置(配置前需要检查,如果配置文件中已有该配置,将值改为6;如果没有则新增这项配置。)

配置文件中调整级别:(配置前需要检查,如果配置文件中已有该配置,将值改为6;如果没有则新增这项配置。)

因为之前也遇到过类似问题,低级别恢复失败了。所以我这里直接使用级别6:跳过启动检测直接进行库表重建。

如果是其他情况的启动异常,具体问题分析后再确定采用哪个级别。

innodb_force_recovery参数说明:

影响整个InnoDB存储引擎的恢复状况,默认值为0,表示当需要恢复时执行所有的恢复操作。 当不能进行有效的恢复操作时,MySQL有可能无法启动,并记录下错误日志。

innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。 当设置参数值大于0后,可以对表进行select/create/drop操作,但insert/update/delete这类操作是不允许的。

1 (SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页

2 (SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash

3 (SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。

4 (SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。

6 (SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

启动MySQL

配置改好后,就可以启动了。

启动方式选择常用的即可,但不能重复执行,否则提示进程已存在。

/etc/init.d/mysql start(在centos7.0以上版本已被systemctl start mysqld.service替代)
或者
service mysql start

正常启动后,注意此时我们只是跳过了启动检查,表数据仍然是坏的。新的数据读写操作进来,仍然可能会出错,甚至导致脏数据滚雪球般放大。因此需要修复数据

修复数据文件

修复数据采用的是导出后重建。

导出数据方式一

使用mysqldump命令导出:

如果数据顺利导出了,可以直接查看下一节重建。

导出数据方式二

使用navicat数据库连接工具远程连接数据库。

常见问题

提示密码过期

操作时出现了密码过期的提示:

尝试直接登录数据库后,没问题,但任何操作都会提示重设密码:

原因暂时不清楚,毕竟只是断电,没有数据库升级或其他动作。我直接按提示重设密码

能正常读了,接着执行备份:

执行命令:mysqldump -uroot -p --default-character-set=utf8 acc > ./acc.sql

输入密码,备份成功。

如果损坏的是MySQL系统表,无法dump

重建

此时数据已备份好,最大的风险已经没有了。

为了保险起见,接下来的操作前,可以把数据文件备份。

zip -r mysql_bak.zip /var/lib/mysql 或者直接将MySQL家目录改名(因为目前数据库已停止,不需要关闭数据库) mv /var/lib/mysql /var/lib/mysql_bak-user-date

有的人建议直接直接物理删除目录和里面的frm与ibd文件,找到mysql的data目录,找到目标库,删除整个目录,但是我没有成功。

我建议直接完全卸载mysql,直接重装数据库,因为我们现在最重要的数据已经备份出来了。这种方法百试不爽,从来没有失败过。

卸载数据库(注意使用脚本前修改相应的目录路径)

#!/bin/bash

#SelfDir
SelfDir=$(cd "$(dirname "$0")";pwd)
echo "cerrent path is :${SelfDir}" mysql='mysql' if [ `rpm -qa | grep -i $mysql | wc -l` -ne 0 ]
then
echo " installed mysql "
service mysql stop
EXISTS_RPMS=`rpm -qa | grep -i mysql`
echo ${EXISTS_RPMS}
for RPM in ${EXISTS_RPMS} do
rpm -e --nodeps ${RPM} done
## 删除残留文件
rm -fr /usr/lib/mysql
rm -fr /usr/include/mysql
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
rm -f /root/.mysql_secret
else echo "start install mysql ...." fi echo 'finished!'

重装MYSQL(这里就不演示了,需要安装之前部署的mysql版本,可以在网上查mysql安装部署)

导入备份数据

将my.cnf中的innodb_force_recovery配置改为0或直接删掉(无该配置项时MySQL默认为0)

然后重建数据库

成功完成还原。

启动应用服务正常,数据库访问正常。

整个恢复过程基本完成。

windwos服务器的恢复流程与上述一样,只是服务的启停方式,文件后缀名,卸载安装操作不一样而已

windwos启停mysql net start/stop mysql或者到“服务”中启动,停止

windwos配置文件 my.ini

centos/windows服务器,Mysql数据库表结构损坏-已解决的更多相关文章

  1. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...

  2. mysql数据库表结构导出

    mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...

  3. 比较两个mysql数据库表结构的差异

    需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...

  4. 一个漂亮的输出MySql数据库表结构的PHP页面

    经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...

  5. PHP快速获取MySQL数据库表结构

    直接举例某个数据库中只有两个数据表,一个 test ,一个 xfp_keywords ,获取他们的数据库表结构. 此功能可以用于开发人员快速获取数据表结构通过获取的数据生成各种文件形式,用来快速理解数 ...

  6. 反向读取Mysql数据库表结构到PowerDesigner中

    使用PowerDesigner挺长时间了,只是一些简单的表结构设计,因需要对当前数据库进行再设计,需要看一下数据库中所有的表,及表之间的关系,并重新修改表结构,因此需求就是怎么把数据库中的表结构反向生 ...

  7. windows下mysql数据库表名大小写不敏感

    最近新入职,领导让做个小功能先练练手.是一个添加分类的功能,有添加和列表,很简单.功能做完后提交,结果在线上出现一个大大的500. 但是我再本地环境下是正常的,我以为可能是php的版本不一致导致的问题 ...

  8. PowerDesigner逆向生成MYSQL数据库表结构总结

    由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1.      安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...

  9. powerDesigner如何动态显示mysql数据库表结构

    原文链接:http://jingyan.baidu.com/article/e5c39bf5d64efa39d760333c.html 有时候,由于数据库中的表太多,主外键关系复杂,对数据库的非设计人 ...

随机推荐

  1. Java开发学习(一)----初识Spring及其核心概念

    一. Spring系统架构 1.1 系统架构图 Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基. Spring Framework的发展也经历了很多版本的变更,每 ...

  2. Crane-scheduler:基于真实负载进行调度

    作者 邱天,腾讯云高级工程师,负责腾讯云 TKE 动态调度器与重调度器产品. 背景 原生 kubernetes 调度器只能基于资源的 resource request 进行调度,然而 Pod 的真实资 ...

  3. 类型转换——JavaSE基础

    类型转换 类型判断 可以通过Instanceof关键字判断左操作数是否是右操作数的父类或本身 强制类型转换 不能对布尔值进行转换 不能将对象类型转换为不相关的类型 把高容量转向低容量时,需要进行强制类 ...

  4. Node.js安装与环境配置

    废话不多少直接上干货.坐车扶稳, 当然你要知道Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.其次Node.js是一个事件驱动I/O服务端JavaScript环境, ...

  5. 多路分支、for循环

    多路分支 多路分支也叫做switch语句,它的格式: switch (控制表达式){ case 条件: 输出....} switch 可以看成一种跳转,每当我们满足跳转就会跳转到响应的位置,接下我们写 ...

  6. 网心云在PVE下三种磁盘IO模式(No cache,Write through,Write back)选择与优化指南

    ---------------------------------------------------------------------------------------------------- ...

  7. 【Srping】事务的执行原理(一)

    在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理. @Enab ...

  8. 让我们用Vue cli全家桶搭建项目

    一般项目都会用到这几个,这里不在详细介绍概念,只是简单的使用.一.搭建cli 1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://regi ...

  9. 关于个人项目(臻美MV【仿抖音App】)滑动切换视频的分析(前端角度)

    我们知道你天天刷抖音的时候可以上滑切换视频,互不影响.那么我们站在前端的角度能否可以实现这种效果呢?这是我的个人项目:臻美MV 下面我是用Vue写的,现在我把它开源. Vue: 初始界面 <te ...

  10. Windows 通过本地计算机IP链接Mysql设置

    前言 1.Mysql-1130错误:无法远程连接 错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL se ...