MySQL 8.0 - Клієнт не підтримує протокол аутентифікації, запитуваний сервером; розглянути можливість оновлення клієнта MySQL


273

Я не можу з якихось причин встановити просте з'єднання з сервером. Я встановлюю нову базу даних MySQL Community 8.0 разом з Node.JS із налаштуваннями за замовчуванням.

Це мій код node.js

    var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "password",
      insecureAuth : true
    });

    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
    });

Нижче наведена помилка, знайдена в командному рядку:

C:\Users\mysql-test>node app.js
    C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
    r.js:80
            throw err; // Rethrow non-MySQL errors
            ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
    at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
    at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
    at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:103:28)
    at Socket.emit (events.js:159:13)
    at addChunk (_stream_readable.js:265:12)
    at readableAddChunk (_stream_readable.js:252:11)
    at Socket.Readable.push (_stream_readable.js:209:10)
    --------------------
    at Protocol._enqueue (C:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
    at Object.<anonymous> (C:\Users\mysql-test\server.js:
11:5)
at Module._compile (module.js:660:30)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)

Я читав такі речі, як: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/isissue/1507

Але я все ще не впевнений, як виправити свою проблему. Будь-яка допомога буде вдячна: D


2
Усі користувачі коду VS, які використовують розширення SQLTools, повинні посилатися на цю публікацію, якщо у них виникають проблеми з цим, особливо якщо ви лише оновили екземпляр mysql на своєму розробницькому комп’ютері
OzzyTheGiant

Відповіді:


678

Виконайте наступний запит у MYSQL Workbench

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

Де rootяк ваш користувач localhostяк ваша URL-адреса і passwordяк ваш пароль

Потім запустіть цей запит, щоб оновити привілеї:

flush privileges;

Спробуйте підключитись за допомогою вузла після цього.

Якщо це не працює, спробуйте це без @'localhost'частини.


47
Це працювало для мене. Не забувайте flush privileges;після.
Алі Хесарі

12
Це працювало для мене без @localhost (я думаю, це могло бути тому, що це не для кореневого користувача)
NicolasZ

10
замініть "пароль" своїм кореневим паролем, якщо ви знаєте це
Vedha Peri

11
Він працює ...... але чому він раніше не працював і чому він працював після цього запиту, це все ще питання.
сакшам

9
Привіт @GuilhermeMatuella Це тому caching_sha2_password, що введено в MySQL 8.0, але версія Node.js ще не реалізована.
Дакш Гаргас

106

Давайте спочатку дамо зрозуміти, що відбувається.

MySQL 8 підтримує підключаються методи аутентифікації. За замовчуванням використовується один з них caching_sha2_password, а не наш старий mysql_native_password( джерело ). Повинно бути очевидним, що використання крипто алгоритму з декількома рукостисканнями безпечніше, ніж звичайне введення пароля, яке існує вже 24 роки !

Тепер проблема полягає mysqljsв Node (пакет, який ви встановлюєте npm i mysqlі використовуєте в коді Node), поки не підтримує цей новий метод аутентифікації за замовчуванням MySQL 8. Проблема тут: https://github.com/mysqljs/mysql/isissue/1507 і залишається відкритою через 3 роки станом на липень 2019 року.

(ОНОВЛЕННЯ Червень 2019: У mysqljs зараз є новий PR, щоб виправити це! ) (ОНОВЛЕННЯ Лютий 2020: Мабуть, заплановано вийти у версії 3 mysqljs . )

Ваші варіанти

Варіант 1) Поновлення "MySQL" для автентифікації за допомогою старого хорошого "native_password"

Це те, що всі пропонують тут (наприклад, відповідь вище ). Ви просто увійдете mysqlі запустіть запит, який говорить, що rootце добре, використовуючи старий native_passwordметод для аутентифікації:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

Хороша річ, що життя буде простим, і ви все одно можете використовувати старі хороші інструменти, такі як Sequel Pro, без жодних проблем . Але проблема полягає в тому, що ви не користуєтеся більш безпечними (і крутими, читайте нижче) продуктами, доступними для вас.

