MySQL 8.0 - İstemci, sunucu tarafından istenen kimlik doğrulama protokolünü desteklemez; MySQL istemcisini yükseltmeyi düşünün


273

Nedense sunucu ile basit bir bağlantı kuramıyorum. En yeni MySQL Community 8.0 veritabanını varsayılan ayarlarla Node.JS ile birlikte yüklerim.

Bu benim node.js kodum

    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!");
    });

Komut İsteminde bulunan hata aşağıdadır:

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 gibi bazı şeyleri okudum.

Ama yine de sorunumu nasıl çözeceğimden emin değilim. Herhangi bir yardım takdir edilecektir: D


2
SQLTools uzantısını kullanan tüm VS Code kullanıcıları, özellikle sorunlu bilgisayarınızda bir mysql örneğini yeni sürüme
geçirdiyseniz

Yanıtlar:


678

MYSQL Workbench içinde aşağıdaki sorguyu yürütün

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

Nerede rootsizin kullanıcı olarak localhostsizin URL olarak ve passwordşifreniz olarak

Ardından ayrıcalıkları yenilemek için bu sorguyu çalıştırın:

flush privileges;

Bunu yaptıktan sonra düğümü kullanarak bağlanmayı deneyin.

Bu işe yaramazsa, @'localhost'parçası olmadan deneyin .


47
Bu benim için çalıştı. flush privileges;Sonra unutmayın .
Ali Hesari

12
@Localhost olmadan benim için çalıştı (sanırım bu kök kullanıcı için değildi çünkü olabilir)
NicolasZ

10
biliyorsanız 'şifre' yerine root şifrenizi girin
Vedha Peri

11
Çalışıyor ...... ama neden daha önce çalışmadı ve neden bu sorgudan sonra çalıştı hala bir soru.
saksham

9
Merhaba @GuilhermeMatuella Bunun nedeni caching_sha2_passwordMySQL 8.0'da kullanılmaya başlanmıştır , ancak Node.js sürümü henüz uygulanmamıştır.
Daksh Gargas

107

Önce neler olduğunu netleştirelim.

MySQL 8, takılabilir kimlik doğrulama yöntemlerini destekler. Varsayılan olarak, bunlardan biri caching_sha2_passwordiyi eski mysql_native_password( kaynak ) yerine kullanılır . Birkaç el sıkışma ile bir kripto algoritması kullanmanın 24 yıldır var olan düz şifre geçişinden daha güvenli olduğu açıktır !

Şimdi, sorun mysqljsDüğümde (yüklediğiniz npm i mysqlve Düğüm kodunuzda kullandığınız paket ) henüz MySQL 8'in bu yeni varsayılan kimlik doğrulama yöntemini desteklemiyor. Sorun burada: https://github.com/mysqljs/mysql/issues/1507 ve Temmuz 2019 itibariyle 3 yıl sonra hala açık.

(UPDATE Haziran 2019: Bunu düzeltmek için şimdi mysqljs'de yeni bir PR var ! ) (UPDATE Şubat 2020: Görünüşe göre mysqljs 3 sürümünde gelmesi planlanıyor . )

Seçenekleriniz

Seçenek 1) Eski "native_password" kullanarak kimlik doğrulaması yapmak için "MySQL" değerini eski sürüme geçirin

Burada herkesin önerdiği şey budur (örneğin yukarıdaki en iyi yanıt ). Sadece almak mysqlve rooteski bir native_passwordkimlik doğrulama yöntemi kullanarak iyi olduğunu söyleyerek bir sorgu çalıştırın :

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

İyi olan şu ki, hayat basit olacak ve Sequel Pro gibi eski eski araçları sorunsuz bir şekilde kullanabilirsiniz . Ama sorun şu ki, daha güvenli (ve havalı, aşağıda okuyun) eşyalardan yararlanmıyorsunuz.

Seçenek 2) "Düğüm" paketini MySQL Connecter X DevAPI ile değiştirin

