今天,我想在 PMA 中创建一个数据库。它显示:“无法登录 MySQL 服务器”。我通过终端尝试,还是同样的问题,这是因为我的密码错误。我不明白为什么。
我尝试了通常的方法来重置 root 密码(跳过授权表挂载并重置密码)但似乎不起作用。
看到这个:
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'
答案1
我找到了一个与问题本身一样奇怪的解决方案。
。 (完全没有必要,请阅读文章末尾的编辑)--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,您应该能够连接到 root 帐户。
这不一定禁用通过 Unix 套接字的连接。我的 MySQL va 修复后,在 PMA 中,我可以看到连接是通过 Unix 套接字建立的。
编辑几个月后:我现在已经习惯了这个问题经常出现,我想每次更新 MariaDB(或类似的东西)时都会出现。所以我对这个问题有了更好的理解;有一个 UNIX_SOCKET 插件可以让你登录 MariaDB 帐户而不必创建密码,因为它使用 shell 的凭据来信任你,而无需输入任何密码。事实上,这个插件是一个身份验证插件而不是与 SQL 服务器通信的方法。因此,如果您不使用 unix 套接字作为登录方法,则可以安全地禁用它。我唯一无法解释的是,为什么 UNIX_SOCKET 插件定期在数据库的每个帐户上设置,而我这边没有任何操作。
这有一个很好的副作用,当它发生时,您可以登录到 SQL 服务器而不必重新启动 MariaDB --skip-grant-tables
:只需登录到系统的根帐户,然后只需mysql -u root
无需密码连接,然后按照上面解释的方式重置插件字段。
编辑2:已确认,它发生在 Ubuntu 上每次 MariaDB 升级时。
答案2
从这个答案来看,http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227。
Mysql 尝试使用插件而不是密码来验证 root 身份。您需要禁用 root 的插件使用。
shell$ sudo mysql -u root
[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
答案3
按前面所述进行连接:
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
答案4
默认情况下,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';