MySQL 오류 : '사용자'root '@'localhost '에 대한 액세스가 거부되었습니다.


263

$ ./mysqladmin -u root -p ' 수정 됨 '
암호를 입력하십시오 :

mysqladmin : 'localhost'에서 서버 연결 실패 오류 :
'사용자'root '@'localhost '에 대한 액세스가 거부되었습니다 (비밀번호 사용 : YES)'

이 문제를 어떻게 해결할 수 있습니까?



1
@clearlight 같은 질문이 아닙니다,이 포스트는 mysqladmin win myprivacys mysql에 대한 문제이고, 다른 포스트는 소켓으로부터의 간단한 연결 문제입니다.
e-info128

존재하는 ~/.my.cnf파일을 제거 하십시오.
e-info128

11
나는 이것이 오래되었다는 것을 알고 있지만 앞으로의 방문객을 위해 이것을 말하고 싶습니다. 명령 자체에 mysql 비밀번호, 특히 root의 비밀번호를 입력하지 마십시오. 그렇지 않으면 쉘 히스토리에 저장됩니다. -p옵션을 그대로두면 mysql이 암호를 묻습니다.
Scotty C.

답변:


356
  1. 열기 및 편집 /etc/my.cnf하거나 /etc/mysql/my.cnf, 당신의 배포판에 따라.
  2. skip-grant-tables아래에 추가[mysqld]
  3. MySQL을 다시 시작
  4. 아래 명령을 사용하여 mysql에 로그인 할 수 있어야합니다 mysql -u root -p
  5. 운영 mysql> flush privileges;
  6. 다음으로 새 비밀번호 설정 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. /etc/my.cnf로 돌아가서 skip-grant-tables를 제거 / 코멘트하십시오
  8. MySQL을 다시 시작
  9. 이제 새 비밀번호로 로그인 할 수 있습니다 mysql -u root -p

6
안녕하세요, 같은 문제가있었습니다. 위의 작업을 수행하고 문제를 해결했지만 CentOS를 재부팅 할 때마다 모든 단계를 다시 수행해야합니다 (사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 : NO)). mysql 명령 (또는 sql 명령)을 실행할 때마다 재부팅 할 때마다 위와 같이 반복해서 수행합니다
Eitan

19
이것이 MariaDB와 함께 작동하지 않는다는 것이 너무 나쁩니다 :You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig

11
이 작업은 @PhilippLudwig에서 작동하는 것으로 나타났습니다 set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');. 5 단계 후에이 작업을 수행했습니다. 명령 프롬프트 출력은 다음과 같습니다.MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow

3
3 단계 MariaDB를 다시 시작하십시오. 다음과 같은 작업을 발견했습니다.sudo systemctl restart mariadb
therobyouknow

7
일부는 /etc/mysql/my.cnf에서 파일을 찾을 수 있습니다
DSinghvi

589

내가 찾은 모든 솔루션은 필요한 것보다 훨씬 복잡했으며 나에게 도움이되지 못했습니다. 내 문제를 해결 한 솔루션이 있습니다. mysqld를 다시 시작하거나 특별한 권한으로 시작할 필요가 없습니다.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

단일 쿼리로 auth_pluginmysql_native_password 로 변경하고 루트 비밀번호를 root로 설정합니다 (쿼리에서 자유롭게 변경)

이제 루트로 로그인 할 수 있어야합니다. 자세한 정보는 mysql 문서 에서 찾을 수 있습니다

( Ctrl + D를 사용 하거나 exit 입력하여 mysql 콘솔을 종료하십시오 )


41
이 작업을 수행 할 수 없습니다 ... "SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 매뉴얼에서 근처에서 사용할 올바른 구문을 확인하십시오 ..."
TCB13

2
이 답변은 효과가 있었고 실수로 유용한 답변 투표가 아닙니다. 실례합니다!
taher

25
우분투 18.04에서 일했습니다
Almino Melo

