【问题标题】:Innodb and MyISAM tables issueInnodb 和 MyISAM 表问题
【发布时间】:2019-01-22 14:59:58
【问题描述】:

我的硬盘崩溃导致 SQL 数据库出现一些问题。从那以后,我从备份中重建,但不断出现对我来说毫无意义的问题。希望它会在这里的人。我真的只是在寻找有关在哪里找到问题根源的帮助。我可以从那里修复。我已经阅读了数百篇文章,并在网上无休止地搜索了这篇文章。当然,有人可能会发布一个链接,其中包含我错过的答案。

服务器较旧,运行 CentOS 5 和 MySQL 5.0.77。我打算在解决此问题后升级。

该数据库同时具有 MyISAM 和 InnoDB 表。通过 phpmyadmin,我看到 InnoDB 没有运行。我检查了 my.cnf,没有任何迹象表明它没有运行,除非我遗漏了什么。

    [mysqld]
innodb_file_per_table = 1
log-bin=/var/lib/mysql/

binlog-ignore-db=supp
server-id=5
#master-host=
#master-user=
#master-password=
#master-connect-retry=60
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
skip-name-resolve
relay-log=/data1/mysqld/mysqld-relay-bin
skip-slave
#set-variable    = join_buffer_size=60M
set-variable    = key_buffer=128M
set-variable    = max_allowed_packet=30M
set-variable    = table_cache=64
set-variable    = sort_buffer=8M
set-variable    = record_buffer=2M
set-variable    = myisam_sort_buffer_size=8M
set-variable    = thread_cache=4
set-variable    = thread_concurrency=2
set-variable    = max_connections=500
set-variable    = wait_timeout=3600

#


# Uncomment the following if you are using BDB tables
#set-variable   = bdb_cache_size=64M

# Point the following paths to different dedicated disks
tmpdir          = /var/tmp/
#log-update     = /path-to-dedicated-directory/hostname

innodb_data_home_dir=
innodb_data_file_path = /data1/ibdata/ibdata1:5000M;/data1/ibdata/ibdata2:5000M;/data1/ibdata/ibdata3:5000M;/data1/ibdata/ibdata4:5000M:autoextend
set-variable = innodb_buffer_pool_size=1G
set-variable = innodb_additional_mem_pool_size=5M
innodb_log_group_home_dir= /data1/iblogs
innodb_log_arch_dir = /data1/iblogs
set-variable = innodb_log_files_in_group=3
##
set-variable = innodb_log_file_size=100M
set-variable = innodb_log_buffer_size=16M
set-variable = innodb_file_io_threads=8
set-variable = innodb_lock_wait_timeout=100
set-variable = innodb_autoextend_increment=200
#
innodb_flush_log_at_trx_commit=0
innodb_log_archive=0

set-variable = innodb_lock_wait_timeout=100
#innodb_flush_method = O_DSYNC

[mysqldump]
quick
set-variable    = max_allowed_packet=16M

[mysql]
no-auto-rehash
#safe-updates   # Remove the comment character if you are not familiar with SQL

[isamchk]
set-variable    = key_buffer=2M
set-variable    = sort_buffer=1M
set-variable    = read_buffer=1M
set-variable    = write_buffer=1M

[myisamchk]
set-variable    = key_buffer=20M
set-variable    = sort_buffer=20M
set-variable    = read_buffer=2M
set-variable    = write_buffer=2M

在 phpmyadmin 中,所有 InnoDB 表都显示为“正在使用”并报告 1033 错误。当我创建一个新数据库并复制表时,会发生同样的事情。唯一可行的方法是从 sql 转储文件创建数据库,但这会创建旧数据,因为备份有点旧。新数据库包含所有 MyISAM 表并且它们可以工作,但从 CGI 文件中寻找数据时会出现一些语法错误。我现在可以解决这个问题。

我没有创建这台服务器,也从未管理过。我已经解决了许多问题,并且正在努力找人帮忙,但这很困难。我只要求有人指出我正确的方向。

什么会导致只有 InnoDB 表的信息不正确?我搜索了错误日志,它们报告的内容大致相同,出现大量“table.frm 中的信息不正确”错误。

