MySQL 8.0-클라이언트는 서버가 요청한 인증 프로토콜을 지원하지 않습니다. MySQL 클라이언트 업그레이드 고려


273

어떤 이유로 서버에 간단하게 연결할 수 없습니다. 기본 설정으로 Node.JS와 함께 최신 MySQL Community 8.0 데이터베이스를 설치합니다.

이것은 내 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
SQLTools 확장을 사용하는 모든 VS Code 사용자는 특히 개발 컴퓨터에서 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;.
알리 Hesari

12
@localhost없이 나를 위해 일했습니다 (루트 사용자가 아니기 때문일 수 있습니다)
NicolasZ

10
'password'를 루트 암호로 바꾸십시오
Vedha Peri

11
작동하지만 ... 이전에 작동하지 않은 이유 와이 쿼리 후에 왜 작동했는지는 여전히 의문입니다.
saksham

9
안녕하세요 @GuilhermeMatuella 이것은 caching_sha2_passwordMySQL 8.0에서 도입되었지만 Node.js 버전은 아직 구현되지 않았기 때문입니다.
Daksh Gargas 2016

106

먼저 무슨 일이 일어나고 있는지 분명히하자.

MySQL 8은 플러그 가능한 인증 방법을 지원합니다. 기본적으로 caching_sha2_password우리의 좋은 예전 mysql_native_password( source ) 대신 이름 이 지정된 이름 중 하나 가 사용됩니다 . 여러 핸드 셰이크와 함께 암호화 알고리즘을 사용하는 것이 24 년 동안 존재했던 일반 암호 전달보다 더 안전합니다 !

이제 문제는 mysqljsNode ( npm i mysql노드 코드 와 함께 설치하여 사용 하는 패키지 )에서 아직 MySQL 8의이 새로운 기본 인증 방법을 지원하지 않습니다. 이 문제는 https://github.com/mysqljs/mysql/issues/1507에 있으며 2019 년 7 월 현재 3 년이 지난 후에도 계속 열려 있습니다.

(2019 년 6 월 업데이트 : 이 문제를 해결하기 위해 mysqljs에 새로운 PR 이 있습니다! ) (2020 년 2 월 업데이트 : 분명히 mysqljs 버전 3으로 예정되어 있습니다 . )

당신의 옵션

옵션 1) 좋은 "native_password"를 사용하여 인증하기 위해 "MySQL"을 다운 그레이드

이것이 모두가 여기에서 제안하는 것입니다 (예 : 위의 답변 ). 당신 은 인증에 대한 오래된 방법을 사용하여 괜찮다고 mysql말하는 쿼리를 시작 하고 실행합니다 .rootnative_password

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

좋은 점은 인생이 단순해질 것이며 여전히 아무런 문제 없이 Sequel Pro와 같은 오래된 도구를 사용할 수 있다는 것 입니다. 그러나 문제는 당신이 사용할 수있는보다 안전한 (그리고 시원하고 읽을 수있는) 것들을 이용하지 않는다는 것입니다.

옵션 2) "Node"패키지를 MySQL Connecter X DevAPI로 교체

MySQL X DevAPI for Nodehttp://dev.mysql.com 공식 사용자가 제공하는 Node의 Mysqljs 패키지를 대체합니다 .

caching_sha2_password인증을 지원하는 매력처럼 작동 합니다. ( X 프로토콜 통신에 포트 33060를 사용해야 합니다.)

나쁜 점은 mysql모든 사람들이 익숙하고 의존하는 오래된 패키지를 남겼다는 것입니다 .

좋은 점은 앱이 더 안전 해졌으며 오랜 친구들이 제공하지 않은 새로운 것들을 활용할 수 있다는 것입니다. X DevAPI튜토리얼을 확인하면 유용한 새로운 섹시한 기능이 많이 있음을 알 수 있습니다. 기술 업그레이드와 함께 제공되는 학습 곡선의 가격 만 지불하면됩니다. :)

추신. 불행하게도,이 XDevAPI 패키지는 타입 정의 (TypeScript가 이해할 수없는)를 아직 가지고 있지 않으므로 typescript 를 사용하면 문제가 발생합니다. 나는 .d.ts 사용하지 생성하기 위해 노력 dts-gen하고 dtsmake있지만 성공. 따라서 명심하십시오.

건배!


3
1 년 된 질문에 대한 자세한 답변을 게시 해 주셔서 감사합니다. :]
Daksh Gargas 2016

3
좋은, 실제로 당신에게 그것을 지시하는 대신 mysql_native_password를 설명하는 대답
wizloc

1
예, 한 번만 올바른 설명입니다. 아이 딘 잘 지내요. 앱 연결이 포트 3306을 MySQL로 자동 구성하지 않은 방법. 우리는 MySQL과 MariaDB를 3306에서 멀어지게하는 데 어려움을 겪고 있습니다.
Trunk

: 오라클 플러그인의주의, 당신은 큰 처벌 얻을 수 있습니다 theregister.co.uk/2019/10/04/oracle_virtualbox_merula
주하 Untinen