2
@ TCB13 및이 문제에 직면 한 다른 사람 "이 작업을 수행 할 수 없습니다 ..."SQL 구문에 오류가 있습니다. near ... "를 사용하기 위해 올바른 구문을 보려면 MariaDB 서버 버전에 해당하는 매뉴얼을 확인하십시오. alter 명령을 실행하기 전에 FLUSH PRIVILEGES를 사용하십시오.
coder

3
저장 내 하루 :)
xger86x

50

이 문제를 해결하기 위해 여러 단계를 시도했습니다. 이 문제에 대한 해결책이 너무나 많아서 말도 안되는 소리를 걸러 내기가 어렵습니다. 마침내 여기 에서 좋은 해결책을 찾았 습니다 .

1 단계 : 데이터베이스 버전 식별

$ mysql --version

MySQL에서 다음과 같은 출력이 표시됩니다.

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

또는 MariaDB의 경우 다음과 같이 출력하십시오.

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

나중에 사용할 데이터베이스와 버전을 기록해 두십시오. 다음으로 데이터베이스를 수동으로 액세스 할 수 있도록 중지해야합니다.

2 단계 : 데이터베이스 서버 중지

루트 암호를 변경하려면 미리 데이터베이스 서버를 종료해야합니다.

MySQL을 사용하여 다음을 수행 할 수 있습니다.

$ sudo systemctl stop mysql

그리고 MariaDB의 경우 :

$ sudo systemctl stop mariadb

3 단계 : 권한 검사없이 데이터베이스 서버 다시 시작

사용자 권한에 대한 정보를로드하지 않고 MySQL 및 MariaDB를 실행하면 비밀번호를 제공하지 않고 루트 권한으로 데이터베이스 명령 행에 액세스 할 수 있습니다. 이를 통해 데이터베이스를 몰라도 데이터베이스에 액세스 할 수 있습니다.

이를 수행하려면 데이터베이스가 사용자 권한 정보를 저장하는 권한 부여 테이블을로드하지 못하게해야합니다. 이것은 약간의 보안 위험이므로 다른 클라이언트가 연결하지 못하도록 네트워킹을 건너 뛰어야합니다.

권한 부여 테이블을로드하거나 네트워킹을 사용하지 않고 데이터베이스를 시작하십시오.

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

이 명령의 끝에있는 앰퍼샌드는이 프로세스를 백그라운드에서 실행하므로 터미널을 계속 사용할 수 있습니다.

이제 비밀번호를 요구하지 않는 루트 사용자로 데이터베이스에 연결할 수 있습니다.

$ mysql -u root

대신 데이터베이스 셸 프롬프트가 나타납니다.

MySQL 프롬프트

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

mysql>

MariaDB 프롬프트

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

MariaDB [(none)]>

이제 루트 액세스 권한이 있으므로 루트 비밀번호를 변경할 수 있습니다.

4 단계 : 루트 비밀번호 변경

mysql> FLUSH PRIVILEGES;

이제 루트 비밀번호를 변경할 수 있습니다.

들어 MySQL은 5.7.6 및 최신 뿐만 아니라 MariaDB 10.1.20 및 최신 , 다음 명령을 사용합니다 :

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

들어 MySQL은 5.7.5 이상 뿐만 아니라 MariaDB 10.1.20 이상 사용 :

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

new_password선택한 새 비밀번호 로 바꾸십시오 .

참고 : 은 IF ALTER USER명령이없는 작업을 수행, 그것은 더 큰 문제의 일반적 나타내는입니다. 그러나 UPDATE ... SET대신 루트 비밀번호를 재설정 할 수 있습니다 .

[중요] 이것은 내 특정 문제를 해결 한 특정 줄입니다.

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

그 후에 부여 테이블을 다시로드해야합니다.

두 경우 모두 명령이 성공적으로 실행되었다는 확인 메시지가 표시됩니다.

