MySQL 오류 1045 (28000) : 사용자 'bill'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).


430

먼저 많은 제안 된 질문을 겪었고 관련 답변을 찾지 못했다고 언급하겠습니다. 여기 내가하고있는 일이 있습니다.

Amazon EC2 인스턴스에 연결되어 있습니다. 이 명령으로 MySQL 루트로 로그인 할 수 있습니다.

mysql -u root -p

그런 다음 호스트 %로 새 사용자 청구서를 작성했습니다.

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

사용자 청구서에 대한 모든 권한을 부여했습니다.

grant all privileges on *.* to 'bill'@'%' with grant option;

그런 다음 루트 사용자를 종료하고 bill로 로그인을 시도하십시오.

mysql -u bill -p

올바른 비밀번호를 입력하고 다음 오류가 발생했습니다.

오류 1045 (28000) : 사용자 'bill'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).


34
당신은 했습니까 FLUSH PRIVILEGES?
eggyal

6
좋아, 나는 성공하지 않고 이것을 시도했다. 다른 제안은 부탁드립니다.
알리

1
어떤 서버 버전을 실행하고 있습니까? 5.1이 이것에 대해 이상하게 행동하는 것을 보았습니다.
Poodlehat

2
이것은 Magento를 설치하는 동안 나에게 일어 났으며 훨씬 더 실수를 저질렀습니다. 'mysql -u magento -p magento'를 입력하면 비밀번호를 묻는 메시지가 표시되고 기본 비밀번호 대신 루트 비밀번호를 입력했습니다.
AmirHd

2
@authentictech 불행히도,이 질문이 게시 될 당시 제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 이 상황을 극복하는 데 도움이 된 내 대답을 참조하십시오. 그것이 내가 그들 중 어느 것도 답으로 표시하지 않은 이유입니다. 아마도 가장 높은 순위의 응답을 답변으로 표시 할 수 있습니다.
Ali

답변:


441

당신은 아마 익명의 사용자 ''@'localhost'또는 ''@'127.0.0.1'입니다.

에 따라 수동 :

일치하는 항목이 여러 개인 경우 서버는 사용할 항목을 결정해야합니다. 이 문제는 다음과 같이 해결됩니다. (...)

  • 클라이언트가 연결을 시도하면 서버는 [mysql.user 테이블의] 행 을 정렬 된 순서대로 찾습니다 .
  • 서버는 클라이언트 호스트 이름 및 사용자 이름과 일치하는 첫 번째 행을 사용합니다.

(...) 서버는 가장 특정한 호스트 값을 가진 행을 먼저 정렬하는 정렬 규칙을 사용합니다 . 리터럴 호스트 이름 (예 : 'localhost') 및 IP 주소가 가장 구체적입니다.

따라서 이러한 익명 사용자는 '[any_username]'@'%'에서 연결할 때 와 같은 다른 사용자를 "마스크"합니다 localhost.

'bill'@'localhost'일치 'bill'@'%'하지만 ''@'localhost'사전에 (예) 일치 합니다.

권장되는 해결책은이 익명 사용자를 삭제하는 것입니다 (일반적으로 어쨌든하는 것이 좋습니다).


아래 편집 내용은 주로 주요 질문과 관련이 없습니다. 이것들은이 글에서 다른 의견으로 제기 된 일부 질문에 대한 답변입니다.

편집 1

'bill'@'%'소켓 을 통한 인증 .

    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    MySQL 모니터에 오신 것을 환영합니다 (...)

    mysql> 사용자 선택, 호스트 FROM mysql.user;
    + ------ + ----------- +
    | 사용자 | 호스트 |
    + ------ + ----------- +
    | 청구서 | % |
    | 뿌리 | 127.0.0.1 |
    | 뿌리 | :: 1 |
    | 뿌리 | localhost |
    + ------ + ----------- +
    4 행 세트 (0.00 초)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | bill @ % |
    + ---------------- + ---------------- +
    1 행 세트 (0.02 초)

    mysql> 'skip_networking'과 같은 변수 표시;
    + ----------------- + ------- +
    | Variable_name | 가치 |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 행 세트 (0.00 초)

편집 2

네트워킹을 다시 활성화하고 익명 사용자를 만드는 것을 제외하고는 정확히 동일한 설정 ''@'localhost'입니다.

    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    MySQL 모니터에 오신 것을 환영합니다 (...)

    mysql> 사용자 생성 ''@ 'localhost' 'anotherpass'에 의해 식별 됨;
    쿼리 OK, 영향을받는 0 개의 행 (0.00 초)

    mysql> 안녕

    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    오류 1045 (28000) : 사용자 'bill'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).
    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    오류 1045 (28000) : 사용자 'bill'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).
    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    오류 1045 (28000) : 사용자 'bill'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).

