MySQL 8.0 - клиент не поддерживает протокол аутентификации, запрашиваемый сервером; рассмотреть вопрос об обновлении клиента MySQL

274

Я не могу установить простое соединение с сервером по какой-то причине. Я устанавливаю новейшую базу данных 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/issues/1507

Но я все еще не уверен, как решить мою проблему. Любая помощь будет оценена: D

свинья
источник
2
Все пользователи кода VS, использующие расширение SQLTools, должны обращаться к этому сообщению на случай, если у них возникнут проблемы, особенно если вы только что обновили экземпляр mysql на своем компьютере для разработки
OzzyTheGiant

Ответы:

680

Выполните следующий запрос в MYSQL Workbench

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

Где в rootкачестве вашего пользователя, localhostкак ваш URL и passwordкак ваш пароль

Затем выполните этот запрос, чтобы обновить привилегии:

flush privileges;

Попробуйте подключиться с помощью узла после этого.

Если это не работает, попробуйте это без @'localhost'части.

Pras
источник
47
Это сработало для меня. Не забудьте flush privileges;после.
Али Хесари
12
У меня это работало без @localhost (наверное, потому что не для пользователя root)
NicolasZ
10
замените «пароль» своим корневым паролем, если вы его знаете
Vedha Peri
11
Это работает ...... но почему это не работало раньше и почему это работало после этого запроса, все еще вопрос.
Сакшам
9
Привет @GuilhermeMatuella Это потому, что caching_sha2_passwordвведено в MySQL 8.0, но версия Node.js еще не реализована.
Дакш Гаргас
108

Давайте сначала проясним, что происходит.

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

Теперь проблема mysqljsв Node (пакет, который вы устанавливаете npm i mysqlи используете в своем коде Node), пока не поддерживает этот новый метод аутентификации по умолчанию в MySQL 8. Вопрос находится здесь: https://github.com/mysqljs/mysql/issues/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) Замените пакет "Node" на MySQL Connecter X DevAPI

MySQL X DevAPI для Node является заменой пакета Node's Mysqljs , предоставленного официальными парнями 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.
Ствол
Будьте осторожны с плагинами Oracle, вы можете получить большой штраф: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Юха Унтинен
Это отличный ответ заслуживает больше голосов!
Июнь Венстон
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 еще не реализована. Вы можете увидеть этот запрос и эту проблему для получения дополнительной информации. Вероятно, исправление придет в ближайшее время!

upupming
источник
Работай как шарм. Какое облегчение!
шляпа
Какая разница между добавлением @localhost и просто «root»
filemonczyk
Запрос работает. Но все равно узел не мог подключиться к серверу MySQL. Любая идея? Вот ошибка, {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: YES)", "sqlState": "28000" , "роковой": правда}
Санджай Прадип
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

Затем попробуйте подключиться с помощью узла

joshuakcockrell
источник
@ мой см. мой ответ выше для деталей.
Айдин
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';
Siddhant
источник
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
Юха Унтинен
Полная трассировка стека находится здесь: 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
Юха Унтинен,
1
@JuhaUntinen убедитесь, что вы удалили контейнер Docker (созданный docker-compose) и том (~ / Database / ORM_Test), а затем снова запустите docker-compose up. В противном случае изменения из команды не будут применены. Это помогло в моем случае.
Виталий Иванов
11

В Mysql Последний докер контейнер

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
MacielJr
источник
9

Если командная строка ALTER USER ... не работает для вас И если вы используете Windows 10, попробуйте выполнить следующие действия:

1) Введите MySQL в строке поиска Windows

2) Откройте установщик MySQL для Windows - сообщество

3) Найдите «MySQL server» и нажмите «Reconfigure». шаг 3

4) Нажимайте «Далее», пока не дойдете до фазы «Метод аутентификации».

5) На этапе «Метод аутентификации» проверьте второй параметр «Использовать устаревший метод аутентификации» шаг 5

6) Затем следуйте инструкциям установщика Windows до конца

7) Когда это будет сделано, перейдите в «Службы» в строке поиска Windows, нажмите «Пуск» MySql81 ».

Теперь попробуйте еще раз, соединение между MySQL и Node.js должно работать!

Campalo
источник
4

В MySQL 8.0 caching_sha2_passwordэто плагин аутентификации по умолчанию, а неmysql_native_password. ...

Большинство ответов на этот вопрос приводят к переходу на механизм аутентификации с по caching_sha2_passwordк mysql_native_password. С точки зрения безопасности это весьма разочаровывает.

В этом документе подробно обсуждается caching_sha2_passwordи, конечно, почему он НЕ должен быть первым выбором для понижения метода аутентификации.

При этом я считаю, что ответ Айдина должен быть принятым ответом. Вместо понижения метода аутентификации используйте соединитель, который соответствует версии сервера.

Lester
источник
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);
  });
Шиванг Патель
источник
Это выглядит сложнее, но я думаю, что мы должны следовать официальному руководству! b
Juneyoung Oh
3

У меня MYSQL на сервере и приложение nodejs на другом сервере

Выполните следующий запрос в MYSQL Workbench

ALTER USER 'root' @ '%' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'password'

iomar
источник
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снова.

Лео
источник
2

Для существующих MySQL 8.0 устанавливается на Windows 10 MySQL,

  1. запустить установщик,

  2. нажмите «Переконфигурировать» под QuickAction (слева от MySQL Server), затем

  3. нажмите рядом, чтобы пройти через следующие 2 экрана до прибытия

  4. в разделе «Метод проверки подлинности» выберите «Использовать устаревший метод проверки подлинности (сохранить совместимость с MySQL 5.x»).

  5. Продолжайте нажимать, пока установка не будет завершена

Чарльз Гудвин
источник
Ахмед, большое спасибо за ваши переформатированные изменения. Теперь легче читать.
Чарльз Гудвин
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 как администратор; установить путь к папке bin сервера 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 Server Installer и перенастройте My SQL Server ... Это сработало для меня.

Александр Буриас
источник
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.

gbland777
источник
0

Вы можете пропустить ORM, сборщики и т. Д. И упростить управление БД / 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');
});
ugate
источник
0

Понижение рейтинга не может быть хорошим вариантом, так как:

  1. Его модернизировали по причине (чтобы обеспечить лучшую аутентификацию).
  2. Возможно, у вас недостаточно прав для внесения таких изменений.

Вы можете использовать mysql2пакет вместо mysql. В основном это API, совместимый с mysqljs. Также есть поддержка обещаний.

Используйте это как: const mysql = require('mysql2/promise')

Вы можете прочитать больше о mysql2здесь: https://www.npmjs.com/package/mysql2

Надеюсь, поможет. :)

Салим Шамим
источник
-1

У меня та же проблема с MySQL, и я решаю с помощью XAMPP для соединения с MySQL и остановки служб в Windows для MySQL (панель управления - Администрирование - Службы) и в папке db.js (которая отвечает за базу данных). сделать пароль пустым (здесь видно :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});
Мохаммед Джуза
источник
пожалуйста, не добавляйте проблему, с которой вы сталкиваетесь, как ответ на проблему, с которой вы столкнулись
Aloy A Sen