Query OK, 0 rows affected (0.00 sec)

비밀번호가 변경되었으므로 이제 데이터베이스 서버의 수동 인스턴스를 중지하고 이전과 같이 다시 시작할 수 있습니다.

5 단계 : 데이터베이스 서버를 정상적으로 다시 시작

튜토리얼은 데이터베이스를 다시 시작하기위한 몇 가지 추가 단계로 진행되지만 내가 사용한 유일한 부분은 다음과 같습니다.

MySQL의 경우 다음을 사용하십시오. $ sudo systemctl start mysql

MariaDB의 경우 다음을 사용하십시오.

$ sudo systemctl start mariadb

이제 다음을 실행하여 새 비밀번호가 올바르게 적용되었는지 확인할 수 있습니다.

$ mysql -u root -p

이제 명령에 새로 할당 된 비밀번호를 입력하라는 메시지가 표시됩니다. 입력하면 예상대로 데이터베이스 프롬프트에 액세스 할 수 있습니다.

결론

이제 MySQL 또는 MariaDB 서버에 대한 관리 액세스 권한이 복원되었습니다. 선택한 새 루트 비밀번호가 강력하고 안전한지 확인하고 안전한 곳에 보관하십시오.


1
ALTER USER 문은 MariaDB 10.2.0에서 도입되었습니다.
Benoit Desrosiers

2
와 ! 이 바로 그 선 mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';이 나를위한 생명의 은인이었습니다!
lucyjosef

35

위의 답변 중 어느 것도이 문제에 도움이되지 않았으므로 여기에 내가 찾은 해결책이 있습니다.

관련 부분 :

MySQL 5.7 이상 버전을 실행하는 Ubuntu 시스템에서 루트 MySQL 사용자는 비밀번호가 아닌 auth_socket 플러그인을 사용하여 기본적으로 인증하도록 설정되어 있습니다. 이것은 많은 경우에 더 큰 보안과 유용성을 허용하지만 외부 프로그램 (예 : phpMyAdmin)이 사용자에게 액세스하도록 허용해야 할 때 상황을 복잡하게 만들 수도 있습니다.

비밀번호를 사용하여 루트로 MySQL에 연결하려면 인증 방법을 auth_socket에서 mysql_native_password로 전환해야합니다. 이렇게하려면 터미널에서 MySQL 프롬프트를 엽니 다.

sudo mysql

다음으로, 각 MySQL 사용자 계정이 다음 명령으로 사용하는 인증 방법을 확인하십시오.

SELECT user,authentication_string,plugin,host FROM mysql.user;

산출

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

이 예에서는 루트 사용자가 실제로 auth_socket 플러그인을 사용하여 인증하는 것을 볼 수 있습니다. 비밀번호로 인증하도록 루트 계정을 구성하려면 다음 ALTER USER 명령을 실행하십시오. 비밀번호를 선택한 강력한 비밀번호로 변경해야하며이 명령은 2 단계에서 설정 한 루트 비밀번호를 변경합니다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

그런 다음 서버에 권한 부여 테이블을 다시로드하고 새 변경 사항을 적용하도록 지시하는 FLUSH PRIVILEGES를 실행하십시오.

FLUSH PRIVILEGES;

auth_socket 플러그인을 사용하여 루트가 더 이상 인증되지 않는지 확인하려면 각 사용자가 사용한 인증 방법을 다시 확인하십시오.

SELECT user,authentication_string,plugin,host FROM mysql.user;

산출

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

이 예제 출력에서 ​​루트 MySQL 사용자가 이제 비밀번호를 사용하여 인증하는 것을 볼 수 있습니다. 자신의 서버에서이를 확인하면 MySQL 셸을 종료 할 수 있습니다.

exit


27

우분투 / 데비안 사용자

( 다른 배포판, 특히 데비안 기반 배포판에서 작동 할 수 있음)

다음을 실행하여 root비밀번호없이 연결하십시오.

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