Варіант 2) Замініть пакет "Вузол" MySQL Connecter X DevAPI

MySQL X DevAPI для Node - це заміна пакету Mysqljs Node , наданий офіційними хлопцями http://dev.mysql.com .

Це працює як шарм, що підтримує caching_sha2_passwordаутентифікацію. (Переконайтеся, що ви використовуєте порт 33060для комунікацій із протоколом X. )

Погано в тому, що ви залишили наш старий mysqlпакунок, до якого всі так звикли і на який покладаєтесь.

Хороша річ, що ваш додаток зараз більш безпечний, і ви можете скористатися цілою точкою нових речей, які наші старі добрі друзі не надали! Просто перегляньте підручник X DevAPI, і ви побачите, що в ньому є безліч нових сексуальних функцій, які можуть стати в нагоді. Вам просто потрібно заплатити ціну кривої навчання, яка, як очікується, поставляється з будь-яким оновленням технології. :)

PS. На жаль, у цього пакету XDevAPI ще немає визначення типів (зрозуміло для TypeScript), тому, якщо ви користуєтеся машинописом , у вас виникнуть проблеми. Я намагався генерувати .d.ts за допомогою dts-genі dtsmake, але успіху не було. Тож майте це на увазі.

Ура!


3
Дякуємо, що опублікували детальну відповідь на запитання за рік. :]
Дакш Гаргас

3
приємно, відповідь, яка насправді пояснює mysql_native_password замість того, щоб просто сказати вам це зробити
wizloc

1
Так, правильне пояснення за один раз. Добрий вам Айдін. Як я хочу, щоб підключення програм не конфігурувало порт 3306 автоматично на MySQL. У нас достатньо проблем із тим, щоб оцінити MySQL та MariaDB далеко від 3306.
Trunk

Будьте уважні до плагінів Oracle, ви можете отримати великий штраф: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha Untinen

Ця відмінна відповідь заслуговує на більшу кількість грошей!
Червень Венстон

82

Використання старих mysql_native_passwordтворів:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;

Це тому caching_sha2_password, що введено в MySQL 8.0, але версія Node.js ще не реалізована. Ви можете переглянути цей запит на витягнення та цю проблему для отримання додаткової інформації. Напевно, виправлення незабаром з’явиться!


Працюй як шарм. Яке полегшення!
капелюх

яка різниця між додаванням @localhost і просто «root»
filemonczyk

Запит працює. Але все ж вузол не міг підключитися до сервера MySQL. Будь-яка ідея? Ось помилка, {"код": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Доступ заборонено для користувача" root "@" localhost "(з використанням пароля: ТАК)", "sqlState": "28000" , "фатальний": true}
Санджай Прадіп

26

Повні кроки для MySQL 8

Підключення до MySQL

$ mysql -u root -p
Enter password: (enter your root password)

Скинути пароль

(Замініть your_new_passwordпаролем, який ви хочете використовувати)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit

Потім спробуйте підключитися за допомогою вузла


@sky див. мою відповідь вище для деталей.
Aidin

1
@Aidin Спасибі, це дуже корисно.
Небо

17

Хоча прийнята відповідь правильна, я вважаю за краще створити нового користувача, а потім використовувати його для доступу до бази даних.

create user nodeuser@localhost identified by 'nodeuser@1234';
grant all privileges on node.* to nodeuser@localhost;
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY 'nodeuser@1234';

2
Якщо хтось хоче пройти цей маршрут, ось стаття з деяким поясненням: digitalocean.com/community/tutorials/…
Девін

12

Якщо ви зіткнулися з цією помилкою, але все-таки хотіли скористатись MySQLверсією 8. Ви можете домогтися цього, повідомивши MySQL Server використовувати застарілий плагін аутентифікації під час створення бази даних за допомогою Docker.

Отже, ваш composeфайл буде виглядати приблизно так:

# Use root/example as user/password credentials

version: '3.1'

services:

  db:
    image: mysql:8.0.15
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'
    ports:
      - 3318:3306
    # Change this to your local path
    volumes:
      - ~/Database/ORM_Test:/var/lib/mysql

Я використовую це command, але все ж отримую непідтримуване повідомлення про помилку автентифікації під час використання mysqlв Node.js
Juha Untinen

Повний стек-трек тут: pastebin.com/SzayQzdh та docker-compose.yml : pastebin.com/7pUrWYDs Сама помилка:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen

1
@JuhaUntinen переконайтесь, що ви видалили контейнер Docker (той, створений docker-compose) та об'єм (~ / База даних / ORM_Test), а потім знову запустіть "docker-compose". В іншому випадку зміни з "команди" не будуть застосовані. Це допомогло в моєму випадку.
Віталій Іванов

11

В останній контейнер докера Mysql

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

Якщо команда ALTER USER ... не працює для вас І якщо ви використовуєте Windows 10, спробуйте виконати такі дії:

1) Введіть MySQL на панелі пошуку Windows

