mysql - MAMP PRO崩溃; MySQL将不会在重新启动时启动

标签 mysql database innodb mamp

今天,在工作中,我的计算机随机冻结/崩溃。重启后,MAMP拒绝启动mysql,我不知道为什么。肯定没有其他的mysql进程正在运行。我已经检查了几次。因此,killall -9 mysqld不是解决方案。我实际上也已经完全重新安装了MAMP。

这似乎是我的MySQL日志的重要组成部分,但是我对这些东西的阅读不是很熟练,所以也许答案就在我眼前。

140527 15:06:58 mysqld_safe Starting mysqld daemon with databases from /Library/Application Support/appsolute/MAMP PRO/db/mysql
140527 15:06:58 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
140527 15:06:58 [Warning] Setting lower_case_table_names=2 because file system for /Library/Application Support/appsolute/MAMP PRO/db/mysql/ is case insensitive
140527 15:06:58 [Note] Plugin 'FEDERATED' is disabled.
140527 15:06:58 InnoDB: The InnoDB memory heap is disabled
140527 15:06:58 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140527 15:06:58 InnoDB: Compressed tables use zlib 1.2.3
140527 15:06:58 InnoDB: Initializing buffer pool, size = 128.0M
140527 15:06:58 InnoDB: Completed initialization of buffer pool
140527 15:06:58 InnoDB: highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 791075520
140527 15:06:58  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 791076717
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 8402.
InnoDB: You may have to recover from a backup.
140527 15:06:58  InnoDB: Page dump in ascii and hex (16384 bytes):
 len 16384; hex ....
InnoDB: End of page dump
140527 15:06:58  InnoDB: Page checksum 3802906200, prior-to-4.0.14-form checksum 786607151
InnoDB: stored checksum 3802906200, prior-to-4.0.14-form stored checksum 1787456768
InnoDB: Page lsn 0 791046088, low 4 bytes of lsn at page end 790720183
InnoDB: Page number (if stored to page already) 8402,
InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 0
InnoDB: Page may be an insert undo log page
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 8402.
InnoDB: You may have to recover from a backup.
InnoDB: It is also possible that your operating
InnoDB: system has corrupted its own file cache
InnoDB: and rebooting your computer removes the
InnoDB: error.
InnoDB: If the corrupt page is an index page
InnoDB: you can also try to fix the corruption
InnoDB: by dumping, dropping, and reimporting
InnoDB: the corrupt table. You can use CHECK
InnoDB: TABLE to scan your table for corruption.
InnoDB: See also http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
InnoDB: Ending processing because of a corrupt database page.
140527 15:06:58  InnoDB: Assertion failure in thread 140735261836048 in file buf0buf.c line 3619
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
19:06:58 UTC - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed, 
something is definitely wrong and this may fail.

key_buffer_size=16777216
read_buffer_size=262144
max_used_connections=0
max_threads=151
thread_count=0
connection_count=0
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 134084 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0 thread_stack 0x40000
0   mysqld                              0x000000010028081c my_print_stacktrace + 44
1   mysqld                              0x0000000100021624 handle_fatal_signal + 692
2   libsystem_platform.dylib            0x00007fff91e625aa _sigtramp + 26
3   ???                                 0x0000000000000000 0x0 + 0
4   libsystem_c.dylib                   0x00007fff9355bb1a abort + 125
5   mysqld                              0x00000001002b30af buf_page_io_complete + 959
6   mysqld                              0x00000001002b9892 buf_read_page_low + 610
7   mysqld                              0x00000001002b9fa5 buf_read_page + 85
8   mysqld                              0x00000001002b4431 buf_page_get_gen + 673
9   mysqld                              0x000000010034fdd5 trx_undo_lists_init + 373
10  mysqld                              0x0000000100348e2e trx_rseg_mem_create + 334
11  mysqld                              0x0000000100348fed trx_rseg_list_and_array_init + 157
12  mysqld                              0x000000010034a147 trx_sys_init_at_db_start + 215
13  mysqld                              0x000000010033eafd innobase_start_or_create_for_mysql + 5805
14  mysqld                              0x00000001003114c1 _ZL13innobase_initPv + 1473
15  mysqld                              0x0000000100027028 _Z24ha_initialize_handlertonP13st_plugin_int + 104
16  mysqld                              0x000000010017f0f1 _ZL17plugin_initializeP13st_plugin_int + 97
17  mysqld                              0x0000000100181810 _Z11plugin_initPiPPci + 3776
18  mysqld                              0x00000001000ccce5 _Z11mysqld_mainiPPc + 10405
19  mysqld                              0x0000000100001804 start + 52
20  ???                                 0x000000000000000a 0x0 + 10
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
140527 15:06:58 mysqld_safe mysqld from pid file /Applications/MAMP/tmp/mysql/mysql.pid ended

当尝试执行数据库转储时,我得到:(编辑:我已经修复了这部分)
mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) when trying to connect

最佳答案

前言:这听起来很糟糕,但是在执行操作之前,请务必先阅读此答案中的所有内容。花费时间不能使事情变得更糟。阅读每个步骤,希望这将使您很清楚地了解并继续使用MAMP Pro中的MySQL数据库服务器并重新运行。

因此,您的InnoDB数据库似乎崩溃了。不是应用程序本身。密钥在这里在日志中:

140527 15:06:58 InnoDB: highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 791075520
140527 15:06:58  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 791076717
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 8402.
InnoDB: You may have to recover from a backup.

好像您在这里使用MAMP PRO:
/Library/Application Support/appsolute/MAMP PRO/db/mysql

所以问题是,您是否有MAMP Pro数据库的备份?通过mysqldump还是其他?您的MAMP安装中是否还有其他InnoDB数据库?