--defaults-file으로 연결할 때마다 추가하지 않으려면 홈 디렉토리에 root복사 /etc/mysql/debian.cnf하십시오.

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

그리고:

sudo mysql

2
이것이 전부였습니다. 'root'는 기본적으로 우분투에서 'root'가 아닙니다.
Chaim Eliyah

21

다른 모든 답변을 시도한 후에 마침내 이것이 나를 위해 일한 것입니다.

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

이 게시물에서 답을 찾았습니다 : https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06


1
이 플러그인 라인은 정말 도움이됩니다. 나는 compinations을 많이 시도하지만이 유일한 리눅스 (x86_64의)에 대한 버전 14.14 DISTRIB 5.7.27 위해 일한다
AlexNikonov

2
이것은 mysql 5.7에서도 도움이되었습니다. mariadb
podarok

방금 MySQL 8 Ubuntu 20.04에서 이것을 사용했으며 효과가있었습니다. skip-grant-table(my.conf 또는 mysql명령에서)를 사용하는 다른 답변이 작동하지 않았습니다. 서비스 계정 ( askubuntu.com/a/120769/169836 )을 사용할 수 UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';는 있지만 작동하지 않았습니다. 플러그인 부분을 사용할 때만 작동했습니다. 감사합니다 ~
hamx0r

16

새로운 리눅스 사용자에게는 어려운 작업이 될 수 있습니다. mysql 8로 업데이트하겠습니다 (2018 년 9 월 12 일 현재 최신 버전은 8.0.12입니다)

  1. "/etc/mysql/mysql.conf.d/"에서 "mysqld.cnf"구성 파일을여십시오.
  2. [mysql] 텍스트의 다음 줄에 skip-grant-tables 를 추가 하고 저장하십시오.
  3. "sudo service mysql restart"로 mysql 서비스를 다시 시작하십시오. 이제 mysql에 인증이 없습니다.
  4. mysql 클라이언트 (mysql-shell이라고도 함)에 mysql -u root -p로 연결하십시오 . 현재 비밀번호를 입력하지 않았습니다.
  5. sql 명령 플러시 권한을 실행 하십시오.
  6. ALTER USER 'root'@ 'localhost' 로 비밀번호를 재설정하십시오 . 'MyNewPassword'에 의해 식별되었습니다.
  7. 이제 정상 상태로 돌아 갑시다. "mysqld.cnf"에서 "skip-grant-tables"행을 제거하고 서비스를 다시 시작하십시오.

그게 다야.


5

MySQL 워크 벤치에서 왼쪽 사이드 바로 이동하여 관리에서 "사용자 및 권한"을 선택하고 사용자 계정 아래에서 루트를 클릭하고 오른쪽 섹션에서 "계정 제한"탭을 클릭하여 최대 쿼리, 업데이트 등을 늘리십시오. 그런 다음 "관리 역할"탭을 클릭하고 상자에 체크 표시하여 계정 액세스 권한을 부여하십시오. 희망이 도움이됩니다!


4

OSx에서 초기 MySQL 설정에서 루트 암호를 설정하기 위해이 작업을 수행했습니다. 터미널을 엽니 다.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

터미널을 닫고 새 터미널을 엽니 다. 다음은 Linux에서 루트 암호를 설정하기 위해 작동합니다.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables : 처음에는 효과가 없었지만 두 번째 시도는 성공이었습니다.)

그런 다음 MySQL에 로그인

mysql -u root

FLUSH PRIVILEGES;

이제 비밀번호를 변경하십시오.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

MySQL을 다시 시작하십시오.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start

3

필자의 경우 데비안 10에서 오류가 발생했습니다.

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

(GOOD WAY)에 의해 해결되었습니다.

sudo mysql -u root -p mysql

나쁜 방법:

mysql -u root -p mysql

3

어-아무것도 나를 위해 일하지 않았다! mariadb 5.5.64를 실행하는 CentOS 7.4 컴퓨터가 있습니다.

