호스트 'xxx.xx.xxx.xxx'는이 MySQL 서버에 연결할 수 없습니다


667

이것은 간단하게 죽어야하지만 내 삶에 효과 가 없을는 없습니다 .
MySQL 서버에 원격으로 연결하려고합니다.

로 연결

mysql -u root -h localhost -p  

잘 작동하지만 시도

mysql -u root -h 'any ip address here' -p

오류와 함께 실패

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

에서 mysql.user테이블, 정확히 호스트 '%'와 다른 같은 호스트 'localhost를'을 가지고있는 사용자 '루트'에 대해 동일한 항목이 있습니다.

나는 나의 지혜의 끝에 있고, 어떻게 진행할 것인지 전혀 모른다. 어떤 아이디어라도 환영합니다.


보안 예방 조치로 인해 대부분의 경우 루트로 로그인 할 수 없습니다.
AO_

답변:


816

보안 예방 조치 일 수 있습니다. 새 관리자 계정을 추가 할 수 있습니다.

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Pascal과 다른 사람들이 언급했듯이 이러한 종류의 액세스 권한을 가진 사용자가 모든 IP에 공개하는 것은 좋은 생각이 아닙니다. 관리 사용자가 필요한 경우 root를 사용하고 localhost에 그대로 두십시오. 다른 조치의 경우 필요한 권한을 정확하게 지정하고 파스칼이 아래에 제안한대로 사용자의 접근성을 제한하십시오.

편집하다:

MySQL FAQ에서 :

액세스 거부 이유를 알 수없는 경우 와일드 카드 ( '%'또는 '_'문자를 포함하는 항목)를 포함하는 호스트 값이있는 모든 항목을 사용자 테이블에서 제거하십시오. 매우 일반적인 오류는 Host = '%'및 User = 'some_user'로 새 항목을 삽입하는 것입니다. 이렇게하면 동일한 시스템에서 연결할 로컬 호스트를 지정할 수 있습니다. 이것이 작동하지 않는 이유는 기본 권한에 Host = 'localhost'및 User = ''항목이 포함되어 있기 때문입니다. 해당 항목은 '%'보다 더 특정한 호스트 값 'localhost'를 가지므로 localhost에서 연결할 때 새 항목보다 우선적으로 사용됩니다! 올바른 절차는 Host = 'localhost'및 User = 'some_user'로 두 번째 항목을 삽입하는 것입니다. 또는 Host = 'localhost'및 User = ''로 항목을 삭제합니다. 항목을 삭제 한 후 FLUSH PRIVILEGES 문을 발행하여 권한 부여 테이블을 다시로드하십시오. 5.4.4 절“액세스 제어, 1 단계 : 연결 확인”도 참조하십시오.


17
Yannick를 잘 잡았지만 루트가 아닌 사용자에게 모든 권한을 부여하는 것은 좋지 않습니다. 아마도 축소 세트?
Corey Ballou

3
글쎄, 이것은 실제로 좋은 생각은 아니지만 '루트'가 모든 호스트에서 연결되도록 허용하는 것은 동일한 권한 수준이기 때문에 정확히 동일합니다.
Yannick Motton

2
내 포인트 파스칼이 그립다 고 생각합니다. 요점은 '루트'사용자가 이미 이러한 권한을 가지고 있으며, IP가 해당 사용자로 인증되도록하고 싶다는 것입니다. 따라서 이것이 실제로 원하는 경우 새 관리자 사용자 (정확히 동일한 권한을 가짐)를 작성하는 기본 예는 그가 시도하는 것의 대안입니다.
Yannick Motton

2
맞습니다 Yannick, 나는 빨리 읽고 내 의견을 제거 할 것입니다. 그러나 AFAIK, 권한은 MySQL에서 제대로 작동하므로 다음과 같습니다. 1. OP가 그랜트 테이블을 수동으로 수정 한 다음 권한을 플러시해야 할 수도 있습니다. 2. 어쩌면 그는 루트에 적절한 부여 문법을 사용하지 않았을 것입니다. 다른 관리 사용자를 추가하면 해결 방법이 될 수 있지만 IMHO의 실제 문제는 해결되지 않습니다.
Pascal Thivent

