Tools: How to Reset Your MySQL Root Password on Ubuntu (When Nothing Works) - Complete Guide

Tools: How to Reset Your MySQL Root Password on Ubuntu (When Nothing Works) - Complete Guide

Step 1: Check if your Laravel .env is the problem first

Step 2: Try the classic Ubuntu trick

Step 3: Reset the password using an init file

Step 4: Create your database if it does not exist yet

Two confusing errors that tripped me up

"sudo mysql" stops working

Just typing "mysql" fails

Step 5: Stop typing your password every time

A safer setup for real projects

Quick recap I was working on a Laravel task and got this error in my logs: My .env file had DB_PASSWORD=password, but MySQL was rejecting it. I tried the usual tricks and ran into a wall. Here is what was happening, what fixed it, and a few small things that confused me along the way. If you are a junior dev and any of this sounds familiar, this post is for you. Before anything wild, open your .env file and check these lines: If your password is blank or wrong, just fix it and run: Done. If the password really is what you think it is and MySQL still rejects it, keep reading. On a lot of Ubuntu installs, the MySQL root user does not use a password at all. It uses something called socket authentication, which means you log in by being a Linux superuser. So this usually works: If that opens a MySQL prompt, great. You can set a real password from inside: But in my case I got this: That means root already had a password set, just not one I knew. Time for the real recovery. The safest way to reset a forgotten root password is to start MySQL with a special init file. The init file runs SQL the moment MySQL boots, so you can change the password without ever logging in. Here is a small bash script that does the whole thing. Save it as mysql-reset.sh: It will ask for your sudo password. After it finishes, root has the password you set. Mine is now password, which matches my Laravel .env. You will see a warning that goes like this: That is just a warning, not an error. Your command still ran. We will fix that warning in the last step. Now run your migrations: If your tables get created, you are back in business. After the reset I tried a couple of things that looked broken but were actually fine. If you see these, do not panic. This is correct now. We changed root from socket login to password login. So sudo mysql cannot just walk in anymore. You have to give the password: When you run mysql with no flags, it tries to log in using your Linux username with no password. There is no MySQL user with your Linux name, so it fails. This is normal. You need -u root -p. This was the nicest little win. You can put your client credentials in a config file and the mysql command will read it automatically. Lock down the permissions so other users on the machine cannot read it: No prompt, no flags, no warning. Quick test: You should see root@localhost. Using root for your app is fine on a learning machine, but on anything you care about, make a dedicated user with access to one database only: Then point your .env at that user. If the app password ever leaks, your other databases are still safe. Hope this saves someone an hour. Forgetting a database password feels scary, but the recovery is short once you know the steps. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Code Block