2) Відкрийте інсталятор Windows MySQL - Спільнота

3) Шукайте "MySQL сервер" і натисніть кнопку Reconfigure крок 3

4) Клацніть на «Далі», поки не досягнете фази «Метод аутентифікації»

5) На етапі "Метод аутентифікації" перевірте другий варіант "Використовувати застарілий метод аутентифікації" крок 5

6) Потім виконайте дії, встановлені інсталятором Windows до кінця

7) Коли це буде зроблено, перейдіть до пункту "Послуги" на панелі пошуку Windows, натисніть "запустити" MySql81 ".

Тепер спробуйте ще раз, зв’язок між MySQL та Node.js повинен працювати!


4

У MySQL 8.0 caching_sha2_passwordє плагіном аутентифікації за замовчуванням, а неmysql_native_password. ...

Більшість відповідей на це запитання призводять до переходу на механізм аутентифікації від caching_sha2_passwordдо mysql_native_password. З точки зору безпеки, це дуже невтішно.

Цей документ широко обговорює caching_sha2_passwordі, звичайно, чому НЕ повинен бути першим вибором для зниження способу аутентифікації.

Зважаючи на це, я вважаю, що відповідь Айдіна має бути прийнятою відповіддю. Замість того, щоб погіршити метод аутентифікації, використовуйте роз'єм, який відповідає версії сервера.


3

Оригінальну документацію ви можете знайти тут: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

'use strict';

const mysqlx = require('@mysql/xdevapi');

const options = {
  host: 'localhost',
  port: 33060,
  password: '******',
  user: 'root',
  schema: 'yourconference'
};

mysqlx.getSession(options)
  .then(session => {
          console.log(session.inspect());
           session.close();
  }).catch(err => {
    console.error(err.stack);
    process.exit(1);
  });

Це виглядає складніше, але я думаю, що ми повинні слідувати офіційному керівництву! б
Juneyoung Oh

3

У мене є MYSQL на сервері та додаток nodejs на іншому сервері

Виконайте наступний запит у MYSQL Workbench

ПОЛІ ПОТРІБНИК 'root' @ '%' ІДЕНТИФІКОВАНО З mysql_native_password BY 'пароль'


2

Для існуючих встановлень mysql 8.0 на Windows 10 mysql,

(1) програма запуску,

(2) натисніть кнопку "Реконфігурувати" в розділі QuickAction (зліва від MySQL Server), потім

(3) натисніть кнопку "Далі", щоб перейти через наступні 2 екрани до прибуття

(4) у розділі "Метод аутентифікації" виберіть "Використовувати застарілий метод аутентифікації (збережіть сумісність MySQL 5.x")

(5) Тримайте клацання, поки установка не буде завершена


2

Завдяки MySQL 8+ нова автентифікація за замовчуванням caching_sha2_passwordзамість mysql_native_password. Новий і більш безпечний метод аутентифікації ще не підтримується нативним mysqlпакетом, але вам слід подумати про використання цього пакету @mysql/xdevapi, який офіційно підтримується і підтримується Oracle.

Щоб встановити новий пакет, запустіть:

npm install @mysql/xdevapi --save --save-exact

