centos/windows服务器,Mysql数据库表结构损坏-已解决
【问题原因】服务器突然断电
【故障报告】数据库表结构损坏
【解决思路】进入强制恢复模式,备份库表及数据重建
故障发现
周末公司断电,周一启动数据库就直接报错了
查看日志
上面标记的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数据库表结构损坏-已解决的更多相关文章
- 用户中心mysql数据库表结构的脚本
/* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...
- mysql数据库表结构导出
mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...
- 比较两个mysql数据库表结构的差异
需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...
- 一个漂亮的输出MySql数据库表结构的PHP页面
经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作. 这 ...
- PHP快速获取MySQL数据库表结构
直接举例某个数据库中只有两个数据表,一个 test ,一个 xfp_keywords ,获取他们的数据库表结构. 此功能可以用于开发人员快速获取数据表结构通过获取的数据生成各种文件形式,用来快速理解数 ...
- 反向读取Mysql数据库表结构到PowerDesigner中
使用PowerDesigner挺长时间了,只是一些简单的表结构设计,因需要对当前数据库进行再设计,需要看一下数据库中所有的表,及表之间的关系,并重新修改表结构,因此需求就是怎么把数据库中的表结构反向生 ...
- windows下mysql数据库表名大小写不敏感
最近新入职,领导让做个小功能先练练手.是一个添加分类的功能,有添加和列表,很简单.功能做完后提交,结果在线上出现一个大大的500. 但是我再本地环境下是正常的,我以为可能是php的版本不一致导致的问题 ...
- PowerDesigner逆向生成MYSQL数据库表结构总结
由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...
- powerDesigner如何动态显示mysql数据库表结构
原文链接:http://jingyan.baidu.com/article/e5c39bf5d64efa39d760333c.html 有时候,由于数据库中的表太多,主外键关系复杂,对数据库的非设计人 ...
随机推荐
- DML数据操作语言
DML数据操作语言 用来对数据库中表的数据记录进行更新.(增删改) 插入insert -- insert into 表(列名1,列名2,列名3...) values (值1,值2,值3...):向表中 ...
- JAVA - 启动一个线程是用run()还是start()?
JAVA - 启动一个线程是用run()还是start()? 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运 ...
- linux运维基础2
内容概要 虚拟机关键配置名词解释 远程链接工具 xshell基本使用 linux命令准则 系统运⾏命令 常用快捷方式 文件命令操作 文件编辑命令 内容详情 虚拟机关键配置名词解释 # 虚拟网络编辑器说 ...
- CentOS 8.0与CentOS7.0 防火墙端口设置
一,开放端口号 firewall-cmd --zone=public --add-port=8080/tcp --permanent #开启8080端口 firewall-cmd --zone=pu ...
- Bean Validator
Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...
- 【SignalR全套系列】之在.Net Core 中实现SignalR实时通信
微信公众号:趣编程ACE 关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码 [如果觉得本公众号对您有帮助,欢迎关注] 前文回顾 [SignalR全套系列]之在.NetCo ...
- BUUCTF-假如给我三天光明
假如给我三天光明 打开压缩包可以看到一个海报,下方有盲文显示,通过对照表得知 盲文翻译为kmdonowg 通过盲文翻译得到的字符串解压压缩包得到一个音频文件 使用Audacity打开,看样子应该是摩斯 ...
- 关于webstorm更换主题
现在我们前端使用编辑器,只要用习惯就好,不过这里推荐使用webstorm,因为被称为,'js神器'的称号,不是白说的.接下来我们来看下怎么引入主题. 下面有一个网站,这个网站的名字叫 http://w ...
- JDK9对集合添加的优化of方法和Debug追踪
JDK9对集合添加的优化(of方法) JDK9的新特性: 1.List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素 2.static List of (E- ...
- 提名 Apache ShardingSphere Committer,说说方法
文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 就在前几天,收到了 Apache ShardingSphere Vote 我成为 Committer 的邮件 ...