Düğüm için MySQL X DevAPI , http://dev.mysql.com resmi adamları tarafından sağlanan Düğümün Mysqljs paketinin yerine geçer .

caching_sha2_passwordKimlik doğrulamayı destekleyen bir cazibe gibi çalışır . (Sadece X Protokolü iletişim33060 için port kullandığınızdan emin olun .)

Kötü olan şu ki, eski mysqlpaketimizi bıraktınız , böylece herkes buna alışkın ve güveniyor.

İyi olan şey, uygulamanız artık daha güvenli ve iyi eski dostlarımızın sağlamadığı bir sürü yeni şeyden yararlanabilirsiniz! Sadece X DevAPI öğreticisine göz atın ve kullanışlı olabilecek bir ton yeni seksi özelliğe sahip olduğunu göreceksiniz. Sadece herhangi bir teknoloji yükseltmesi ile birlikte gelen bir öğrenme eğrisinin bedelini ödemeniz gerekir. :)

PS. Ne yazık ki, bu XDevAPI Paketinin henüz tür tanımı (TypeScript tarafından anlaşılabilir) yok, bu yüzden daktilo yazısındaysanız , sorunlarınız olacak. Ben .d.ts kullanarak üretmek için çalıştı dts-genve dtsmake, ancak hiçbir başarı. Bunu aklınızda bulundurun.

Şerefe!


3
Bir yıllık soru için ayrıntılı bir cevap gönderdiğiniz için teşekkür ederiz. :]
Daksh Gargas

3
güzel, sadece bunu söylemenizi yerine mysql_native_password'ü açıklayan bir cevap
wizloc

1
Evet, bir kez uygun bir açıklama. Aferin Aidin. Nasıl bağlantı uygulamaları bağlamak MySQL için 3306 bağlantı noktasını otomatik olarak yapılandırmadı. 3306'dan itibaren MySQL ve MariaDB'yi ödüllendirmede yeterince sorun yaşıyoruz.
Trunk

Oracle eklentilerine dikkat edin, büyük bir ceza alabilirsiniz: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha Untinen

Bu mükemmel bir cevap daha fazla oyu hak ediyor!
Haziran Wenston

82

Eski mysql_native_passwordeserleri kullanma :

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;

Bunun nedeni caching_sha2_password, MySQL 8.0'da kullanılmaya başlanmasıdır, ancak Node.js sürümü henüz uygulanmamıştır. Daha fazla bilgi için bu çekme isteğini ve bu sorunu görebilirsiniz . Muhtemelen bir düzeltme yakında gelecek!


Bir cazibe gibi çalışın. Ne rahatlama!
şapka

@localhost ve sadece 'root' ekleme arasındaki fark nedir
filemonczyk