1
모든 호스트에서 루트로의 액세스를 제공하는 것이 적절한 솔루션이 아니라고 생각했습니다. 대신 새로운 사용자를 생성하고 축소 된 권한 세트를 부여했는데, 사용 된 세트는 MySQL Workbench에서 'DBManager'로 설명됩니다. 또한 로컬 네트워크의 특정 호스트 그룹, 특히 192.168.0. %에만 액세스를 허용했습니다.
Gustavo Guevara

271

phpMyAdmin 또는 명령 프롬프트를 통해 new MySQL User아래와 같이 권한 을 생성 하고 할당해야 Query prompt합니다.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

네 가지 쿼리를 모두 마치면 username / password


5
위의 단계를 완료 한 후 mysql을 다시 시작해야했습니다.
tollbooth

username @ localhost를 만들어야합니까? username @ % 만 만들면 충분하지 않습니까? username @ % 만 만들면 localhost에서 해당 사용자와 연결할 수 없습니까?
Sorin Postelnicu

1
@localhost, 권한이 어떻게 든 다른 경우에는 생성하는 것이 합리적이지만 여기서는 동일하며 다른 것보다 더 혼란 스러울 것입니다 (예 : 다른 사람을 모르는 사람의 비밀번호 변경이 존재하고 로그인이 그 사람을 때릴 수 있음) ).
Bratchley

초보자로는 정말 도움이
무하마드 Nayab을

1
Windows의 컨테이너화 된 라 라벨 애플리케이션에서 "SQLSTATE [HY000] [1130] 호스트 'DESKTOP-xxx.xx'는이 MariaDB 서버에 연결할 수 없습니다"를 해결해 주셔서 감사합니다
Zulqarnain

117

내 오류 메시지는 비슷했고 루트를 사용하고 있는데도 ' Host XXX는이 MySQL 서버에 연결할 수 없습니다 '라고 했습니다 . 루트에 올바른 권한이 있는지 확인하는 방법은 다음과 같습니다.

내 설정 :

  • 우분투 14.04 LTS
  • MySQL v5.5.37

해결책

  1. 'etc / mysql / my.cnf'에서 파일을여십시오.
  2. 확인 사항 :

    • 포트 (기본적으로 'port = 3306')
    • bind-address (기본적으로 'bind-address = 127.0.0.1'입니다. 모두 열려면이 줄을 주석 처리하십시오. 예를 들어 실제 서버는 10.1.1.7이라고 말하겠습니다)
  3. 이제 실제 서버의 MySQL 데이터베이스에 액세스하십시오 (예 : 원격 주소는 포트 3306에서 사용자 'root'로 123.123.123.123이며 데이터베이스 'dataentry'에 대한 권한을 변경하고 싶습니다. IP 주소, 포트 및 데이터베이스 이름을 변경하십시오. 설정으로)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
  4. sudo 서비스 mysqld 재시작

  5. 이제 데이터베이스에 원격으로 연결할 수 있습니다. 예를 들어, MySQL Workbench를 사용하고 'Hostname : 10.1.1.7', 'Port : 3306', 'Username : root'를 입력하고 있습니다.

1
use dataentry대부분의 사람들이 해당 데이터베이스를 만들지 않기 때문에 줄을 건너 뛸 수 있습니다 .
Jedidja

3
mysql마지막에 서비스를 다시 시작하지 않고도이 작업을 수행 할 수있었습니다
Ryan Tuck

5
FLUSH PRIVILEGES다시 시작할 필요가 없습니다.
Adam B

이것은 FLUSH PRIVILEGES가있는 Windows 10의 MySQL 5.5에서 서비스를 다시 시작하지 않고 나를 위해 일했습니다. Windows에서 서비스 속성은 구성에 사용되는 my.ini 파일을 식별해야합니다 (속성 | 일반 | 실행 파일 경로)
FreeText

bind-address = "0.0.0.0"을 지정하면 모든 인터페이스에서 수신 대기하고 원격 연결은 작동하지만 잘못되었습니다. 네, netstat는 mysql이 0.0.0.0 (모든 인터페이스)을 수신하고 있지만 질문 제목에 오류가 있음을 보여주었습니다. 바인드 주소 줄을 완전히 제거하면 작동하기 시작했습니다. 기묘한.
Henno

