2016-06-14 2 views
0

mysql-5.5 데이터가있는 mysql-5.6 서버를 시작하려고합니다. 다음과 같은 오류가 발생합니다. 나는 mysql_upgrade 오류를 실행하는 서버를 시작할 수 없습니다 :mysql.user 테이블을 복구하는 방법은 무엇입니까?

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 

mysqld --skip-grant-tables & 
[1] 6534 
[email protected]:/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) 

[email protected]:/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) 

어떻게 내가 그 테이블을 복구 할 수 --skip-그랜트 테이블 시작? 나는 이것을 시도했지만 사용자 테이블에서 데이터를 잃어 버렸다.

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) 

답변

0

문제가 해결되었습니다. 각 MYISAM 테이블은 데이터 디렉토리에 3 개의 파일을 가지고 있습니다. 사용자 테이블에 대한

,

  1. user.frm - 테이블 메타 데이터
  2. user.MYI - 색인
  3. user.MYD - 데이터

내가 user.frm 파일을 덮어 쓰기 놓친 (docker rw 변경으로 인해). 그래서 user.frm은 mysql-5.6이고 user.MYI는 mysql-5.5의 user.MYD이다. password_expired 칼럼에 5.6에 mysql 사용자 테이블이 추가되었습니다. user.frm 및 다른 파일과의 비 호환성으로 인해 복구 할 수 없었습니다. mysql-5.5 및 user.frm 복사 작업을 시도했다.

관련 문제