난 그냥 패키지와 함께 우분투를 16.04 LTS를 설치 php
, mariadb
하고 nginx
. mysql_secure_installation
루트 비밀번호를 실행 하고 변경했습니다.
이제 mysql
우분투에 일반 사용자 계정으로 로그인 한 상태에서 루트 계정 을 사용하여 로그인하려고 하면 액세스가 거부됩니다.
을 사용하여 로그인하면 sudo mysql
mysql은 비밀번호를 묻지 않습니다. 실행 mysql_secure_installtion
하면 이전 설정이 영구적으로 설정되지 않은 것을 볼 수 있습니다.
내가 무엇을 잘못하고 있지?
답변
나는 최근에 Ubuntu 15.04를 16.04로 업그레이드했으며 이것이 나를 위해 일했습니다.
-
먼저 sudo mysql에 연결하십시오.
sudo mysql -u root
-
DB에 존재하는 계정을 확인하십시오.
SELECT User,Host FROM mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | admin | localhost | | debian-sys-maint | localhost | | magento_user | localhost | | mysql.sys | localhost | | root | localhost |
-
현재 root @ localhost 계정 삭제
mysql> DROP USER 'root'@'localhost'; Query OK, 0 rows affected (0,00 sec)
-
사용자를 재창조하십시오
mysql> CREATE USER 'root'@'%' IDENTIFIED BY ''; Query OK, 0 rows affected (0,00 sec)
-
사용자에게 권한을 부여하십시오 (권한을 플러시하는 것을 잊지 마십시오)
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)
-
MySQL을 종료하고 sudo없이 다시 연결하십시오.
나는 이것이 누군가를 도울 수 있기를 바랍니다 🙂
답변
5.7을 설치하고
root
사용자 에게 비밀번호를 제공하지 않으면auth_socket
플러그인 을 사용합니다 . 해당 플러그인은 신경 쓰지 않으며 비밀번호가 필요하지 않습니다. 사용자가 UNIX 소켓을 사용하여 연결하고 있는지 확인한 다음 사용자 이름을 비교합니다.
에서 촬영 으로 MySQL의 5.7에서 사용자 비밀번호 변경 “플러그인 : auth_socket”
따라서 plugin
다시 변경하려면 mysql_native_password
:
-
sudo로 로그인 :
sudo mysql -u root
-
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 액세스 권한 이있는 경우에는 해당되지 않음 )
-
MySQL 루트 셸에 로그인하십시오.
$ sudo mysql -u root -p
-
아래 쿼리를 실행하십시오.
use mysql; update user set plugin='mysql_native_password' where user='root'; flush privileges; quit;
-
새 쉘을 열고 다음을 수행하십시오.
$ mysql -u root -p
답변
새 mysql 계정을 만들어보십시오. 작동했습니다 (mysql 5.7.12).
-
sudo로 로그인 :
sudo mysql -uroot
-
새 사용자를 작성하고 권한을 부여하십시오 (비밀번호 없음).
CREATE USER 'admin'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
-
새로운 사용자로 로그인 :
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;