AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6859
Accepted
Alaa
Alaa
Asked: 2011-10-17 01:10:51 +0800 CST2011-10-17 01:10:51 +0800 CST 2011-10-17 01:10:51 +0800 CST

查询时出现错误“未知表引擎 'InnoDB'”。重启mysql后

  • 772

我在服务器 S1 上有 mysql DB(mysql 版本 5.1.41-3ubuntu12.7-log)。

我在服务器 S2(mysql 版本 5.1.54-1ubuntu4-log)上为这个数据库创建了主从。

S1 上的数据库使用一个数据文件 (ibdata)。

将 DB 转储到 S2 后,我设置了innodb_file_per_table=1. 这使得每个表都有自己的 ibd 文件。现在一切顺利。

在 S2 上重新启动 mysql 后,我遇到了收到此错误的问题:
Error 'Unknown table engine 'InnoDB'' on query. Default database: MyDB 当我尝试显示引擎时,我得到以下信息:

展示引擎;
+------------+---------+-------------- --------------------------------------------------+------------ ---+--------+------------+
| 引擎 | 支持 | 评论 | 交易 | XA | 保存点 |
+------------+---------+-------------- --------------------------------------------------+------------ ---+--------+------------+
| MyISAM | 默认 | MySQL 3.23 的默认引擎具有出色的性能| 否 | 否 | 否 |
| MRG_MYISAM | 是 | 相同的 MyISAM 表的集合 | 否 | 否 | 否 |
| 黑洞 | 是 | /dev/null 存储引擎(您写入的任何内容都会消失)| 否 | 否 | 否 |
| CSV | 是 | CSV 存储引擎 | 否 | 否 | 否 |
| 内存 | 是 | 基于哈希,存储在内存中,对临时表有用 | 否 | 否 | 否 |
| 联邦 | 否 | 联合 MySQL 存储引擎 | 空 | 空 | 空 |
| 存档 | 是 | 归档存储引擎 | 否 | 否 | 否 |
+------------+---------+-------------- --------------------------------------------------+------------ ---+--------+------------+

InnoDB 未列出。

在错误日志中,我可以看到:

InnoDB:数据库物理写入文件已满:等待...
InnoDB:无法初始化创建的日志文件,因为
InnoDB:数据文件已损坏,或新数据文件已损坏
InnoDB:在数据库之前启动时创建
InnoDB:时间但数据库没有关闭
InnoDB:通常在那之后。
111016 8:24:11 [错误] 插件“InnoDB”初始化函数返回错误。
111016 8:24:11 [错误] 插件“InnoDB”注册为存储引擎失败。
111016 8:24:11 [警告] 既没有使用 --relay-log 也没有使用 --relay-log-index;因此,当此 MySQL 服务器充当从属服务器并更改其主机名时,复制可能会中断!请使用 '--relay-log=S2-relay-bin' 来避免这个问题。

我试图删除 ib_logfiles 但这也不起作用。如果我删除 ib_logfiles 和 ibdata 文件,innodb 将正常返回,但我无法访问我的 innodb 表,即。删除ibdata1并重新启动mysql后

描述文章;
错误 1146 (42S02):表 'MyDb.article' 不存在

我在 my.cnf 中的 innodb 配置如下:

innodb_file_per_table=1  
innodb_flush_method=O_DIRECT  
innodb_log_file_size=1G  
innodb_buffer_pool_size=4G  
innodb_data_file_path=ibdata1:10M:autoextend  
innodb_buffer_pool_size = 384M  
innodb_log_file_size=5M  
innodb_lock_wait_timeout = 18000

虽然桌子在那里!!

以前有人遇到过这样的问题吗??

任何想法都受到高度赞赏

谢谢

