如何修复mysql.usertable?

How to repair mysql.user table?

我正在使用 mysql-5.5 数据启动 mysql-5.6 服务器。我收到以下错误。我无法为 运行 mysql_upgrade 启动服务器 错误:

2016-06-14 11:07:54 5827 [Note] InnoDB: Using atomics to ref count buffer pool pages
2016-06-14 11:07:54 5827 [Note] InnoDB: The InnoDB memory heap is disabled
2016-06-14 11:07:54 5827 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2016-06-14 11:07:54 5827 [Note] InnoDB: Memory barrier is not used
2016-06-14 11:07:54 5827 [Note] InnoDB: Compressed tables use zlib 1.2.8
2016-06-14 11:07:54 5827 [Note] InnoDB: Using Linux native AIO
2016-06-14 11:07:54 5827 [Note] InnoDB: Using CPU crc32 instructions
2016-06-14 11:07:54 5827 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2016-06-14 11:07:54 5827 [Note] InnoDB: Completed initialization of buffer pool
2016-06-14 11:07:54 5827 [Note] InnoDB: Highest supported file format is Barracuda.
2016-06-14 11:07:54 5827 [Note] InnoDB: 128 rollback segment(s) are active.
2016-06-14 11:07:54 5827 [Note] InnoDB: Waiting for purge to start
2016-06-14 11:07:54 5827 [Note] InnoDB: 5.6.30 started; log sequence number 1600607
2016-06-14 11:07:54 5827 [Note] Server hostname (bind-address): '*'; port: 3306
2016-06-14 11:07:54 5827 [Note] IPv6 is available.
2016-06-14 11:07:54 5827 [Note]   - '::' resolves to '::';
2016-06-14 11:07:54 5827 [Note] Server socket created on IP: '::'.
2016-06-14 11:07:54 5827 [ERROR] Fatal error: Can't open and lock privilege tables: Incorrect key file for table 'user'; try to repair it
160614 11:07:54 mysqld_safe mysqld from pid file   /var/run/mysqld/mysqld.pid ended

开始于 --skip-grant-tables

mysqld --skip-grant-tables &
[1] 6534
root@1428a7d90520:/var/lib/mysql# 2016-06-14 11:16:17 0 [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.
2016-06-14 11:16:17 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-06-14 11:16:17 0 [Note] mysqld (mysqld 5.6.30-0ubuntu0.14.04.1) starting as process 6534 ...
2016-06-14 11:16:18 6534 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
2016-06-14 11:16:18 6534 [Note] Plugin 'FEDERATED' is disabled.
2016-06-14 11:16:18 6534 [Note] InnoDB: Using atomics to ref count buffer pool pages
2016-06-14 11:16:18 6534 [Note] InnoDB: The InnoDB memory heap is disabled
2016-06-14 11:16:18 6534 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2016-06-14 11:16:18 6534 [Note] InnoDB: Memory barrier is not used
2016-06-14 11:16:18 6534 [Note] InnoDB: Compressed tables use zlib 1.2.8
2016-06-14 11:16:18 6534 [Note] InnoDB: Using Linux native AIO
2016-06-14 11:16:18 6534 [Note] InnoDB: Using CPU crc32 instructions
2016-06-14 11:16:21 6534 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2016-06-14 11:16:21 6534 [Note] InnoDB: Completed initialization of buffer pool
2016-06-14 11:16:21 6534 [Note] InnoDB: Highest supported file format is Barracuda.
2016-06-14 11:16:21 6534 [Note] InnoDB: 128 rollback segment(s) are active.
2016-06-14 11:16:21 6534 [Note] InnoDB: Waiting for purge to start
2016-06-14 11:16:21 6534 [Note] InnoDB: 5.6.30 started; log sequence number 1600617
2016-06-14 11:16:21 6534 [Note] Server hostname (bind-address): '*'; port: 3306
2016-06-14 11:16:21 6534 [Note] IPv6 is available.
2016-06-14 11:16:21 6534 [Note]   - '::' resolves to '::';
2016-06-14 11:16:21 6534 [Note] Server socket created on IP: '::'.
2016-06-14 11:16:21 6534 [Note] mysqld: ready for connections.
Version: '5.6.30-0ubuntu0.14.04.1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)

root@1428a7d90520:/var/lib/mysql# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.30-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>  select TABLE_NAME,ENGINE from information_schema.tables where TABLE_SCHEMA='mysql';
+---------------------------+--------+
| TABLE_NAME                | ENGINE |
+---------------------------+--------+
| columns_priv              | MyISAM |
| db                        | MyISAM |
| event                     | MyISAM |
| func                      | MyISAM |
| general_log               | CSV    |
| help_category             | MyISAM |
| help_keyword              | MyISAM |
| help_relation             | MyISAM |
| help_topic                | MyISAM |
| innodb_index_stats        | InnoDB |
| innodb_table_stats        | InnoDB |
| ndb_binlog_index          | MyISAM |
| plugin                    | MyISAM |
| proc                      | MyISAM |
| procs_priv                | MyISAM |
| proxies_priv              | MyISAM |
| servers                   | MyISAM |
| slave_master_info         | InnoDB |
| slave_relay_log_info      | InnoDB |
| slave_worker_info         | InnoDB |
| slow_log                  | CSV    |
| tables_priv               | MyISAM |
| time_zone                 | MyISAM |
| time_zone_leap_second     | MyISAM |
| time_zone_name            | MyISAM |
| time_zone_transition      | MyISAM |
| time_zone_transition_type | MyISAM |
| user                      | MyISAM |
+---------------------------+--------+
28 rows in set (0.50 sec)

