Centos7下Mysql的安装
干净环境安装
首先,本机环境是CentOS7.2,如下图所示,开始安装时本机没有任何其余的设置。
我只说一下安装过程中可能的问题:
在CentOS系统下如果直接通过yum安装,比如直接使用下面的语句安装:
yum install mysql
yum install mysql-server
yum install mysql-devel
会发现安装mysql-server失败,因为CentOS 7 版本将MySQL数据库软件从默认的程序列表中移除,用mariadb代替了。所以默认情况是安装Mariadb而不是Mysql,而且Mariadb的版本是5版本的,不是最新的10系列版本。如果对这mysql和mariadb的特性区别没有什么特殊要求的话确实可以安装Mariadb,我认为在显示方面还是比mysql好的(比如会显示当前在操作哪个数据库)。mariadb与mysql都属于同一类数据库管理系统。但是mariadb与mysql在使用范围和使用目的上都有所不同,两者的主要功能都是为了通过开源社区在维护中,从而获得GPL授权许可。从关系上来看,mariadb是属于数据库管理系统的开发和升级版本,它仅仅代表MySQL的一个分支。
安装Mariadb
安装Mariadb的过程很简单,使用下面的命令:(前提是环境是干净的,没有安装过其他DBMS,如果安装过要重装后面有介绍)
yum install mariadb-server mariadb
#关于Mariadb的使用命令如下
systemctl start mariadb #启动MariaDB
systemctl stop mariadb #停止MariaDB
systemctl restart mariadb #重启MariaDB
systemctl enable mariadb #设置开机启动
需要注意的是,安装后需要修改字符集,反正我的环境下安装后很多默认字符集都不是utf-8导致数据库中的中文显示乱码,至于字符集修改的问题,可以修改/etc/my.cnf文件,具体的方法可以自行查找,一定要在建库之前修改好,否则建完后再修改需要从库级别,表级别,列级别对字符集进行修改,比较麻烦。可以通过show variables like “%character%”;show variables like “%collation%”;命令查看当前数据库的默认字符集,下面是一个参考的修改方法:
编辑MariaDB的" vi /etc/my.cnf.d/server.cnf “文件,设置编码,然后ESC退出,” :wq "保存。
[root@holer ~]# vi /etc/my.cnf.d/server.cnf
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
编辑MariaDB的" vi /etc/my.cnf.d/mysql-clients.cnf "文件,设置编码。
[root@holer ~]# vi /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set=utf8
建立好数据库后,默认建立的root用户密码可能为空,可以通过SET PASSWORD FOR ‘root’@‘localhost’ = PASSWORD(‘newpass’);修改密码登录。
安装Mysql
在CentOS-7中安装MySQL需要配置下载源,不能直接使用yum安装,否则又安装成了Mariadb
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm #这里需要根据需要的版本和系统版本选择
#wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm #安装MySQL源
执行成功后会在/etc/yum.repos.d/目录下生成两个repo文件mysql-community.repo及 mysql-community-source.repo
并且通过yum repolist可以看到mysql相关资源
接着需要选择安装的版本,默认是8.0,如果想安装5.7:
shell> sudo yum-config-manager --disable mysql80-community
shell> sudo yum-config-manager --enable mysql57-community
之后就可以开始安装
安装:$ sudo yum install mysql-community-server
启动:$ sudo systemctl start mysqld
查看状态:$ sudo systemctl status mysqld
对于8.0版本的数据库,在修改密码时需要注意,由于升级后的密码强度限制,如果还跟5.7一样直接set会报错,需要先修改my.cnf里的限制条件,如下图:
最开始mysql会设置一个默认密码给root,通过这个密码登录后再用ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘yourpassword’;
$ sudo grep 'temporary password' /var/log/mysqld.log #查看默认密码进行登录
升级或者不干净环境重装
升级Mariadb需要修改/etc/yum.repos.d/MariaDB.repo,添加官方源
https://downloads.mariadb.org/mariadb/ http://yum.mariadb.org/
# 添加 MariaDB 官方源
vi /etc/yum.repos.d/MariaDB.repo
# MariaDB 10.3 CentOS repository list
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64 #这里的版本需要自己切换
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
# 清除 yum 缓存
yum clean all
yum makecache
注意,如果是Mairadb切换为Mysql,或者是升级,最好先卸载
检查mariadb: $ rpm -qa|grep mariadb
如果上面检查的结果有内容,则删除mariadb,把命令中的mariadb-server
替换成所有上面输出的内容: $ rpm \-e --nodeps mariadb-server
检查mysql也是类似的,如果要升级的话先卸载老版本,否则后面安装会报错冲突
$ rpm -qa|grep mysql
mysql80-community-release-el7-3.noarch
mysql-community-libs-8.0.19-1.el7.x86_64
mysql-community-server-8.0.19-1.el7.x86_64
mysql-community-common-8.0.19-1.el7.x86_64
mysql-community-client-8.0.19-1.el7.x86_64
那么就要卸载上面出现的,先停止服务sudo systemctl stop mysqld
然后
$ sudo rpm -e --nodeps mysql80-community-release-el7-3.noarch mysql-community-libs-8.0.19-1.el7.x86_64 mysql-community-server-8.0.19-1.el7.x86_64 mysql-community-common-8.0.19-1.el7.x86_64 mysql-community-client-8.0.19-1.el7.x86_64
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
最后删除所有mysql相关文件:$ sudo rm -rf /var/lib/mysql /var/log/mysqld.log
Mariadb不同版本的区别
起初我不太清楚Mariadb是什么东西,感觉和Mysql没太大区别,但是在Explain这一块发现还是有不少问题
默认情况下安装的Mariadb是5.7版本的,其Explain显示的信息不够全,比如查询开销,另外一个更为详细的 ANALYZE statement
在 MariaDB 10.1.0.版本才引入,所以如果需要使用Analyze,需要进行版本升级。
Mariadb和Mysql的区别
如下图所示,我升级到10.6.4版本后,尝试使用Analyze命令和Expain命令
Explain和Analyze命令对比如下:
可以发现,ANalyze命令提供了更真实,更准确的查询信息(使用Format=json会显示更多信息),如官网ANALYZE Statement - MariaDB Knowledge Base所说:
ANALYZE statement
will invoke the optimizer, execute the statement, and then produceEXPLAIN
output instead of the result set. TheEXPLAIN
output will be annotated with statistics from statement execution.
analyze实际上执行了语句,但是丢弃返回的结果,仅仅是获取执行的信息方便分析,因此在结果上更精准,但在执行时间上肯定比Explain要耗时,比较调用了Opimizer进行了真实的执行过程。
而Mysql就不同,升级到最新的8.0.26版本后,我们再测试explain (mysql不支持analyze命令),另外需要注意的是,8.0开始expalin的select_type不支持extended字段,执行会报错
explain结果如下图所示,可以发现其内容比mariadb下的详细了很多,因此在分析语句时直接使用没什么问题,只是存在准确度的问题
Mysql不同版本的区别
mairadb开始流行版本是5.7,后来逐渐升级为8.0
升级后mysql的安全措施更严,所以在远程连接,修改用户权限时都和5.7版本的略有区别
在创建好数据库后我们尝试远程连接,要设置用户的权限,比如在5.7版本下直接把在所有数据库的所有表的所有权限赋值给位于所有IP地址的root用户,使用下面命令:mysql> grant all privileges on . to root@’%'identified by ‘password’; 即可授权root用户的远程连接
然而在8.0版本下,如果使用相同的命令会报错:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘identified by ’ password’’ at line 1
因为在mysql8.0创建用户和授权和之前不太一样了,其实严格上来讲,也不能说是不一样,只能说是更严格,mysql8.0需要先创建用户和设置密码,然后才能授权。我们可以新建一个用户,创建完后授权即可。
另外还有一个问题,MySQL8.0 只支持 localhost 访问,我们必须设置一下才可以远程访问。
进入mysql数据库查询存放用户信息的user表:
这里面有两个重要信息,一个是第一列的host,这代表可以访问的ip,默认情况下全是localhost及只能本地,需要执行语句
update user set host=’%’ where user=‘root’;进行修改,下图是修改后的结果,%代表任意ip
执行完后一定要记得刷新权限flush privileges;
另外重要的一行是最后一行,mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法是把mysql用户登录密码加密规则还原成mysql_native_password:
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’; #更新一下用户的密码
FLUSH PRIVILEGES; #刷新权限