MySQL 8.0에서 루트 사용자에게 모든 권한을 부여하는 방법


116

시도

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

얻기

오류 1064 (42000) : SQL 구문에 오류가 있습니다. 1 행의 'IDENTIFIED BY'root 'WITH GRANT OPTION'근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

참고 : 이전 버전에서 시도했을 때도 마찬가지입니다.

또한 시도

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

얻기

오류 1410 (42000) : GRANT로 사용자를 만들 수 없습니다.

MySQL (8.0.11.0) 사용자 이름 / 암호는 root / root입니다.


mysql과 직접 연결하고 있습니까 아니면 ssh를 사용합니까?
Harald

루트 사용자로 명령 프롬프트에서 직접
Praveen

1
13.7.1.6 GRANT 구문13.7.1.4 GRANT 구문 의 차이점을 참조하십시오 .
wchiquito

7
메신저도 같은 문제에 붙어 있습니다. 를 사용하여 mysql 셸을 mysql -u root -p시작한 다음 루트 암호를 입력합니다. 그런 다음 시도했는데 GRANT GRANT OPTION ON *.* TO 'root'@'%';오류가 발생했습니다ERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

답변:


203

MySQL 8부터는 GRANT명령을 사용하여 더 이상 (암시 적으로) 사용자를 생성 할 수 없습니다 . 사용은 사용자를 생성 에 의해 다음, 대신에 GRANT의 문 :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

에 대한 보안 위험에 대한 주의 사항 은 다음을 WITH GRANT OPTION참조하십시오.


3
이 명령은 새 사용자를 만듭니다. 하지만 기존 루트 사용자에게 권한을 부여하고 싶습니다. mysql> CREATE USER 'root'@ '%'IDENTIFIED by 'root'; 쿼리 OK, 영향을받는 행 0 개 (0.31 초) mysql> GRANT ALL PRIVILEGES ON . GRANT 옵션으로 'root'@ '%'로; 쿼리 OK, 영향을받는 행 0 개 (0.16 초) mysql> SELECT User FROM mysql.user; + ------------------ + | 사용자 | + ------------------ + | 루트 | | mysql.infoschema | | mysql.session | | mysql.sys | | 루트 | + ------------------ + 5 행 세트 (0.00 초)
Praveen

이제 사용자 테이블에 이름이 root 인 두 명의 사용자가 있습니다 !! 또한 원격으로 연결할 수 없습니다 (루트 사용자). ------------- 세부 정보 : 유형 : com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL 상태 : 08001
Praveen

기묘한. 질문의 오류 메시지는이 사용자가 존재하지 않음을 나타냅니다. 이것이 내가 먼저 만들 것을 제안한 유일한 이유입니다. 그리고 단일 MySQL 인스턴스에서 동일한 사용자를 두 번 보유하는 것은 불가능합니다. 이름이나 호스트 부분이 다릅니다.
Mike Lischke

2
이 두 사용자는 서로 다른 호스트에서 연결합니다. SELECT User, Host FROM mysql.user;대신 실행하십시오 .
Mike Lischke

3
오류가 발생했습니다 :ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

32

1) 이것은 나를 위해 일했습니다. 먼저 새 사용자를 만듭니다. 예 : foo비밀번호가있는 사용자bar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) 아래 코드를 사용자 이름으로 'foo'로 바꿉니다.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

참고 : database_name은 권한을 가지려는 데이터베이스입니다 . 모든 것을 의미합니다

3) 사용자 foo로 로그인

mysql> mysql -u foo -p

비밀번호 : bar

4) Sequelize의 초기 연결이 pw bar로 foo로 설정되어 있는지 확인하십시오.


5
이것은 질문에 대한 답이 아닙니다. 데이터베이스 관련 권한이 아니라 전역 권한에 관한 것입니다.
tmuecksch

30

많은 (잘못된) 답변을 봅니다. 다음과 같이 간단합니다.

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

참고 : 자체 생성 대신 user사용 root하여 데이터베이스에 연결할 수 있습니다 . 그러나 기본 루트 계정을 사용하여 응용 프로그램이 데이터베이스에 연결할 수 있도록하는 것은 선호되는 방법이 아닙니다.