71

모든 호스트 이름에서 사용자에게 액세스 권한을 부여해야합니다.

이것은 phpmyadmin에서 새로운 권한을 추가하는 방법입니다

이동 권한> 새로운 사용자 추가

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

원하는 사용자 이름으로 모든 호스트 를 선택하십시오

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


65

다음 단계를 수행하십시오.

1a) 로컬 호스트를 통해 mysql에 연결

mysql -uroot -p

1b) myslq 서버가 Kubernetes (K8s)에서 실행 중이고 NodePort를 통해 액세스중인 경우

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) 사용자 생성

CREATE USER 'user'@'%' IDENTIFIED BY 'password';

3) 권한 부여

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) 권한 플러시

FLUSH PRIVILEGES;

4
오류 1045 (28000) : 사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (passwoYES 사용) Y
Gank

11
해야한다 *.* ?
sgarg

26

메시지 *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server는 MySQL 서버에서 MySQL 클라이언트로의 응답입니다. 호스트 이름이 아닌 IP 주소를 어떻게 반환하는지 확인하십시오.

연결하려는 경우 mysql -h<hostname> -u<somebody> -p IP 주소와 함께이 메시지를 반환하면 MySQL 서버는 클라이언트에서 역방향 조회를 수행 할 수 없습니다. 이는 MySQL 클라이언트를 그랜트에 매핑하는 방식이기 때문에 중요합니다.

nslookup <mysqlclient>MySQL 서버에서 FROM을 수행 할 수 있는지 확인하십시오 . 그래도 작동하지 않으면 DNS 서버에 항목이없는 것입니다. 또는 MySQL 서버의 HOSTS 파일에 항목을 넣을 <ipaddress> <fullyqualifiedhostname> <hostname>수도 있습니다 ( <-순서는 중요 할 수 있음).

내 서버의 호스트 파일에 MySQL 클라이언트의 역방향 조회를 허용하는 항목이이 문제를 해결했습니다.


1
"MySQL 서버에서 MySQL 클라이언트로의 응답입니다." 감사합니다. 시스템이나 서버에서 오류가 어디서 발생했는지 궁금합니다. 오류 "오류 1130 (HY000) :"등이 있습니다.
PJ Brunet

20

간단한 방법 :

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

그때

FLUSH PRIVILEGES;

끝난!


%는 무엇을 의미합니까?
dataviews

1
그것은 모든 것과 같습니다. 예를 들면 다음과 같습니다 WHERE CustomerName LIKE 'a%'.- "a"로 시작하는 모든 값을 찾습니다
user5510975

16

권한 부여 테이블을 수동으로 수정하는 경우 (INSERT, UPDATE 등을 사용하여) FLUSH PRIVILEGES 권한 부여 테이블을 다시로드하도록 서버에 지시 명령문을 .

추신 : 모든 호스트가 모든 사용자 (특히 root사용 하지 않음) 에 연결 하는 것을 권장 하지 않습니다 . 클라이언트 / 서버 애플리케이션에 mysql을 사용하는 경우 서브넷 주소를 선호하십시오. 웹 서버 또는 애플리케이션 서버와 함께 mysql을 사용하는 경우 특정 IP를 사용하십시오.


4

MySql의 GUI 도구 (SQLyog)에서 제공하는 인터페이스를 사용하십시오.

사용자 관리자를 클릭하십시오 : 여기에 이미지 설명을 입력하십시오

이제 다른 모든 원격 PC에 대한 액세스 권한을 부여하려면 아래 그림과 같이 호스트 필드 값이 % (와일드 카드)인지 확인하십시오.

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


4

여기에있는 대부분의 답변은 두 개의 호스트 값을 가진 사용자 (하나는 for localhost및 다른 하나)를 만드는 사용자를 보여줍니다 %.

root와 같은 내장 localhost 사용자를 제외하고는이 작업을 수행 할 필요가 없습니다. 어디에서나 로그인 할 수있는 새로운 사용자를 만들고 싶다면

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