편집 3

익명 사용자의 비밀번호를 제공하는 편집 2와 동일한 상황.

    root @ myhost : /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    MySQL 모니터에 오신 것을 환영합니다 (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 행 세트 (0.01 초)

결론 1, 편집 1 : 'bill'@'%'소켓 을 통해 인증 할 수 있습니다 .

결론 2, 편집 2 : TCP 또는 소켓을 통한 연결 여부는 인증 프로세스에 영향을 미치지 않습니다 (다른 사람이 아닌 'something'@'localhost'소켓을 통해 연결할 수는 없음 ).

결론 3, 편집 3 : 3을 지정했지만 -ubill익명 사용자로 액세스 권한이 부여되었습니다. 이것은 위에서 언급 한 "정렬 규칙"때문입니다. 대부분의 기본 설치 에는 암호가없는 익명 사용자가 존재 하며 보안 / 제거되어야합니다.


9
왜 'bill'@ 'localhost'가 ''@ 'localhost'와 일치하는지 궁금한 사람은 빈 문자열이 MySQL의 인증 알고리즘에서 와일드 카드로 효과적으로 작동합니다.
Dean 또는

2
@Sanja이 해결 방법에 특히주의하십시오. 어느 위치에서나 데이터베이스에 대한 익명 액세스를 허용 할 수 있습니다. 의심스러운 경우 오히려 사용자를 삭제하고 싶습니다.
RandomSeed

7
@RandomSeed이 의견에 감사드립니다! 아마도 익명 사용자를 삭제해야 할 것입니다. 추신 : 나는 이 사용자가 반드시 삭제할 수 있다고 dev.mysql.com/doc/refman/5.1/en/default-privileges.html 을 발견했습니다 DROP USER ''@'localhost';. 그들은 특별한 목적을 위해 필요하지 않습니다.
Alex

1
익명 사용자를 삭제했지만 여전히 작동하지 않습니다. 그런 다음 "FLUSH PRIVILEGES"도 발행해야한다는 것을 알았습니다. 또한 언급하는 것이 도움이 될 것입니다.
Neeme Praks

2
이것이 답입니다! 왜 모든 mysql 매뉴얼에서 굵은 대문자로 표시되지 않습니까? 익명 사용자를 삭제하면 LOCALHOST에서 로그인 할 때 모든 속성이 삭제됩니다!
Sergei

140

시험:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
누군가가 bill @ localhost mysql 계정을 해킹하면 mysql 서버의 모든 데이터베이스에 무한하게 액세스 할 수 있습니다.
Adonis K. Kakoulidis

2
유장 내 사용자 'myusername'@'myhost.static.myip.com'을 인용해야했는데 효과가있었습니다.
bendecko

나를 위해 작품을하지만 난 두려워 나는 사용자에 대한 너무 많은 권한을 준거야 그
사바 토스를

1
@CsabaToth, 사용자가 필요로하는 것을 가질 때까지 권한을 다시 줄이십시오.
jwenting

... 그리고 "사용자 'root'@ 'localhost'에 대한 액세스 거부 (암호 : YES)"가 표시되면 어떻게해야합니까?
Grunion Shaftoe

75

당신이 달렸을 때

mysql -u bill -p

이 오류가 발생했습니다

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld는 다음과 같이 연결할 것을 기대하고 있습니다. bill@localhost

만들어보십시오 bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

원격으로 연결하려면 TCP / IP를 사용하여 DNS 이름, 퍼블릭 IP 또는 127.0.0.1을 지정해야합니다.

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

로그인하면 이걸 실행하십시오

SELECT USER(),CURRENT_USER();

USER () 는 MySQL에서 인증을 시도한 방법을보고합니다

CURRENT_USER ()mysql.user 테이블 에서 MySQL 인증 방법을보고 합니다.

이렇게하면 mysql에 로그인 할 수있는 방법과 이유를 더 잘 볼 수 있습니다. 이 견해를 알아야하는 이유는 무엇입니까? 그것은 사용자 인증 순서 프로토콜과 관련이 있습니다.

다음은 예입니다 : 데스크탑 MySQL에서 익명 사용자를 생성합니다

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

확인 익명 사용자로 로그인하십시오.

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, 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 user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

인증 순서는 매우 엄격합니다. 가장 구체적인 것부터 가장 적은 것까지 확인합니다. DBA StackExchange에서이 인증 스타일에 대해 썼습니다 .

필요할 때 mysql 클라이언트의 프로토콜로 TCP를 명시 적으로 호출하는 것을 잊지 마십시오.


1
'bill'@'localhost'일치 'bill@%'해야합니까?
RandomSeed 2016 년

@Yak 정렬 순서는 mysql.user의 사용자 열에 만 기반하지 않습니다. MySQL은 문자 매칭을하지 않습니다. : 나는 DBA StackExchange에서 사용자 인증 순서 프로토콜에 대해 쓴 dba.stackexchange.com/a/10897/877
RolandoMySQLDBA

@YaK 이것이 제가 구체적으로 언급 한 이유 SELECT USER(),CURRENT_USER();입니다. 실제로 설정이 좋지 않은 경우를 제외하고는이 두 기능에서 익명 사용자가 나타나지 않습니다.
RolandoMySQLDBA 2016 년

1
나는 정렬 순서를 기반으로 가정 결코 전적으로mysql.user. 사실, 내 대답을 다시 읽으면 정렬 순서가 host먼저 열을 기반으로한다고 말한 것입니다 (실제로 수동으로 말합니다) . 현재 자격 증명을 확인하는 방법에 대해 많이 작성했지만 오늘 'bill'@'localhost'로그인 할 수없는 이유에 대한 정보는 거의 없습니다. 이것이 'bill'@'%'오늘날의 질문 AFAIK입니다. OP의 설정이 잘못되었을 수 있으므로 이러한 오류가 발생합니다.
RandomSeed 2016 년

2
--protocol=TCP열쇠였습니다. 대단히 감사합니다!
lfx

22

이것에 늦게 슈퍼

나는 다른 모든 답변을 시도하고 많은 다른 버전을 mysql -u root -p실행했지만 결코 실행하지 않았습니다.


mysql -u root -p

그리고 [ENTER]비밀번호를 누르기 만하면 됩니다.


일단 그렇게하면 효과가있었습니다. 이것이 누군가를 돕기를 바랍니다.


18

내 경우의 관련 문제는 다음을 사용하여 연결하려고했습니다.

mysql -u mike -p mypass

공백 은 -u # uname # 사이에 허용되지만 -p와 # password # 사이에는 허용 되지 않습니다 .

따라서 다음이 필요합니다.

mysql -u mike -pmypass

그렇지 않으면 -p mypass 사이에 공백이있는 경우 mysql은 'mypass'를 db 이름으로 사용합니다.


1
또는 : mysql -u usrname -p-이렇게하면 새 줄이

훌륭한 답변 @mstram
Arpit Solanki

1
이 솔루션은 편안하지만 암호를 분명히 입력하는 것은 안전하지 않지만 형식 부여 권한이 필요 없으며 다른 것을 정의 할 필요가 없습니다. 따라서 맥북이 안전하다면,이 접근 방식은 매우 편안하고, docker mysql driver에서 aws로 데이터를 가져 오는 데 사용했습니다.
dimpiax

17

를 입력 mysql -u root -p하면 로컬 유닉스 소켓을 통해 mysql 서버에 연결됩니다.

그러나 부여한 권한은 'bill'@'%'TCP / IP 연결과 흥미롭게 일치합니다.

로컬 유닉스 소켓에 대한 액세스 권한을 부여하려면 'bill'@ 'localhost'에 권한을 부여해야합니다. 흥미롭게도 'bill'@'127.0.0.1'과 동일하지 않습니다.

실행 mysql -u root -p -h 192.168.1.123또는 상자의 로컬 IP 주소 와 같이 이미 부여 된 권한과 일치하도록 mysql 명령 줄 클라이언트와 함께 TCP / IP를 사용하여 연결할 수도 있습니다.


" 'bill'@ '%'는 TCP / IP 연결과 만 일치합니다."잘못되었습니다. skip-networking
RandomSeed

@YaK 그런 설정에서 'user'@ '%'를 사용할 수 없습니다. 무슨 일이 있었나요?
no.

네트워킹없이 (따라서 소켓을 통해) v5.0에서 'bill'@ '%'로 연결할 수 있습니다. 어떤 버전을 사용하고 있습니까? v5.5에서 시도하겠습니다.
RandomSeed

업데이트 된 답변을 참조하십시오. 'bill'@'%'v5.5의 소켓을 통해 로그인 할 수있었습니다 .
RandomSeed 2016 년

17

비밀번호를 잊어 버렸거나 비밀번호를 수정하려는 경우 다음 단계를 수행하십시오.

1 : 당신의 MySQL을 중지

[root @ maomao ~] # service mysqld stop
MySQL 중지 : [OK]

2 :“-skip-grant-tables”를 사용하여 mysql을 재시작하십시오

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # / var / lib / mysql의 데이터베이스로 mysqld 데몬 시작

3 : 새 창을 열고 mysql -u root를 입력하십시오.

[root @ cy400 ~] # mysql -u root
MySQL 모니터에 오신 것을 환영합니다. 명령은;로 끝납니다. 또는 \ g.

4 : 사용자 데이터베이스 변경

mysql> use mysql
테이블 및 열 이름 완성을위한 테이블 정보 읽기이 기능을 해제하면 -A 데이터베이스가 변경된 상태에서 더 빠르게 시작할 수 있습니다.

5 : 비밀번호 수정 "()"에 새 비밀번호를 입력해야합니다

mysql> update user set password = password ( 'root123') 여기서 user = 'root';
쿼리 확인, 영향을받는 3 개의 행 (0.00 초)
일치하는 행 : 3 변경 : 3 경고 : 0

6 : 플러시

mysql> 플러시 권한;

7 : 종료

mysql> 종료
안녕

8 : mysql 재시작

[root @ cy400 ~] # 서비스 mysqld 재시작;
MySQL 중지 : [OK]
MySQL 시작 : [OK]

빙고! 당신은 사용자 이름과 새로운 암호로 데이터베이스를 연결할 수 있습니다 :

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye

1
이것은 나에게 도움이되었지만 homebrew로 설치하면 Mac에서는 mysql.server stop. 필자의 경우 사용자 열이 없기 때문에 업데이트 할 수 없습니다. 안전 모드이기 때문에 만들 수 없습니다. 내가 지금하고있는 일에 대해서는 신경 쓰지 않지만 정확한 입력 및 출력이 표시된이 형식의 답변에 정말 감사드립니다. 감사!
szeitlin

죄송합니다. Mac을 사용한 적이 없습니다. 도와 드릴 수 없습니다.
Li Yingjun

15

중대한 두통을 피하십시오 ... 문제는 암호 주위에 따옴표가 빠져있을 수 있습니다. 적어도 그것은 3 시간 동안 나를 우회했던 나의 경우였다.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

"일반적인 사용자 옵션 파일은 다음과 같습니다."를 검색하여 해당 파일에 나와있는 예를 확인하십시오. 행운을 빕니다. 그리고 다른 누군가를 구하기를 바랍니다.


1
감사합니다. 나는 이것에 반나절을 낭비했고 암호에 대한 멍청한 따옴표는 트릭을했다!
guyfromfl

ㅋ. 그것이 나에게 일어날 때 나는 거의 똑같이 낭비했다. 도움이되어 기쁘다.
mimoralea

12

해결책은 익명 사용자를 삭제하는 것입니다!

또한 다른 사람이 서버 설정에서 같은 문제에 직면했습니다. 나는 보통 MySQL을 설치할 때 익명의 사용자를 만들지 않기 때문에 이것을 눈치 채지 못했다. 처음에는 "루트"사용자로 로그인하여 "일반"사용자 몇 명 (일명 사용자 이름이 접두사 인 db에 대해서만 권한을 가진 사용자)을 만든 다음 로그 아웃 한 다음 첫 번째 일반 사용자를 확인했습니다. 로그인 할 수 없습니다. phpMyAdmin 또는 셸을 통해 둘 다 없습니다. 결과적으로 범인은이 "모든"사용자입니다.


11

나는 root접근이 거부되었다고 말한 것처럼 MySQL에 처음 들어 가려고 시도했을 때 다소 비슷한 문제가 있었다 . 내가 사용하는 것을 잊었다는 것이 밝혀졌습니다 sudo...

따라서 root첫 번째 시도에서 실패하면 다음을 시도하십시오.

sudo mysql -u root -p

암호를 입력하면 작동합니다.


6

내가 찾은 최고의 해결책은.

내 사용자는 소나이며 외부 또는 다른 컴퓨터에서 데이터베이스에 연결하려고 할 때마다 오류가 발생합니다.

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

또한 다른 컴퓨터에서 Jenkins 작업을 통해이 URL을 사용하려고하면

alm-lt-test.xyz.com

원격으로 연결하려면 다음과 같이 다른 방법으로 지정할 수 있습니다.

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

URL을 사용하여 액세스하려면 다음 쿼리를 실행하면됩니다.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

4

좋아, 확실하지 않지만 아마도 이것이 mysql 설치 디렉토리의 my.cnf 파일 일 것입니다. 이 줄을 주석 처리하면 문제가 해결 될 수 있습니다.

bind-address = 127.0.0.1

1
자세한 내용은 wiki.bitnami.org/Components/MySQL
Ali

1
이것이 문제가 아니라고 확신합니다. 그렇다면 MySQL은 127.0.0.1 이외의 호스트와의 연결을 거부하며 SQL '액세스 거부'오류가 발생하지 않습니다.
Pellmeister 2012 년

3

동일한 오류가 발생하는 비정상적인 상황을 알려주고 싶었습니다. 아마도 이것은 미래에 누군가를 도울 것입니다.

개발 사이트에서 생성 한 몇 가지 기본 뷰를 개발하여 프로덕션 사이트로 옮겼습니다. 그 주 후반에 나는 PHP 스크립트를 변경했고 사용자 'local-web-user'@ 'localhost'에 대한 액세스가 거부되었다는 갑작스런 오류가 모두 발생했습니다. 데이터 소스 객체는 변경되지 않았으므로 MySQL의 데이터베이스 사용자에게 집중하여 누군가 내 웹 사이트를 해킹하는 동안 걱정했습니다. 다행히도 사이트의 나머지 부분은 무해한 것으로 보였습니다.

나중에 그 견해는 범인이라는 것이 밝혀졌습니다. 우리의 객체 전송은 로컬 웹 사이트 사용자가 아닌 다른 (및 원격 : admin @ ip-address) 사용자를 사용하여 수행됩니다. 따라서 뷰는 정의 자로 'admin'@ 'ip-address'를 사용하여 작성되었습니다. 뷰 생성 SECURITY 기본값은

SQL SECURITY DEFINER

로컬 웹 사용자가 뷰를 사용하려고 할 때 테이블을 사용할 수있는 정의 자의 부족 권한으로 넘어집니다. 보안이 변경되면

SQL SECURITY INVOKER

문제가 해결되었습니다. 실제 문제는 오류 메시지에 따라 예상과 완전히 다릅니다.


1
이것은 결국 내 문제의 원인이되었습니다-누락 된 "정의 자"가있는 견해. 이것이 일어나고 있는지 확인하는 빠른 방법 중 하나는 루트와 동일한 테이블이나 뷰를 쿼리하는 것입니다. 그렇게하면 오류 메시지가 훨씬 더 설명적인 "ERROR 1449 (HY000) :" 정의자가 없습니다 "
Joshua Davies

3

차이점은 다음과 같습니다.

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

확인해 봐:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

명령

mysql -u bill -p

'bill'@ 'localhost'에 대한 암시 적 액세스 및 'bill'@ '%'에 대한 액세스 권한 없음.

'bill'@ 'localhost'에 대한 권한이 없습니다

오류가 발생합니다.

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

문제 해결 :

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;

grant 문이 오류를 리턴했습니다. 그래서 같은 데이터베이스 지정에 필요한 : 한 newdb에 대한 모든 권한을 부여를 *에 ....
LeBird

3

비밀번호에 @, $ 등의 특수 문자가 포함 된 경우에도 마찬가지입니다. 이 상황을 피하려면 비밀번호를 작은 따옴표로 묶을 수 있습니다.

$ mysql -usomeuser -p's0mep@$$w0Rd'

또는 입력하는 동안 비밀번호를 사용하지 마십시오. 비워두고 터미널이 요청할 때 입력하십시오. 이것이 권장되는 방법입니다.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, 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>

3
이것은 실제로 문제가 될 수 있습니다 (나처럼). 내 계정에 대한 모든 비밀번호는을 사용하여 생성됩니다 pwgen. 오늘 저는 MySQL 데이터베이스와 그 사용자를 위해 새로운 데이터베이스를 생성했습니다. 불행히도 암호에는 백 슬래시 "\"가 포함되어있어 오류 출처로 식별하지 못했습니다 (생각조차하지 않았습니다). 그래서 몇 시간 동안 해결책을 찾았습니다. 절망에서 비밀번호를 "123"으로 설정 한 후 마침내 로그인이 작동했습니다. … 예를 들어, MySQL은 "daiy4ha4in7chooshuiphie \ Th * aew"와 같은 비밀번호 사용에 대한 경고를 표시하지 않으므로 일부 특수 문자는 문제를 일으킬 수 있음을 알고 있어야합니다.
Arvid

1
아직 표시되지 않은 경우이 질문에 대한 답변으로 게시하려고했지만, 목록에 너무 많이 표시되어 있으므로 알 수 없습니다 (+1 충돌).
Assimilater

3

나 에게이 문제는 MySQL 5.7.2의 새로운 기능으로 인해 발생했습니다 . 필드가 비어 있으면 user항목이 무시 됩니다 plugin.

예를 들어 mysql_native_password다시 활성화하려면 설정하십시오 .

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

«Authentication Notes»의 MySQL 5.7.2 릴리스 정보를 참조하십시오 .

어떤 이유로 (내 4.2 이전 비밀번호 해시가 제거 되었기 때문에) mysql_upgrade스크립트가 기본 플러그인 값을 설정하지 않았습니다.

나는 다음과 같은 경고 메시지를 보았습니다 /var/log/mysql/error.log.

[경고] 사용자 항목 'foo'@ '%'에 빈 플러그인 값이 있습니다. 사용자는 무시되며 더 이상이 사용자로 로그인 할 수 없습니다.

나는이 대답을 여기에 게시하여 내가했던 것과 똑같은 시간을 사용하지 못하게 할 수 있습니다.


2

다른 사람이 이것이 도움이 될지 확실하지 않지만 동일한 오류가 발생하여 익명의 사용자를 검색했습니다 ... 아무 것도 없었습니다. 문제는 사용자 계정이 "SSL 필요"로 설정 되었기 때문입니다. 사용자 계정으로 이동하여 사용자의 권한 편집을 클릭하여 PHPMyAdmin에서 찾았습니다. 이 옵션을 선택 해제하자마자 모든 것이 예상대로 작동했습니다!


2

디버깅 요약

  • 오타 오류를 확인하십시오 : 사용자 이름 또는 비밀번호.
  • 호스트 이름을 확인하고 mysql.user 테이블 호스트 이름과 비교하십시오.
  • 사용자가 있는지 확인하십시오.
  • 호스트에 IP 주소 또는 호스트 이름이 포함되어 있는지 확인하십시오.

작업에서이 문제가 여러 번 발생했을 가능성이 큽니다. 이 문제는 사용자 이름 또는 비밀번호를 잘못 입력하여 발생했습니다. 이것이 이유 중 하나이지만이 문제가 발생할 가능성이 다른 여러 가지가 있습니다. 때로는 매우 비슷해 보이지만 자세히 살펴보면이 오류의 원인이되는 여러 가지 요소를 알게됩니다. 이 게시물에서는 대부분의 일반적인 이유를 자세히 설명하고이 문제를 해결하기위한 해결 방법을 제공합니다.

가능한 이유 :

  • 사례 1 : 오타 오류 : 사용자 이름 또는 비밀번호

이것이이 오류의 가장 일반적인 이유입니다. 사용자 이름 또는 비밀번호를 잘못 입력하면이 오류가 발생합니다.

해결책:

이 유형의 오류에 대한 해결책은 매우 간단합니다. 올바른 사용자 이름과 비밀번호를 입력하십시오. 이 오류는 해결 될 것입니다. 비밀번호를 잊어 버린 경우 사용자 이름 / 비밀번호를 재설정 할 수 있습니다. 관리자 / 루트 계정의 비밀번호를 잊어 버린 경우 루트 비밀번호를 재설정 / 다시 캡처하는 방법에는 여러 가지가 있습니다. 루트 암호를 잊어 버린 경우 루트 암호를 재설정하는 방법에 대한 다른 게시물을 게시합니다.

  • 사례 2 : 잘못된 호스트에서 액세스

MySQL은 보안 기능으로 사용자 액세스에 대한 호스트 기반 제한을 제공합니다. 프로덕션 환경에서는 액세스 요청을 응용 프로그램 서버로만 제한했습니다. 이 기능은 많은 프로덕션 시나리오에서 실제로 유용합니다.

해결책:

이러한 유형의 문제가 발생하면 먼저 mysql.user 테이블을 확인하여 호스트가 허용되는지 확인하십시오. 정의되지 않은 경우 mysql.user 테이블에 새 레코드를 업데이트하거나 삽입 할 수 있습니다. 일반적으로 원격 시스템에서 루트 사용자로 액세스 할 수 없으며 보안 문제로 인해 모범 사례가 아닙니다. 여러 머신에서 서버에 액세스해야하는 경우 해당 머신에만 액세스하십시오. 와일드 카드 (%)를 사용하지 않는 것이 좋으며 범용 액세스를 제공합니다. mysql.user 테이블을 업데이트하겠습니다. 이제 데모 사용자는 모든 호스트에서 MySQL 서버에 액세스 할 수 있습니다.

  • 사례 3 : 서버에 사용자가 없습니다.

이 유형의 오류는 액세스하려는 사용자가 MySQL 서버에 없을 때 발생합니다.

솔루션 :

이러한 유형의 문제에 직면하면 사용자가 mysql.user 테이블에 있는지 여부를 확인하십시오. 레코드가 존재하지 않으면 사용자는 액세스 할 수 없습니다. 해당 사용자가 액세스해야하는 경우 해당 사용자 이름으로 새 사용자를 작성하십시오.

  • 사례 4 : 숫자 및 이름 기반 호스트의 혼합

중요한 포인트

  • 사용자 호스트를 정의 할 때 와일드 카드를 사용하지 않는 것이 좋습니다. 정확한 호스트 이름을 사용하십시오.

  • 원격 시스템에서 루트 로그인을 비활성화하십시오.

  • 프록시 사용자 개념을 사용하십시오.

이 주제와 관련된 다른 개념은 거의 없으며 해당 주제에 대한 세부 정보를 얻는 것은이 기사의 범위와 매우 다릅니다. 다음 기사에서 다음 관련 주제를 살펴볼 것입니다.

  • MySQL 서버에서 루트 비밀번호를 잊어 버린 경우 수행 할 작업
  • MySQL 액세스 권한 문제 및 사용자 관련 테이블.
  • 모범 사례가 포함 된 MySQL 보안 기능.

이 게시물이 MySQL에서 사용자에게 거부 된 MySQL 오류 코드 1045 액세스를 수정하는 데 도움이되기를 바랍니다.


2

mysql에서 debian-sys-maint 사용자를 삭제하여 더 많은 피해를 입지 않았기를 바랍니다.

mysql 데몬이 정상적으로 작동하도록하십시오. 아래와 같이 mysql 클라이언트를 시작하십시오

mysql -u debian-sys-maint -p

다른 터미널 cat에서 파일/etc/mysql/debian.cnf . 해당 파일에는 비밀번호가 포함되어 있습니다. 프롬프트가 표시되면 해당 비밀번호를 붙여 넣으십시오.

http://ubuntuforums.org/showthread.php?t=1836919


2

나는 표면에 가장자리로 보이는 또 다른 사례를 발견했다. SELECT INTO .. ​​OUTFILE을 통해 파일 시스템으로 루트로, 그러나 일반 사용자로는 내보낼 수 없습니다. 이것이 권한의 문제 일지 모르지만, 나는 그것을 보았고 특히 명백한 것을 보지 못했습니다. 내가 말할 수있는 것은 해당 데이터베이스에 대한 모든 권한을 가진 일반 사용자로 쿼리를 실행하면 액세스 거부 오류가 반환 되어이 주제로 연결된다는 것입니다. 오래된 프로젝트에서 SELECT INTO… OUTFILE을 성공적으로 사용했다는 기록을 찾았을 때 루트로 로그인 한 것을 알 수있었습니다. 물론 루트로 로그인하면 쿼리가 예상대로 실행되었습니다.


1

업데이트 : v8.0.15 (아마도이 ​​버전)에서PASSWORD() 기능이 작동하지 않습니다.

당신은해야합니다 :

  1. 먼저 MySQL을 중지했는지 확인하십시오.
  2. 권한 우회를 사용하여 안전 모드에서 서버를 실행하십시오. sudo mysqld_safe --skip-grant-tables
  3. 로그인: mysql -u root
  4. MySQL> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. MySQL> FLUSH PRIVILEGES;
  6. MySQL> exit;
  7. 다시 로그인하십시오 : mysql -u root
  8. MySQL> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

0

당신이 실행하면 mysql -u bill -p, localhost그것은 127.0.0.1 때문에, 당신의 IP로 해결하고있는 /etc/hosts기본으로, 파일이 127.0.0.1 localhost존재한다. 따라서 mysql bill@localhost은으로 부여되지 않은 것으로 해석합니다 bill@'%'. 이것이 쿼리 root결과로 사용자에 대해 두 개의 다른 레코드가있는 이유 select host, user from mysql.user;입니다.

이 문제를 처리하는 두 가지 방법이 있습니다.

하나는 /etc/hosts로그인을 시도 할 때 파일에 의해 확인되지 않는 ip를 지정하는 것 입니다. 예를 들어, 서버의 IP는입니다 10.0.0.2. 명령을 실행하면 mysql -u bill -p -h 10.0.0.2로그인 할 수 있습니다. 당신이 입력 select user();하면 얻을 것이다 bill@10.0.0.2. 물론 /etc/hosts파일 에서 도메인 이름을이 IP로 확인해서는 안됩니다 .

둘째,이 특정 도메인 이름에 대한 액세스 권한을 부여해야합니다. 의 경우 bill@localhostcommand를 호출해야합니다 grant all privileges on *.* to bill@localhost identified by 'billpass';. 이 경우 command로 로그인 할 수 있습니다 mysql -u bill -p. 로그인하면 select user();command 가를 반환합니다 bill@localhost.

그러나 이것은 동일한 호스트에서 mysql 서버에 로그인하려고하기위한 것입니다. 원격 호스트에서 mysql은 예상대로 작동하며 '%'는 로그인 권한을 부여합니다.


0

나는 오래된 버그가 많은 사용자 'bill'항목을 삭제 하여이 문제를 해결했다 (이것은 mysql.usermysql.db 모두에서 중요한 부분 임).

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

작동했습니다. 사용자가 연결 중입니다. 이제 나는 그것에서 일부 특권을 제거 할 것입니다 :)


