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.