MySQL笔记(一)——安装、配置、启停与MySQL体系结构

安装

按下面的步骤,一步步来安装配置,肯定不会出错。

先在官网下载MySQL二进制包,我练习用的版本是5.7,还有台机器装的8.0,用来了解一些新的特性。

下载好二进制包后,将其解压到/application/mysql目录下,即为MySQL的安装目录basedir

接着配置一下环境变量,在/etc/profile末尾添加一句:

export PATH=/application/mysql/bin:$PATH

保存后source /etc/profile,再执行mysql -V,即可查询到mysql版本,到这里可以认为MySQL已经装好了,当然,想真正运行起来还需要一些步骤。

添加用户组和用户:

groupadd mysql

useradd -r -g mysql mysql

创建数据目录/data/mysql/data,即为MySQL的数据目录datadir

mkdir /data/mysql/data -p

修改目录用户:

chown -R mysql.mysql /application/*

chown -R mysql.mysql /data

接下来就是初始化数据了,即创建数据系统。

对于v5.7之前的版本,直接执行/application/mysql/scripts/mysql_install_db脚本即可,v5.7以及之后的版本,则是执行命令:

mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data

执行完毕之后就可以在/data/mysql/data目录下看到mysql的初始数据了。

最后,要启动mysql,还需要准备配置文件/etc/my.cnf。

配置文件

首先要知道,MySQL是通过mysqld进程作为服务器端,为客户端提供服务,所以启动mysql本质上就是启动mysqld进程,我们需要先为mysqld进程配置一些参数,而这些参数就放在/etc/my.cnf这个脚本中,无论是哪种方式启动mysqld,都会先读取配置文件。仅仅是启动和练习需要,只需要简单配置一下即可:

cat > /etc/my.cnf << EOF

[mysqld]

user=mysql

basedir=/application/mysql

datadir=/data/mysql/data

socket=/tmp/mysql.sock

server_id=6

port=3306

[mysql]

socket=/tmp/mysql.sock

简单说明一下,配置文件中,[mysqld]标签下为服务器端配置,[mysql]标签下为本地socket连接时客户端的配置,每个配置项的含义如下:

·user:用户

·basedir:MySQL安装路径

·datadir:MySQL数据路径

·socket:socket文件位置

·server_id:服务器id,取值范围在1~65535

·port:端口号

在添加配置文件后,MySQL已经能够启动了。

启停

MySQL的启动方式主要可以分为两种。

SYS-V

这种启动方式依靠application/mysql/support-files/mysql.server这一脚本,可以打开看一看,注释里有对这一脚本的详细介绍,可以知道这一脚本的用途便是MySQL的启停。可以直接使用以下命令:

/application/mysql/support-files/mysql.server {start|stop|restart|reload|force-reload|status}

更合适的做法是将mysql.server这一脚本拷贝到/etc/init.d目录下:

cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld

之后就可以通过以下命令来启停MySQL:

service mysqld {start|stop|restart|reload|force-reload|status}

Systemd

systemd是现在更推荐的启动方式,主要需要一个配置文件mysqld.service:

cat > /etc/systemd/system/mysqld.service << EOF

[Unit]

Description=MySQL Server

Documentation=man:mysql(5.7)

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/application/mysql/bin/mysqld -- defaults-file=/etc/my.cnf

LimitNOFILE=5000

在官方文档上还有更多的其他参数,目前只需要配置这些就够了。在这之后,就可以通过以下命令来控制MySQL的状态:

systemctl {start|stop|restart|reload|force-reload|status} mysqld

启动时可能遇到的问题

按照上述的步骤,应该就能正常启动mysqld了,但是实际上在我操作的过程中,也遇到过一些问题。

1、socket文件地址不一致

my.cnf中有一个很重要的配置——socket,在[mysqld]标签和[mysql]标签下,socket文件路径一定要一致。

2、selinux

一般来说centos的selinux默认是禁用的,但是我有一台机器在装机后,selinux默认开启了,这导致我在使用systemd方式启动mysqld时一直报错,当时也是排查了很久才找到这个问题,如果你的配置什么的都确定无误,那么可以检查一下你系统中selinux的状态。

临时关闭:setenforce 0

默认禁用:selinux的配置文件在/etc/selinux/config中,令SELINUX=disabled即可

连接

启动mysqld之后,我们还需要启动客户端与mysqld建立连接,才能真正地使用MySQL数据库。

MySQL的连接方式分为远程tcp/ip连接和本地socket连接:

tcp/ip:mysql -uroot -p -h <ip_address> -P3306

socket:mysql -uroot -p -S /tmp/mysql.sock ,也可以省略-S后的内容

要注意远程连接时,服务器端所在的机器要把3306端口开放出来,需要修改一下防火墙配置。

比较粗暴的做法是直接关闭防火墙,如果只是练习的话可以这样做:

systemctl stop firewalld.service

当然,这并不是一个很好的做法,我们还是更应该把3306端口开放出来:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

用户管理

以上方式启动数据库后,我们并没有为用户设置密码,我们也可以试想一下,如果在使用中,我们忘记了管理员密码的话——虽然发生这种情况的概率很低——该怎么办?

首先,关闭数据库。以什么方式启动就应该以同样的方式关闭(sys-v、systemd)。

然后,以维护模式启动数据库:

mysqld_safe --skip-grant-tables --skip-networking &

接下来就可以修改密码了,直接本地连接数据库后,执行以下语句:

flush privileges;

alter user root@'localhost' identified by '<password>';

这样就完成密码的修改了。关闭连接后,还需要重新正常启动mysqld进程,以mysqld_safe方式启动mysqld进程并没有对应的stop命令,需要用以下命令来关闭:

mysqladmin -uroot -p shutdown;

这之后再正常启动即可。

现在,我们的MySQL里还只有root@localhsot这一个用户,这是一个管理员用户,并且只能通过本地连接登录。在实际使用中,我们肯定需要创建各种用户供不同人员、在不同网络中使用,这些用户的权限也根据也无需求有序区别。创建用户的语句如下:

create user <user_name>@<address> identified by <password>;

grant <permission> on <database_name>.<table_name> to <user>;

在v5.7之前的版本,可以直接使用grant语句同时完成用户的创建和授权,但是v5.7及之后的版本则需要将用户创建和授权分开,为了操作过程更加清晰,将这两步分开也更恰当。例如我们要创建一个可以远程登录的管理员用户,登录密码为123,语句如下:

create user root@'%' identified by '123';

grant ALL on *.* to root@'%' with grant option;

如果要收回多余的权限,则使用以下语句:

revoke <permission> on <database_name>.<table_name> from <user>;

多实例管理

在实际的应用中,经常会遇到一台主机上需要运行多个mysqld实例的情况,创建多个mysqld实例,还是紧扣单实例启动的方法。

首先,每个mysqld实例需要拥有各自的数据目录,所以要先创建多个目录:

mkdir -p /data/330{7, 8, 9}/data

接着,每个实例都必须有各自的配置文件my.cnf,书写方式参照单实例启动,port改成各自的端口号,放在各自的目录下,如3307端口的实例对应配置文件放在/data/3307/my.cnf。

然后,为每个实例初始化数据,并给每个目录授权。

最后各自启动即可,如果是systemd方式启动,还需要为每个实例创建启动配置,如mysqld3307.service。

多实例的管理与单实例其实并没有太大不同,只需要每个实例单独配置、管理即可。

MySQL体系结构

MySQL体系结构自顶向下可以分为4层,分别是连接层、服务层、存储引擎层和文件层,其中重点是服务层和存储引擎层

连接层

连接层负责连接管理,主要表现在提供连接协议、用户授权和校验、开启连接线程等方面。每个客户端连接都对应一个连接线程,用于mysqld服务端接收语句和返回结果,在客户端中,可以通过show processlists;语句来查询当前有多少客户端连接。为了避免连接线程创建与销毁过于频繁,在MySQL服务器端通过线程池来维护这些连接线程。

服务层

服务层是MySQL的核心层,MySQL服务器端通过连接层的线程接收到语句,由服务层对语句进行进一步处理,主要包括语法检查、语义检查和权限检查,通过后便会解析语句,生成执行计划,优化器算法会选取其认为最优的执行方法,这之后再有语句执行器真正运行SQL语句。同时,服务层还提供了查询缓存功能,需要手动开启。

存储引擎层

存储引擎层负责数据的存储与提取,可以把它看做SQL语句与磁盘交互的桥梁,MySQL支持多种存储引擎,但这些存储引擎对于上层而言则是透明的,由存储引擎层向上层提供统一的接口用以通信,进而屏蔽了不同存储引擎的使用差异。

存储引擎是针对表而非数据库的,我们可以根据需求对同一数据库中的不同表设置不同的存储引擎。

文件层

文件层是将数据库中的数据存储在文件系统之上,并与存储引擎层交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值