우분투 16.04의 일반 사용자 계정에서 mysql 사용자 루트로 로그인 할 수 없습니다


203

난 그냥 패키지와 함께 우분투를 16.04 LTS를 설치 php, mariadb하고 nginx. mysql_secure_installation루트 비밀번호를 실행 하고 변경했습니다.

이제 mysql우분투에 일반 사용자 계정으로 로그인 한 상태에서 루트 계정 을 사용하여 로그인하려고 하면 액세스가 거부됩니다.

을 사용하여 로그인하면 sudo mysqlmysql은 비밀번호를 묻지 않습니다. 실행 mysql_secure_installtion하면 이전 설정이 영구적으로 설정되지 않은 것을 볼 수 있습니다.

내가 무엇을 잘못하고 있지?

답변:


359

나는 최근에 Ubuntu 15.04를 16.04로 업그레이드했으며 이것이 나를 위해 일했습니다.

  1. 먼저 sudo mysql에 연결하십시오.

    sudo mysql -u root
    
  2. DB에 존재하는 계정을 확인하십시오.

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. 현재 root @ localhost 계정 삭제

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. 사용자를 재창조하십시오

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. 사용자에게 권한을 부여하십시오 (권한을 플러시하는 것을 잊지 마십시오)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. MySQL을 종료하고 sudo없이 다시 연결하십시오.

나는 이것이 누군가를 도울 수 있기를 바랍니다 :)


16
이것은 나를 위해 일한 유일한 일이었습니다 .16.04에 mysql-server를 설치할 때 누군가 루트 사용자에게 무슨 일이 있었는지 정확히 알고 있습니까?
Ruggi

32
잠깐만, %어디에서든 원격으로 연결할 수있는 것은 아닙니다 .
Stevie G

9
행을 다음과 같이 변경할 수 있습니다. CREATE USER 'root'@ 'localhost'IDENTIFIED BY '';
vladnev

11
보안 관련 사항 : 보안되지 않은 root @ localhost mysql 연결 패턴은 로컬 개발의 핵심 요소 이지만 다른 곳에서는 절대 나타나지 않아야합니다.
Charney Kaye

5
: 루트이 나중에 실행하지 않고 부여 할 수 있도록 루트에 "부여로"제공하지 않습니다 여기에 새로운 루트 사용자에 대한 GRANT 문 dba.stackexchange.com/a/62046/115679가 에 grant 문을 변경하십시오grant all privileges on *.* to 'root'@'localhost' with grant option;
로렌

132

5.7을 설치하고 root사용자 에게 비밀번호를 제공하지 않으면 auth_socket플러그인 을 사용합니다 . 해당 플러그인은 신경 쓰지 않으며 비밀번호가 필요하지 않습니다. 사용자가 UNIX 소켓을 사용하여 연결하고 있는지 확인한 다음 사용자 이름을 비교합니다.

에서 촬영 으로 MySQL의 5.7에서 사용자 비밀번호 변경 "플러그인 : auth_socket"

따라서 plugin다시 변경하려면 mysql_native_password:

  1. sudo로 로그인 :

    sudo mysql -u root
    
  2. plugin단일 명령으로 비밀번호를 변경하고 비밀번호를 설정 하십시오 .

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

물론 위의 명령을 사용하여 빈 암호를 설정할 수도 있습니다.

레코드 (및 MariaDB < 10.2사용자)를 plugin위해 비밀번호를 제공하지 않고 변경하는 다른 방법 이 있습니다 (비워 두십시오).

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

2
감사합니다, 어떤 이유로 이것은 apt-get 업그레이드 후 갑자기 자동으로 설정되었습니다 ...
Tominator

4
또한, 나는이 답변을 더 좋아합니다-그것은 훨씬 덜 파괴적입니다 ;-)
benzkji

3
MariaDB <10.2의 경우 비밀번호와 함께 플러그인을 변경하려면 다음 쿼리가 필요합니다. UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;출처 : stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu

5
이것은 정답입니다
Geo C.

3
나는 이것을 두 번 투표 할 수 있기를 바랍니다.
제임스 스미스

21

요컨대, MariaDB에서

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

여기서 NEWPASSWORD를 원하는 암호로 바꾸고 그 밖의 모든 단어를 그대로 사용하십시오.