Copy

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=my_app DB_USERNAME=root DB_PASSWORD=password DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=my_app DB_USERNAME=root DB_PASSWORD=password DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=my_app DB_USERNAME=root DB_PASSWORD=password php artisan config:clear php artisan config:clear php artisan config:clear ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES; ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) #!/bin/bash set -e NEW_PASS='password' INIT_FILE=$(mktemp /tmp/mysql-init-XXXXXX.sql) cat > "$INIT_FILE" <<SQL ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${NEW_PASS}'; FLUSH PRIVILEGES; SQL sudo chown mysql:mysql "$INIT_FILE" sudo chmod 600 "$INIT_FILE" echo "Stopping mysql..." sudo systemctl stop mysql echo "Starting mysql with the init file..." sudo mysqld --user=mysql --init-file="$INIT_FILE" --daemonize sleep 3 echo "Stopping the temporary mysqld..." sudo pkill -f "mysqld --user=mysql --init-file=$INIT_FILE" || true sleep 2 echo "Starting mysql normally..." sudo systemctl start mysql sudo rm -f "$INIT_FILE" echo "Testing the new password..." mysql -u root -p"$NEW_PASS" -e "SELECT 'OK' AS status;" #!/bin/bash set -e NEW_PASS='password' INIT_FILE=$(mktemp /tmp/mysql-init-XXXXXX.sql) cat > "$INIT_FILE" <<SQL ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${NEW_PASS}'; FLUSH PRIVILEGES; SQL sudo chown mysql:mysql "$INIT_FILE" sudo chmod 600 "$INIT_FILE" echo "Stopping mysql..." sudo systemctl stop mysql echo "Starting mysql with the init file..." sudo mysqld --user=mysql --init-file="$INIT_FILE" --daemonize sleep 3 echo "Stopping the temporary mysqld..." sudo pkill -f "mysqld --user=mysql --init-file=$INIT_FILE" || true sleep 2 echo "Starting mysql normally..." sudo systemctl start mysql sudo rm -f "$INIT_FILE" echo "Testing the new password..." mysql -u root -p"$NEW_PASS" -e "SELECT 'OK' AS status;" #!/bin/bash set -e NEW_PASS='password' INIT_FILE=$(mktemp /tmp/mysql-init-XXXXXX.sql) cat > "$INIT_FILE" <<SQL ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${NEW_PASS}'; FLUSH PRIVILEGES; SQL sudo chown mysql:mysql "$INIT_FILE" sudo chmod 600 "$INIT_FILE" echo "Stopping mysql..." sudo systemctl stop mysql echo "Starting mysql with the init file..." sudo mysqld --user=mysql --init-file="$INIT_FILE" --daemonize sleep 3 echo "Stopping the temporary mysqld..." sudo pkill -f "mysqld --user=mysql --init-file=$INIT_FILE" || true sleep 2 echo "Starting mysql normally..." sudo systemctl start mysql sudo rm -f "$INIT_FILE" echo "Testing the new password..." mysql -u root -p"$NEW_PASS" -e "SELECT 'OK' AS status;" bash mysql-reset.sh bash mysql-reset.sh bash mysql-reset.sh mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS my_app;" mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS my_app;" mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS my_app;" mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. mysql: [Warning] Using a password on the command line interface can be insecure. php artisan migrate php artisan migrate php artisan migrate sudo mysql -e "ALTER USER 'root'@'localhost' ..." ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) sudo mysql -e "ALTER USER 'root'@'localhost' ..." ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) sudo mysql -e "ALTER USER 'root'@'localhost' ..." ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) mysql -u root -p mysql -u root -p mysql -u root -p mysql ERROR 1045 (28000): Access denied for user 'your_username'@'localhost' (using password: NO) mysql ERROR 1045 (28000): Access denied for user 'your_username'@'localhost' (using password: NO) mysql ERROR 1045 (28000): Access denied for user 'your_username'@'localhost' (using password: NO) [client] user=root password=password [client] user=root password=password [client] user=root password=password chmod 600 ~/.my.cnf chmod 600 ~/.my.cnf chmod 600 ~/.my.cnf mysql -e "SELECT CURRENT_USER();" mysql -e "SELECT CURRENT_USER();" mysql -e "SELECT CURRENT_USER();" CREATE DATABASE IF NOT EXISTS my_app; CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'a_real_password'; GRANT ALL PRIVILEGES ON my_app.* TO 'my_app_user'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE IF NOT EXISTS my_app; CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'a_real_password'; GRANT ALL PRIVILEGES ON my_app.* TO 'my_app_user'@'localhost'; FLUSH PRIVILEGES; CREATE DATABASE IF NOT EXISTS my_app; CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'a_real_password'; GRANT ALL PRIVILEGES ON my_app.* TO 'my_app_user'@'localhost'; FLUSH PRIVILEGES; - Check the .env first. The simplest fix is usually the right one. - Try sudo mysql. If it works, you are using socket auth and you can set a password right there. - If root already has a password you do not know, reset it with an init file. Do not edit mysql.user by hand and do not run with --skip-grant-tables if you can avoid it. - After the reset, remember that sudo mysql will not work anymore. Use mysql -u root -p. - Drop a ~/.my.cnf with mode 600 so you can just type mysql and get in. - For real projects, do not use root. Make an app user with access to one database.