0

같은 오류가 발생했습니다. 작동하지 않는 설정은 다음과 같습니다.

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

아래의 편집 된 설정은 작동 된 것입니다. 차이점을 알 수 있습니까?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

차이점은 큰 따옴표입니다. Java와 달리 PHP에서 상당히 중요한 것처럼 보이며 문자를 이스케이프하고 URL을 설정하고 매개 변수를 함수에 전달할 때 영향을 미칩니다. 그들은 더 예쁘지 만 (가능한 한) 항상 작은 따옴표를 사용하십시오. 필요한 경우 큰 따옴표를 그 안에 중첩시킬 수 있습니다.

이 오류는 Windows 환경이 아닌 Linux 상자에서 응용 프로그램을 테스트 할 때 발생했습니다.


0

비밀번호에 ";"이 포함되어 있기 때문에 비슷한 문제가있었습니다. 처음 비밀번호를 만들 때 내 비밀번호를 깨는 문자. 당신을 도울 수 있다면 이것에주의하십시오.


0

이것은 소수의 사람들에게 적용될 수 있지만 여기에갑니다. !비밀번호에 느낌표 를 사용하지 마십시오 .

MariaDB를 사용하여 위의 오류가 발생했습니다. 숫자와 문자로 단순화하면 효과가있었습니다. 같은 다른 문자 @$잘 작동-같은 인스턴스에서 다른 사용자의 해당 문자를 사용했습니다.

