问题描述

主库的create table语句传到备库,备库SQL线程执行过程中报错:

Error 'Can't create table 'XXX.XX' (errno: -1)' on query. Default database: 'XXX'. Query: 'CREATE TABLE XX ( column_a char(32) NOT NULL, column_b int(10) DEFAULT NULL, column_c int(10) DEFAULT NULL, PRIMARY KEY (column_a), KEY expiry (column_b)) ENGINE=HEAP DEFAULT CHARSET=gbk'

备库 error log:

InnoDB: Error number 17 means 'File exists'.

InnoDB: Some operating system error numbers are described at

InnoDB: http://dev.mysql.com/doc/refman/5.5/en/operating-system-error-codes.html

InnoDB: The file already exists though the corresponding table did not

InnoDB: exist in the InnoDB data dictionary. Have you moved InnoDB

InnoDB: .ibd files around without using the SQL commands

InnoDB: DISCARD TABLESPACE and IMPORT TABLESPACE, or did

InnoDB: mysqld crash in the middle of CREATE TABLE?You can

!!!InnoDB: resolve the problem by removing the file '...'

InnoDB: under the 'datadir' of MySQL.

从error log中可以看出,数据目录中已存在 .ibd 文件,推测是在建表过程中发生 crash。

数据目录下存在 .ibd,不存在 .frm,创建.ibd 文件的时间:

-rw-rw---- 1 mysql mysql 65536 Sep 5 14:41 XXX.ibd

.ibd 文件创建时间 150905 14:41,对应时间的 error log:

150905 14:41:58 mysqld_safe Number of processes running now:0

150905 14:41:58 mysqld_safe mysqld restarted

之后也出现了和该创建失败的表相关的错误记录:

150905 14:59:45 InnoDB: Error: table `XXX`.`XX` does not exist in the InnoDB internal

问题分析

执行如下语句,模拟建表

create table test.t3 (id int);

create table 时,由函数mysql_create_frm创建 .frm 文件,mysql_create_frm 调用栈如下:

#0 mysql_create_frm

#1 rea_create_table

#2 mysql_create_table_no_lock

#3 mysql_create_table

#4 mysql_execute_command

#5 mysql_parse

t3.frm 文件生成后,实例 crash(函数mysql_create_frm 执行完毕后kill mysqld),在数据库中show tables可以看到 test.t3,但是无法插入,数据目录下 t3.frm 文件依然存在。

drop table报错

ERROR 1051 (42S02): Unknown table 'test.t3'

之后数据目录下的t3.frm不存在,show tables 无法看到t3表,可以重新创建t3表。

.ibd 文件由函数fil_create_new_single_table_tablespace创建,fil_create_new_single_table_tablespace调用栈如下:

#0 fil_create_new_single_table_tablespace

#1 dict_build_table_def_step

#2 dict_create_table_step

#3 que_thr_step

#4 que_run_threads_low

#5 que_run_threads

#6 row_create_table_for_mysql

#7 create_table_def

#8 ha_innobase::create

#9 handler::ha_create

#10 ha_create_table

#11 rea_create_table

#12 create_table_impl

#13 mysql_create_table_no_lock

#14 mysql_create_table

#15 mysql_execute_command

#16 mysql_parse

t3.ibd 文件生成后,实例 crash(函数fil_create_new_single_table_tablespace执行完毕后kill mysqld),在数据库中show tables可以看到 test.t3,无法插入数据,在数据目录下存在文件 t3.frm 和 t3.ibd。

drop table依然可以移除 t3.frm 并使show tables无法看到 t3 表。但无法移除 t3.ibd,并在重建 t3 表时报错:

ERROR 1813 (HY000): Tablespace for table '`test`.`t3`' exists. Please DISCARD the tablespace before IMPORT.

在数据目录中删除 t3.ibd ,可以正常重建 t3 表。

这个 bug 的主要原因是 MySQL 的建表过程不是原子操作。如果建表过程正在进行的时候实例 crash,可能会造成一些在实例重启后无法自动恢复的问题。就像这个问题当中的文件残留,无法通过 MySQL 客户端中的操作解决,只能手动删除文件。如果用户是远程连接数据库,又没有登录服务器操作数据文件的权限,就会影响数据库的可用性。

MySQL 5.7 的实验室版本正在设计和实现新版本的数据字典来解决这一问题。这个版本主要由以下几个特性:

数据字典将实现事务存储,首先利用 InnoDB 存储,其他存储引擎可能会跟进开发;

把分布式系统中的字典信息统一成一个整体;

使用统一的规则存储字典信息,给字典对象定义统一的API;

避免文件系统特性带来的问题。