Sorgu işleri. Ancak yine de düğüm MySQL sunucusuna bağlanamadı. Herhangi bir fikir? {"Code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "'root' @ 'localhost' kullanıcısı için erişim reddedildi (şifre: YES kullanılarak)", "sqlState": "28000" , "ölümcül": doğru}
Sanjay Pradeep

26

MySQL 8 için Tam Adımlar

MySQL'e bağlanın

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

Şifrenizi sıfırlayın

(Kullanmak your_new_passwordistediğiniz şifreyle değiştirin )

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

Ardından düğümü kullanarak bağlanmayı deneyin


@sky detaylar için yukarıdaki cevabımı gör.
Aidin

1
@Aidin Teşekkürler, çok faydalı.
Sky

17

Kabul edilen cevap doğru olmasına rağmen, yeni bir kullanıcı oluşturmayı ve sonra bu kullanıcıyı veritabanına erişmek için kullanmayı tercih ederim.

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
Birisi bu rotaya gitmek istiyorsa, bazı açıklamaları olan bir makale: digitalocean.com/community/tutorials/…
Devin

12

Bu hatayla karşılaştıysanız ancak yine de MySQLsürüm 8'i kullanmak istiyorsanız, MySQL Server'a veritabanını oluştururken eski kimlik doğrulama eklentisini kullanmasını söyleyerek bunu başarabilirsiniz Docker.

Yani composedosyanız şu şekilde görünecektir:

# 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

Bunu kullanıyorum commandama kullanırken hala desteklenmeyen bir kimlik doğrulama hata mesajı alıyorum mysqlnode.js içinde
Juha Untinen

Tam yığın izleme burada: pastebin.com/SzayQzdh ve docker-compose.yml : pastebin.com/7pUrWYDs Hatanın kendisi:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen

1
@JuhaUntinen, bir Docker kapsayıcısını (docker-compose tarafından oluşturulan kapsayıcı) ve birimi (~ / Database / ORM_Test) kaldırdığınızdan emin olun ve 'docker-compose up' komutunu tekrar çalıştırın. Aksi takdirde, 'komut'tan yapılan değişiklikler uygulanmaz. Benim durumumda yardımcı oldu.
Vitalii Ivanov

11

Mysql Son yükleme istasyonu konteynerinde

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

ALTER USER ... komut satırı sizin için uygun değilse VE Windows 10 kullanıyorsanız, aşağıdaki adımları izlemeyi deneyin:

1) Windows arama çubuğuna MySQL yazın

2) MySQL Windows Installer'ı açın - Topluluk

3) "MySQL sunucusu" nu bulun ve Yeniden Yapılandır'ı tıklayın. Aşama 3

4) "Kimlik Doğrulama Yöntemi" aşamasına ulaşıncaya kadar "İleri" yi tıklayın.

5) "Kimlik Doğrulama Yöntemi" aşamasında ikinci seçenek olan "Eski Kimlik Doğrulama Yöntemini Kullan" seçeneğini işaretleyin Adım 5

6) Sonra Windows yükleyicisi tarafından sonuna kadar verilen adımları izleyin

7) İşiniz bittiğinde, Windows arama çubuğundan "Hizmetler" e gidin, "başlat" MySql81 "e tıklayın.

Şimdi tekrar deneyin, MySQL ve Node.js arasındaki bağlantı işe yarayacak!


4

MySQL 8.0 sürümünde, caching_sha2_passwordvarsayılan kimlik doğrulama eklentisimysql_native_password. ...

Bu sorudaki cevapların çoğu, kimlik doğrulama mekanizmasına olandan sürümüne bir düşüşe neden caching_sha2_passwordolur mysql_native_password. Güvenlik açısından bu oldukça hayal kırıklığı yaratıyor.

Bu belge kapsamlı bir şekilde tartışıyor caching_sha2_passwordve elbette kimlik doğrulama yöntemini eski sürüme geçirmenin neden ilk seçenek OLMAMASI gerektiği.

Bununla, Aidin'in cevabının kabul edilen cevap olması gerektiğine inanıyorum . Kimlik doğrulama yöntemini düşürmek yerine, bunun yerine sunucunun sürümüyle eşleşen bir bağlayıcı kullanın.


3

Orijinal belgeleri burada bulabilirsiniz: 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);
  });

Daha karmaşık görünüyor, ama sanırım resmi kılavuzu takip etmeliyiz! b
Juneyoung Oh

3

Sunucuda MYSQL ve başka bir sunucuda nodejs uygulaması var

MYSQL Workbench içinde aşağıdaki sorguyu yürütün

ALTER USER 'root' @ '%' mysql_native_password İLE 'şifre' İLE TANIMLANDI


2

Windows 10 mysql'ye varolan mysql 8.0 yüklemeleri için,

(1) yükleyiciyi başlat,

