首页 > 数据库 >MySQL_踩坑记录

MySQL_踩坑记录

时间:2024-10-27 08:51:27浏览次数:1  
标签:记录 MySQL 密码 mysql password root native

=== MySQL_踩坑记录 ===

本文的所有解决方案并非万能,只是记录本人遇到的情况。

Authentication plugin 'mysql_native_password' cannot be loaded

初始问题及解决方案

Windows环境下使用 MySQL Connector/C++ 远程访问 Linux中的MySQL服务,下面是测试代码。

// 测试是否可以访问 MySQL
void TestConnectMySQL() {
	try {
		// 获取 MySQL 驱动实例,创建数据库连接
		sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
		sql::Connection* conn = driver->connect("ip:port", "username", "password");
		// 选择数据库
		conn->setSchema("db");
	}
	catch (sql::SQLException& E) {
		// 处理异常
		std::cerr << "MySQL ConnPool init failed, error: " << E.what() << std::endl;
		std::cerr << " (MySQL Error Code: " << E.getErrorCode()
			<< ", SQLState: " << E.getSQLState() << " )" << std::endl;
	}
}

程序执行出错

MySQL ConnPool init failed, error: Authentication plugin 'mysql_native_password' cannot be loaded: 找不到指定的模块。

解决方案

当时访问的MySQL版本是5.7,最终换成了8.0及以上的MySQL版本,创建一个新的支持远程连接的用户,默认会使用caching_sha2_password安全验证,程序中使用此用户即可消除此错误。

注意点

  • MySQL版本8.0及以上
  • 用户支持远程连接
  • 用户使用caching_sha2_password安全验证方式而非mysql_native_password

此问题已解决!后续内容为解决此问题而引发的一系列问题,记录于此。

MySQL配置文件

# 查找配置文件的位置 my.cnf mysqld.cnf
find /etc -name "my.cnf" 2>/dev/null
find /etc -name "mysqld.cnf" 2>/dev/null
[mysqld]

# 指定本机访问 "0.0.0.0"表示任意ip都可访问,即允许远程连接
#bind-address = 127.0.0.1
bind-address = 0.0.0.0

# 允许同一客户端连接失败的次数
max_connect_errors = 10

# 设置默认的插件验证方式
#default_authentication_plugin = mysql_native_password
#default_authentication_plugin = caching_sha2_password

Host 'xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

这个错误表明 MySQL 阻止了来自特定主机的连接,因为该主机尝试连接的错误次数过多。

解决方案

在 MySQL 中运行以下命令:

-- 查看最大错误连接数
show global variables like '%max_connect_errors%';
-- 设置为100次
SET GLOBAL max_connect_errors = 100;

或者在 MySQL 配置文件中添加或修改该设置:

[mysqld]
max_connect_errors = 100

然后重启 MySQL 服务:

sudo systemctl restart mysql

至此,即可继续连接。

Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

MySQL8.0.16版本中新增了一个system_user帐户类型,由于root用户没有SYSTEM_USER权限,会报此错误,授予权限即可。

grant system_user on *.* to 'root';

在Linux上跳过密码登录MySQL报错-bash: mysqld_safe: command not found

解决方案:

mysqld --user=mysql --skip-grant-tables --skip-networking &

至此,可以登录root用户而无需密码:

mysql -u root

常用方案命令整合

MySQL

# 创建新用户,并允许远程登录
#-----------------------------------------------------------------------------
# 创建新用户 指定本地登录
create user 'username'@'localhost' identified by 'password';
# 创建新用户 指定远程登录
create user 'username'@'%' identified by 'password';
# 授予新用户远程登录的所有权限
grant all privileges on *.* to 'username'@'%' with grant option;

# 设置用户登录的加密方式(身份验证插件)
#-----------------------------------------------------------------------------
# 查询使用 mysql_native_password 加密方式的用户信息
SELECT user, host, plugin from mysql.user WHERE plugin='mysql_native_password';
# 查询使用 caching_sha2_password 加密方式的用户信息
SELECT user, host, plugin from mysql.user WHERE plugin='caching_sha2_password';
# 设置 root 用户本地登录密码永久有效
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root密码' PASSWORD EXPIRE NEVER;
# 设置 root 用户本地登录的加密方式为 mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root密码';
# 设置 root 用户远程登录密码永久有效
ALTER USER 'root'@'%' IDENTIFIED BY 'root密码' PASSWORD EXPIRE NEVER;
# 设置 root 用户远程登录的加密方式为 mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root密码';
# 可仿照 root 用户,配置普通用户本地和远程登录的密码和加密方式
# 设置之后,刷新下权限
flush privileges;