问题解决

通过问题分析,判断备库无法建表是由于在执行create table语句时备库实例crash,且crash时.ibd 文件已存在。用户发现表创建失败,企图重建表依然失败,之后执行了drop table语句,移除了.frm文件,但.ibd文件依然存在,无法重建表。

将数据目录下的.ibd文件移到其他文件夹作为备份,在备库start slave后建表成功,主备复制正常。

mysql数据库表删了重建error_数据库内核月报 - 2015 / 09-MySQL · 捉虫动态 · 建表过程中crash造成重建表失败-阿里云开发者社区...相关推荐

  1. 阿里mysql数据库同步_如何对MySQL数据库中的数据进行实时同步-阿里云开发者社区...

    数据传输(Data Transmission) 支持以数据库为核心的结构化存储产品之间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据传输服务.数据传输致力于在公有云.混合云场景下 ...

  2. MySQL内核月报 2014.10-MySQL· 捉虫动态·binlog重放失败

    背景 在 MySQL 日常维护中,要回滚或者恢复数据,我们经常会用 binlog 来在数据库上重放,执行类似下面的语句: mysqlbinlog mysql-bin.000001 | mysql -h ...

  3. MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment

    背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引用). Innodb表定义中处理主键的逻辑是: 1.如果表定义了主键,就使用主键唯一定位一 ...

  4. mysql sql rowcount_ORACLE中的SQL%ROWCOUNT与MySQL中的ROW_COUNT()的一点异同-阿里云开发者社区...

    MySQL的ROW_COUNT()和ORACLE中的SQL%ROWCOUNT函数作用并不完全相同.从作用上来说,两者都是返回前一个SQL进行UPDATE,DELETE,INSERT操作所影响的行数,但 ...

  5. mysql 提高事物效率_怎么提高向mysql中插入数据的效率-问答-阿里云开发者社区-阿里云...

    String[] filelist = file.list(); for(String filename : filelist){ BufferedReader br = new BufferedRe ...

  6. mysql半同步 rpo_PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)-阿里云开发者社区...

    标签 PostgreSQL , 同步 , 半同步 , 流复制 背景 两节点HA架构,如何做到跨机房RPO=0(可靠性维度)?同时RTO可控(可用性维度)? 半同步是一个不错的选择. 1.当只挂掉一个节 ...

  7. canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...

    这个应该跟你的binlog记录模式有关系,binlog有3中模式,ROW(行模式), Statement(语句模式), Mixed(混合模式)三种模式的用法如下: ROW(行模式):记录那条数据修改了 ...

  8. pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区

    postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...

  9. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

最新文章

  1. Tomcat中部署后JspFactory报异常的解决方案
  2. 0-pyqt5开发环境搭建
  3. 《爬虫写得好,铁窗关到老》教你把握爬虫的法律边界!㊫
  4. 如何把本地yum源给其他机器使用_如何使用系统安装盘做yum的本地源?
  5. Java ArrayList isEmpty()方法与示例
  6. 值得看的hadoop书籍
  7. Api demo源码学习(4)--App/Activity/Dialog --Activity以Dialog形式呈现
  8. 深度探秘大数据新应用,2018 中国大数据技术大会(BDTC)强势来袭!
  9. 被马云、周鸿祎、李书福等人拉黑的微信,究竟犯了哪些众怒?
  10. tensorflow之tf.slice()
  11. 国内外网站设计与浏览习惯的差异
  12. 百度地图 | 如何获取AK
  13. proccessing 中的 port busy
  14. 【oracle】oracle筛选后导出表,载入对象选择,保存对象选择,save object selection的使用,过滤clob导出,利用osf文件
  15. go---- mgo
  16. php源码之strip_tags
  17. Dubbo优雅上下线
  18. CBTC系统标准: 1474.3---系统设计和功能分配需求
  19. 二,区块链理论(定义及特性)
  20. eclipse合作开发(SVN)下文件显示修改时间和提交作者的方法

热门文章

  1. 如何在php中插入map热点,PHP中使用BigMap实例
  2. python输入hello*3_Python3基础(一) Hello World
  3. java基础入门-预定义类与自定义类
  4. ros订阅相机深度信息_一起做ROS-DEMO系列 (2):基于find_object_2d的目标匹配识别
  5. 如何写一份优秀的Java程序员简历?
  6. 让你在浏览器也能享受H.265播放器的高清画面
  7. 全文搜索引擎选 ElasticSearch 还是 Solr
  8. 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
  9. mysql ora01031_ORA-01031:insufficient privileges解决方法
  10. php 错误传递,php-调用时通过引用传递错误,无法修复代码