[实践OK]mysql root 忘记密码强力修改 修改密码,Linux下MySQL 的root的密码忘记的解决办法,修改mysql密码的方法,给mysql的root空密码加上密码,localhost能连接127.0.0.1不能连接的授权命令。

jack 2009-11-23 09:38 | |
两者的核心差异在于连接通道:localhost 默认走 Unix Socket(本地套接字文件),而 127.0.0.1 明确走 TCP/IP 回环协议。这直接影响了连接路径、性能和权限判定。
关键细节:
在 MySQL 原生命令行客户端(如 mysql -h localhost)中,只要 host 是字符串 localhost,默认强制使用 socket 连接。只有显式写成 -h 127.0.0.1 时,才会触发 TCP 连接。

Java 应用的特殊性
Java 通过 JDBC(Connector/J) 连接 MySQL 时,情况与命令行不同:
JDBC 驱动本质上是网络协议驱动,默认基于 TCP 实现。
即使 JDBC URL 写成 jdbc:mysql://localhost:3306/...,驱动通常也会将 localhost 解析为 127.0.0.1,然后仍然走 TCP/IP。
除非显式配置 Unix Socket(需引入第三方库如 junixsocket 并指定 socketFactory 和 socket 参数),否则 Java 应用很难享受到 socket 连接的性能优势。

| 场景                       | 推荐写法                              | 理由                                                                       |
| ------------------------ | --------------------------------- | ------------------------------------------------------------------------ |
| **MySQL 命令行/Shell 脚本操作** | `-h localhost`(或不写 `-h`)          | 走 socket,性能最好,且不受防火墙/端口监听策略影响                                            |
| **Java JDBC 连接**         | `jdbc:mysql://localhost:3306/...` | 虽然底层大概率仍走 TCP,但写 `localhost` 语义最清晰,表明这是**本地服务依赖**。未来即使做读写分离或迁出,也更容易识别和替换 |
| **追求极致本地性能(Java)**       | 使用 Unix Socket 连接                 | 需额外配置 `socketFactory`,同机场景下可减少 TCP 协议栈开销,延迟更低                            |
最务实的结论:
Java 应用同机部署时,JDBC URL 写 localhost 更合理。它的优势不在于底层协议(因为 JDBC 默认还是 TCP),而在于:
语义明确:一眼看出是本地依赖,非远程网络调用。
维护友好:后续若 MySQL 迁出,只需改 hosts 或 DNS,无需改代码里的 IP。
权限管理:DBA 可以单独为 'app'@'localhost' 授权,与远程访问权限隔离,更安全。
如果未来这套系统对延迟极度敏感,再考虑在 Java 层启用 Unix Socket 连接。

/etc/my.cnf
#skip-grant-tables=on
update mysql.user set authentication_string=password('MyNewPass') where user='root'; #成功
select host,user,authentication_string from mysql.user;
+-----------+-----------+-------------------------------------------+
| host      | user      | authentication_string                     |
+-----------+-----------+-------------------------------------------+
| localhost | root      | *xxx |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| 127.0.0.1 | root      | *xxx |
+-----------+-----------+-------------------------------------------+
mysql db_eladmin < /tmp/db_eladmin.sql

在打开skip-grant-tables后,这些语句在mysql-5.7基本上用不上了:
mysql> show grants;
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Asdfjkl;711');
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

mysql修改root密码:

cat /root/.my.cnf
[client]
user=root
password=111111


问题一:Linux下MySQL 的root的密码忘记的解决办法加上  --skip-grant-tables, 重新设置密码:

重新正常启动提示并解决办法如下,改密码为一样还是不行的登录不了 了,这块最新的版本可能是作了安全防范吧:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user 'root'@'localhost' identified by 'mysql';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> exitBye

再次提示修改密码和原密码一致进不了了怎么办?出现:
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> GRANT ALL PRIVILEGES ON *.* TO IDENTIFIED BY '123' WITH GRANT OPTION;
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

