Menu Close

MariaDB忘记root@’localhost’密码的解决方法

MariaDB不能使用操作系统层面的认证,想访问数据库必须要使用用户名与密码登录(但是在新安装数据库后,可以直接使用 mariadb 或 mysql 命令登录数据库)。

重置MariaDB root@'localhost'账户密码的前提当然是能够登录到linux系统,且有足够的操作权限。本文以linux root账户为例,重置MariaDB的root@'localhost'账户密码。

1. 密码错误时登录提示

~]# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

2. 先将MariaDB服务关闭

~]# systemctl stop mariadb
~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: inactive (dead)

3. 修改my.cnf启动文件

修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:

skip-grant-tables=1

这一行配置让 mysqld 启动时不对密码进行验证。

或者:设定环境变量 MYSQLD_OPTS="--skip-grant-tables",然后重启MariaDB服务。--skip-grant-tables将允许MariaDB在启动时跳过授权表,这将导致允许所有用户拥有权限访问所有表数据。因此遗失root账户密码时,采用该方式可以进入数据库操作。

~]# systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

或者:在/usr/lib/systemd/system/mariadb.service 文件中添加一行

ExecStart=/usr/bin/mysqld_safe --basedir=/usr --skip-grant-tables --skip-networking

4. 重新启动mariadb

~]# systemctl start mariadb
~]# systemctl status mariadb

5. 使用 root 用户登录到 mysql(此时已经不再需要密码了)

~]#  mysql -uroot -p
回车

6. 更新root@'localhost'密码

MariaDB [(none)]>
-- 优先执行下列语句:
FLUSH PRIVILEGES;

-- 对于5.6或以前版本使用如下语句:
UPDATE mysql.user SET password=PASSWORD('NewPassword') WHERE user='root' AND host = 'localhost';

-- 对于5.7或以上版本使用如下语句:
GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY 'NewPassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

至此,root账户密码已经重置了,但事情并未结束。前面我们设定了--skip-grant-tables允许用户跳过授权表登录,因此我们还需要取消该项设置,同样在关闭MariaDB服务的状态下操作,最后重新启动MariaDB服务。

7. 重置环境并重启mariadb服务

移除 /etc/my.cnf 文件中的 skip-grant-tables=1,并重启服务。

~]# systemctl stop mariadb
~]# systemctl unset-environment MYSQLD_OPTS
~]# systemctl start mariadb

8. 最后使用重置的密码登录数据库

~]# mysql -uroot -p
Enter password: