MySQL数据库[ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace XXX

原创 2018年04月15日 13:59:50

问题背景

昨天老师告诉我,客户的网站打开不了,让我帮忙解决下,我上服务器看了下负载,发现数据库的服务器cpu都百分100%,大多数是mysqld 这个进程。于是,我打算把数据库服务停掉重新启动,发现竟然停止不了,也启动不了,启动就报错。错误信息如下:

 2018-04-12 12:00:11 15563 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace reg/datadict uses space ID: 5 a
t filepath: ./reg/datadict.ibd. Cannot open tablespace mysql/slave_worker_info which uses space ID: 5 at filepath: ./mysql/slave_worker_info.ibd。。
InnoDB: Error: could not open single-table tablespace file ./mysql/slpwd
InnoDB: We do not continue the crash recovery, because the table may become
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.
180412 12:00:11 mysqld_safe mysqld from pid file /tmp/mysqld.pid ended

解决办法

看报错信息,说是数据库损坏了,并且也给我了错误修复的办法
这里写图片描述
于是我按照第三种方案来,设置innodb_force_recovery的值,我先设置成1,貌似不太起作用。遂上网查了下,看到有人说设置成4,于是我就抱着试试的态度,把innodb_force_recovery设置成4,结果神奇的一幕出现了,数据库启动了,真TM带尽。

后续问题

数据库虽然启动了,但是应用登录不上去,登录报错,报Failed to read auto-increment value from storage engine,我以为是数据库自增主键超了,看错误信息,是登录的时候插入日志出现问题,于是我就去看数据库看日志表的自增主键,发现才2000多,不可能超呀,于是我打算先把自增去掉,再设置自增步伐为1,但是我一操作完毕,就发现保存不了,就报

MySQL:Error : Tablespace for table '`reg`.`#sql-279b_1`' exists. Please DISCARD the tablespace before IMPORT

一脸懵逼态,于是又去搜索这个错误的答案,发现没有一个解决能解决问题,折腾了很久,一度想删库跑路。后来我想是不是所有的表都不能写操作,只能读,我就去实验了下,发现我的猜想是对的。这就奇怪了,我啥也没有做呀,凭啥就只可读不可写,想不通。于是我就出去接杯水,毕竟坐太久了。我冷静思考了下,发现整个从数据库坏死到数据库重新启动,再到数据库只能读不能写,我只动了innodb_force_recovery 这个值,我是我就去搜索innodb_force_recovery的用法,结果真TM发现问题了。

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

innodb_force_recovery 各个数字的含义

级别 含义
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)不执行前滚的操作。

解决办法

既然知道问题的根源,就需要寻找解决办法,这个我给我一种解决办法。
1. 备份数据

mysqldump -uroot -p123 test > test.sql

一定要确保数据备份成功,因为下面的操作会删除数据库的数据,没有备份成功,到时候就准备跑路吧!!!
2.删除数据文件
为了保险起见,先备份mysql 数据目录下的ib_logfile0ib_logfile1ibdata1 这三个文件(这三个文件存储着数据库的数据,可以进行后续的数据修复),然后将这三个文件删除。
3.配置my.cnf
将my.cnf中innodb_force_recovery =4(或者其他大于0的数字) 这行配置删除或者配置为innodb_force_recovery =0,重启MySQL 数据库
4.恢复数据

mysql -uroot -p123 test < test.sql

总结

当我们看到网上的答案时,一定要先弄清楚这个参数的含义时什么,用法是怎么样的,如果只是一味的复制粘贴,有可能会引发后续不可预知的错误。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011242657/article/details/79948832

Mac xampp mysql Attempted to open a previously opened tablespace

2017-01-25 10:10:16 1434 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous ...
  • ZEUSSXB
  • ZEUSSXB
  • 2017-01-25 10:37:21
  • 545

无法启动Mysql服务,错误InnoDB: Attempted to open a previously opened tablespace. - IsaacZhang

2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t...
  • Templar1000
  • Templar1000
  • 2015-01-18 08:33:26
  • 6894

错误InnoDB:Attemptedtoopenapreviouslyopenedtablespace.

2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t...
  • wx_mdq
  • wx_mdq
  • 2013-10-19 03:29:37
  • 4821

mysql服务器断电引起的风波

我在虚拟机上模拟mysql服务器突然断电的场景,在mysql正常运行的情况下直接重启服务器,结果mysql数据库起不来了,详细情况如下:   1. 重启服务器后,启动mysql报错 [root@lan...
  • langkeziju
  • langkeziju
  • 2013-11-04 16:48:08
  • 4399

无法启动Mysql服务 could not open single-table tablespace file

 无法启动Mysql服务,错误InnoDB: Attempted to open a previously opened tablespace. - IsaacZhang 时间2013-08-...
  • weizunde
  • weizunde
  • 2014-08-03 12:43:22
  • 3236

Mysql5.6启动报错, [ERROR] InnoDB: Could not find a valid tablespace file for 'pa

通过xampp1.8.3安装的环境,由于修改了my.cnf配置,kill之前的mysql实例,重启的时候,报错,错误如下: 2014-03-10 13:48:19 7948 [ERROR] Inn...
  • markboy1125
  • markboy1125
  • 2014-03-10 14:03:35
  • 4547

Mac下MAMP Pro 启动数据库MySQL出错导致无法启动的问题

问题1: InnoDB: Check that you do not already have another mysqld process InnoDB: using the same InnoD...
  • svendson
  • svendson
  • 2017-07-31 11:55:02
  • 2896

MySQL5.7 数据字典表损坏

在进行xtrabackup备份的时候,出现了mysql用户下的表损坏的情况,用show tables可以看到这些表,但查询报错。然后用源码包中的创建语句脚本重新创建表,还是报错。经查证,这是一个bug...
  • guogang83
  • guogang83
  • 2017-05-27 14:21:05
  • 515

[ERROR] InnoDB: Could not find a valid tablespace file

mysql启动报下述错误: [ERROR] InnoDB: Could not find a valid tablespace file for 'test/sys_log'. See http:...
  • lwei_998
  • lwei_998
  • 2014-12-11 17:36:08
  • 5304

MySQL Study之--MySQL增加新的表空间(tablespace)

MySQL Study之--MySQL增加新的表空间(tablespace) 系统环境:     操作系统:RedHat EL64(64)     MySQL:  Percona Ser...
  • lqx0405
  • lqx0405
  • 2015-09-11 15:25:45
  • 5644
收藏助手
不良信息举报
您举报文章:MySQL数据库[ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace XXX
举报原因:
原因补充:

(最多只允许输入30个字)