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

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

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

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

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



답변

나는 최근에 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없이 다시 연결하십시오.

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


답변

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;

답변

요컨대, 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명령문을 정확하게 얻지 않으면 다른 문제를 일으킬 수 있습니다 . 이미 가지고있는 루트를 쉽게 업데이트하기가 더 쉽습니다.

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


답변

기본 리포지토리에서 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 계정을 만들어보십시오. 작동했습니다 (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
    

답변

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

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

그리고:

FLUSH PRIVILEGES;

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


답변

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

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;