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

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

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

故障发现

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



查看日志

上面标记的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. NBMiner42.1版本发布,完全解锁30系LHR版本显卡

    2021年下半年,NVIDIA发布了LHR版本显卡,对显卡算力进行了限制. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核中加入了100%LHR解锁器,适用于Wind ...

  2. SpringCloud Alibaba Sentinel 限流详解

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 熔断规则 在上一篇文章中我们讲解了 ...

  3. 1个程序员单干之:怎样给我的升讯威在线客服系统编写堪比 MSDN 的用户手册

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 免费在线使用 & 免费私有化部署:https://kf.shengxunwei.com 视频实 ...

  4. php 使用phpqrcode生成二维码并上传到OSS

    一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...

  5. Windows系统开启显示文件名后缀

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年8月26日. 通常Windows系统根据文件名称的后缀来确定文件的类型.经常让朋友出现软件方面的问题,让其修改一 ...

  6. bitmap技术解析:redis与roaringBitmap

    bitmap的表象意义是,使用一个01标识位来表示是否的状态,可以达到节省空间和高效判定的效果.在我们的实际工作中,也有着许多的应用场景,相信了解bitmap定会给你带来一些额外的收获. 1. bit ...

  7. 搭建SVN服务器-腾讯云

    检查服务器SVN服务器 svn --version 出现版本号说明已安装 安装SVN yum install subversion 创建版本库 svnadmin create /opt/svn/rep ...

  8. 如何修改 node_modules 里的文件

    前言 有时候使用npm上的包,发现有bug,我们知道如何修改,但是别人可能一时半会没法更新,或者是我们特殊需求,别人不愿意修改,这时候我们只能自己动手丰衣足食.那么我们应该如何修改别人的源码呢?首先, ...

  9. 关闭windows更新、设置自启动、提高开发机性能

    做Java开发的朋友都知道,每次开机启动一堆的软件和工具,包括未写完的文档,是非常花时间的,加上一桌面的快捷方式,往往不是那么容易直接找到.windows的自动更新往往在凌晨自动启动,导致很多软件被异 ...

  10. 校验日期格式为yyyy-MM-dd

    /** * 校验时间 * * @param text * @return */ public static boolean checkTime(String text) { DateFormat fo ...