mysql replication
  • 3 3 个回答
  • 16486 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-10-17T14:01:52+08:002011-10-17T14:01:52+08:00

    我有一个非常坏的消息要告诉你。

    您不应该删除 ibdata1 文件。原因如下:

    ibdata1 包含四种类型的信息:

    • 表元数据
    • MVCC 数据
    • 数据页(启用 innodb_file_per_table)
    • 索引页(启用了 innodb_file_per_table)

    创建的每个 InnoDB 表都有一个数字 id,通过一些自动增量元数据功能分配给每个 ibd 文件。该内部表空间 ID (ITSID) 嵌入在 .ibd 文件中。对照维护的 ITSID 列表检查该数字,猜猜在哪里,... ibdata1。

    我也有一个非常好的消息要告诉你,还有一些坏消息。

    可以重建 ibdata1 以获得正确的 ITSID,但要做到这一点需要工作。虽然我个人并没有单独完成程序,但我协助我雇主的虚拟主机的客户完成了这项工作。我们一起解决了这个问题,但由于客户端使用了 ibdata1,我让他完成了大部分工作(30 个 InnoDB 表)。

    无论如何,这是我在 DBA StackExchange 上发表的一篇文章。我回答了另一个问题,其根本原因是 ITSID 的混淆。

    切入正题,这里是解释如何参考 ITSID 以及如何按摩 ibdata1 以确认 .ibd 文件中包含的 ITSID 的存在的文章。

    很抱歉,除了玩带有 ITSID 的游戏之外,没有快速而简单的方法来恢复 .ibd 文件。

    更新 2011-10-17 06:19 EDT

    这是您问题中的原始 innodb 配置:

    innodb_file_per_table=1
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G
    innodb_buffer_pool_size=4G
    innodb_data_file_path=ibdata1:10M:autoextend
    innodb_buffer_pool_size = 384M
    innodb_log_file_size=5M
    innodb_lock_wait_timeout = 18000 
    

    请注意 innodb_log_file_size 有两次。仔细看...

    innodb_file_per_table=1
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G <----
    innodb_buffer_pool_size=4G
    innodb_data_file_path=ibdata1:10M:autoextend
    innodb_buffer_pool_size = 384M
    innodb_log_file_size=5M <----
    innodb_lock_wait_timeout = 18000 
    

    innodb_log_file_size 的最后一个设置优先。MySQL 预计以 5M 的日志文件启动。当您尝试启动 mysqld 时,您的 ib_logfile0 和 ib_logfile1 为 1G。它看到了大小冲突并采取了阻力最小的路径,即禁用 InnoDB。这就是为什么 InnoDB 从show engines;. 谜团已揭开 !!!

    更新 2011-10-17 11:07 EDT

    该错误消息具有欺骗性,因为 innodb_log_file_size 小于当时为 1G 的日志文件(ib_logfile0 和 ib_logfile1)。有趣的是:由于文件预计为 5M 并且文件更大,因此报告了损坏。如果情况相反并且 innodb 日志文件小于 my.cnf 中声明的大小,您应该在错误日志中得到类似的内容:

    110216 9:48:41 InnoDB: Initializing buffer pool, size = 128.0M
    110216 9:48:41 InnoDB: Completed initialization of buffer pool
    InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
    InnoDB: than specified in the .cnf file 0 33554432 bytes!
    110216 9:48:41 [ERROR] Plugin 'InnoDB' init function returned error.
    110216 9:48:41 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    

    在此示例中,日志文件已存在 5M,并且 innodb_log_file_size 的设置更大(在本例中为 32M)。

    对于这个特定的问题,我将不一致的错误消息协议归咎于 MySQL(呃 Oracle [仍然讨厌这样说])。

    • 6
  2. Derek Downey
    2011-10-17T09:50:05+08:002011-10-17T09:50:05+08:00

    错误日志表明您有一些数据损坏。发生这种情况时,InnoDB 不会在SHOW ENGINES. 您可以尝试通过执行以下步骤强制恢复:

    • 在 S2 上关闭 mysql
    • 添加innodb_force_recovery=1到您的 my.cnf 文件
    • 启动 mysql 并查看是否列出了您的数据。

    希望它在那里,您可以减少数据并将其重新加载到 S2 上。

    • 4
  3. Brad Mace
    2012-08-20T10:38:45+08:002012-08-20T10:38:45+08:00

    就我而言,使用innodb_force_recovery=1不起作用。然后我发现有第二个 mysql 实例正在运行,它不接受任何连接并且杀戮-1不起作用,所以我选择重新启动服务器。

    重新启动后,我跑了start slave,一切都自行恢复正常。

    • 0

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve