引子

最近想在自己玩客云中做一个网页版本的日记记录,能实现数据保存和随机读取推荐的功能,这就打算使用MySQL数据库来保存。
实现的方案是:VUE+MySQL+PHP等,这样就基本能实现数据保存和读取了。
同时也能为以后各种数据保存跟远程读取打下基础。
而且现在也能实现了内网穿透,基本上把前后端打通。

开始实验了很多次,然而,由于这个CPU使用的是ARM架构,所以基本都会报错,最后是使用了 mariadb 来实现相应功能

安装mysql

使用如下命令查询当前linux发行版的信息:

1
2
3
lsb_release -a

apt install mariadb-server mariadb-client

安装mariadb之后依旧是使用mysql命令,它是mysql的分支而已

配置root的密码

  1. sudo mysql_secure_installation
  2. 然后提示 Set root password? [Y/n],输入Y
  3. 然后输入两次mysql数据库的密码,此密码会被设置为mysql root的密码
  4. 然后一路回车即可

配置登录

这里通过配置解决ERROR 1698 (28000): Access denied for user ‘root’@’localhost’报错,详细参考:

https://blog.csdn.net/jlu16/article/details/82809937

首先登陆:

1
sudo mysql -u root

然后在mysql中输入:

1
2
USE mysql;
SELECT User, Host, plugin FROM mysql.user;

可以看到:

1
2
3
4
5
+------------------+---------------------------------+
| User | plugin |
+------------------+---------------------------------+
| root | auth_socket(或是unix_socket) |
+------------------+---------------------------------+

此时输入:

1
2
3
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
exit;

然后在命令行中输入:

1
sudo service mysql restart

无法登录的问题

设置好后输入

1
sudo mysql -u root

还是会报错

1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

这个是因为设置了密码导致拒绝访问,需要在命令行中添加密码选项

1
sudo mysql -u root -p

然后根据提示输入正确密码即可。

img

权限问题(目前只是本机访问要求就不做其他了)

一、查看3306端口是否开放

1
netstat -an|grep 3306

如果看到下图这样的,说明端口并未打开:

二、修改访问权限

1
vim /etc/mysql/mysql.conf.d/mysqld.cnf

注意上图中的第一行红色的注释:

“By default we only accept connections from localhost”,这几句话的意思是说“在默认情况下我们只允许本地服务访问MySQL”,

所以我们需要注释掉下方那条配置,直接在它前面加上一个井号即可:

1
# bind-address = 127.0.0.1

如下图所是,这条配置也变成了注释:

拓展一下思路,如果我们出于安全考虑,希望限制只有某台应用服务器可以访问MySQL的话,那么其实就需要调整这条配置项就可以了。

三、修改端口号

还是这个配置文件,看到这个配置文件的中间部分的配置项:

我们需要在其中增加一条端口配置:

1
port = 3306

加完以后整个配置文件看起来是这样的:

修改完文件之后记得保存。

四、开放root账户的访问权限

在第三步中,我们仅仅只是取消了本地访问限制,但是我们还是没有对账户权限进行设置。

重启MySQL服务,并进入MySQL控制台:

1
2
3
4
service mysql stop
service mysql start

mysql -u root -p

**切换到系统数据库“mysql”中: **

1
use mysql;

查看一下该数据库中的所有的表:

1
show tables;

我们要修改上图中的最后一张表“user”,看一下这张表有哪些字段:

1
desc user;

img

字段非常多,就不一一罗列了。我们要用到的只是“Host”和“User”两个字段而已:

1
select host,user from user;

在这张表里,我们看到root用户仅仅只能在本地访问MySQL服务,所以我们要把它修改为“%”,意思是无论在哪里root账户都能够访问数据库服务:

1
2
update user set host='%' where user='root';
flush privileges;​

注意,在真实的生产环境中,并不建议这么修改,因为安全风险太大。我建议根据实际情况将root用户的host项修改为某个指定的ip地址,或仍然保持localhost

一般情况下 最后一项可以不设置,不看。

最后一项设置,开放root账户所有权限:

1
grant all privileges on *.* to 'root'@'%' identified by '你的root账户密码';

使各种权限设置立即生效:

