High severityauthentication
MySQL Error:
1698, auth_socket Plugin
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
- 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.
- 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.
- 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;`
- 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.
- 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'.
- 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.
- 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)'