MySQL 安装教程
一、安装环境
虚拟机系统:CentOS 7.6
该虚拟机为新装虚拟机,暂无安装其他软件等,本系列文章将以该虚拟机作为示例,在其上安装各种常用软件与服务。
数据库管理工具:Navicat 15
二、修改IP地址
为了方便操作,我们需要先将虚拟机的IP 修改为静态IP,这样子可以避免每次连接虚拟机时都需要更换登录凭证。
当前,该虚拟机是已经提前修改好了网卡配置,在这里就简单的介绍以下。
2.1 查看当前网卡与IP
在命令行中输入以下命令:
ip addr
本次操作的结果如下图所示:
2.2 修改网卡配置
在命令行中输入以下命令:
cat /etc/sysconfig/network-scripts/ifcfg-ens192
在这里有个要点需要注意:ifcfg-ens192 文件需要根据虚拟机的网卡来确定。
例如,在【2.1】中可以看到示例虚拟机的网卡有两个,分别是lo 和ens192,其中lo 是固定的,无需更改,而ens192 便是我们这次操作的主角。
如果你的另一个网卡是ens62,那么在命令中输入的文件名就应该是ifcfg-ens62,而不是ifcfg-ens192。
本次操作的结果如下图所示:
图片中红框中的部分便是我们需要进行修改以及增添的部分,具体如下:
BOOTPROTO=static
IPADDR=10.90.21.96
NETMASK=255.255.255.0
GATEWAY=10.90.21.254
DNS1=10.90.21.254
NM_CONTROLLED=NO
ZONE=public
2.3 重启网卡
修改完配置后我们需要重启下网卡,该配置才能生效。在命令行中输入以下命令即可:
service network restart
三、安装MySQL
3.1 删除mariadb
mariadb 是Linux 系统自带的数据库,可能会与MySQL 数据库的某些配置起冲突,在这里,我们需要先将其卸载。
首先,我们需要确认服务器上安装的mariadb 的版本,在命令行中输入以下命令:
rpm -aq | grep mariadb
本次操作的结果如下图所示:
确认了版本之后便可以进行删除了,在命令行中输入以下命令:
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
本次操作的结果如下图所示:
3.2 安装软件包
3.2.1 解压软件包
软件包下载地址:
链接:https://pan.baidu.com/s/12VcnPSeaqNY8zez5f2bKqQ
提取码:v2vg
首先选择一个合适的目录,存放压缩包,这里我们选择的/usr/local 目录,并在其下创建了env 文件夹,本次包括今后的安装都将在这个目录下进行。
现在,我们已经将mysql 的压缩包通过FTP 工具放进了/usr/local/env 目录,具体结果如下:
已经有了压缩包,那么接下来肯定就是解压了,在命令行输入以下命令:
tar -xvf mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar
本次操作的结果如下图所示:
通过该命令,我们可以清楚地看到整个解压过程以及该过程中的产生的解压文件。
3.2.2 安装软件包
在命令行中依次输入以下命令:
rpm -ivh mysql-community-common-5.7.35-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.35-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.35-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.35-1.el7.x86_64.rpm
本次操作的结果如下图所示:
可以看到,在安装serve 服务端时出现了报错,根据提示信息,我们可以判断是因为我们的服务器缺少net-tools 以及perl 工具,才导致了本次的安装失败。
3.2.3 下载工具
在命令行中输入以下命令:
yum install perl -y
本次操作的结果如下图所示:
在命令行中输入以下命令:
yum install net-tools -y
本次操作的结果如下图所示:
工具安装完成之后,我们可以再次尝试安装serve 服务端,不出意外,这一次应该是可以了。
rpm -ivh mysql-community-server-5.7.35-1.el7.x86_64.rpm
本次操作的结果如下图所示:
3.3 修改配置
3.3.1 初始化数据库
MySQL 数据库安装完成之后默认的root 账号是没有密码的。这时候想登录数据库有两种选择:
- 初始化数据库,这会生成一个随机的密码
- 配置免密登录
这里,我们选择用随机密码登录的方式。
在命令行中输入以下命令进行数据库的初始化:
mysqld --initialize
通过以下命令我们可以查看到root 账号分配到的随机密码:
grep 'temporary password' /var/log/mysqld.log
本次操作的结果如下图所示:
3.3.2 启动数据库
在命令行中输入以下命令启动MySQL数据库:
service mysqld start
注意:是mysqld ,不是mysql 。
可以看到,启动失败了,根据它的提示,我们查看下报错信息:
systemctl status mysqld.service
本次操作的结果如下图所示:
从这里看的话,只有一个start-limit 的提示,这并不足以让我们精准定位报错原因,那么我们需要查看下MySQL 日志来辅助判断。
3.3.3 修改文件权限
但是我们的MySQL 日志放在哪里呢?别着急,我们可以通过以下命令来确定MySQL 的配置:
cat /etc/my.cnf
本次操作的结果如下图所示:
图中用红框圈出的两行配置分别代表的是数据文件和日志文件的位置。
那么日志文件的所在已经确定了,我们接下来查看下究竟是怎么回事:
cat /var/log/mysqld.log
本次操作的结果如下图所示:
可以清楚的看到错误日志中指出了本次数据库启动失败的原因所在:
ibdata1 must be writable
简单的说其实就是数据文件权限不足导致的。
在命令行中依次执行以下命令:
cd /var/lib/mysql
chmod -R 777 /var/lib/mysql
本次操作的结果如下图所示:
在网上搜索“ ibdata1 must be writable” 错误的时候,给出的解决方案是修改以ib 开头的几个文件的权限,但经过尝试,这样子仍会报错,而且还是文件权限的问题,因此,在这里,我们直接把整个文件夹的权限都修改为777 ,这样就能避免权限问题的出现。
我们再次启动MySQL 服务:
service mysqld start
看到下面的打印信息,那么就是启动成功了。
3.3.4 修改密码
折腾了这么一遭,之前提到的root 账户的随机密码估计都给忘了,没关系,输入以下命令就可以获取到了:
grep 'temporary password' /var/log/mysqld.log
现在数据库已经启动了,接下来我们需要修改root 账户的密码,这是为了安全起见。
在命令行中输入以下命令(其中aybsHLzF%6:T 是随机密码,注意更换):
mysql -uroot -paybsHLzF%6:T
可以看到,我们已经进行sql 操作界面了。
没有修改密码前,你是无法进行其他操作的。所以接下来,我们要把密码改了:
set password for 'root'@'localhost' = password('12345678');
退出sql 操作界面,重新使用原密码登录:
exit;
mysql -uroot -paybsHLzF%6:T
可以看到,这时之前的随机密码已经失效了,被我们设置的新密码所替代。我们使用新密码进行登录:
mysql -uroot -p12345678
成功进入sql 操作界面:
3.3.5 允许远程登录
在sql 操作界面输入以下命令:
GRANT ALL ON *.* TO 'root'@'%';
报错了?找不到匹配的行记录,那么我们就先看下数据库中的用户究竟有哪些:
use mysql;
select Host,User from user;
可以看到root 用户的host 地址指向只有localhost ,而我们的命令里写的是% ,所以数据库找不到对应的记录。
root@localhost 表示只允许root 用户在本地登录,root@% 表示允许root 用户在任何IP 下进行登录。
既然没有这条记录,那我们就自己造一个嘛,都是程序员了,还不会new 一个么?
create user 'root'@'%' identified by '12345678';
可以看到我们已经有root@% 这个对象了,恭喜恭喜。
接下来,我们重新配置下远程登录:
GRANT ALL ON *.* TO 'root'@'%';
记得刷新权限!!
flush privileges;
3.3.6 开放端口
远程登录已经配置好了,接下来我们在Navicat 上试一下:
emmm…报错了。等一下,我们的服务器是新开的,那么端口号好像,应该,也许,可能,或者是没有对外开放的。我们来看一下。
首先,退出sql 操作界面:
exit;
接下来,查看防火墙情况,正常来说,是开启着的:
systemctl status firewalld
果然,不出所料。配置端口对外开放,是需要开启防火墙的,所以第一步得先确定其是否正在运行,免得一顿操作猛如虎,一看战绩0-5 ,那就尴尬了。
看下已经开放的端口号有哪些:
firewall-cmd --list-ports
果然,啥都没有…
那么,我们就把MySQL 的默认端口号3306 放开吧:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新载入配置,使其生效:
firewall-cmd --reload
firewall-cmd --list-ports
可以看到,3306 端口已经在开放列表中了。
再次在Navicat 进行连接,可以看到,此时已经可以连接到数据库了。
3.4 开启binlog
biglog 是什么?
binlog 是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
binlog 不会记录SELECT 和SHOW 这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL 执行过的所有语句。
这么讲吧,binlog 记录了数据库上的所有改变,主从数据库的复制就是通过biglog 实现的,原理就是根据binlog 的记载对数据进行同步或者恢复。
如果你想了解更多关于binlog 的内容,可以参考以下博客:
mysql binlog系列(一)----binlog介绍、日志格式、数据查看等
【原创】研发应该懂的binlog知识(上)
我们继续刚才的话题,既然binlog 这么有用,那我们肯定要第一时间把它开起来,这可是数据恢复的利器。
在命令行界面输入以下命令:
vi /etc/my.cnf
在文件末端加入以下内容即可:
#开启binlog日志
log-bin=/var/lib/mysql/mysql-bin
#配置serverid
server-id=123
重启MySQL 使其生效:
service mysqld restart
3.5 不区分大小写
新安装的MySQL 是不区分大小写的,但这可能会给我们带来一些困扰。
例如:数据库testm 和数据库 TESTM 会被认为是两个不同的数据库,但其实也许我们并没有定义TESTM,只是不区分大小写的原因使得程序在MySQL 中自己创建了TESTM 数据库;如果此时的testm 数据库中有索引的话,可能会出现“同名索引(duplicate key)”的错误。
我们可以通过以下命令检查我们的MySQL 是否区分大小写:
show Variables like '%table_names';
结果如下:
修改MySQL 配置文件:
vi /etc/my.cnf
在文件中加入以下内容:
即
lower_case_table_names = 1
重启MySQL:
service mysqld restart
3.6 修改sql_mode
在使用GROUP BY 时,比较容易出问题的就是SELECT 中的列不符合要求:
SELECT list is not in GROUP BY clause and contains nonaggregated column ‘库.表.某一列’ which is not functionally dependent on columns in GROUP BY clause;this is incompatible with sql_mode=only_full_group_by
这是因为对于 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。
但实际中,比较少会遵循这个准则(我也没有…),那么在MySQL 5.7.35 这个版本中实际上是默认严格要求这个书写格式,为了避免程序报错,我们需要将其禁用掉。
首先,在sql 操作界面输入以下命令可以查看下我们数据库的sql_mode :
SELECT @@sql_mode;
可以很清楚的看到“ONLY_FULL_GROUP_BY” 的存在,我们的想法就是将其去了。
回到Linux 命令行界面,输入vi /etc/my.cnf
打开MySQL 的配置文件,在其中加入以下内容:
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
即
随后,重启MySQL 即可:
service mysqld restart
四、 总结
好了,本文到此截至,主要介绍了如何在Centos 7 服务器上安装MySQL 数据库。
我是陈冰安,一个学习者。欢迎关注我的公众号【暗星涌动】,愿与你一同进步。