目录
6、编辑 /etc/my.cnf,将skip-grant-tables删除
mysql数据管理员密码忘记或者遗失的原因,一般有:
1、DBA记性不好,忘记了。弹脑瓜蹦(DBA,人事,老板)。
2、数据库密码被其他人(被黑了)修改了。弹脑瓜蹦(DBA,网管)
3、DBA离职交接工作没做到位,或者制度不完善,意识欠缺。弹脑瓜蹦(DBA,人事,老板)
4、不可预知的原因导致遗失。
脑瓜蹦弹归弹,但问题还是要解决的。
一、解决方法分析:
mysql的服务端可以分为三层,分别是连接层,SQL层,存储层
连接层定义了通信server端与client协议:
连接层
1.提供链接协议(socket,tcp/ip) #这里的socket也不是网络连接的socket,mysql的socket连接只能连接本地
2.验证用户的合法性(用户名,密码,白名单)
3.提供一个专用连接线程(接收sql,返回结果,将sql语句交给sql层继续处理)
sql层
1.接收到sql语句,语法判断
2.判断语义(判断语句类型:DML,DDL,DCL,DQL)
3.解析SQL语句,生成多种执行计划
4.优化器,选择它认为成本最低的执行计划(通俗讲就是选择速度快,消耗低的sql语句类型)
5.执行器根据优化器的选择,按照优化器建议执行sql语句,得到去哪儿找sql语句需要访问的数据
5.1.具体:在哪个数据文件上的哪个数据页中
5.2.将以上结果充送给下层继续处理
6.接收存储引擎层的数据,结构化成表的形式,通过连接层提供的专用线程
7.提供查询缓存
7.1.query_cache使用memcached或Redis代替
8.日志记录(binlog)
存储引擎层
1.接收上层的执行结果
2.取出磁盘文件和相应数据
3.返回给sql层,结构化之后生成表格,由专用线程返回给客户端。
二、解决办法:(跳过验证)
方法一:
1、编辑 /etc/my.cnf 文件。
在 [mysqld]区域内增加下面一行
skip-grant-tables
2、重启mysql:
方式一:进入mysql安装目录下的support-files目录,然后执行:
./mysql.server restart
方式二:
systemctl restart mysqld
3、免认证连接数据库:
mysql -uroot -p
要求输入密码的地方,直接回车;
4、重置root密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
有错误提示信息:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
5、刷新权限再重置
6、编辑 /etc/my.cnf,将skip-grant-tables删除
退出mysql命令行,
编辑 /etc/my.cnf。将上面添加的语句删除掉或者注释掉。
并保存退出
7、测试是否可正常登录和操作:
方法二:
1、关闭正在运行的 MySQL
2、跳过验证
mysqld_safe --skip-grant-tables &
3、禁止远程连接
mysqld_safe --skip-networking &
2,3步也可以同时操作为:
mysqld_safe --skip-grant-tables --skip-networking &
4、本地连接mysql
mysql -uroot -p
输入密码处直接按回车
5、刷新权限再重置
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '666666';
6、修改完毕,重启。
方法参考方式一