如何修复mysql.user表?
Posted
技术标签:
【中文标题】如何修复mysql.user表?【英文标题】:How to repair mysql.user table? 【发布时间】:2016-10-14 17:08:04 【问题描述】:我正在使用 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)
我该如何修理那张桌子?我试过了,但我在用户表中丢失了数据。
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)
【问题讨论】:
【参考方案1】:问题现已解决。每个 MISAM 表在数据目录中有 3 个文件。
对于用户表,
-
user.frm - 表元数据
user.MYI - 索引
user.MYD - 数据
我错过了覆盖 user.frm 文件(因为进行了 docker rw 更改)。所以 user.frm 来自 mysql-5.6 和 user.MYI,user.MYD 来自 mysql-5.5。 password_expired
列在 5.6 中添加了 mysql 用户表。由于与 user.frm 和其他文件不兼容,它是不可恢复的。我尝试从 mysql-5.5 复制 user.frm 及其工作。
【讨论】:
以上是关于如何修复mysql.user表?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 上的 MySQL 安装 - 以及如何修复丢失的 mysql.user?
mysql 忘记密码,重置密码,mysql.user表为空的解决办法
在 mysql 中重新创建一个 `mysql.user` 表
MySQL 报错ERROR 1054 (42S22): Unknown column 'plugin' in 'mysql.user'