为了尽可能简短,我将在此停止,但如果有必要,我很乐意解释更多。

mysqld 日志:

    190122 12:45:02  mysqld started
190122 12:45:02 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295
190122 12:45:02 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295
InnoDB: No valid checkpoint found.
InnoDB: If this error appears when you are creating an InnoDB database,
InnoDB: the problem may be that during an earlier attempt you managed
InnoDB: to create the InnoDB data files, but log file creation failed.
InnoDB: If that is the case, please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/error-creating-innodb.html
190122 12:45:03 [Warning] 'user' entry 'root@fmdb2' ignored in --skip-name-resolve mode.
190122 12:45:03 [Warning] 'user' entry 'leadtraffic@www.bravelcon.com' ignored in --skip-name-resolve mode.
190122 12:45:03 [Warning] 'db' entry 'leadtraffic leadtraffic@www.bravelcon.com' ignored in --skip-name-resolve mode.
190122 12:45:03 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.77-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution

【问题讨论】:

  • 32 位 MySQL 和/或操作系统?

标签: mysql innodb myisam


【解决方案1】:

这是一个我认为与您的情况相似的博客:https://eric.lubow.org/2010/mysql-error-1033-incorrect-information-in-file/

在这种情况下,用户启动了 MySQL 服务器,但 InnoDB 存储引擎无法初始化。在旧版本的 MySQL 中,如果 InnoDB 引擎无法启动,这不是致命错误,但正如您可能猜到的那样,如果没有该引擎,您将无法读取或写入 InnoDB 表。如果无法初始化 InnoDB,有一个选项可以强制服务器停止,但当时默认情况下没有启用此选项。

如博客所示,您可以确认 InnoDB 是否已禁用或不在引擎列表中:

mysql> SHOW ENGINES;

.FRM 文件是存在于表中的元数据文件,与存储引擎无关,因此当您查询表时,它首先打开 .FRM 文件以获取表定义。这很好,但是如果由于 InnoDB 引擎没有运行而无法读取表 data,它就会感到困惑。 "有表元数据但没有表??"

您需要找出 InnoDB 无法启动的原因,并纠正该问题。线索很可能在 MySQL 错误日志中。例如,请参阅该博客中报告的案例。

在博客中,用户发现另一个mysqld 进程已经在运行,并且在InnoDB 表空间ibdata1 上持有文件锁。所以在第二种情况下,MySQL Server 的启动无法获得对该文件的锁定而放弃了。

就您而言,正如您在几周前的问题中报告的 (ERROR /usr/libexec/mysqld: Incorrect information in file),有迹象表明您有另一个 mysqld 实例正在运行:

190105 17:11:09 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
190105 17:11:09 [ERROR] Do you already have another mysqld server running on port: 3306 ?

您在错误日志中显示的错误:

InnoDB: No valid checkpoint found.
InnoDB: If this error appears when you are creating an InnoDB database,
InnoDB: the problem may be that during an earlier attempt you managed
InnoDB: to create the InnoDB data files, but log file creation failed.

这表明 InnoDB 日志文件 ib_logfile0ib_logfile1 存在严重问题。它们可能已损坏或无法使用。当您在 mysqld 运行时尝试移动日志文件时,有时会发生这种情况。

您的 MySQL 实例处于危险状态,您可能会丢失所有数据。我真的建议您找一些合格的数据恢复专家。我在上一个回答中也提出了这个建议。

另一种选择是将其归结为经验。删除所有 InnoDB 文件,重新启动 MySQL 服务器,并让它初始化一个新的表空间(将是空的)。

【讨论】:

  • 您好比尔-感谢您的回复。我修复了 TCP/IP 的原始问题。 mysqld 日志显示了我在上面添加的内容。
  • set-variable 语法已过时,但在 5.0 中仍然有效。
猜你喜欢
  • 2012-05-15
  • 2013-07-21
  • 2012-01-13
  • 1970-01-01
  • 2014-02-03
  • 2012-03-01
  • 1970-01-01
  • 2011-12-23
  • 2011-10-17
相关资源
最近更新 更多