대체 권한 (최소 권한 원칙을주의하고 기억하십시오) :

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

어떻게 든 다음 오류가 발생하는 경우 :

오류 1130 (HY000) : 호스트 '1.2.3.4'는이 MySQL 서버에 연결할 수 없습니다.

다음 두 줄을 추가 / 변경하고 /etc/mysql/my.cnfmysql을 다시 시작 해야합니다 .

bind-address           = 0.0.0.0
skip-networking

불평하는 대신 왜 작동하지 않는지 자세히 설명해 주시겠습니까? 그렇게하면 도움을 주거나 추가 정보를 게시 할 수 있습니다.
Nebulastic

이 답변은 루트 사용자 권한 문제를 해결하지 않습니다 .
Joseph8th

그에 따라 답변을 업데이트했습니다.
Nebulastic

1
가장 좋은 대답은 이제 GRANT ALL ONMySQL 8.0입니다. 또한 비활성화하는 대신 모든 명령에 bind-address바인딩 127.0.0.1하고 포함 할 수 있다고 생각 --protocol=tcp합니다. 장기적인 성능도 localhost.
Jesse Nickles

4

내 사양 :

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

나를 위해 일한 것 :

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

두 쿼리의 응답 :

Query OK, O rows affected (0.10 sec*)

NB : 이전에 데이터베이스 (db_name)를 만들었고 DB의 모든 테이블에 부여 된 모든 권한이있는 사용자 자격 증명을 만들었습니다. 여기서 읽은 기본 루트 사용자를 사용하는 것이 가장 좋습니다.


3

지정된 사용자가 MySQL에 존재하지 않습니다 (따라서 MySQL은 버전 8 이전과 마찬가지로 GRANT를 사용하여 생성하려고하지만이 버전에 도입 된 제한 사항으로 인해 실패합니다).

이 시점에서 MySQL은 꽤 멍청하기 때문에 'root'@ 'localhost'가 있고 'root'@ '%'에게 권한을 부여하려고하면 다음을 포함한 모든 호스트의 루트 사용자에 대한 일반화 된 개념이 아닌 다른 사용자로 취급됩니다. localhost.

오류 메시지도 오해의 소지가 있습니다.

따라서 오류 메시지가 표시되면 다음과 같이 기존 사용자를 확인하십시오.

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

그런 다음 누락 된 사용자를 생성하거나 (Mike가 조언 한대로) GRANT 명령을 실제 기존 사용자 사양으로 조정합니다.


이것은 나에게 유효한 해결책이었습니다! 나는 단순히 user @ 줄을 정확하게 입력하지 못했습니다. 제안 된 다른 솔루션을 시도하기 전에이를 확인하십시오. 저에게는 CREATE USER 'user'@'%domain.com'이었고 실패한 GRANT 문을 발행했을 때 내 구문이 '.'로 벗어났습니다. GRANT .... TO 'user'@'%.domain.com'처럼 보입니다. 나는 '.'를 넣는 것을 잊었다. 내 create 문에서이 문제를 해결하는 데 모든 차이를 만들었습니다.
wallisds

2

주제에 대한 나의 2 센트. MySQL Workbench에서 연결을 시도하는 것과 똑같은 문제가 발생했습니다. 개발을위한 로컬 샌드 박스를 설정하기 위해 bitnami-mysql 가상 머신을 실행하고 있습니다.

Bitnami의 튜토리얼은 '모든 권한 부여'명령을 실행한다고 말했습니다.

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

이것은 분명히 작동하지 않았으며 마침내 Mike Lischke의 대답을 사용하여 작동했습니다.

내가 생각하는 것은 root @ % 사용자에게 잘못된 자격 증명이 연결되어 있다는 것입니다. 따라서 사용자의 권한을 수정하려고 시도했지만 운이 좋지 않으면 다음을 시도하십시오.

  1. 사용자 삭제.
  2. 사용자를 다시 만듭니다.
  3. my.cnf 구성 파일에 올바른 바인딩이 있는지 확인하십시오. 제 경우에는 샌드 박스 환경을위한 것이기 때문에 라인을 주석 처리했습니다.

Mysql 콘솔에서 :

사용자 나열 (모든 사용자를 보는 데 도움이 됨) :

select user, host from mysql.user;