(2) QuickAction (MySQL Server'ın solunda) altında "Yeniden Yapılandır" ı tıklayın, ardından

(3) gelene kadar sonraki 2 ekranda ilerlemek için ileri'yi tıklayın.

(4) "Kimlik Doğrulama Yöntemi" bölümünde "Eski Kimlik Doğrulama Yöntemini Kullan (MySQL 5.x uyumluluğunu koru" seçeneğini belirleyin

(5) Kurulum tamamlanana kadar tıklamaya devam edin


2

MySQL 8+ ile caching_sha2_passwordbunun yerine yeni varsayılan kimlik doğrulaması yapılır mysql_native_password. Yeni ve daha güvenli kimlik doğrulama yöntemi mysqlhenüz yerel paket tarafından desteklenmiyor , ancak @mysql/xdevapiOracle tarafından resmi olarak desteklenen ve sürdürülen paketi kullanmayı düşünmelisiniz .

Yeni paketi yüklemek için şunu çalıştırın:

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

Veritabanına bağlanmak ve bazı DEĞERLER eklemek için:

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()
    });

Resmi paket belgelerini burada bulabilirsiniz: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/


2

Docker kullanıyorsanız, benim için çalıştı!

içinde docker-compose.ymlaşağıdaki satırları ekleyin:

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

bundan sonra down, konteyner ve uptekrar.


1

Yukarıdaki cevaplara ek olarak; Aşağıdaki komutu uyguladıktan sonra

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

Şu şekilde bir hata alırsanız:

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

Sonra cmd'yi yönetici olarak deneyin; cmd'deki MySQL sunucu bin klasörünün yolunu ayarlama

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

ve sonra komutu çalıştırın:

mysql_upgrade --force -uroot -p

Bu, sunucuyu ve sistem tablolarını güncellemelidir.

Daha sonra aşağıdaki komutları Workbench'te bir Sorgu'da başarıyla çalıştırabilmeniz gerekir:

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

sonra aşağıdaki komutu çalıştırmayı unutmayın:

flush privileges;

Tüm bu adımlardan sonra MySQL veritabanınıza başarıyla bağlanabilmeniz gerekir. Bu yardımcı olur umarım...


0

Sadece MySQL Server Installer'ı çalıştırın ve My SQL Server'ı yeniden yapılandırın ... Bu benim için çalıştı.


0

MySQL kullanıcınız için ayrıcalıkları ve kullanıcı adını / şifreyi kontrol edin.

Hataları yakalamak için geçersiz kılınan _delegateErroryöntemi kullanmak her zaman yararlıdır . Sizin durumunuzda bu şöyle görünmelidir:

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!");
});

Bu yapı, ölümcül hataları izlemenize yardımcı olacaktır.


0

Çok sayıda şeyi denedikten sonra bunu anladım. Sonunda require('dotenv').config()benim için ne yaptı benim .sequelizercdosya eklemek oldu . Görünüşe göre sequelize-cli env değişkenlerini okumuyor.


0

Aşağı Notlandırma iyi bir seçenek olmayabilir:

  1. Onun bir nedenle yükseltilmiş (daha iyi kimlik doğrulaması sağlamak için).
  2. Bu tür değişiklikleri yapmak için yeterli izniniz olmayabilir.

mysql2Paketi yerine kullanabilirsiniz mysql. Mysqljs ile çoğunlukla API uyumlu. Ayrıca, destek vaat ediyor.

Gibi kullanın: const mysql = require('mysql2/promise')

mysql2Burada daha fazla bilgi bulabilirsiniz: https://www.npmjs.com/package/mysql2

Umarım yardımcı olur. :)


0

Sen vb ORM, inşaatçılar, atlayıp kullanarak DB / SQL yönetimini kolaylaştırabilirsiniz sqlerve 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 ile aynı problemim var ve MySQL ile bağlantı kurmak ve MySQL (kontrol paneli - Yönetimsel Araçlar - Hizmetler) için pencerelerde ve db.js (veritabanından sorumlu olan) klasöründe hizmetleri durdurmak için XAMPP kullanarak çözüyorum şifreyi boş bırakın (burada görebilirsiniz :)

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

lütfen karşılaştığınız soruna cevap olarak karşılaştığınız bir sorunu eklemeyin
Aloy A Sen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.