由於筆者只測試過Ubuntu 16.04.4、Ubuntu 19.04和Debian 9,此方法不確定在其他版本下適用。
本文章介紹的方法同樣適用於這樣的錯誤信息。
➜ ~ mysql -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
## 查看默認密碼
某些發行版本,使用包管理器安裝MySQL后,查看這個文件可以看到安裝后的默認密碼`/etc/mysql/debian.cnf`,這個密碼是屬於`debian-sys-maint`的,而非`root`。
即使在這里你可能可以使用root用戶登錄,因為root用戶默認登錄方式是使用socket連接,而不驗證密碼。
## 修改root密碼
如果需要修改先使用`debian-sys-maint`登錄數據庫,完成以下操作
1. `select user, plugin from mysql.user;`查看默認的連接方式。
2. 如果是`auth_socket`(MySQL)的連接方式,則繼續下面得步驟,如果是`unix_socket`(MariaDB),則轉到**MariaDB的處理方法**。
3. `update mysql.user set authentication_string=password('root'), plugin = 'mysql_native_password' where user = 'root';`使用這一行明令將root密碼修改為root。
4. `flush privileges;`應用權限。
5. 退出並重啟MySQL。
## MariaDB的處理方法
上面的方法僅針對MySQL測試。
MariaDB的root默認連接方式是`unix_socket`(MariaDB)
在Debian中軟件包mysql已經替換成了mariadb了。在安裝后`/etc/mysql/debian.cnf`預設了root用戶使用socket的連接方式,所以不輸入密碼也可在命令行直接使用mysql命令登錄。
要想使用密碼連接需要修改連接方式
1. 輸入mysql進入客戶端,若無法進入則跳過。
2. 輸入`select user, plugin from mysql.user`查看默認的連接方式。
3. 如果是`unix_socket`(MariaDB),則繼續下面得步驟。
4. 退出mysql,並kill掉進程。
5. 打開`mysqld_safe --skip-grant-tables`放入后台,並進入`mysql`。
6. `update mysql.user set authentication_string = password('root'), plugin = 'mysql_native_password' where user = 'root';`。
7. `flush privileges;`應用權限。
8. 修改`/etc/mysql/mariadb.conf.d/50-server.cnf`中的`bind-address`為允許的網絡地址,若為整個網絡則填入`0.0.0.0`或注釋掉
9. 重啟服務
10. 退出並重啟MySQL。
## 為MySQL添加遠程訪問
1. 修改`/etc/mysql/mysql.conf.d/mysqld.cnf``/etc/mysql/my.cnf`中的`bind-address`為允許的網絡地址,若為整個網絡則填入`0.0.0.0`或注釋掉
2. 重啟服務
3. 啟動mysql,輸入`use mysql;`進入mysql表
4. 修改地址`grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;`允許root用戶遠程使用root為密碼連接。
5. 使修改生效`flush privileges;`
6. 退出MySQL。