잘 작동합니다. 다른 사람들이 언급했듯이 모든 도메인의 사용자에게 관리 권한을 부여하는 것은 끔찍한 생각입니다.


3

간단한 방법은 루트 계정으로 phpmyadmin에 로그인하고, mysql 데이터베이스로 이동하여 사용자 테이블을 선택하고, 루트 계정을 편집하고 호스트 필드에 % 와일드 카드를 추가하는 것입니다. 그런 다음 ssh flush 권한을 통해

 FLUSH PRIVILEGES;

이를 통해 GRANT ALL PRIVILEGES ON과 결합 할 수 있었습니다. GRANT OPTION으로 'root'@ '%';
Lanklaas

2

최근 mysql 설치 인 경우 다른 것을 변경하기 전에이 명령을 실행 한 다음 다시 시도하십시오.

flush privileges;

이것만으로 Ubuntu 16.04, mysql 5.7.20의 문제가 해결되었습니다. YMMV.


2

호스팅 제어판에서 더 좋은 방법을 찾으십시오 (여기서는 DirectAdmin을 사용하고 있습니다).

제어판의 대상 서버 DB로 이동하십시오. 제 경우에는 MySQL 관리-> DB 선택-> "호스트 액세스"를 찾으십시오. 여기에 원격 호스트를 추가하고 작동하십시오! 여기에 이미지 설명을 입력하십시오

플 리스크 등과 같은 다른 C. 패널에도 비슷한 옵션이 있다고 생각합니다.

나는 그것이 당신에게도 도움이 되었기를 바랍니다.


2

글쎄, 위의 답변 중 어느 것도 나를 위해 일하지 않았다. 많은 연구 끝에 해결책을 찾았습니다. 비록 늦었을지라도 이것은 나중에 다른 사람들을 도울 수 있습니다.

터미널에서 SQL 서버에 로그인

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

권한 문제를 해결해야합니다.

오류를 해결하기 전에

문제를 해결 한 후

행복한 코딩 !!


1

당신이 할 수있는 일은 mysql.cfg 파일을 열고 Bind-address를 이것으로 변경해야합니다.

바인드 주소 = 127.0.0.1

그런 다음 mysql을 다시 시작하면 해당 서버를 여기에 연결할 수 있습니다.

이걸로 아이디어를 얻을 수 있습니다.

이건 진짜 솔이야


3
이것은 관련이 있지만 같은 문제는 아닙니다. 원래 수신 된 오류는 클라이언트가 MySQL 서버에 성공적으로 연결했지만 인증에 실패했음을 나타냅니다. bind-address가 127.0.0.1로 설정되면 대신 연결 거부 오류가 발생합니다.
axon

그러나 이것은 모든 호스트가 서버에 연결될 수있는 주소입니다.
Kishan Bheemajiyani

그러나 클라이언트 사용자가 있고 사용자가 모든 권한을 가진 사용자를 만들 수없는 경우 솔루션은 무엇입니까?
Kishan Bheemajiyani

1

Windows에서 실행중인 경우 간단한 해결책은 MySQL 서버 인스턴스 구성 마법사를 실행하는 것입니다. 시작 메뉴의 MYSQL 그룹에 있습니다. 마지막 화면에서 두 번째로 "원격 컴퓨터에서 루트 액세스 허용"이라는 상자를 클릭하십시오.


1

WAMP Server + Windows 10을 사용 중이고 Wamp 아이콘을 마우스 오른쪽 단추로 클릭하는 것보다 개발에 사용중인 경우 => Wamp Settings=>Check Allow Virtual Hosts other than 127* 여기에 이미지 설명을 입력하십시오


0

나는 또한 같은 문제에 직면했다. 나는 그것을 2 분 안에 해결했다. 나는 단지 cpanel을 통해 ip를 나열한다.

서버 A에서 서버 B의 데이터베이스를 연결하려고한다고 가정합니다. 서버 B Cpanel-> 원격 MySQL로 이동하여 서버 A IP 주소를 입력하면됩니다.


0

이 답변은 누군가를 도울 수 있습니다 ...

이 모든 답변이 도움이되지 않으면 중요한 것을 확인하는 것을 잊어 버렸습니다 .. 포트 :)

