这个问答主题中排名最高的答案在大多数情况下都是有效的,但它们没有组织,这至少可以这么说。有一个解决方案在这里,不过,这个解决方案是分散在其他三个答案中的各种碎片。为了提供一个单一的解决方案、更有帮助且节省时间,我将尝试用清晰、简明和有序的方式撰写答案。我将讨论Ubuntu用户遇到的整个问题,并补充其他答案中没有包含的有用信息,以帮助读者理解他们所遇到的问题。
先来看看问题:这不是SQL的问题,而是Ubuntu的问题
对于您遇到的问题,事实上(大多数软件开发人员/IT专业人员可能已经知道的事实)是,在Ubuntu中,'ROOT'
用户没有密码,任何拥有$ sudo
权限的人都可以访问它。为了给那些可能对我提出的某些语义新手的任何人提供明确的澄清;Ubuntu用户使用sudo -i
命令注册为root用户,而存在的每个其他Linux发行版都使用带密码的用户ID。事实上,我从来没有想到过需要成为root用户做除数据库管理之外的任何事情,而且总是在我首次将数据库安装到服务器时使用它,虽然我的经验可能远不及其他一些IT专业人士。我的观点是,通常仅使用sudo
就可以完成所有工作,但在这种情况下,它有问题,因此需要注意以下重要事项:
问题:
Ubuntu缺少“ROOT密码”,这就是为什么每个遇到我们正在讨论的问题的人都运行一个Ubuntu操作系统的发行版/ SHELL。除非我们重新编写Ubuntu内核以及操作系统中的几乎所有其他内容,否则我们无法为Ubuntu SHELL提供"root密码"。
解决方案:
我们可能无法为Ubuntu SHELL提供根密码,但我们可以并且将会为MySQL提供一个'ROOT PASSWORD'
。
要执行解决方案,您需要以下内容:
- Node.js v12+
- NPM(可能需要v5+,但不要引用我)
- MySQL v8.0+(显然)
- MySQL驱动程序(从npm)
确认:
如果您还没有清单上的所有内容,您无法确定这是否是您正在处理的问题。
如果您已经拥有以下所有内容
并且您正在运行Ubuntu发行版,则应该会收到一个错误消息,它可能看起来像我在修复此问题时收到的那个消息。
我的错误消息如下:
ERROR: (28000): Access denied for user 'ajc'@'localhost'
ERROR: ERROR_NOT_SUPPORTED_AUTH_MODE: Client does not support
authentication protocol requested by server; consider upgrading
MySQL client
'Client does not support authentication protocol requested by server; consider upgrading MySQL client
如果您仍在阅读,那么您可能正在正确的地方。
要开始解决问题,请创建一个空的Node.js项目,并使用NPM将MySQL驱动程序作为依赖项安装到其中(您应该知道如何做到这一点,因为您必须这样做才能出现这个问题)。添加JavaScript .js
文件。将文件命名为sqltest.js
或类似名称。
将下面的代码添加到您刚刚创建的文件中。
let mysql = require('mysql');
let connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'DB_App_00',
});
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
console.log('Connected to the MySQL server.');
});
在名为“createConnection”的方法中,有一个JSON对象参数,保存着用于建立有效连接到MySQL数据库服务器的凭证值。用户必须等于“root”,并且数据库必须存在。另外,在稍后的测试中,还要向数据库添加测试表,并填充一些虚假数据。
现在打开终端窗口,并执行典型的更新和升级操作,这很重要,因此每个教程都要求你这样做。
~$: sudo apt update
~$: sudo apt upgrade
完成升级后,请在终端中输入以下命令:
~$: sudo mysql -u root
- 它应提示您输入Ubuntu密码,请输入并[ENTER]。
下一步非常重要:
- 现在是被认为是解决问题的关键步骤。你的终端应该已经打开,并且你应该在MYSQL服务器内,使用'root'用户。终端应该在一个空的mysql命令行下闪烁光标。在CMDL中复制并粘贴此内容:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ChoosePassword';
mysql> FLUSH PRIVILEGES;
接下来很明显,将“ChoosePassword”更改为你记得住的密码,同时保留单引号内的密码不变。不要更改任何其他内容,按[ENTER]键。
如果您正确地执行了上述步骤,现在您拥有一个具有自己密码的MySQL 'ROOT USER'。通过在Ubuntu CMDL中复制并粘贴以下内容来测试:
~$: mysql -u root -p
……现在您已经登录,请退出。
mysql>exit
- 回到你的“testsql.js”文件中,将凭据更改为用户的根凭据,密码更改为您的密码,有效数据库,主机更改为localhost,除非您有不同主机名的特殊需要。
let connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '********',
database : 'DB_App_00',
});
- 现在使用node来运行node测试文件
~$: node testsql.js
最终结论:
如果它显示未连接,说明您做错了什么,但如果一切顺利,您应该可以连接。在我使其正常工作之前花费了一些时间和精力,但这篇回答应该可以帮助您节省阅读所有其他不完整的答案所需的时间。