关于 MySQL 的连接与用户
大家日常使用 MySQL ,或者说刚刚搭好环境的时候,最常要配置的就是连接以及用户相关的操作,今天我们就来简单地学习一下 MySQL 中的连接方式以及用户相关的操作。最后,我们还会看几个小命令,可能大家都见过,如果你没用过的话,也可以记下来,感觉还是挺有用的哦!
两种不同的连接方式
在之前学习 PHP 与 Nginx 的交互方式,也就是 PHP-FPM 相关的文章中,我们就知道 PHP-FPM 有两种交互方式,一个是通过 9000 端口,一个是通过 sock 文件。分别对应的就是 TCP 和 UnixSocket 这两种形式。
其实连接 MySQL 也有这两种形式,TCP 形式就是我们连接 3306 端口,指定-h 参数的这种。相对来说,大家平常应该较少使用 UnixSocket 这种。先看一下最常见的:
代码语言:javascript复制mysql -h127.0.0.1 -uroot
默认情况下连接本机指定一个 -h 等于 localhost 就可以了,然后后面指定用户名和密码。这个命令相信已经不用再过多描述了。接下来我们就看看如何使用 UnixSocket 的方式来连接数据库。
代码语言:javascript复制mysql -uroot --protocol=SOCKET
这种形式的连接会去找默认的 mysql.sock 文件,一般情况下这个文件会在 /tmp 目录或者你的默认数据目录下,我们也可以指定这个文件的位置。
代码语言:javascript复制mysql -uroot -S /tmp/mysql.sock
注意上面两种使用 UnixSocket 的连接都不需要再指定 -h 也就是我们的 TCP HOST 地址了(有特例,下篇文章我们再细说)。另外,由于 sock 文件是固定在本机的,所以我们使用 UnixSocket 模式的时候也只能是连本机的数据库。就像 PHP-FPM 一样,使用 UnixSocket 形式的效率会更好一点点,当然,毕竟到了 TCP 连接的过程,但是区别不大。
用户指定 HOST
在启用 MySQL 之后,我们一般会使用 root 这个帐号来进行连接。当然,我们也会去创建一些权限较低的用户来作为应用的帐号使用。在 MySQL 的帐号体系中,还有一个比较有意思的东西,就是用户的 host 值。
一般默认情况下,我们的 root 帐号会把 host 值设置成 localhost ,也就是只能本机可以使用这个帐号连接访问。如果在这种状态下,你从另一台主机上连接 MySQL 的话,返回的将是下面这样的信息。
代码语言:javascript复制mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1130 (HY000): Host '_gateway' is not allowed to connect to this MySQL server
当然,我们可以更改帐号的这个 host 值,比如改成 % 来代表任意主机都可以连接。
代码语言:javascript复制
use mysql;
UPDATE user SET host = '%' WHERE user = 'root';
FLUSH PRIVILEGES;
记得修改完之后要使用 FLUSH PRIVILEGES 刷新一下。好吧,上面这段大家其实应该很熟悉,我们再来看另一个限制登录的功能,就像 Redis 中绑定 IP 一样,其实在 MySQL 的配置文件中也可以去限制连接的 IP 。
代码语言:javascript复制[server]
bind-address=localhost
如果你像上面一样只限制为本机的话,那么从另一台机器访问数据库会报下面的错误信息。
代码语言:javascript复制mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.56.133' (61)
注意,它的报错信息和用户帐号的那个 host 设置的报错信息是不一样的哦。bind-address 这个属性的值也可以设置为 *、0.0.0.0 代表全部都可以访问,也可以使用空格分隔来指定多个固定的 IP ,比如 127.0。0.1 192.168.100.100 。
忘记 root 密码?
如果你忘记了 MySQL 的 root 密码了,要怎么办呢?一般来说,生产环境很少出现这种问题,因为公司企业对核心的数据库密码这一类的保存肯定都是很规范而且有备份的。但是,凡事总有例外,忘记密码这种事有的时候可能就是那么凑巧。
网上很多文章会说使用 mysql_safe 再加一个参数来实现,但我虚拟机的 MySQL 环境是通过 Debian 的 rpm 包来安装的,并没有 mysql_safe 以及 mysql.server 这一类的工具。我们只能通过另一种方式,也就是直接修改 my.cnf 然后重启数据库来实现。
首先就是,修改 my.cnf 配置,在服务器相关的配置中添加 skip_grant_tables=1 启动设置,接着重启服务器。这个配置的意思就是不通过验证直接可以连接数据库。
代码语言:javascript复制
# mysql -uroot
mysql > ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
mysql > FLUSH PRIVILEGES;
赶紧修改完密码,然后刷新一下之后再把 skip_grant_tables 从 my.cnf 中去掉,接着重启数据库就好了。
如果出现问题,比如:
代码语言:javascript复制ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
就需要修改一下密码安全策略,可以配置文件中添加:
代码语言:javascript复制validate_password.policy=LOW
使用 SHOW VARIABLES LIKE 'validate_password%';
可以查看当前密码策略的情况,LOW 策略只验证密码长度,密码长度的配置也可以修改。
不管是这种利用 my.cnf 还是利用 mysql_safe 的方式,都是要重启整个 MySQL 服务的。因此,保管好密码其实是更重要的前期准备工作,事后补救多少都会带来一些损失的。
试试几个小命令
最后几个小命令是最近发现比较好玩的,随便写写记录一下,没接触过的小伙伴也可以了解一下哦。
代码语言:javascript复制CREATE DATABASE test1;
CREATE TABLE test1 (id INT(11), `name` VARCHAR(100) NOT NULL) ENGINE=INNODB;
DESCRIBE test1;
DESC test1;
SELECT DATABASE();
SELECT CURRENT_USER();
DESCRIBE 和 DESC 都是查看表的信息,desc 相信不少人应该是用过的。大小写都可以哦,MySQL 的关键字推荐是都用大写,但是小写也是没问题的。
SELECT DATABASE() 是可以查看我们当前使用的是哪个数据库,也就是 use 的哪个库。
SELECT CURRENT_USER() 则是显示现在连接的用户帐号是哪个。
之前没有这方面的需要,所以其实也是最近看文档的时候才发现的这几个小功能或函数。
总结
今天的内容很基础,很入门,主要的就是 MySQL 的两种连接方式以及帐号、服务的 host 控制,最后还讲了一个修改 root 密码相关的内容。这些东西之前确实没有很详细的了解过,因此在这里,也只是把我有疑惑或者不清楚的地方在学习之后拿出来分享一下,大家也可以一起跟着了解一下哦。