MySQL 루트 사용자의 전체 권한을 어떻게 복원 할 수 있습니까?


108

테이블 변경 기능을 포함하여 MySQL 루트 사용자로부터 실수로 일부 권한을 제거했습니다. 이 사용자를 모든 권한으로 원래 상태로 복원 할 수있는 방법이 있습니까?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
두 번째 오류는 암호 문제처럼 보입니다. 아마도 'root'@ 'localhost'계정이 이미 있다고 가정 한 내 잘못 일 것입니다. --skip-grant-tables를 사용하여 mysqld를 다시 실행하고 : "DROP USER 'root'@ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root'@ '%';" 대신? 액세스 권한을 부여해야하는 계정을 찾는 가장 좋은 방법은 "SELECT User, Host FROM mysql.user WHERE User = 'root';"...를 실행하는 것입니다. 그러면 @ 뒤에 사용해야하는 호스트 이름이 표시됩니다. GRANT 명령의 기호.
DMI

1
주제를 벗어난 주제가 아닌 경우 모드가 주제를 주제에서 벗어난 것으로 표시하는 것은 잘못된 형식입니다. 단, 주제를 식별해야하는 경우 주제에 더 적합한 다른 Stack Exchange 사이트가있을 수 있습니다. 이 갈 수있는 곳 (. 개조 부끄러운) 여기입니다 : dba.stackexchange.com
존 데이비스

^ 동의, 나는 재개하기로 투표했다. DBA 사이트의 존재로 인해 폐쇄 된 경우 , 적어도 언급되어야하고 여기에 OP가 지시되어야합니다. (또는 여기에 다른 질문의 중복으로 마감 될
수 있음

답변:


148

(가) 경우 GRANT ALL하지 작업을 수행, 시도 :

  1. 중지 mysqld하고 다시 시작하십시오.--skip-grant-tables옵션으로 .
  2. 다음 mysqld과 같이 서버에 연결합니다 mysql(예 : -p옵션 없음 , 사용자 이름이 필요하지 않을 수 있음).
  3. mysql 클라이언트에서 다음 명령을 실행하십시오.

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

그 후에 실행 GRANT ALL ON *.* TO 'root'@'localhost';하고 작동 시킬 수 있어야합니다 .


7
1. just : mysql로 ​​mysqld 서버에 연결하는 방법 2. UPDATE mysql.user SET Grant_priv = '1'WHERE User = 'root'; FLUSH 특권; 쿼리 확인, 0 개 행 영향 (0.00 초) 행 일치 : 2 개 변경 : 0 경고 : 0 쿼리 확인, 0 개 행 영향 (0.00 초). 루트 사용자로 phpMyAdmin에 로그인하면 "권한 없음"이 계속 표시됩니다.
Steven

죄송합니다. 위의 단계 후에 GRANT ALL 명령을 실행할 수 있습니다. mysqld에 연결하려면 암호가 필요하지 않습니다. 사용자 이름이 작동하는지 또는 "루트"여야하는지 기억할 수 없습니다.
DMI

2
작동하지 않습니다. Steven이 말했듯이 사용자 테이블에 대한 업데이트는 0 개의 레코드에 영향을줍니다 . 루트 사용자는 권한을 부여 할 수 없습니다.
Cerin

1
예, 작동합니다. Windows를 사용하는 경우 mysql 구성 파일 skip-grant-tables[mysqld]섹션에 임시로 추가 하면 암호없이 명령 줄에서 mysql에 액세스 할 수 있습니다.
markus

1
나는 그랜트 부분 (작동하지 않음)에 9 시간 이상 머물렀고 당신의 대답은 저를 구했습니다 ... 당신은 생명의 은인입니다. 고마워요
Ali SH

91

root실수로 사용자를 삭제 한 경우 다음 중 하나를 수행 할 수 있습니다.

  1. MySQL 서비스 중지
  2. 운영 mysqld_safe --skip-grant-tables &
  3. 유형 mysql -u root -p 하고 Enter를 누르십시오.
  4. 비밀번호를 입력하세요
  5. mysql 명령 줄에 다음을 입력합니다. use mysql;

그런 다음이 쿼리를 실행합니다.

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

그런 다음 mysqld를 다시 시작하십시오.

수정 : 2018 년 10 월 6 일

다른 사람이이 답변을 필요로하는 경우 innodb_version 5.6.36-82.010.1.24-MariaDB를 사용하여 오늘 시도 했으며 백틱 을 제거하면 작동합니다 (작은 따옴표도없고 그냥 제거).

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin, 이상한 폴더 에만 mysqld.exe있고 . "mysqld_safe"란 무엇을 의미합니까? binmysqld_safe.exe
Pacerier

4
MySQL 5.5의 경우 두 개의 priv, Event_priv 및 Trigger_priv가 더 필요합니다.
Greg Bell

나는 이것이 5.6.5에서 휴식을 상상한다
Otheus

1
- @Pacerier에 따라 이 게시물에 당신이 정말로 필요하지 않습니다 mysqld_safe: 그냥 보통의 mysqld 바이너리 실행mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber

24

나는 또한 내가 루트 사용자 였을 때 mysql 콘솔에 표시되지 않는 루트 및 데이터베이스의 권한을 제거하여 사용자 mysql>mysql -u 'userName' -p;및 비밀번호를 변경했습니다 .

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

이 명령 후에는 모두 root에있는 데이터베이스를 보여줍니다.

감사


1
나는 여러 가지를해야했다. mysqld 서비스를 중지 한 다음 mysqld_safe --skip-crant-tables &를 실행 한 다음 위의 UPDATE 명령을 실행 한 다음 mysql을 다시 시작한 다음 GRANT ALL ON을 실행해야했습니다 . TO 'user'@ 'localhost';
Nick Woodhams

5

루트에 대한 삽입 및 재로드 권한을 거부했습니다. 따라서 권한을 업데이트 한 후 FLUSH PRIVILEGES가 작동하지 않았습니다 (다시로드 권한 부족으로 인해). 그래서 우분투 16.04에서 debian-sys-maint 사용자를 사용하여 user.root 권한을 복원했습니다. 이 파일에서 user.debian-sys-maint의 비밀번호를 찾을 수 있습니다.

sudo cat /etc/mysql/debian.cnf

날 구해줘! GRANT 다시 내 루트 사용자를 만들 우분투 시스템으로 입력 할 수 있도록 --skip-그랜트 테이블 모드에서 둘 다 저를 허용 작동하지되었고, 나는 모든 권한을 업데이트 할 수있는 것보다
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

각 암호를 사용하여 루트에서 로그인하고 사용자가 무엇이든 위의 명령을 실행하기 만하면됩니다.

예를 들면 :

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
그러나 '루트'사용자가 권한을 잃어버린 경우 어떻게 작동 할 수 있습니까? 루트 사용자가이 작업을 수행하기 위해 높은 권한이 필요하지 않습니까? 이것은 나를 위해 작동하지 않았습니다.
Terungwa

3

각 열 권한에 mysql.userY을 삽입하거나 업데이트하기 만하면 됩니다.


2

로컬 컴퓨터 (mysql 버전 5.7.14)에서 WAMP를 사용하는 경우 1 단계 : my.ini 파일 열기 2 단계 : 세미콜론을 제거하여 'skip-grant-tables'줄의 주석 처리 제거 3 단계 : mysql 다시 시작 서버 4 단계 : mySQL 콘솔 시작 5 단계 :

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

6 단계 : 문제 해결 !!!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.