MySQL (MariaDB) 루트 비밀번호를 재설정 할 수 없습니다


35

오늘은 PMA에서 데이터베이스를 만들고 싶었습니다. "MySQL 서버에 로그인 할 수 없습니다"라고 말했습니다. 터미널을 통해 동일한 문제를 시도했지만 암호가 잘못 되었기 때문입니다. 그리고 나는 왜 그런지 이해할 수 없습니다.

루트 암호를 재설정하는 일반적인 방법을 시도했지만 (그랜트 부여 테이블 마운트를 건너 뛰고 암호를 재설정) 작동하지 않는 것 같습니다.

저거 봐:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

답변:


56

문제 자체만큼 이상한 해결책을 찾았습니다.

--skip-grant-tables(웹에서 튜토리얼 검색)을 사용하여 MySQL / MariaDB를 재부팅합니다 . (필요하지는 않지만 게시물 끝에 내 수정 사항을 읽습니다)

테이블 의 plugin필드를 살펴보십시오 mysql.user.

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

각 항목의 플러그인 필드를 빈 문자열로 재설정해야했습니다.

UPDATE user SET plugin="";   // without WHERE clause

또한 암호가 지워진 경우도 있으므로 암호를 정의해야합니다 ( user, password필드 에서 선택 ). 그렇지 않은 경우 다음으로 업데이트하십시오.

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

권한 매개 변수는 명시 적으로 저장해야합니다.

FLUSH PRIVILEGES;

그런 다음 일반 모드에서 MySQL을 다시 시작하면 루트 계정에 연결할 수 있어야합니다.

유닉스 소켓을 통한 연결이 반드시 비활성화되는 것은 아닙니다. MySQL이 수리 된 후 PMA에서 Unix 소켓을 통해 연결이 설정되었음을 알 수 있습니다.

몇 달 후 EDIT : 이제이 문제가 자주 발생하는 데 익숙합니다. MariaDB (또는 이와 유사한 것)의 각 업데이트에서 생각합니다. 그래서 나는 probem에 대한 더 나은 이해를 얻었습니다. 비밀번호를 만들지 않고도 셸의 자격 증명을 사용하여 비밀번호를 입력하지 않아도 MariaDB 계정에 로그인 할 수있는 UNIX_SOCKET 플러그인이 있습니다. 실제로이 플러그인은 인증 플러그인 이며 SQL 서버와의 통신 방법이 아닙니다. 따라서 로그인 방법으로 유닉스 소켓을 사용하지 않으면 안전하게 비활성화 할 수 있습니다. 내가 설명 할 수없는 유일한 것은 UNIX_SOCKET 플러그인이 내 측에 아무런 조치없이 데이터베이스의 각 계정에 정기적으로 설정되는 이유입니다.

이것은 부작용이 발생하면 MariaDB를 다시 시작하지 않고도 SQL 서버에 로그인 할 수 있습니다 --skip-grant-tables. 시스템의 루트 계정에 로그인 한 다음 mysql -u root암호없이 연결 한 다음 플러그인 필드를 재설정하십시오. 위에서 설명한 방식으로.

편집 2 : 확인, 우분투의 각 MariaDB 업그레이드시 발생합니다.


1
이 스크립트는 소켓 플러그인을 사용하여 암호없이 로그인 할 것으로 예상되므로 Ubuntu 16.04의 유지 관리 cron 작업을 중단합니다 (적어도). 자세한 내용은 superuser.com/questions/957708/… 를 참조하십시오.
— colan

좋아, 흥미롭지 만 더 이상 발생하지 않습니다 (레거시 비밀번호 설정이 무작위로 중단되지 않습니다). 어쩌면 유닉스 소켓 플러그인이 루트 사용자에게만 설정되어 있습니까? 지금 확인하지 못했습니다. 그러나 OS가 어떤 인증 설정을 사용할지 결정한다는 생각이 마음에 들지 않습니다.
— Morgan Touverey Quilling

이 문제는 데비안 9에서 발생했으며 MariaDB를 설치할 때 루트 암호를 묻지 않았으며 재설정조차 할 수 없었습니다. 업그레이드 후에 다시 발생하지 않기를 바랍니다. 그러한 문제를 피하기 위해 MariaDB를 MySQL로 교체해야합니까?
— 세례

여전히 발생하는지 확실하지 않은 경우 지금 수정되었을 수 있습니다 (아는 사람이 있으면 게시물을 편집 할 수 있음). 설치시에만 발생할 수 있으며 기본 설정이 좋습니다.
— Morgan Touverey Quilling

1
루트 사용자를 위해 유닉스 소켓 플러그인을 사용하지 않으면 최신 데비안에서 phpmyadmin 패키지를 설치하지 못할 것입니다 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). 따라서 가장 좋은 해결책은 command와 함께 기본 유닉스 소켓 인증을 계속 사용하는 sudo mysql -u root것입니다.이 또한 더 안전하고 성능이 좋다고 생각합니다.
— baptx

5

이 답변에서 http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

MySQL은 암호가 아닌 플러그인을 사용하여 루트를 인증하려고합니다. 루트에 대한 플러그인 사용을 비활성화해야합니다.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
그것이 바로 답변으로 게시 한 것입니다.
— Morgan Touverey Quilling

1
업데이트와 함께 약간 더 간결한 롤업입니다.
— 조랑말

심지어 mysql 쉘을 얻을 수 없으므로 Could not open mysql.plugin table.오류 로그에서 보더라도 내 경우에는 작동하지 않습니다 .
— Dave Everitt

0

앞에서 설명한대로 연결하십시오.

mysqld_safe --skip-grant-tables

로그 파일이 표시됩니다 :

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

올바른 소켓에 대한 검색 로그 (이 경우 : /usr/local/mysql/data/ab123456.domain.com.err) :

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

그리고 mysql 연결에서 사용하십시오 :

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

나는 단지 얻는다. $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/var그러나 단지 bash 프롬프트로 되돌아 간다.
— Dave Everitt

0

기본적으로 marriadb는 "unix_socket"인증 플러그인을 사용하여 비밀번호를 설정합니다. "mysql_native_password"여야합니다.

데이터베이스 전환 ..

use mydatabase;

먼저 마녀 플러그인이 설정되어 있습니다 ..

SELECT user, plugin FROM user;

"mysql_native_password"로 설정

UPDATE user SET plugin="mysql_native_password"; 

새 비밀번호 설정 ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.