원하는 사용자 삭제 :

drop user '{{ username }}'@'%';

사용자 생성 및 권한 부여 :

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

다음 명령을 실행하십시오.

FLUSH PRIVILEGES;

mysql 구성 파일 'my.cnf'를 찾아 다음과 같은 줄을 찾습니다.

bind-address=127.0.0.1

'#'을 사용하여 주석을 추가합니다.

#bind-address=127.0.0.1

그런 다음 mysql 서비스를 다시 시작하십시오.

이것이 같은 문제가있는 사람에게 도움이되기를 바랍니다!


1

이것은 나를 위해 일했습니다.

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES

1

사용자 이름과 도메인이 이전에 만든 것과 동일한 지 확인하세요. mysql은 user table의 두 컬럼에 의해 계정을 선택하고, 다른 경우, mysql은 8.0 버전 이후에는 지원되지 않는 grant로 새 계정을 생성하고 싶다고 생각할 수 있습니다.


1

내 사양 :

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

나를 위해 일한 것 :

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

특정 상황에서 작동하지만. 이 SQL 구문은 사용자를 업데이트하며 사용자 계정을 설정하지 않습니다. 또한 권한을 부여하지 않습니다.
Nebulastic

0

글쎄, 나도 같은 문제가 있었다. 경로에 '%'가 있어도 원격으로 연결할 수 없습니다. 이제 my.ini파일 (Windows의 구성 파일)을 살펴보면 bind-address명령문이 누락되었습니다.

그래서 ... 나는 이것을 퍼트 bind-address = *[mysqld]하고 서비스를 다시 시작됩니다. 이제 작동합니다!


이것은 실제로 정답에 가장 가깝습니다.
Joseph8th

0

1. 권한 부여

mysql> GRANT ALL PRIVILEGES ON. GRANT 옵션으로 'root'@ '%'에게;

mysql> FLUSH 권한

2. 사용자 테이블 확인 :

mysql> mysql 사용

mysql> select host, user from user 여기에 이미지 설명 입력

3. 구성 파일 수정

mysql 기본 bind ip : 127.0.0.1, 원격 방문 서비스를 원하면 설정을 삭제하십시오.

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. 마지막으로 서비스 다시 시작

양조 서비스는 mysql을 다시 시작합니다.


이것이 작동하더라도 특정 권한을 부여 할 때 프로덕션에서 mysql 인스턴스를 다시 시작하지 않습니다. 대신 플러시 권한을 시도하십시오.
Nebulastic

-1

이것은 작동 할 수 있습니다.

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
코드를 버리는 대신 왜 그것이 적절한 솔루션인지 설명하십시오. 목표는 단순히 즉각적인 문제를 해결하는 것이 아니라 OP가 다음에 무엇을해야하는지 알 수 있도록 교육하는 것입니다.
The Tin Man

-1

나는이 같은 문제를 겪었고 이것이 나를 여기로 이끌었다. 특히, 지역 개발, 나는 할 수 있기를 원 mysql -u root -p없이 sudo. 새 사용자를 만들고 싶지 않습니다. root로컬 PHP 웹 앱에서 사용하고 싶습니다 .

기본 사용자 권한에 문제 가 없었기 때문에 오류 메시지는 잘못된 입니다 'root'@'%'.

대신 여러 사람이 다른 답변에서 언급했듯이 솔루션은 내 구성 bind-address=0.0.0.0대신 설정하는 것이 었습니다 . 그렇지 않으면 변경할 필요가 없습니다.bind-address=127.0.0.1/etc/mysql/mysql.conf.d/mysqld.cnf


이것은 질문에 완전히 대답하지도 않습니다.
Nebulastic

-2

나는 CentOS에서 같은 문제가 있었고 이것은 나를 위해 일했습니다 (버전 : 8.0.11) :

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'

오류 1064 (42000) : SQL 구문에 오류가 있습니다. '근처에 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. TO 'root'@ '%' 'at line 1
GDefender

mysql> GRANT ALL PRIVILEGES ON. TO 'root'@ '%'; 오류 1064 (42000) : SQL 구문에 오류가 있습니다. '근처에 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. TO 'root'@ '%' 'at line 1 mysql>
PGOEL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.