다른 포트에서 실행되는 도커 컨테이너에서 mysql을 실행 중입니다. 포트 3306에서 호스트 컴퓨터를 가리키고 있었고 mysql 서버가 실행 중입니다. 컨테이너가 포트 33060의 서버를 노출시킵니다. 그래서 이번에는 잘못된 서버를보고있었습니다! 도!


0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

이 오류는 루트에 암호가 없기 때문에 발생하며 외부에서 연결하려고 할 때 발생했을 수 있습니다.


0

CPANEL 솔루션

Cpanel로 이동하여 Remote MySQL을 찾으십시오. 입력 필드에 IP를 추가하십시오.

호스트 (% 와일드 카드 허용)

어떤 IP인지 기억하기위한 주석. 그게 나야


0

이것은 미래의 원격 mysql 연결을 위해 작동합니다!

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

bind-address 지시문으로 시작하는 행으로 이동하십시오. 다음과 같아야합니다.

    bind-address            = 0.0.0.0

루트 터미널로 mysql에 로그인

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

마지막으로 다음 명령을 사용하여 해당 시스템에 원격으로 데이터베이스에 연결할 수있는 권한을 부여하십시오.

    sudo ufw allow from remote_IP_address to any port 3306

-1

이 문제에 직면 한 누군가가 SQLyog 내에서 문제를 겪을 가능성이있는 경우, 다음과 같은 일이 발생했습니다.

SQLyog 내에서 원격 데이터베이스에 연결하고 몇 시간 동안 일했습니다. 그 후 몇 분 동안 시스템을 떠난 후 작업을 계속하기 위해 돌아 왔습니다- 오류 1130 ! 내가 시도한 것은 아무것도 없었다. SQLyog를 다시 시작해도 문제가 해결되지 않았습니다. 그런 다음 시스템을 다시 시작했지만 여전히 작동하지 않습니다.

그래서 터미널에서 연결을 시도했습니다. 그런 다음 SQLyog에서 다시 시도해 보았습니다 ... 나는 '무작위 컴퓨터 기발함'이외의 다른 것을 설명 할 수는 없지만 누군가에게 도움이 될 것이라고 생각합니다.


-1

connectionstring을 정의하지 않고 mysql 쿼리를 실행하려고하면이 오류가 발생합니다.

아마도 실행하기 전에 연결 문자열을 정의하는 것을 잊었을 것입니다. 이거 확인 했어? (나쁜 영어에 대한 미안)


-1

문제 : root @ localhost가 openSUSE 42.2-1.150.x86_64에서 mysql-community-server의 새로운 설치에 연결할 수 없습니다. MySQL은 연결을 거부합니다-기간.

해결책:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

파일 user.MYD의 크기는 0입니다 (실제로?!). 다른 작업 시스템에서 3 개의 파일을 모두 복사했습니다.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

로그인 할 수있었습니다. 그런 다음 모든 스키마 권한을 다시 적용하기 만하면됩니다. 또한 IPv6을 비활성화 한 경우 root @ :: 1 계정도 작동 할 수 있도록 임시로 다시 활성화하십시오.


-1

이것은 DirectAdmin에서 작동합니다 .

  1. 로 이동하십시오 DirectAdmin.
  2. 로 이동하십시오 MySQL Management.
  3. 를 선택하십시오 database.
  4. Accesse Host탭 아래 에 필드가 있습니다. 이 필드를로 채워야합니다 xxx.xx.xxx.xx.
  5. 를 클릭하십시오 Add Host.

끝마친. 이제 your_database_username& 로이 DB에 액세스 할 수 있습니다 your_database_password.
너무 간단합니다!


-3

여기에있는 모든 답변이 제 경우에는 효과가 없었으므로 나중에 다른 사용자에게 도움이 될 수 있습니다. 이것은 MySQL에서만이 아니라 코드에서도 문제가 될 수 있습니다.

당신이 사용하는 경우 VB.NET

이 코드 대신 :

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

MysqlConn = New MySqlConnection()첫 번째 줄로 이동해야합니다 . 그래서 이렇게 될 것입니다

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.