另外,您说您能够运行mysqldump,但确实不可能数据库崩溃。因此,我假设当您运行mysqldump时,这是系统上另一种单独的MySQL安装。 MySQL二进制文件(例如MAMP或MAMP Pro中的mysqldump)与系统范围内的mysqldump不同。他们是两个100%不同的安装。您可以通过键入以下命令来检查正在使用的mysqldump:
which mysqldump

查看您所使用的内容的完整路径。 MAMP安装的mysqldump和其他相关二进制文件位于以下位置:
/Applications/MAMP/Library/bin/

而直接运行而不修改您的$PATH值(完全是另一回事)就是这样运行:
/Applications/MAMP/Library/bin/mysqldump

请仔细阅读:请注意,我在下面为您提供的建议是我以各种方式介绍应对这种情况的方法。如果InnoDB数据库不重要,请执行我的第一个建议,废弃InnoDB特定的DB文件。如果您有mysqldump备份,请执行相同的操作,但恢复mysqldump备份。

另外,InnoDB不是默认的存储引擎。您必须尽力设置它。默认值为MyISAM。在MySQL中创建的任何新数据库都将是MyISAM。因此,这将为您提供帮助。您需要考虑一下哪些数据库设置了InnoDB存储引擎。如果您说您有25个,但是只有1个拥有InnoDB,这是简单的解决方案。但是,如果您有25个数据库,则应养成定期进行mysqldump备份的习惯。如果您有备份,这将是一件令人头疼的事情,但很容易解决。

一项选择:删除损坏的InnoDB内容并从mysqldump备份中恢复。

如果您是我,我要做的第一件事就是备份mysql中的/Library/Application Support/appsolute/MAMP PRO/db/目录,以便您至少可以备份损坏的文件,以防万一。

然后,我将删除以下文件:
/Library/Application Support/appsolute/MAMP PRO/db/mysql/ib_logfile0
/Library/Application Support/appsolute/MAMP PRO/db/mysql/ib_logfile1
/Library/Application Support/appsolute/MAMP PRO/db/mysql/ibdata1

这些是InnoDB特定的文件。删除它们,然后尝试再次启动MAMP。它应该出现。但是,MAMP中的任何InnoDB数据库都将处于某种“僵尸”状态。您应该删除这些数据库并从备份中重新创建。或从头开始。

另一个选择:尝试使用innodb_force_recovery启动并重新运行MySQL服务器。

现在,您需要立即恢复该数据库,您可以按照此处所述运行尝试设置 innodb_force_recovery 的尝试。

对于MAMP Pro,看来您可以按照以下说明编辑MySQL配置文件:
  • 启动MAMP Pro。
  • 如果MAMP Pro服务器正在运行,请停止它。
  • 选择文件->编辑模板-> MySQL my.cnf
  • 出现一个编辑器窗口。
  • 如果出现警告消息,请单击“确定”确认。
  • 找到“[mysqld]”部分
  • 在本节的最后一行下面添加以下行:innodb_force_recovery = 1

  • 还有as the MySQL documentation explains,这严格是为了启动数据库并使其运行,因此您可以通过mysqldump进行备份:

    In such cases, use the innodb_force_recovery option to force the InnoDB storage engine to start up while preventing background operations from running, so that you can dump your tables.



    现在innodb_force_recovery大约有6个不同的值,但是您现在真的应该只尝试1。如果您想尝试6种,请按以下步骤进行:

    1 (SRV_FORCE_IGNORE_CORRUPT)

    Lets the server run even if it detects a corrupt page. Tries to make SELECT * FROM tbl_name jump over corrupt index records and pages, which helps in dumping tables.

    2 (SRV_FORCE_NO_BACKGROUND)

    Prevents the master thread and any purge threads from running. If a crash would occur during the purge operation, this recovery value prevents it.

    3 (SRV_FORCE_NO_TRX_UNDO)

    Does not run transaction rollbacks after crash recovery.

    4 (SRV_FORCE_NO_IBUF_MERGE)

    Prevents insert buffer merge operations. If they would cause a crash, does not do them. Does not calculate table statistics.

    5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

    Does not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.

    6 (SRV_FORCE_NO_LOG_REDO)

    Does not do the redo log roll-forward in connection with recovery.

    With this value, you might not be able to do queries other than a basic SELECT * FROM t, with no WHERE, ORDER BY, or other clauses. More complex queries could encounter corrupted data structures and fail.

    If corruption within the table data prevents you from dumping the entire table contents, a query with an ORDER BY primary_key DESC clause might be able to dump the portion of the table after the corrupted part.



    如果您碰巧要启动并运行数据库,然后可以执行mysqldump,那么恭喜您!你很清楚!最好的下一步是
  • 停止MySQL数据库服务器
  • 从MySQL配置中删除innodb_force_recovery选项,以便数据库服务器可以正常运行。
  • 重新启动MySQL数据库服务器。
  • 从服务器删除损坏的MySQL数据库(不要删除转储文件!这是您的备份!)
  • 创建一个要恢复的新数据库。
  • mysqldump备份导入到新数据库中。

  • 并且应该完成。

    关于mysql - MAMP PRO崩溃; MySQL将不会在重新启动时启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898787/

    相关文章:

    php - 为什么 MySQL 插入 3 个值而不是 1 个?

    database - 是否可以优化节点具有可选关系的查询?

    python - 优化mysql多次更新

    MySQL 转换表模式,同时将数据保留在新结构中(你见过的最好的模式)

    MySql 错误 2002

    database - 从 Amazon AWS EC2 服务器上的 Node.js 连接到 Redis 服务器时出错

    php - 资源 ID #5 : MySQL

    mysql - 时间戳索引

    mysql - 多个表的外键

    php - Laravel 5 添加条件子句查询