여기서 문제는 MariaDB 또는 MySQL이 설치 / 업데이트 될 때 (특히 루트없이 비밀번호가 설정되어있는 경우) 사용자 테이블에서 비밀번호가 실제로 비어 있거나 무시되며 로그인하는 시스템 사용자에 따라 다릅니다. MySQL 사용자에게. 시스템 루트로 전환 한 후 다음과 같이 입력하여이를 테스트 할 수 있습니다.

mysql -uroot -p

그런 다음 비밀번호가 없거나 잘못된 비밀번호를 입력하십시오. 당신은 아마 들어올 것입니다. ( # mysql비밀번호가 관련이없고 사용자가 정의 된 것처럼 간단히 유닉스 루트에서 로그인 할 수도 있습니다 ).

무슨 일이야? 루트로 로그인하고 다음을 수행하면

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

참고 로 MariaDB에서 auth_socket읽을 수 있습니다 unix_socket. 이 소켓은 비밀번호를 무시 하고 비밀번호 확인 없이 해당 Unix 사용자를 허용합니다 . 그렇기 때문에 루트로 로그인 할 수 있지만 다른 사용자로 는 로그인 할 수 없습니다.

따라서 해결책은 사용자를 업데이트하여 auth_socket/unix_socket비밀번호를 올바르게 설정 하지 않는 것 입니다.

2017 년 현재 Ubuntu 버전 16에있는 MariaDB (<10.2, 아래 주석 참조)에서는 충분합니다. NEWPASSWORD는 비밀번호입니다. mysql_native_password당신은 그대로 입력합니다.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(플러그인을 비워 두는 것이 가능할 수도 있습니다. YMMV. 시도하지 않았습니다. 이것이 대안입니다.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

그렇지 않으면:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

그때

FLUSH PRIVILEGES;

레코드의 경우 사용자를 삭제하고 '%'로 다시 작성하는 솔루션은 데이터베이스에서 완전히 잠겼으며 grant명령문을 정확하게 얻지 않으면 다른 문제를 일으킬 수 있습니다 . 이미 가지고있는 루트를 쉽게 업데이트하기가 더 쉽습니다.

내 경험상 다른 사용자는 초기 설치 / 업데이트의 일부가 아닌 수동으로 추가되므로 문제는 루트 사용자에게만 발생합니다.


2
이것이 완벽하게 작동한다는 것을 알았습니다. 왜 루트 암호를 변경해도 mysql_secure_installation같은 효과가 없는지 궁금 합니다. 새 비밀번호는 어디에 저장합니까?
Mausy5043

답을 편집하고 각 명령에 대해 더 말할 수 있습니까? 어느 것이 적용 가능한지 잘 모르겠습니다. UPDATEMariaDB <10.2 및 ALTER다른 버전에 적용 되는 두 가지입니까? 그리고 두 번째 UPDATE는 첫 번째 의 대안입니까, 아니면 두 가지를 모두 입력해야합니까? 마지막으로 'mysql_native_password'는 그대로 입력해야합니까, 아니면 MySQL의 루트 암호로 바꿔야합니까?
Michael Scheper

1
@MichaelScheper 너무 오래되어서 너무 많이 편집하고 싶지 않지만 여기에 내가 기억하는 것이 있습니다. (1) 첫 번째 업데이트 만 수행하십시오 (<10.2는 요구 사항이 아닐 수 있음). (2) 예, 'mysql_native_password'그대로 입력하십시오. 본질적으로, 당신이하고있는 일은 mariadb에게 "유닉스 권한을 사용하지 말고 데이터베이스 권한을 사용하십시오"라고 말하는 것입니다. 은 mysql_native_password그 옵션입니다.
Gazzer

젠장, '특권'의 철자가 틀렸다!
Gazzer

1
편집 시간 제한을 1½ 분만 놓친 것 같습니다. 나는 때때로 그것에 의해 좌절된다. 어쨌든 고마워!
Michael Scheper

8

기본 리포지토리에서 MySQL / MariaDB를 설치 한 경우 사용자는 Unix 로그인에서 MySQL 루트 사용자로 MySQL에 로그인 할 수 없습니다 ( sudo 액세스 권한 이있는 경우에는 해당되지 않음 )

  1. MySQL 루트 셸에 로그인하십시오.

    $ sudo mysql -u root -p
    
  2. 아래 쿼리를 실행하십시오.

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. 새 쉘을 열고 다음을 수행하십시오.

    $ mysql -u root -p
    

출처


내가 이것을했을 때, 나는 더 이상 mysql을 루트로 sudo 할 수 없었다. 먼저 su를해야했고, mysql에 root로 로그인 할 수있었습니다. 그래서 auth_socket으로 다시 변경했습니다.
까지

단일 명령 :mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
크리스 Stryczynski

MySQL 인스턴스에 대한 액세스 권한을 잃고 싶다면이 대답이 쉬운 방법입니다.
Danila Vershinin

2

새 mysql 계정을 만들어보십시오. 작동했습니다 (mysql 5.7.12).

  1. sudo로 로그인 :

    sudo mysql -uroot
    
  2. 새 사용자를 작성하고 권한을 부여하십시오 (비밀번호 없음).

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. 새로운 사용자로 로그인 :

    mysql -uadmin
    

2

@Todor와 @Loremhipsum 덕분에 두 가지 일을해야했습니다.

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

그리고:

FLUSH PRIVILEGES;

사용자를 삭제하지 않는 것이 좋습니다 root.


1

이 코드를 먼저 사용해보십시오

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

그리고,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

그런 다음를 누르고 Ctrl+Z입력 : bg프로세스를 포 그라운드에서 백그라운드로 실행 한 후 다음을 통해 액세스를 확인하십시오.

mysql -u root -proot
mysql> show grants;

1

root 사용자로 mysql 명령을 실행하면 root @ localhost에 소켓 인증이 활성화되어 있으므로 암호를 요구하지 않고 액세스 권한이 부여됩니다. .

비밀번호를 설정하는 유일한 방법은 다음과 같은 기본 인증으로 전환하는 것입니다.

$ sudo mysql

mysql> ALTER USER 'root'@ 'localhost'mysql_native_password로 식별 됨 'test';


0

MariaDB를 사용하기 위해 만든 일부 프로비저닝 스크립트를 수정 했으며이 정확한 문제가 발생했습니다. 많은 정보를 여기에 연결하면 Gazzer의 대답은 실제로 문제에서 제로입니다. 모두 auth_socket/ unix_socket설정으로 귀결됩니다 .

따라서 MariaDB 5.5 (Ubuntu 14.04) 및 MariaDB 10 (Ubuntu 16.04)을 사용할 때 MySQL에 로그인하고이 명령을 실행하면 즉시 문제가 해결됩니다.

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Loremhipsum의이 게시물에서 가장 많이 투표 된 답변을 포함한 다른 답변 실제로 사용자를 삭제 한 다음 다시 작성하여 나쁜 관행을 권장합니다. 나에게 이것은 상당히 과격한 해결책입니다. 최선의 / 간단한 솔루션은 plugin가치 를 무효화하고 , 특권을 플러시하며, 삶을 영위하는 것입니다.


-1

나는 같은 문제가 있었고 다음을 실행하면 문제가 해결되었습니다.

mysql_upgrade --force

슬프게도 작동하지 않았습니다. 우분투를 다시 설치하고 있습니다.
codescope

1
방금 우분투 16.04를 새로 설치하고 mariad-server를 설치했습니다. 설치 후 mysql_secure_installation을 실행하고 비밀번호를 설정했습니다. mysql_secure_installation의 나머지 단계를 거친 후 다시 실행했는데 변경 사항을 저장하지 않는 것 같습니다. 여전히 일반 사용자 계정으로 로그인 할 수 없습니다. 버그 일 수 있습니까?
codescope

이것은 결코 도움이되지 않습니다. 이 문제는 MariaDB 바이너리의 실제 설치와는 아무런 관계가 없으며 표준이 아닌 설정으로 사용자 rootplugin설정하는 것입니다. DB 업그레이드가 이와 같은 경우에 도움이 될 수있는 유일한 경우는 mysql_upgrade프로세스 자체가 plugin의심스러운 설정을 설명하는 경우 입니다.
JakeGould
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.