Щоб підключитися до бази даних та ВСТАВИТИ деякі ЦІННОСТІ:

const mysqlx = require('@mysql/xdevapi');
var myTable;

mysqlx
    .getSession({
        user: 'root',
        password: '*****',
        host: 'localhost',
        port: 33060
    })
    .then(function (session) {

    // Accessing an existing table
    myTable = session.getSchema('Database_Name').getTable('Table_Name');

    // Insert SQL Table data
    return myTable
        .insert(['first_name', 'last_name'])
        .values(['John', 'Doe'])
        .execute()
    });

Офіційну пакетну документацію можна знайти тут: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/


2

Якщо ви використовуєте докер, це працювало для мене!

в docker-compose.ymlдодайте наступні рядки:

mysql:
   ...    
   command: --default-authentication-plugin=mysql_native_password
   restart: always

після цього downконтейнер і upзнову.


1

Крім вищезазначених відповідей; Після виконання команди нижче

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

Якщо ви отримаєте помилку як:

[ERROR] Column count of mysql.user is wrong. Expected 42, found 44. The table is probably corrupted

Потім спробуйте в cmd як адміністратор; встановити шлях до папки бін сервера MySQL в cmd

set path=%PATH%;D:\xampp\mysql\bin;

а потім запустіть команду:

mysql_upgrade --force -uroot -p

Це повинно оновити сервер та системні таблиці.

Тоді ви маєте змогу успішно запускати наведені нижче команди у запиті на Workbench:

 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'    

то не забудьте виконати таку команду:

flush privileges;

Після всіх цих кроків має бути можливість успішно підключитися до вашої бази даних MySQL. Сподіваюся, це допомагає ...



0

Перевірте привілеї та ім’я користувача / пароль для свого користувача MySQL.

Для вловлювання помилок завжди корисно використовувати переосмислений _delegateErrorметод. У вашому випадку це має виглядати так:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  insecureAuth : true
});

var _delegateError = con._protocol._delegateError;

con._protocol._delegateError = function(err, sequence) {
    if (err.fatal)
        console.trace('MySQL fatal error: ' + err.message);

    return _delegateError.call(this, err, sequence);
};

con.connect(function(err) {
  if (err) throw err;

  console.log("Connected!");
});

Ця конструкція допоможе вам відстежити фатальні помилки.


0

Просто зрозумів це, спробувавши численні речі. Що нарешті зробив це для мене, було додавання require('dotenv').config()до мого .sequelizercфайлу. Очевидно sequelize-cli не читає змінних env.


0

Низька оцінка може бути не найкращим варіантом, як:

  1. Його оновлено з причини (Для кращої аутентифікації).
  2. Можливо, вам не вистачить дозволів на внесення таких змін.

Ви можете використовувати mysql2пакет замість mysql. Його в основному API сумісний з mysqljs. Також обіцяє підтримку.

Використовуйте його так: const mysql = require('mysql2/promise')

Більше про це можна прочитати mysql2тут: https://www.npmjs.com/package/mysql2

Сподіваюся, це допомагає. :)


0

Ви можете пропустити ORM, будівельників тощо та спростити управління DB / SQL за допомогою sqlerта sqler-mdb.

-- create this file at: db/mdb/read.table.rows.sql
SELECT TST.ID AS "id", TST.NAME AS "name", NULL AS "report",
TST.CREATED_AT AS "created", TST.UPDATED_AT AS "updated"
FROM TEST TST
WHERE UPPER(TST.NAME) LIKE CONCAT(CONCAT('%', UPPER(:name)), '%') 
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.read.table.rows({
  binds: {
    name: 'Some Name'
  }
});

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});

-1

У мене така ж проблема з MySQL, і я вирішую, використовуючи XAMPP для з'єднання з MySQL і зупинення служб у Windows для MySQL (панель управління - Адміністративні інструменти - Послуги), а також у папці db.js (відповідальна за базу даних) I зробіть пароль порожнім (тут ви можете бачити :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});

будь ласка, не додайте питання, яке стоїть перед вами як відповідь на проблему, з якою стикається
Aloy A Sen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.