这个时候我们只需要flush privileges 一下,在添加用户就OK了,

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
alter user 'root'@'localhost' identified by 'mysql';
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost',出现:MYSQL ERROR 1396 (HY000) 错误的解决办法 http://blog.sina.com.cn/s/blog_439f80c40100yoln.html

ERROR 1396 (HY000): Operation CREATE USER failed for 'jack'@'localhost',惹毛我了,我直接从其它机器上拷贝一个db目录带mysql表的过来,O了:scp -r mysql root@10.44.150.187:/data/.
[root@iZ25z0ugwgtZ data]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.11-log MySQL Community Server (GPL)


localhost能连接127.0.0.1不能连接的授权命令。
Warning: mysqli_connect(): (HY000/1130): Host '127.0.0.1' is not allowed to connect to this MySQL server
mysql> grant all privileges on jackX_mysql.* to jackX@"127.0.0.1" identified by "jackX2016";
Query OK, 0 rows affected, 1 warning (0.00 sec)

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

[root@iZ25z0ugwgtZ config]# mysql -h127.0.0.1 -ujackX -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.11-log MySQL Community Server (GPL)

mysql> \q
Bye
——————————————————————————————————————————————————————————
这样的:
一、RPM包的安装方式:
    1.关闭MySQL服务
     /etc/init.d/mysqld stop
    2.修改MySQL的启动文件
     vi /etc/init.d/mysqld
     找到Start(){   \\大概在43行左右
     让后在下行加入
     /usr/bin/mysqld_safe --skip-grant-tables --datadir="$datadir" --socket="$socketfile" --log-error="$errlogfile" --pid-file="$mypidfile
     其中加入--skip-grant-tables的意思是启动MySQL服务的时候跳 过权限表认证。启动后,连接到MySQL的root不需要口令
     3.重新启动MySQL服务
      /etc/init.d/mysqld start
     4.修改root用户密码
     #mysql
     mysql>update mysql.user set password=password('新密码')
         ->where user=root;
     mysql> flush privileges;
     mysql> quit
     5.把/etc/init.d/mysqld 改回原状重新启动mysql 就可以使用新密码登陆了。
     6.重新启动mysql 就可以使用新密码登陆了。
二、如果是源代码编译安装的话
     1.stop数据库
     service mysqld stop
     2.找到源代码编译安装的路径我的是/usr/local/mysql
      #cd /usr/local/mysql
      #bin/mysqld_safe --skip-grant-tables &
     3.启动之后就可以不需要密码进入mysql了
      #mysql
      mysql>use mysql;
      mysql>update user set password=password('new_password')
          ->where user='root';
      mysql>flush privileges;
     4.重启mysql,就可以用新密码登陆了。

其实最主要的就是在启动的时候要加上--skip-grant-tables 这样就可以实现无密码登陆了。
    
                           祝大家好运!!!
摘自:http://blog.chinaunix.net/uid-23397996-id-115499.html



问题二:相关直接修改Mysql的密码问题答疑
问:password=password("new_pass")   等号后为什么要加password?
答:后面那个password应该是个加密函数,用来加密你输入的密码
-------------MYSQL安装问题无密码,如何添加密码?---------------
没有密码为MYSQL加密码:
mysql -uroot -p
回车
提示输入密码,为空回车
update mysql.user set password=PASSWORD('122198') where user='root';
刷新权限表,输入如下命令
flush privileges;
退出
quit
------------------------实践如下:---------------------------------------------------------
mysql> update mysql.user set password=PASSWORD('WXXXXX5v') where user='root';      
Query OK, 4 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)
MYSQL 修改root密码命令
------------------------------------------------------------------------------------------------
cmd下切换到 mysql 安装目录