mysql> repair table  mysql.user;
+------------+--------+----------+-------------------------------------------------------+
| Table      | Op     | Msg_type | Msg_text                                              |
+------------+--------+----------+-------------------------------------------------------+
| mysql.user | repair | Error    | Incorrect key file for table 'user'; try to repair it |
| mysql.user | repair | error    | Corrupt                                               |
+------------+--------+----------+-------------------------------------------------------+
2 rows in set (0.00 sec)

我该如何修复 table?我试过了,但我丢失了用户 table.

中的数据
mysql> repair table  mysql.user USE_FRM;
+------------+--------+----------+--------------------------------------------------+
| Table      | Op     | Msg_type | Msg_text                                         |
+------------+--------+----------+--------------------------------------------------+
| mysql.user | repair | info     | Key 1 - Found wrong stored record at 0           |
| mysql.user | repair | info     | Found block that points outside data file at 184 |
| mysql.user | repair | info     | Found block that points outside data file at 292 |
| mysql.user | repair | info     | Found block that points outside data file at 296 |
| mysql.user | repair | info     | Found block that points outside data file at 300 |
| mysql.user | repair | info     | Found block that points outside data file at 304 |
| mysql.user | repair | info     | Found block that points outside data file at 308 |
| mysql.user | repair | info     | Found block that points outside data file at 312 |
| mysql.user | repair | info     | Found block that points outside data file at 316 |
| mysql.user | repair | info     | Found block that points outside data file at 340 |
| mysql.user | repair | info     | Found block that points outside data file at 392 |
| mysql.user | repair | info     | Found block that points outside data file at 396 |
| mysql.user | repair | info     | Found block that points outside data file at 400 |
| mysql.user | repair | info     | Found block that points outside data file at 404 |
| mysql.user | repair | info     | Found block that points outside data file at 408 |
| mysql.user | repair | info     | Found block that points outside data file at 412 |
| mysql.user | repair | info     | Found block that points outside data file at 416 |
| mysql.user | repair | info     | Found block that points outside data file at 420 |
| mysql.user | repair | info     | Found block that points outside data file at 448 |
| mysql.user | repair | info     | Found block that points outside data file at 452 |
| mysql.user | repair | info     | Found block that points outside data file at 456 |
| mysql.user | repair | info     | Found block that points outside data file at 460 |
| mysql.user | repair | info     | Found block that points outside data file at 464 |
| mysql.user | repair | info     | Found block that points outside data file at 468 |
| mysql.user | repair | info     | Found block that points outside data file at 472 |
| mysql.user | repair | info     | Found block that points outside data file at 500 |
| mysql.user | repair | info     | Found block that points outside data file at 504 |
| mysql.user | repair | info     | Found block that points outside data file at 508 |
| mysql.user | repair | info     | Found block that points outside data file at 512 |
| mysql.user | repair | info     | Found block that points outside data file at 516 |
| mysql.user | repair | info     | Found block that points outside data file at 520 |
| mysql.user | repair | info     | Found block that points outside data file at 524 |
| mysql.user | repair | info     | Found block that points outside data file at 528 |
| mysql.user | repair | info     | Found block that points outside data file at 556 |
| mysql.user | repair | info     | Found block that points outside data file at 560 |
| mysql.user | repair | info     | Found block that points outside data file at 564 |
| mysql.user | repair | info     | Found block that points outside data file at 568 |
| mysql.user | repair | info     | Found block that points outside data file at 572 |
| mysql.user | repair | info     | Found block that points outside data file at 576 |
| mysql.user | repair | info     | Found block that points outside data file at 580 |
| mysql.user | repair | info     | Found block that points outside data file at 604 |
| mysql.user | repair | info     | Found block that points outside data file at 608 |
| mysql.user | repair | info     | Found block that points outside data file at 612 |
| mysql.user | repair | info     | Found block that points outside data file at 616 |
| mysql.user | repair | info     | Found block that points outside data file at 620 |
| mysql.user | repair | info     | Found block that points outside data file at 624 |
| mysql.user | repair | info     | Found block that points outside data file at 628 |
| mysql.user | repair | info     | Found block that points outside data file at 632 |
| mysql.user | repair | status   | OK                                               |
+------------+--------+----------+--------------------------------------------------+
49 rows in set (0.03 sec)


mysql> select * from mysql.user;
Empty set (0.01 sec)

问题现已解决。每个 MYISAM table 在数据目录中有 3 个文件。

对于用户 table、

  1. user.frm - Table 元数据
  2. user.MYI - 索引
  3. user.MYD - 数据

我错过了覆盖 user.frm 文件(因为进行了 docker rw 更改)。所以 user.frm 来自 mysql-5.6,而 user.MYI、user.MYD 来自 mysql-5.5。 password_expired 列已在 5.6 中添加 mysql 用户 table。由于与 user.frm 和其他文件不兼容,因此无法恢复。我尝试从 mysql-5.5 复制 user.frm 及其工作。