6.2.7 액세스 거부 오류의 원인
MySQL 서버에 접속을 시도 할 때 문제가 발생한 경우 문제를 해결하기 위해 수행 할 수있는 일련의 작업에 대해 다음 항목에서 설명합니다.
서버가 실행 중인지 확인합니다. 그렇지 않은 경우, 클라이언트는 연결할 수 없습니다. 예를 들어, 서버에 연결하려고 다음과 같은 메시지와 함께 실패하면 서버가 실행되고 있지 않은 것이 하나의 원인 일 수 있습니다.
shell>
mysql
ERROR 2003: Can't connect to MySQL server on 'host_name
' (111) shell>mysql
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)서버가 실행하고 있지만 서버가 대기하고있는 것과 다른 TCP / IP 포트 명명 된 파이프 또는 Unix 소켓 파일을 사용하여 연결을 시도하는 경우도 있습니다. 이 문제를 해결하려면 클라이언트 프로그램을 호출 할 때 적절한 포트 번호를 가리 키도록
--port
옵션을 지정하거나--socket
에서 적절한 명명 된 파이프 또는 Unix 소켓 파일을 지정합니다. 소켓 파일의 위치를 찾으려면 다음 명령을 사용할 수 있습니다.shell>
netstat -ln | grep mysql
서버가 네트워크 연결을 무시하도록 구성되어 있지 않은지, 또는 (원격으로 연결하려고하는 경우) 서버의 네트워크 인터페이스에서 로컬에서만 수신하도록 구성되어 있지 않은지 확인합니다 . 서버가
--skip-networking
을 지정하여 시작되면 서버는 TCP / IP 연결을 허용하지 않습니다. 서버가--bind-address=127.0.0.1
을 사용하여 시작되면 서버는 로컬 루프백 인터페이스에서만 TCP / IP 연결을 대기하는 원격 연결을 허용하지 않습니다.방화벽이 MySQL에 대한 액세스를 차단하고 있지 않은지 확인합니다. 방화벽은 실행중인 응용 프로그램 또는 MySQL에 의해 통신에 사용되는 포트 번호 (기본값 3306)를 기준으로 구성 될 수 있습니다. Linux 또는 Unix의 경우 IP 테이블 (또는 유사한 기능) 구성을 살펴 포트가 차단되어 있지 않은지 확인합니다. Windows의 경우 ZoneAlarm과 Windows XP 개인용 방화벽 등의 어플리케이션이 MySQL 포트를 차단하지 않도록이를 구성하는 것이 필요한 경우가 있습니다.
부여 테이블이 제대로 설치되어 있고 서버가이를 액세스 제어에 사용할 수 있도록되어있는 것이 필요합니다. 일부 배포 유형 (Windows 바이너리 배포 또는 Linux RPM 배포 등)는 설치 과정에서 부여 테이블이있는
mysql
데이터베이스가 초기화됩니다. 그렇지 않으면 배포의 경우, mysql_install_db 프로그램을 실행 부여 테이블을 수동으로 초기화해야합니다. 자세한 내용은 섹션 2.10.1 "Unix 유사 시스템에서 설치 후 절차" 를 참조하십시오.부여 테이블의 초기화가 필요한지 여부를 판별하려면 데이터 디렉토리 아래에있는
mysql
디렉토리를 참조합니다. (일반적으로 데이터 디렉토리data
또는var
라는 이름으로 MySQL 설치 디렉토리 아래에 있습니다.)mysql
데이터베이스 디렉토리에user.MYD
라는 파일이 있는지 확인하십시오. 없는 경우, mysql_install_db 프로그램을 실행합니다. 이 프로그램을 실행하여 서버를 시작한 후 다음 명령을 실행하여 초기 권한을 테스트합니다.shell>
mysql -u root test
서버는 오류를 내지 않고 사용자를 연결하는 것입니다.
새로 설치 후 서버에 접속하여 사용자 및 사용자의 액세스 권한을 설정하도록합니다.
shell>
mysql -u root mysql
MySQL
root
사용자는 처음부터 비밀번호가 없기 때문에 서버는 사용자를 연결하는 것입니다. 여기에는 보안 측면에서 위험하기 때문에 다른 MySQL 계정을 설정할 때,root
계정의 암호를 설정하는 것이 좋습니다. 초기 암호 설정 절차는 섹션 2.10.2 "처음 MySQL 계정 보안 설정" 을 참조하십시오.기존의 MySQL 설치를 새로운 버전으로 업데이트 한 경우 mysql_upgrade 스크립트를 실행했는지 여부를 확인합니다. 행하고 있지 않으면 실행합니다. 부여 테이블의 구조는 새로운 기능이 추가 될 때 자주 변경되기 때문에 업그레이드 한 후에는 항상 테이블 구조가 최신인지 확인하는 것이 좋습니다. 그 절차는 섹션 4.4.7 "mysql_upgrade - MySQL 테이블 체크 및 업그레이드" 를 참조하십시오.
클라이언트 프로그램이 연결을 시도 할 때 다음 오류 메시지가 나타날 경우 서버는 클라이언트가 생성 할 수있는 것보다 새로운 형식의 패스워드를 기대하고있는 것을 의미합니다.
shell>
mysql
Client does not support authentication protocol requested by server; consider upgrading MySQL client이를 해결하는 방법은 섹션 6.1.2.4 "MySQL에서 암호 해시」 및 섹션 B.5.2.4 "클라이언트는 인증 프로토콜을 지원하지 않습니다" 를 참조하십시오.
클라이언트 프로그램은 옵션 파일 또는 환경 변수에 지정된 연결 매개 변수를 사용하는 것에 유의하십시오. 명령 줄에 연결 매개 변수를 지정하지 않을 때 클라이언트 프로그램이 잘못된 기본 연결 매개 변수를 전송하고 있다고 생각되는 경우 해당 옵션 파일 및 환경을 확인하십시오. 예를 들어, 옵션없이 클라이언트를 구동 할 때
Access denied
을받을 경우 하나의 옵션 파일에서 기존 암호를 지정하고 있지 않은지 확인하십시오.--no-defaults
를 지정하고 클라이언트 프로그램을 호출하여 옵션 파일의 사용을 클라이언트 프로그램에 의해 억제 할 수 있습니다. 예 :shell>
mysqladmin --no-defaults -u root version
클라이언트가 사용하는 옵션 파일의 목록은 섹션 4.2.6 "옵션 파일 사용" 에 있습니다. 환경 변수의 목록은 섹션 2.12 "환경 변수" 에 있습니다.
다음과 같은 오류가 나오는 경우 잘못된
root
암호를 사용하고 있는지를 보여줍니다.shell>
mysqladmin -u root -p
Access denied for user 'root'@ 'localhost'(using password : YES)xxxx
ver암호를 지정하지 않았는데 이러한 오류가 발생하는 경우 옵션 중 하나 파일에 잘못된 암호가 나열되어 있다는 것을 의미합니다. 위의 항목에서 설명한 바와 같이
--no-defaults
옵션을 사용해보십시오.암호 변경에 대한 정보는 섹션 6.3.5 "계정 암호 할당" 을 참조하십시오.
root
암호를 분실하거나 잊어 버린 경우 섹션 B.5.4.1 "root 암호를 재설정하는 방법" 을 참조하십시오.SET PASSWORD
,INSERT
또는UPDATE
를 사용하여 암호를 변경하는 경우,PASSWORD()
함수를 사용하여 암호를 암호화해야합니다. 이러한 진술에PASSWORD()
함수를 사용하지 않으면 암호가 작동하지 않습니다. 예를 들어, 다음 명령문은 암호를 할당하지만 비밀번호가 암호화되지 않기 때문에 사용자는 나중에 연결할 수 없습니다.SET PASSWORD FOR 'abe'@ '
host_name
'='eagle ';대신 암호를 다음과 같이 설정합니다.
SET PASSWORD FOR 'abe'@ '
host_name
'= PASSWORD ('eagle ');CREATE USER
또는GRANT
문이나 mysqladmin password 명령을 사용하여 암호를 지정하는 경우에는PASSWORD()
함수는 필요하지 않습니다. 이들은 모두PASSWORD()
을 자동으로 사용하여 암호를 암호화합니다. 섹션 6.3.5 "계정 암호 지정" 및 섹션 13.7.1.2 "CREATE USER 구문" 을 참조하십시오.localhost
는 로컬 호스트 이름의 동의어로 호스트를 명시 적으로 지정하지 않으면 클라이언트가 연결을 시도하는 디폴트 호스트이기도합니다.그런 시스템에서 위의 문제를 해결하기 위해
--host=127.0.0.1
옵션을 사용하여 서버 호스트를 명시 적으로 지정할 수 있습니다. 이렇게하면 로컬 mysqld 서버에 TCP / IP 연결이됩니다. 또한 로컬 호스트의 실제 호스트 이름을 사용하는--host
옵션을 지정하여 TCP / IP를 사용할 수도 있습니다. 이 경우 서버와 동일한 호스트에서 클라이언트 프로그램을 실행하고 있어도, 호스트 이름이 서버 호스트의user
테이블 행에 지정되어 있지 않으면 안됩니다.Access denied
라는 에러 메시지는 로그인을 시도하는 사용자 이름, 연결을 시도하는 클라이언트 호스트 및 암호를 사용했는지 여부를 알려줍니다. 일반적으로 오류 메시지에서 지정된 호스트 이름과 사용자 이름과 정확하게 일치하는 1 개의 행을user
테이블에 갖게합니다. 예를 들어,using password: NO
라는 메시지가 포함 된 오류 메시지를받는 경우 암호없이 로그인하려고 한 것을 의미합니다.mysql -u
을 사용하여 데이터베이스에 연결하려고 할 때user_name
Access denied
에러를 받았을 경우,user
테이블에 아마 문제가 있습니다. 이를 확인하려면mysql -u root mysql
를 실행하고 다음 SQL 문을 발행합니다.SELECT * FROM user;
이 결과는 클라이언트의 호스트 이름과 사용중인 MySQL 사용자 이름과 일치하는
Host
와User
컬럼을 갖는 행이 포함되어있을 것입니다.MySQL 서버를 실행하는 호스트가 아닌 호스트에서 연결하려고 다음과 같은 오류가 발생하면 클라이언트 호스트와 일치하는
Host
값을 가진 행이user
테이블에 없다는 것을 의미합니다.Host ... is not allowed to connect to this MySQL server
이것은 연결하려고 할 때 사용하는 클라이언트 호스트 이름과 사용자 이름 조합에 대한 계정을 설정하여 해결할 수 있습니다.
접속을 시도하는 컴퓨터의 IP 주소 또는 호스트 이름을 모르는 경우,
Host
컬럼 값이'%'
행을user
테이블에 작성하도록합니다. 그리고 그 클라이언트 컴퓨터에서 연결하려고 한 후에,SELECT USER()
쿼리를 사용하여 실제로 어떻게 연결했는지 확인합니다. 그 후,user
테이블 행의'%'
를 로그에 표시되는 실제 호스트 이름으로 변경합니다. 그렇지 않으면 특정 사용자 이름에 대해 모든 호스트로부터의 접속이 가능하므로 시스템은 안전하지 않은 상태입니다.Linux에서는이 오류가 발생할 수있는 다른 이유는 사용중인 버전과 다른 버전의
glibc
라이브러리로 컴파일 된 바이너리 MySQL 버전을 사용하고있는 것이 있습니다. 이 경우 운영 체제 또는glibc
를 업그레이드하거나 MySQL 소스 배포판 버전을 다운로드하여 직접 컴파일합니다. 소스 RPM의 컴파일 및 설치는 일반적으로 쉽게이기 때문에 이것은 큰 문제가 없습니다.연결을 시도 할 때 호스트 이름을 지정했지만, 호스트 이름을 숨기거나 IP 주소가있는 오류 메시지를받은 경우, MySQL 서버는 클라이언트 호스트의 IP 주소를 이름으로 해결하려고 할 때 오류 을받은 것을 의미합니다.
shell>
mysqladmin -u root -p
Access denied for user 'root'@ ''(using password : YES)xxxx
-hsome_hostname
verroot
로 접속하려고 다음과 같은 오류를받은 경우User
컬럼 값이'root'
행이user
테이블에없고 mysqld가 클라이언트에 호스트 이름을 확인할 수 없음을 의미합니다.Access denied for user ''@ 'unknown'
이러한 오류는 DNS의 문제를 보여줍니다. 이 문제를 해결하려면 mysqladmin flush-hosts를 실행하고 내부 DNS 호스트 캐시를 재설정합니다. 섹션 8.11.5.2 "DNS 조회 최적화 및 호스트 캐시" 를 참조하십시오.
일부 영구적 인 해결책을 보여줍니다.
DNS 서버의 문제를 확인하고 수정합니다.
MySQL 부여 테이블에 호스트 이름 대신 IP 주소를 지정합니다.
클라이언트 컴퓨터 이름의 항목을 Unix의 경우
/etc/hosts
에 Windows의 경우는\windows\hosts
에 배치합니다.mysqld를
--skip-name-resolve
옵션으로 시작합니다.mysqld를
--skip-host-cache
옵션에서 시작합니다.Unix에서 서버와 클라이언트를 동일한 컴퓨터에서 실행하는 경우
localhost
에 연결합니다.localhost
에 Unix 연결은 TCP / IP가 아닌 Unix 소켓 파일을 사용합니다.Windows에서 서버와 클라이언트를 동일한 시스템에서 실행하고 서버가 명명 된 파이프 연결을 지원하는 경우 호스트 이름
.
(마침표)에 연결합니다..
연결은 TCP / IP 대신 명명 된 파이프가 사용됩니다.
mysql -u root test
는 작동하지만,mysql -h
가your_hostname
-u root testAccess denied
되는 경우 (여기서your_hostname
은 로컬 호스트의 실제 호스트 이름) 호스트 이름에 대한 올바른 이름이user
테이블에없는 수 있습니다. 이 경우 일반적인 문제로서user
테이블 행의Host
값은 규정되지 않은 호스트 이름을 지정하고 있지만 시스템의 이름 해석 루틴은 정규화 된 도메인 이름을 반환하는 것 (또는 그 반대)이 있습니다. 예를 들어,user
테이블에 호스트'pluto'
항목이 있지만, DNS가 MySQL에 호스트 이름이'pluto.example.com'
라고 지시하는 경우 항목은 비활성화됩니다. 호스트의 IP 주소를Host
컬럼 값으로 저장하는 항목을user
테이블에 추가 해보세요. (또는'pluto.%'
등의 와일드 카드를 포함한Host
값을 가진 항목을user
테이블에 추가 할 수 있습니다. 다만, "%
"로 끝나는Host
값을 사용하는 것이 안전하지 않기 때문에 권장되지 응.)mysql -u
가 작동하지만user_name
testmysql -u
가 작동하지 않는 경우user_name
other_db
other_db
라는 데이터베이스에 대해 특정 사용자에게 액세스 권한을 부여하지 않습니다.mysql -u
서버 호스트에서 실행했을 때 작동하지만,user_name
mysql -h
원격 클라이언트 호스트에서 실행했을 때 작동하지 않는 경우 특정 사용자 이름에 대해 원격 호스트 서버에 액세스 를 사용하지 않습니다.host_name
-uuser_name
Access denied
을받는 이유를 모르는 경우 와일드 카드를 포함Host
값을 가진 모든 항목 ('%'
또는'_'
문자가 포함 된 항목)를user
테이블에서 삭제합니다. 매우 일반적인 실수는Host
='%'
와User
=
라는 새로운 항목을 삽입하고이를 통해 사용자는 동일한 시스템에서 연결하도록' some_user '
localhost
로 지정할 수있는 것으로 여길 것입니다. 이것이 작동하지 않는 이유는 기본 권한에Host
='localhost'
와User
=''
엔트리를 가지고 있기 때문입니다. 이 항목은'%'
보다 더 구체적인'localhost'
라는Host
값이 있기 때문에localhost
에서 접속할 때는 새로운 항목보다 이쪽이 우선 해 사용됩니다. 올바른 절차로는Host
='localhost'
와User
=
라는 제 2의 항목을 삽입하거나' some_user '
Host
='localhost'
와User
=''
항목을 삭제합니다. 이 항목을 삭제 한 후FLUSH PRIVILEGES
명령문을 발행하여 부여 테이블을 다시 읽어를 반드시 실시해주십시오. 섹션 6.2.4 "액세스 제어 1 단계 : 연결 확인" 을 참조하십시오.MySQL 서버에 연결할 수 있지만
SELECT ... INTO OUTFILE
또는LOAD DATA INFILE
명령문을 발행 할 때마다Access denied
메시지를받을 경우,user
테이블의 항목에서FILE
권한이 설정되어 있지 않습니다.부여 테이블을 직접 (예를 들어,
INSERT
,UPDATE
또는DELETE
문을 사용하여) 변경하고 변경 사항이 무시 된 것처럼 보이는 경우 서버에 권한 테이블을 다시로드하기 위해FLUSH PRIVILEGES
명령문 또는 mysqladmin flush-privileges 명령을 실행해야하는 것을 기억하십시오. 그렇지 않으면 서버가 다음 다시 시작할 때까지 변경의 영향을받지 않습니다.root
암호를UPDATE
문에서 변경 한 뒤, 권한을 플래시 할 때까지 새 암호를 지정할 필요가 없습니다. 이것은 암호가 변경된 것을 서버에 아직 인식되지 않기 때문입니다.세션 중에 권한이 변경되었다고 생각하면, MySQL 관리자에 의해 권한이 변경된 가능성이 있습니다. 부여 테이블을 다시 읽어는 새로운 클라이언트 접속에 영향을 주지만, 섹션 6.2.6 "권한 변경이 활성화되는시기" 와 같이 기존의 연결에도 영향을 미칩니다.
Perl, PHP, Python, 또는 ODBC 프로그램 액세스에 문제가있는 경우
mysql -u
또는user_name
db_name
mysql -u
을 사용하여 서버에 연결을 시도합니다. mysql 클라이언트를 사용하여 연결할 수 있다면 문제는 권한이 아닌 프로그램에 있습니다. (user_name
-pyour_pass
db_name
-p
와 비밀번호 사이에는 공백이 없습니다.--password=
구문을 사용하여 암호를 지정할 수 있습니다.your_pass
-p
또는--password
옵션을 사용하여 암호 값을 지정하지 않으면, MySQL 암호를 요구합니다.)테스트 목적으로
--skip-grant-tables
옵션을 지정해 mysqld 서버를 시작합니다. 이렇게하면 MySQL 부여 테이블을 변경할 수 있으며,SHOW GRANTS
문을 사용하여 변경 의한 바람직한 영향이 있는지 여부를 확인 할 수 있습니다. 변경이 마음에 들면, mysqladmin flush-privileges를 실행하여 권한을 다시로드하도록 mysqld 서버에 지시합니다. 이렇게하면 서버를 중지하고 다시 시작하지 않고 새로운 부여 테이블의 내용의 사용을 시작할 수 있습니다.모두가 실패 할 경우, mysqld 서버를 디버깅 옵션 (
--debug=d,general,query
등)에서 시작합니다. 이에 따라 발행 된 각 명령에 대한 정보 외에 시도 된 연결에 대한 호스트 및 사용자 정보가 출력됩니다. 섹션 24.4.3 "DBUG 패키지" 를 참조하십시오.MySQL 부여 테이블에 대해 뭔가 다른 문제가있는 메일 링리스트에 문제를 게시 할 필요가 있다고 생각하면, MySQL 부여 테이블의 덤프를 항상 제공합니다. mysqldump mysql 명령으로 테이블을 덤프 할 수 있습니다. 버그 리포트를 제출하려면 섹션 1.7 "질문이나 버그를보고하는 방법" 의 설명을 참조하십시오. mysqldump를 실행하려면
--skip-grant-tables
를 지정해 mysqld를 다시 시작하는 것이 필요한 경우도 있습니다.