1
flush privileges;​

五、再次确认3306端口状态

1
netstat -an|grep 3306

如果看到下图这样,就可以了:

ERROR 1045 (28000) 错误处理

一、问题:

ERROR 1045 (28000): Access denied for user ‘root‘@’localhost’ (using password: YES)

相信很多刚刚在Linux上装MySQL的用户都会遇到这个问题,到底该怎么解决呢?我在stackoverflow上查找到了答案(我使用了方法1并且十分有效),搬运过来顺便翻译成中文。

原文地址:https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost

回答:

原因是因为在最近的Ubuntu安装(当然也可能是其他安装)中,MySQL默认使用了UNIX auth_socket plugin插件。

简单来说这意味着当db_users使用数据库时,将会通过系统用户认证表进行认证。你可以通过下面的命令看看你的root用户是否设置成了这样:

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User | plugin |
+------------------+-----------------------+
| root | auth_socket |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

就像你在查询语句中看到的那样,root用户在使用auth_socket插件。有两种方法来解决这个问题:

1. 你可以设置你的root用户使用mysql_native_password插件 2. 你可以创建一个与你的系统用户一致的新的数据库用户(推荐)

(笔者注:方法2即满足auth_socket插件的要求)

选择1:

1
2
3
4
5
6
7
8
$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

选择2( 用你的操作系统用户名代替YOUR_SYSTEM_USER) :

1
2
3
4
5
6
7
8
9
10
$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

记住如果你选择使用方法2,你应该通过使用你的操作系统用户名来连接到MySQL(mysql -u YOUR_SYSTEM_USER)。

注意:在一些操作系统中(例如Debian系)‘auth_socket’插件被叫做’unix_socket’,所以相应的SQL命令语句应该为UPDATE user SET plugin=‘unix_socket’ WHERE User=‘YOUR_SYSTEM_USER’

二、原因:

错误 1045 (28000):用户“root”@“本地主机”的访问被拒绝(使用密码:是)

简单的说,就是用户root没有使用权限。:

(1) MySQL服务器停止

(2)密码输入错误

三、解决方法:

(1)若MySQL已经没有启动,重启MySQL服务器

1
systemctl restart mysqld

或者

1
systemctl restart mariadb

(2)修改密码

  1. 修改/etc/my.cnf文件,在[mysqld]中添加skip-grant-tables(登录时跳过权限检查)
1
vi /etc/my.cnf
1
skip-grant-tables
  1. 重启数据库(同上

  2. 修改密码

先登录mysql

1
mysql -uroot -p

会让你输入密码,直接点击回车即可。

输入use mysql

1
use mysql

设置密码
【MySQL密码不好设置,可以跟我一样设置密码为:Abcdefg@123】

方法一:

1
set password for `root`@`localhost`=password('Abcdefg@123');

【问题解决】

如果遇到

ERROR 1290 (HY000): The MariaDB server is running with the –skip-grant-tables option so it cannot execute this statement

输入flush privileges;

1
flush privileges;

接下来再次输入set password for root@localhost=password(‘Abcdefg@123’);即可

1
set password for `root`@`localhost`=password('Abcdefg@123');

方法二:

1
update mysql.user set authentication_string ='Abcdefg@123' where user="root";

4.退出

1
exit

5.将my.cnf中的skip-grant-tables去除

1
vi /etc/my.cnf

6.重启服务

1
systemctl restart mysqld

或者

1
systemctl restart mariadb

7.登录

使用修改后的密码登录即可。

** 普及:**

不输入密码显示:

ERROR 1045 (28000): Access denied for user ‘root‘@’localhost’ (using password: NO)


相关链接

  1. Linux安装mysql(解决E: Package ‘mysql-server‘ has no installation candidate与ERROR 1698 (28000))

  2. MySQL登录报错 ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)

  3. 在Ubuntu/Linux环境下使用MySQL:开放/修改3306端口、开放访问权限

  4. 解决 MySQL 的 ERROR 1698 (28000): Access denied for user ‘root‘@’localhost’

  5. ERROR 1698 (28000): Access denied for user ‘root‘@’localhost’


=================我是分割线=================

欢迎到公众号来唠嗑: