安装
按下面的步骤,一步步来安装配置,肯定不会出错。
先在官网下载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支持多种存储引擎,但这些存储引擎对于上层而言则是透明的,由存储引擎层向上层提供统一的接口用以通信,进而屏蔽了不同存储引擎的使用差异。
存储引擎是针对表而非数据库的,我们可以根据需求对同一数据库中的不同表设置不同的存储引擎。
文件层
文件层是将数据库中的数据存储在文件系统之上,并与存储引擎层交互。