모든 호스트에서 MySQL 루트 액세스


152

원격 우분투 컴퓨터에 MySQL 서버를 설치했습니다. root사용자는에 정의 된 mysql.user테이블이 방법 :

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

root표준 mysql클라이언트를 사용하여 동일한 원격 컴퓨터 명령 줄 인터페이스에서 사용자와 액세스 할 수 있습니다 . 이제 인터넷의 모든 호스트에서 루트 액세스허용 하고 싶습니다 . 따라서 다음 행을 추가하려고했습니다 (열을 제외하고 이전 덤프의 첫 번째 행과 정확히 똑같습니다 host).

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

그러나 내 개인 PC의 클라이언트는 계속 나에게 말합니다 (서버 IP가 가려졌습니다).

SQL 오류 (2003) : '46 .xxx '에서 MySQL 서버에 연결할 수 없음 (10061)

인증 오류인지 네트워크 오류인지 알 수 없습니다. 서버 방화벽 에서 0.03.0.0/0 포트 3306 / TCP 를 사용하도록 설정했습니다 .


당신은 포트 3306에있는 컴퓨터에 텔넷 수
mihaisimi

3
대부분의 MySQL 데몬은 46.xxx에서 청취하지 않고 localhost에서만 청취합니다. bind-addressmy.cnf에서 찾으십시오
Maxim Krizhanovsky 2016 년

1
따라서 세계 + 개는 이제 루트 암호의 해시, 루트는 인터넷의 모든 호스트 및 IP 주소의 첫 번째 바이트에서 액세스 할 수 있다는 지식을 갖습니다. 이 단지 생각하지 않습니다 작은 비트와 관련된?
eggyal

답변:


362

이 과정에는 두 단계가 있습니다.

a) 권한을 부여하십시오. 루트 사용자는 'password'현재 루트 비밀번호 로 다음을 대체 하여 실행 하십시오.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) 모든 주소에 바인딩

가장 쉬운 방법은 파일 에서 줄 을 주석 처리하는 것입니다my.cnf .

#bind-address = 127.0.0.1 

mysql을 다시 시작하십시오.

service mysql restart

기본적으로 로컬 호스트에만 바인드되지만 라인을 주석 처리하면 찾은 모든 인터페이스에 바인드됩니다. 라인을 주석 처리하는 것은와 같습니다 bind-address=*.

mysql 서비스가 바인딩 된 위치를 확인하려면 루트로 실행하십시오.

netstat -tupan | grep mysql

우분투 16 업데이트 :

구성 파일은 (현재)

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

(적어도 표준 우분투 16에서)


5
문제는 바인딩 주소였습니다. 감사합니다. @Darhazer 감사합니다 :)
lorenzo-s

2
현재 보조금을 쿼리하려면 :`SHOW GRANTS FOR 'root'@ '%';
robsch

5
root @ %가 다른 사용자에게 권한을 부여하려면 (a) 단계 직후에 다음을 실행하십시오. GRANT USAGE ON *. * TO 'root'@ '%'WITH GRANT OPTION;
Caleb

1
구성 파일은 (현재) /etc/mysql/mysql.conf.d/mysqld.cnf (적어도 표준 Ubuntu 16 이상)입니다.
jgp

2
서버에 원격으로 원격으로 연결할 수 있으려면 이렇게해야했습니다.USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

다음 쿼리를 실행하십시오.

use mysql;

update user set host='%' where host='localhost'

참고 : 프로덕션 용도로는 권장되지 않습니다.


2
이것은 완벽한 솔루션이 아닙니다. 작동 할 수 있습니다. 중복 항목 '% -root'키 'PRIMARY'ERROR 1062 (23000) : 나에게는 오류 발생
Scriptlabs

2
@Scriptlabs, 사용자 테이블에 호스트가 'localhost'인 둘 이상의 항목이있을 수 있습니다. root.localhost, root.127.0.0.1, root.::1을 포함하여 루트가있는 둘 이상의 행. 따라서 업데이트하는 대신 별도의 사용자를 추가하는 것이 좋습니다.이 답변을 내리는 이유입니다.
Mike Purcell

4
FLUSH PRIVILEGES가 아닙니다. 바로 후에도 필요합니까?
Nom1fan

1
이것은 나를 위해 일하고 있습니다. 이 시도. update mysql.user set host='%' where user='root'
nur zazin


7

MYSQL 8.0-mysql 명령 행 클라이언트 열기
*. *를 'root'@ 'localhost'에 GRANT ALL PRIVILEGES ON;
mysql
업데이트 사용 mysql.user SET host = '%'WHERE user = 'root';
MySQL 서비스를 다시 시작하십시오


4

Raspbian에서 실행중인 MariaDB-bind-address를 포함하는 파일을 정확히 찾아 내기가 어렵습니다. MariaDB에는 주제에 대해 도움이되지 않는 정보 가 있습니다.

나는 사용했다

# sudo grep -R bind-address /etc 

그 빌어 먹을 곳을 찾을 수 있습니다.

또한 위의 모든 사람들이 지적한 것처럼 mysql에서 권한과 호스트를 설정해야했습니다.

또한 내 Raspberry Pi에 원격 연결하기 위해 3306 포트를 여는 데 재미있는 시간을 보냈습니다 . 마침내 iptables-persistent를 사용했습니다 .

이제 모두 잘 작동합니다.


1

OS에 많은 네트워크가 연결되어 있다면 my.conf 파일의 bind-addres에서이 네트워크 중 하나를 지정해야합니다. 예를 들면 :

[mysqld]
bind-address = 127.100.10.234

이 IP는 ethX 구성에서 온 것입니다.


1
자세한 내용을 추가하십시오. 어떤 파일 또는 프레임 워크에서 해당 설정을 수행해야합니까? ethX 구성에 대해보다 구체적으로 설명하십시오.
BPS

1

제 경우에는 "바인드 주소"설정이 문제였습니다. mysql이 어떤 이유로 기본값을 127.0.0.1로 설정했기 때문에이 설정을 주석 처리하는 것은 도움 my.cnf되지 않았습니다 .

MySql이 현재 사용중인 설정을 확인하려면 로컬 상자에서 명령 행을여십시오.

mysql -h localhost -u myname -pmypass mydb

현재 설정을 읽습니다.

Show variables where variable_name like "bind%"

모든 호스트에서 액세스를 허용하려면 여기 0.0.0.0이 표시되어야합니다. 그렇지 않은 경우, /etc/mysql/my.cnf[mysqld] 섹션에서 사용자를 편집 하고 bind-address를 설정하십시오.

bind-address=0.0.0.0

마지막으로 MySql 서버를 다시 시작하여 새 설정을 선택하십시오.

sudo service mysql restart

다시 시도하고 새 설정이 선택되었는지 확인하십시오.


-2

mysql_update 당신이 필요한 것입니다.

MySql이 이미이 작업을 수행하는 도구를 은혜롭게 작성했을 때 누군가이 문제를 해결하는보다 복잡한 방법을 따르는 이유를 모르겠습니다 ...

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