# 插件管理
#-----------------------------------------------------------------------------
# 查看插件信息
SHOW PLUGINS;
# 安装 mysql_native_password 插件
INSTALL PLUGIN mysql_native_password SONAME 'mysql_native_password';
# 安装 auth_socket 插件
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

# 修改身份验证插件(同上面的设置用户登录的加密方式一样)
#-----------------------------------------------------------------------------
# 修改本地登陆
# 修改密码过期规则----》永不过期
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; 
# 更新用户的密码修改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; 
# 刷新权限
FLUSH PRIVILEGES;
# 重置密码(==非必须==)
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#-----------------------------------------------------------------------------
# 修改远程登陆
# 修改密码过期规则----》永不过期
ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; 
# 更新用户的密码修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
FLUSH PRIVILEGES;
# 重置密码(==非必须==)
ALTER USER 'root'@'%' IDENTIFIED BY '123456';
#-----------------------------------------------------------------------------
# 设置密码规则
# 查看密码策略。 默认 MEDIUM
SHOW VARIABLES LIKE 'validate_password%';
# 将密码位数设置为 6
set global validate_password.length = 6;
# 密码策略修改为LOW,原值为MEDIUM
set global validate_password.policy = LOW;
# 至此,可以设置较为简单的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
FLUSH PRIVILEGES;
#-----------------------------------------------------------------------------
# 查看加密方式
SELECT Host, User, plugin from mysql.user;

Linux

# mysql 或 mysqld 具体取决于service
#-----------------------------------------------------------------------------
# 查看服务的状态
systemctl status mysql
# 重启
systemctl restart mysql
# 停止
systemctl stop mysql
# 启动
systemctl start mysql

标签:记录,MySQL,密码,mysql,password,root,native
From: https://www.cnblogs.com/lxybx/p/18506829

相关文章

  • 软件源码,招投标管理系统,询价管理系统,供应商管理系统,一体化管理系统,供应链管理(springbo
    前言:随着互联网和数字技术的不断发展,企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式,能够提高采购效率、降低采购成本、优化供应商合作效率,已成为企业实现效益提升的关键手段。源码获取本文末个人名片。一、建设的必要性数字化采购平台是指......
  • 用户对某条账单记录的删除操作
    1.数据获取与处理StringbillId=request.getParameter("billId");首先,从客户端请求中获取账单的ID是删除操作的第一步。这里使用request.getParameter()方法来提取传入的账单ID。2.DAO模式的使用BillDAObillDAO=newBillDAO();使用DAO模式的主要目的是将数据库操......
  • 【Atcoder训练记录】AtCoder Beginner Contest 377
    训练情况赛后反思D题差一点点吧?可能不去乐跑就能写出来了A题我们发现ABC是字典序单调递增的,字符串先排序再判断是否为ABC即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ strings;cin>>s; sort(s.begin(),s.end()); i......
  • Docker部署MySQL主从复制
    1.主从复制概念及优势1.1概念MySQL主从复制是一种数据库复制技术,它允许将一个数据库服务器(主服务器)上的数据更改复制到一个或多个数据库服务器(从服务器)。这种技术在数据库管理和维护中扮演着重要的角色,尤其是在需要数据冗余、负载均衡和高可用性的场景中。主从复制的概念......
  • Python 潮流周刊#74:创下吉尼斯世界记录的 Python 编程课(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期分享了12篇文章,12个开源项目,2则音视频,全文2300字。好消息:即日起至......
  • 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现二
    一、前言介绍:1.1项目摘要随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势。古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力。然而,在现代社会中,由于生活节奏的加快和信息获取方式的多样化,古诗词的传播和阅读面临着一定的挑......
  • 0-petalinux2018.3 摸索记录 - 快速亮机
    一、环境搭建1、环境要求①需要注意petalinux、vivado、vitis、linux之间的版本对应关系,在ug1144上可以找到②需要注意linux的硬件要求,运存8G以上不然会报错等等2、环境依赖配置2018.3_PetaLinux_Package_List.xlsx①安装包sudoapt-getinstalltofrodos......
  • 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现一
    一、前言介绍:1.1项目摘要随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势。古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力。然而,在现代社会中,由于生活节奏的加快和信息获取方式的多样化,古诗词的传播和阅读面临着一定的挑......
  • Excel导入到MySQL里
    0]MySQL报错出现TheMySQLserverisrunningwiththe--secure-file-privoptionsoitcannotexecutethisstatement。解决办法:1.找到mysql的存储路径:  2.打开my.ini(以记事本方式打开即可)[mysqld]secure_file_priv=''  添加该句。3.重启mysql1]先根据X......
  • 记录no.12
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>;//intmain()//{//0表示假非0表示真//   intage=10;//age=10<18,if不输出//   if(age>18)//if函数为真,输出结果 为假不输出//   {//      printf("成年\n");//   }//   el......