주소 의 다섯 번째 답변 은 나를 고쳤습니다.


0

Windows에서 해결 방법은 다음과 같습니다.

오류 1045 (28000) : 사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : NO).

  1. 제어판에서 mysql 제거
  2. 에서 C:\Program Files,C:\Program Files (x86)및 MySql 폴더를 삭제하십시오.C:\ProgramData
  3. mysql 설치

다른 모든 답변을 시도하고 마침내 이것을 시도하여 해결했습니다!
jasonoriordan

0

MySQL이 Windows와 같이 대소 문자를 구분하지 않는 OS에서 실행중인 경우에도 발생할 수 있습니다.

예를 들어,이 자격 증명을 사용하여 데이터베이스에 연결하려는 시도가 실패한 것으로 나타났습니다.

MySQL> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

오류 1045 (28000) : 사용자 'specialuser'@'10.0.1.113'에 대한 액세스가 거부되었습니다 (암호 사용 : 예).

그러나 이것은 성공했습니다.

MySQL> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

암호를 입력:



0

요즘! 솔루션 :

MySQL 오류 1045 (28000) : 사용자 'user'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : YES).

Wampserver 3.2.0 새로운 설치 또는 업그레이드

아마도 기본값으로 xamp사용 mariaDB하는 것이 좋습니다.

Wamp서버는 mariaDBmysql 과 함께 제공되며 mariaDB3306 포트에서 기본으로 설치되고 3307에서 mysql로 ​​설정되며 포트는 때때로 3308입니다.

에 연결하십시오 mysql!

소 instalation에 사용하도록 요구 mariaDB하거나 MySql, 그러나 mariaDB은 기본적으로 선택되어 있으며, 변경 확인하지 못할 mysql옵션을 설치합니다.

설치가 완료되면 둘 다 mariaDB기본 포트 3306과 mysql다른 포트 3307 또는 3308에서 실행됩니다.

오른쪽 wampserver하단 모서리에있는 런이있는 아이콘을 마우스 오른쪽 버튼으로 클릭하고 도구로 이동하여 올바른 mysql런닝 포트를 확인하십시오 .

그리고 folowng와 같은 데이터베이스 연결에 포함하십시오.

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : pdo를 사용하고 있습니다.

자세한 내용은 여기를 참조하십시오 : https://sourceforge.net/projects/wampserver/


강조하기 위해 백틱을 사용하지 마십시오. 코드에만 사용해야합니다. MySQL이나 Wampserver와 같은 단어는 코드가 아닙니다.
Dharman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.