MetricSign
Start free
High severityauthentication

MySQL Error:
1698

What does this error mean?

MySQL error 1698 (ER_ACCESS_DENIED_NO_PASSWORD_ERROR) treedt op wanneer een client via TCP/IP probeert in te loggen op een account dat is geconfigureerd met het auth_socket (of unix_socket) authenticatie-plugin. Dit plugin staat alleen lokale Unix-socket verbindingen toe waarbij de OS-gebruikersnaam overeenkomt met het MySQL-account. In een data-pipeline context betekent dit dat elke externe tool — Azure Data Factory via de MySQL connector, dbt over TCP, Power BI Gateway, of een Python-script met mysql-connector — wordt geweigerd met 'Access denied for user root@localhost'. De engineer ziet een onmiddellijke connection failure zonder retry-mogelijkheid, omdat het een authenticatie-mismatch is en geen tijdelijke fout.

Common causes

  • 1Ubuntu/Debian MySQL-packages (inclusief MariaDB) configureren het root-account standaard met auth_socket — dit is OS-level beleid, geen expliciete keuze van de DBA
  • 2De ADF linked service, dbt profile, of Power BI Gateway connectie gebruikt het root-account met een wachtwoord over TCP/IP, terwijl auth_socket alleen Unix-socket accepteert
  • 3Na een MySQL upgrade van 5.7 naar 8.0 op Ubuntu wordt auth_socket opnieuw als default ingesteld, waardoor eerder werkende TCP-verbindingen breken
  • 4Een Docker-container of remote host probeert root@localhost te bereiken — maar socket auth werkt alleen voor processen op dezelfde machine met de juiste OS-user
  • 5Het MySQL-account heeft geen wachtwoord-hash opgeslagen (authentication_string is leeg in mysql.user), waardoor zelfs een handmatige wachtwoord-login onmogelijk is
  • 6Een Ansible/Terraform provisioning script maakt het root-account aan zonder expliciet mysql_native_password of caching_sha2_password op te geven, waardoor de distributie-default (auth_socket) geldt

How to fix it

  1. 1Step 1: Verifieer welk auth-plugin actief is op het account: `SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';` — als plugin = 'auth_socket' of 'unix_socket', dan is dat de oorzaak.
  2. 2Step 2: (Optie A — root switchen) Wijzig het root-account naar wachtwoord-authenticatie: `ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'StrongP@ss2026!'; FLUSH PRIVILEGES;` — gebruik caching_sha2_password voor MySQL 8.0+, of mysql_native_password als je client dat nog niet ondersteunt.
  3. 3Step 3: (Optie B — aanbevolen) Maak een dedicated service-account met minimale rechten: `CREATE USER 'svc_pipeline'@'%' IDENTIFIED WITH caching_sha2_password BY 'StrongP@ss2026!'; GRANT SELECT, SHOW VIEW ON target_db.* TO 'svc_pipeline'@'%'; FLUSH PRIVILEGES;`
  4. 4Step 4: Test de nieuwe credentials lokaal met een TCP-verbinding om socket-auth uit te sluiten: `mysql -u svc_pipeline -p -h 127.0.0.1 -P 3306 target_db` — gebruik expliciet 127.0.0.1, niet 'localhost', want localhost kan naar de Unix-socket resolven.
  5. 5Step 5: Update de ADF linked service (Azure Portal → Data Factory → Manage → Linked Services → jouw MySQL connectie) met de nieuwe gebruikersnaam en wachtwoord. Test de verbinding via 'Test connection'.
  6. 6Step 6: Voor dbt: pas `~/.dbt/profiles.yml` aan met de nieuwe user, en voeg `host: 127.0.0.1` toe in plaats van `localhost` om TCP af te dwingen.
  7. 7Step 7: Valideer end-to-end door een pipeline-run of `dbt debug` uit te voeren en controleer dat de connectie slaagt zonder 1698.

Example log output

ERROR 1698 (28000): Access denied for user 'root'@'localhost'
mysql-connector-python: mysql.connector.errors.ProgrammingError: 1698 (28000): Access denied for user 'root'@'localhost'
[ADF] Activity 'Copy MySQL orders' failed: ErrorCode=UserErrorFailedToConnectToMySql, Message='Access denied for user root@localhost (using password: YES)'

Frequently asked questions

Why does 'mysql -u root' work in the terminal but my app gets error 1698?

Wanneer je `mysql -u root` typt zonder -h flag, gebruikt de client de Unix-socket (/var/run/mysqld/mysqld.sock). Het auth_socket plugin controleert of je OS-user 'root' is — en dat klopt als je sudo gebruikt. Je applicatie verbindt via TCP (host 127.0.0.1 of localhost met TCP), en auth_socket weigert elke niet-socket verbinding, ongeacht het wachtwoord.

Is het veilig om root te switchen naar mysql_native_password?

Het werkt, maar het is beter om root op auth_socket te laten staan en een apart service-account aan te maken. Root met een wachtwoord over TCP vergroot het aanvalsoppervlak. Gebruik een account met alleen SELECT en SHOW VIEW rechten op de databases die je pipeline nodig heeft.

Ik krijg nog steeds error 1698 na ALTER USER — wat gaat er mis?

Controleer of je FLUSH PRIVILEGES hebt uitgevoerd na de ALTER USER. Check ook of er meerdere root-entries zijn in mysql.user (bijv. root@localhost en root@127.0.0.1) — elke entry heeft zijn eigen plugin-instelling. Verifieer met: `SELECT user, host, plugin FROM mysql.user WHERE user = 'root';`

Kan ik error 1698 oplossen zonder sudo/root toegang tot de server?

Nee — je hebt OS-level toegang nodig om via de socket in te loggen als root (of een ander account met GRANT-rechten). Zonder server-toegang moet je de DBA vragen om een service-account aan te maken. Er is geen client-side workaround voor auth_socket.

Source · dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html

Other authentication errors