내가해야했던 것은 yum에서 mariadb를 설치 한 직후입니다.

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installation포함, 여러 단계를 통해 당신을 데려 갈 것이다 "설정 루트 암호? [Y / N]". "y"라고 말하고 비밀번호를 입력하십시오. 원하는대로 다른 질문에 대답하십시오.

그런 다음 비밀번호를 사용하여 들어갈 수 있습니다.

# mysql -u root -p

살아남을 것이다

# systemctl restart mariadb

열쇠

그런 다음 /bin/mysql_secure_installation소스 코드를 검사하여 루트 암호를 마술처럼 변경하는 방법과 다른 답변은 없었습니다. 가져 오기 비트는 다음과 같습니다.

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... SET Password=...그렇지 않습니다 SET authentication_string = PASSWORD.... 따라서이 버전 (5.5.64)의 올바른 절차는 다음과 같습니다.

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

mysql> 프롬프트에서 :

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

실행중인 mysqld_safe를 종료하십시오. mariadb를 다시 시작하십시오. 루트로 로그인하십시오 : mysql -u -p. 새 비밀번호를 사용하십시오.

원하는 경우 모든 루트 비밀번호를 한 번에 설정할 수 있습니다. 나는 이것이 현명하다고 생각한다.

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

이렇게하면 모든 루트 비밀번호 (예 : "localhost", "127.0.0.1"및 ":: 1")에 대한 업데이트가 수행됩니다.

앞으로 RHEL8 또는 무엇을 방문 할 때 / bin / mysql_secure_installation을 확인하고이 OS에 대해 mariadb를 구성한 사람이 누구인지를 기억하도록 노력할 것입니다.


2

나처럼 위의 모든 제안이 실패한 경우 컴퓨터에서 모든 버전의 mysql을 제거 하고이 명령 sudo find / -name "mysql"rm -rfmysql 이름이 첨부 된 모든 파일 또는 디렉토리를 검색하십시오 (관련 파일을 건너 뛰어야합니다) 프로그래밍 언어 라이브러리). 이제 새로운 MySQL 버전을 설치하고 즐기십시오. 주의 : 모든 데이터를 잃어 버리므로 옵션의 무게를 먼저 측정하십시오.


1

충분한 권한이없는 경우 발생할 수 있습니다. 을 입력 su하고 루트 비밀번호를 입력 한 후 다시 시도하십시오.


1

좋아, 나는 이것이 오래된 스레드라는 것을 알고 있지만, 내가했던 것처럼 Google을 통해이 페이지에 도달했는데 위의 해결책 중 어느 것도 효과가 없다면, 내 말에 100 % 어리 석음이라는 것이 밝혀졌습니다. 서버에 연결하지 않았습니다. 연결되면 모든 것이 순조롭게 항해되었습니다.

내 설정을 이해하는 데 도움이되는 경우 Sequel Pro를 사용하고 있으며 NPM 패키지 mysql을 사용하여 노드와 연결하려고합니다. 내 앱에서 이미 그렇게했기 때문에 실제로 Sequel Pro를 실행하지 않고 연결해야한다고 생각하지 않았습니다.

여기에 이미지 설명을 입력하십시오


0

해결책 : 포기하십시오!

내 말을 들어, 나는 MySQL 작업을 무용지물로 만들려고 노력하는 데 약 2 일을 보냈다. 항상 권한 오류가 있었으며이 스레드의 답변으로 수정되지 않았습니다. 내가 계속한다면 내가 미쳤다고 생각했던 시점에 이르렀다.

그것이 작동하도록 인내심을 가지고, 450KB 만 사용하여 SQLite를 설치하라는 명령을 보냈으며 go라는 단어에서 완벽하게 작동했습니다.

성도의 인내심이 없다면 SQLite를 사용하여 많은 시간, 노력, 고통 및 저장 공간을 절약하십시오.

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