d:/mysql/bin
前提:mysql用户root密码为空.
输入 mysql -u root mysql
mysql> 状态下输入 update user set password=password('新密码') where user='root';
回显
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> 状态下输入 FLUSH PRIVILEGES;
回显
Query OK, 0 rows affected (0.00 sec)
mysql> 状态下输入 quit
退出 sql
注意每个命令后都要加上一个分号 ";"
mysql 才开始执行该行命令
而第二个指令会让已载入记忆体的 mysql 系统资料库更新
重起 mysql .
在更新 root 密码後,日後要与 MySQL 连线的方法为:
mysql -uroot -p新密码
==================================================
忘记mysql 的root 密码:
先确认已经杀掉mysqld 进程了,然后执行这个
/usr/bin/safe_mysqld --skip-grant-tables &
再这样登录
mysql -h 192.168.1.2 -u root
上边的192.168.1.2 是cloud 的mysqld 运行机器,你换成自己的,这样登录上
去,就可以修改密码了。
修改密码
1.mysql -h hostname –u root 命令登录到mysqld server 用grant 命令改变口令:
grant all privileges on DBNAME.* to USERNAME@localhost identified by 'PASSWORD'
2. mysqladmin -u 用户名-p 旧密码password 新密码
例1:给root 加个密码ab12。首先在DOS 下进入目录mysqlbin,然后键入
以下命令
mysqladmin -uroot password ab12
注:因为开始时root 没有密码,所以-p 旧密码一项就可以省略了。
2、例2:再将root 的密码改为djg345。
mysqladmin –u root -pab12 password djg345 (注意-p 不要和后面的密码分
开写,要写在一起)
3.
use mysql; update user set password =password('yourpass') where user='r
oot'
4. 载入权限表: `mysqladmin -h hostname flush-privileges' ,或者使
用SQL 命令`FLUSH PRIVILEGES'。(当然,在这里,你也可以重启mysqld。)
mysql 的建库,添加数据方法:
mysqi –u root
mysql>create database ttt;
mysql>source 1.txt
mysql>load data local infile "2.txt" into table board;
1.txt 内容:
CREATE TABLE board (
boardid int(11) NOT NULL auto_increment,
boardname char(255),
PRIMARY KEY (boardid)
); ......




-------------------------------------------------------------------------------------------------------------
1. 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWORD函数。
2. 使用mysqladmin, mysqladmin -u root -p password mypasswd
3. mysql> REPLACE INTO mysql.user (Host,User,Password) VALUES('%','username',PASSWORD('password'));
mysql> FLUSH PRIVILEGES
4. mysql> SET PASSWORD FORusername@"%" = PASSWORD('password');
这里的username是要修改的用户名称。
5. mysql> GRANT USAGE _disibledevent='mailto:username@"%'>username@"%" IDENTIFIED BY 'password';
这里的username是要修改的用户名称。  

    最后找到了修改遗失的MySQL的ROOT用户密码,嘿嘿好使了

如果忘记了 MySQL 的 root 密码,可以用以下方法重新设置:


1. KILL掉系统里的MySQL进程;

2. 用以下命令启动MySQL,以不检查权限的方式启动;

mysqld_safe -skip-grant-tables &

3. 然后用空密码方式使用root用户登录 MySQL;

mysql -u root

4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD('新密码') where User='root';
mysql> flush privileges;
mysql> quit

5. 重新启动MySQL,就可以使用新密码登录了。

添加
可以设置同一个用户在不同的ip限定下,不同密码来访问,如:root,可以在192.168.38.70上访问:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.38.70' IDENTIFIED BY 'ads_root';
FLUSH PRIVILEGES;

也可以在其他机器上访问:root,可以在192.168.38.30上访问:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.38.30' IDENTIFIED BY 'ads_root';
FLUSH PRIVILEGES;

就是统一用户,但授权访问密码可以不同,也可以相同,但IP段不同。

作者:jack@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2260/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jack 编辑于2026-5-21 11:47
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]