89

I have actually lost my root password and I need to change it. I follow these steps :

  • Step # 1: Stop the MySQL server process.

    Step # 2: Start the MySQL (mysqld) server/daemon process with the --skip-grant-tables option so that it will not prompt for a password.

    Step # 3: Connect to the MySQL server as the root user.

that we can found on these website : https://www.howtoforge.com/setting-changing-resetting-mysql-root-passwords#recover-mysql-root-password

mysql> use mysql;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD("TOOR");
mysql> flush privileges;
mysql> quit

First error, so I tried :

mysql> use mysql;
mysql> update user set password=PASSWORD("TOOR") where User='root';
mysql> flush privileges;
mysql> quit

Always the same error said :

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '("TOO
R") WHERE User='root'' at line 1

How can I resolve this?

Mangue Sutcliff
  • 1,429
  • 1
  • 12
  • 16

7 Answers7

179

as here says:

This function was removed in MySQL 8.0.11

1.if you in skip-grant-tables mode
in mysqld_safe:

UPDATE mysql.user SET authentication_string=null WHERE User='root';
FLUSH PRIVILEGES;
exit;

and then, in terminal:

mysql -u root

in mysql:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

2.not in skip-grant-tables mode
just in mysql:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Jack Chern
  • 1,914
  • 1
  • 7
  • 4
  • 2
    For in SKIP-GRANT-TABLES mode - sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables . Works for 8.0.1 – Piash Sarker Oct 04 '18 at 07:59
  • 1
    I got `ERROR 1146 (42S02): Table 'mysql.role_edges' doesn't exist` so I had to do a `mysql_upgrade -u root` after I set the root password to null for this to work. – Gregory R. Sudderth Feb 11 '19 at 11:12
  • 10
    I had to use `mysql_native_password` instead of `caching_sha2_password` for this to work: `ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpasswd';`. Not sure why, though. – dvlcube Nov 18 '19 at 18:53
  • @dvlcube this work for me in Mysql 8.0.21-0ubuntu0.20.04.4 – ebuzz168 Oct 07 '20 at 03:51
  • 1
    I had trouble with the order of the commands but in ubuntu 20 worked for me: `sudo service mysql stop` `sudo mysqld_safe --skip-grant-tables &` then opening mysql console with `mysql -u root` `UPDATE mysql.user SET authentication_string=null WHERE User='root'; flush_privileges; ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd'; exit;` `ps -fea | grep mysqld` `sudo kill -9 [pid from previous command]` then finally `sudo service mysql stop` – Ulises Layera Apr 18 '21 at 18:04
  • @Jack Chern What a great person you are, I spent a day solving this problem and there is no article I haven't read. I reset the server many times with no results. Thank you so much. – umutyerebakmaz Oct 27 '21 at 12:09
  • God bless you! Finally, I changed the root password. – Aleksey Dz May 18 '22 at 05:37
  • This gives me the same syntax error that the OP has – Native Coder May 21 '23 at 20:03
71

Jus login to mysql with sudo

sudo mysql

Then

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
exit;

Test it

mysql -u root -p
Hidde
  • 11,493
  • 8
  • 43
  • 68
Mahdi Raad
  • 729
  • 5
  • 3
17

Try this:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPasswd';
William Desportes
  • 1,412
  • 1
  • 22
  • 31
Jitesh Middha
  • 389
  • 3
  • 10
  • 2
    This statement is not available before adding skip-grant-tables and after that user gets: ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement – richardwhitney Sep 03 '20 at 21:41
3

If you are on Windows you can try following steps

Reset MySQL 8.0 root Password in Windows

  1. Stop the MySQL 8.0service from services
  2. Go to path C:\Program Files\MySQL\MySQL Server 8.0\bin and open cmd
  3. Run mysqld --console --skip-grant-tables --shared-memory
  4. Open new cmd in the same path
  5. Run following commands
  6. mysql -u root
  7. select authentication_string,host from mysql.user where user='root';
  8. UPDATE mysql.user SET authentication_string='' WHERE user='root';
  9. Now close both the cmd.
  10. Try to start the MySQL 8.0 service.
  11. Connect using username as root & password as blank.
  12. Change the password from the user management.

Found this at https://gist.github.com/pishangujeniya/0f839d11a7e692dadc49821c274a2394

Pishang Ujeniya
  • 176
  • 5
  • 13
1

Step 1: Create a new file in your root directory( e.g C:) Step 2: Write this ALTER USER 'root'@'localhost' IDENTIFIED BY 'abc' and save it Step 3: If your Mysql service is already running, please stop this and open your CMD Step 4: Go to your Mysql installation directory (e.g C:\Program Files\MySQL\MySQL Server 8.0\bin) and type this command

mysql --init-file=C:/init.sql

Step 5: Execute this command and you are good to go :)

Refer this video for more clarification : https://www.youtube.com/watch?v=LsdV-7dFOhk

Ashit
  • 59
  • 6
1

I am using 8.0.23 but had multiple issues. Here are the issues and solutions. I followed the mysql docs and was able to do the reset, though I had isues. I have provided my solutions and a sample reset script.

Issues

  1. following steps outlined by others had various failures
  2. user running daemon is mysql and I cannot su to mysql id
  3. getting error can't create lock file /var/run/mysqld/mysqlx.sock.lock , mysqld folder is getting deleted by the mysql service.
  4. had to kill -9 mysql process after running, very ugly

Solutions

  1. use steps from https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html
  2. use --user=mysql when running mysql commands
  3. Create folder /var/run/mysqld and chown for mysql:mysql before runing comamnds
  4. use mysqladmin shutdown to stop sql after starting it for reset

In the script, I will reset root to New%Password

# create password reset file
cat << EOF >/tmp/deleteme
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'New%Password';
EOF
# create /var/run/mysqld
mkdir /var/run/mysqld
chown mysql:mysql /var/run/mysqld
# start mysqld and run the command
mysqld --init-file=/tmp/deleteme --user=mysql &
# wait for sql to start
while [ ! -f /var/run/mysqld/mysqlx.sock.lock ]; do sleep 1; done
sleep 3
# stop sql
mysqladmin -u root -pNew%Password shutdown
while [ -f /var/run/mysqld/mysqlx.sock.lock ]; do sleep 1; done
#clean up temp file
rm /tmp/deleteme
Greg Long
  • 51
  • 5
-7

Using SQLYog you can execute commands

  • User Creation

    CREATE USER 'tester'@'localhost' IDENTIFIED BY 'Pass123#d'
    
  • Authorization

    GRANT ALL PRIVILEGES ON sakila.* TO 'tester'@'localhost'
    
  • Changing Password in MySQL 8.0

    ALTER USER 'tester'@'localhost' IDENTIFIED BY 'Pass123#d';
    

    or if u know the authentication_string directly set it to update

    UPDATE mysql.user 
    SET authentication_string='*F9B62579F38BE95639ACB009D79427F2D617158F'  
    WHERE USER='root'
    
  • Changing password in lower versions of mysql

    GRANT USAGE ON *.\* TO 'tester'@'localhost' IDENTIFIED BY 'Pass123#d'
    SET PASSWORD FOR 'tester'@'localhost' = PASSWORD('Pass123#d');
    
Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197