이것은 더 많은 찬사를받을 가치가있는 훌륭한 답변입니다!
June Wenston

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_passwordMySQL은 8.0에서 소개되어 있지만 Node.js를 버전은 아직 구현되지 않았습니다. 당신이 볼 수있는 이 풀 요청 하고 이 문제에 대한 자세한 내용입니다. 아마 수정이 곧 올 것이다!


매력처럼 작동합니다. 어떤 구호!
모자

무슨 @localhost를 추가하고 단지 '루트'의 차이
filemonczyk

쿼리가 작동합니다. 그러나 여전히 노드는 MySQL 서버에 연결할 수 없습니다. 어떤 생각? 오류 { "code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 : YES)", "sqlState": "28000" , "치명적인": true}
Sanjay Pradeep

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 감사합니다. 매우 도움이됩니다.
Sky

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/…
Devin

12

이 오류가 발생했지만 여전히 MySQL버전 8을 사용하려면을 사용하여 데이터베이스를 만들 때 MySQL 서버에 레거시 인증 플러그인을 사용하도록 지시하면됩니다 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에서
주하 Untinen

전체 스택 추적은 다음 과 같습니다. pastebin.com/SzayQzdhdocker-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로 만든 컨테이너)와 볼륨 (~ / Database / ORM_Test)을 제거한 다음 'docker-compose up'을 다시 실행하십시오. 그렇지 않으면 'command'의 변경 사항이 적용되지 않습니다. 그것은 내 경우에 도움이되었습니다.
Vitalii Ivanov

11

MySQL의 최신 도커 컨테이너

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

ALTER USER ... 명령 행이 작동하지 않고 Windows 10을 사용중인 경우 다음 단계를 수행하십시오.

1) Windows 검색 창에 MySQL을 입력하십시오.

2) MySQL Windows Installer 열기-커뮤니티

3) "MySQL 서버"를 찾아 재구성을 클릭하십시오. 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는 인증 방법을 다운 그레이드하기위한 첫 번째 선택이 아닌 이유를 광범위하게 설명 합니다.

이를 통해 Aidin의 대답 이 받아 들여 져야 할 것입니다. 인증 방법을 다운 그레이드하는 대신 서버 버전과 일치 하는 커넥터 를 사용하십시오.


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

3

서버에 MYSQL이 있고 다른 서버에 nodejs 응용 프로그램이 있습니다.

MYSQL Workbench에서 다음 쿼리 실행

'비밀번호'로 mysql_native_password로 식별 된 대체 사용자 'root'@ '%'


2

Windows 10 mysql에 설치된 기존 mysql 8.0 설치의 경우

(1) 설치 프로그램 시작

(2) QuickAction (MySQL Server의 왼쪽)에서 "재구성"을 클릭 한 다음

(3) 도착할 때까지 다음 2 개의 화면을 진행하려면 다음을 클릭하십시오.

(4) "인증 방법"에서 "레거시 인증 방법 사용 (MySQL 5.x 호환성 유지")을 선택하십시오.

(5) 설치가 완료 될 때까지 계속 클릭


2

MySQL 8+에서는 새로운 기본 인증이 caching_sha2_password대신에 사용 mysql_native_password됩니다. 새롭고보다 안전한 인증 방법은 mysql아직 네이티브 패키지에서 지원되지 않지만, @mysql/xdevapiOracle이 공식적으로 지원하고 유지 관리 하는 패키지를 대신 사용해야합니다 .

새 패키지를 설치하려면 다음을 실행하십시오.

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에서 admin으로 시도하십시오. cmd에서 MySQL 서버 bin 폴더의 경로를 설정하십시오.

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

그런 다음 명령을 실행하십시오.

mysql_upgrade --force -uroot -p

서버와 시스템 테이블을 업데이트해야합니다.

그런 다음 워크 벤치의 쿼리에서 아래 명령을 성공적으로 실행할 수 있어야합니다.

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

그런 다음 다음 명령을 실행해야합니다.

flush privileges;

이 모든 단계 후에 MySQL 데이터베이스에 성공적으로 연결할 수 있어야합니다. 도움이 되었기를 바랍니다...


0

MySQL Server Installer를 실행하고 내 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 변수를 읽지 않습니다.


0

다운 그레이드는 다음과 같은 좋은 옵션이 아닐 수 있습니다.

  1. 이유를 위해 업그레이드되었습니다 (더 나은 인증을 제공하기 위해).
  2. 그러한 변경을 수행 할 권한이 충분하지 않을 수 있습니다.

mysql2대신 패키지를 사용할 수 있습니다 mysql. 주로 mysqljs와 호환되는 API입니다. 또한 지원을 약속합니다.

다음과 같이 사용하십시오. const mysql = require('mysql2/promise')

https://www.npmjs.com/package/mysql2에서 자세한 내용을 확인할 수 있습니다 mysql2.

도움이 되길 바랍니다. :)


0

당신은 등 ORM, 빌더를 생략하고 사용하여 DB / SQL 관리를 단순화 할 수 있습니다 sqlersqler-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과 연결하고 MySQL 창 (제어판-관리 도구-서비스) 및 db.js (데이터베이스를 담당하는) 폴더에서 서비스를 중지하여 해결합니다. 비밀번호를 비워 두십시오 (여기에서 볼 수 있음).

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

직면 한 문제에 대한 답변으로 직면 한 문제를 추가하지 마십시오
Aloy A Sen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.