먼저 많은 제안 된 질문을 겪었고 관련 답변을 찾지 못했다고 언급하겠습니다. 여기 내가하고있는 일이 있습니다.
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’에 대한 액세스가 거부되었습니다 (암호 사용 : 예).
답변
당신은 아마 익명의 사용자 ''@'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
익명 사용자로 액세스 권한이 부여되었습니다. 이것은 위에서 언급 한 “정렬 규칙”때문입니다. 대부분의 기본 설치 에는 암호가없는 익명 사용자가 존재 하며 보안 / 제거되어야합니다.
답변
시험:
~$ mysql -u root -p
Enter Password:
mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
답변
당신이 달렸을 때
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를 명시 적으로 호출하는 것을 잊지 마십시오.
답변
이것에 늦게 슈퍼
나는 다른 모든 답변을 시도하고 많은 다른 버전을 mysql -u root -p
실행했지만 결코 실행하지 않았습니다.
mysql -u root -p
그리고 [ENTER]
비밀번호를 누르기 만하면 됩니다.
일단 그렇게하면 효과가있었습니다. 이것이 누군가를 돕기를 바랍니다.
답변
내 경우의 관련 문제는 다음을 사용하여 연결하려고했습니다.
mysql -u mike -p mypass
공백 은 -u # uname # 사이에 허용되지만 -p와 # password # 사이에는 허용 되지 않습니다 .
따라서 다음이 필요합니다.
mysql -u mike -pmypass
그렇지 않으면 -p mypass 사이에 공백이있는 경우 mysql은 ‘mypass’를 db 이름으로 사용합니다.
답변
를 입력 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를 사용하여 연결할 수도 있습니다.
답변
비밀번호를 잊어 버렸거나 비밀번호를 수정하려는 경우 다음 단계를 수행하십시오.
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 경고 : 06 : 플러시
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