CentOS7使用yum安装配置MySQL8

卸载MariaDB

列出所有被安装的rpm package

# rpm -qa | grep mariadb
mariadb-libs-5.5.50-1.el7_2.x86_64
mariadb-5.5.50-1.el7_2.x86_64
mariadb-server-5.5.50-1.el7_2.x86_64

强制卸载

rpm -e mariadb-libs-5.5.50-1.el7_2.x86_64

此时报错:

error: Failed dependencies:
    libmysqlclient.so.18()(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64
    libmysqlclient.so.18()(64bit) is needed by (installed) perl-DBD-MySQL-4.023-5.el7.x86_64
    libmysqlclient.so.18()(64bit) is needed by (installed) php-mysql-5.4.16-36.3.el7_2.x86_64
    libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64
    libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) perl-DBD-MySQL-4.023-5.el7.x86_64
    libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) php-mysql-5.4.16-36.3.el7_2.x86_64
    mariadb-libs(x86-64) = 1:5.5.50-1.el7_2 is needed by (installed) mariadb-1:5.5.50-1.el7_2.x86_64
    mariadb-libs(x86-64) = 1:5.5.50-1.el7_2 is needed by (installed) mariadb-server-1:5.5.50-1.el7_2.x86_64

强制卸载,因为没有–nodeps

# rpm -e --nodeps mariadb-libs-5.5.50-1.el7_2.x86_64

# rpm -e --nodeps mariadb-5.5.50-1.el7_2.x86_64

# rpm -e --nodeps mariadb-server-5.5.50-1.el7_2.x86_64 

安装MySQL

下载MySQL源(后缀是noarch.rpm)

[root@centos ~]# wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

安装mysql源

[root@centos ~]# yum localinstall mysql80-community-release-el7-1.noarch.rpm

检查mysql源是否安装成功

[root@centos ~]# yum repolist enabled | grep "mysql.*-community.*"

出现如下所示表示安装成功:

mysql-connectors-community/x86_64 MySQL Connectors Community                  65
mysql-tools-community/x86_64      MySQL Tools Community                       69
mysql80-community/x86_64          MySQL 8.0 Community Server                  33

安装MySQL

[root@centos ~]# yum install mysql-community-server

出现Error downloading packages:错误,重复执行上述命令。

启动MySQL服务

[root@centos ~]# systemctl start mysqld

查看MySQL的启动状态

[root@centos ~]# systemctl status mysqld

找出root默认密码

mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改。

[root@centos ~]# grep 'temporary password' /var/log/mysqld.log
2018-05-13T02:02:14.879263Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: &/hQlEZXc1gT

使用数据库root用户登录

[root@centos ~]# mysql -u root -p
Enter password: &/hQlEZXc1gT

修改默认密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mysql&123456789';
mysql> flush privileges;

修改默认密码和加密方式

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '%KMzSp43m5XKC@eP';
flush privileges;

注意:mysql5.7以上默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000)错误,如下图所示:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456789';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

远程连接授权

mysql> use mysql;
mysql> select user,host from user;
mysql> update user set host = '%' where user = 'root';

重启MySQL

[root@centos ~]# systemctl restart mysqld;

Mysql 安装完客户端连接报错:“Authentication plugin ‘caching_sha2_password’ cannot be loaded: ”

意思是客户端不支持caching_sha2_password的加密方式。

这样是不是就可以了呢? 其实并不会,还有一个坑

执行命令

use mysql;
select user,plugin from user ;

可以看到root用户的加密方式为caching_sha2_password

这样的话有两种办法可以解决问题:

一、升级客户端支持caching_sha2_password方式,没有采用。

我使用第二种方法:

二、修改密码加密方式,改成mysql_native_password

# 注意这里’%’是因为我们刚刚把user表中的localhost换成了%

ALTERUSER'root'@'%'IDENTIFIED BY'password'PASSWORD EXPIRE NEVER;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

FLUSH PRIVILEGES;

 

# 查看一下现在的user表

select host, user, authentication_string, plugin from user;

可以看到plugin那我们已经换过来了

现在就可以正常的使用小海豚或者navicat Premium登录了

Nginx开启Gzip详解

1. Nginx开启Gzip

Nginx实现资源压缩的原理是通过ngx_http_gzip_module模块拦截请求,并对需要做gzip的类型做gzip,ngx_http_gzip_module是Nginx默认集成的,不需要重新编译,直接开启即可。

1.1 配置说明

Nginx开启Gzip的配置如下:

# $gzip_ratio计算请求的压缩率,$body_bytes_sent请求体大小
    log_format  main  '$remote_addr - $remote_user [$time_local] "$host" - "$request" '
                    '$gzip_ratio - $body_bytes_sent - $request_time';


    access_log  logs/access.log  main;

    # 开启gzip
    gzip off;

    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;

    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
    gzip_comp_level 1;

    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;

    # 禁用IE 6 gzip
    gzip_disable "MSIE [1-6]\.";

    # 设置压缩所需要的缓冲区大小     
    gzip_buffers 32 4k;

    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.0;

下面将逐条介绍下gzip的指令和参数配置。

1.2 参数详解

gzip on

这个没的说,打开或关闭gzip

SSyntax: gzip on | off;
Default:    
gzip off;
Context:    http, server, location, if in location

gzip_buffers

设置用于处理请求压缩的缓冲区数量和大小。比如32 4K表示按照内存页(one memory page)大小以4K为单位(即一个系统中内存页为4K),申请32倍的内存空间。建议此项不设置,使用默认值。

Syntax: gzip_buffers number size;
Default:    
gzip_buffers 32 4k|16 8k;
Context:    http, server, location

gzip_comp_level

设置gzip压缩级别,级别越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大

Syntax: gzip_comp_level level;
Default:    
gzip_comp_level 1;
Context:    http, server, location

我们以一个大小为92.6K的脚本文件为例,如下所示。其中最后三个数值分别表示压缩比、包大小、平均处理时间(使用ab压测,100用户并发下, ./ab -n 10000 -c 100 -H 'Accept-Encoding: gzip' http://10.27.180.75/jquery.js)以及CPU消耗。

从这我们可以得出结论:

  1. 随着压缩级别的升高,压缩比有所提高,但到了级别6后,很难再提高;
  2. 随着压缩级别的升高,处理时间明显变慢;
  3. gzip很消耗cpu的性能,高并发情况下cpu达到100%

因此,建议:
一方面,不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。
另一方面,压缩一定要和静态资源缓存相结合,缓存压缩后的版本,否则每次都压缩高负载下服务器肯定吃不住。

http://10.27.180.75/jquery.js 
gzip_comp_level 0: 0,94840, 63 [ms], 29%
gzip_comp_level 1: 2.43,39005, 248 [ms], 100%
gzip_comp_level 2: 2.51,37743, 273 [ms], 100%
gzip_comp_level 3; 2.57,36849, 327 [ms], 100%
gzip_comp_level 4; 2.73,34807, 370 [ms], 100%
gzip_comp_level 5; 2.80,33898, 491 [ms], 100%
gzip_comp_level 6; 2.82,33686, 604 [ms], 100%
gzip_comp_level 7; 2.82,33626, 659 [ms], 100%
gzip_comp_level 8; 2.82,33626, 698 [ms], 100%
gzip_comp_level 9; 2.82,33626, 698 [ms], 100%

gzip_disable

通过表达式,表明哪些UA头不使用gzip压缩

Syntax: gzip_disable regex ...;
Default:    —
Context:    http, server, location
This directive appeared in version 0.6.23.

gzip_min_length

当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。

Syntax: gzip_min_length length;
Default:    
gzip_min_length 20;
Context:    http, server, location

gzip_http_version

用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。

Syntax: gzip_http_version 1.0 | 1.1;
Default:    
gzip_http_version 1.1;
Context:    http, server, location

我看网上的很多文章中,对这一点都觉得过时了,因为浏览器基本上都支持HTTP/1.1。然而这里面却存在着一个很容易掉入的坑,也是笔者从生产环境中一个诡异问题中发现的:
问题背景:
笔者所在公司的静态资源服务器全部使用的Nginx,且都开启了gzip压缩。内部测试是完全正常的,然而一到外网,居然没有做gzip!

原因定位:
为什么这样呢?
在应用服务器前,公司还有一层Nginx的集群作为七层负责均衡,在这一层上,是没有开启gzip的。
如果我们使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间默认是用HTTP/1.0协议通信的。
如果我们的Cache Server也是nginx,而前端的nginx没有开启gzip。
同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进行gzip压缩。

我相信,以后还有人会入坑,比如你用Apache ab做压测,如果不是设置gzip_http_version为1.0,你也压不出gzip的效果(同样的道理)。希望写在这里对大家有帮助

gzip_proxied

Nginx做为反向代理的时候启用:

  • off – 关闭所有的代理结果数据压缩
  • expired – 如果header中包含”Expires”头信息,启用压缩
  • no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
  • no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
  • private – 如果header中包含”Cache-Control:private”头信息,启用压缩
  • no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
  • no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
  • auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
  • any – 无条件压缩所有结果数据
Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
Default:    
gzip_proxied off;
Context:    http, server, location

gzip_types

设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩

Syntax: gzip_types mime-type ...;
Default:    
gzip_types text/html;
Context:    http, server, location

这里需要说明一些特殊的类型,比如笔者公司会使用”字体类型”的资源,而这些资源类型往往会被忽略,且这些资源又比较大,没有被压缩很不合算。(可以参考:http://www.darrenfang.com/2015/01/setting-up-http-cache-and-gzip-with-nginx/):

所以MIME-TYPE中应该新增字体类型:

字体类型扩展名 Content-type
.eot application/vnd.ms-fontobject
.ttf font/ttf
.otf font/opentype
.woff font/x-woff
.svg image/svg+xml

gzip_vary

增加响应头”Vary: Accept-Encoding”

Syntax: gzip_vary on | off;
Default:    
gzip_vary off;
Context:    http, server, location

关于CentOS7下swap分区创建(添加),删除以及相关配置

小叨下背景:笔者的服务器内存只有1g,少得可怜。之前使用apache,不堪忍受其过量的内存消耗,网站卡得想哭,数据库也不断地崩,无奈投入nginx的怀抱并且已经喜欢上了nginx。

Linux 将物理内存分为内存段,叫做页面。交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放对于页面的内存。物理内存和交换空间的总大小是可用的虚拟内存的总量。

Swap即:交换分区,类似于Windows的虚拟内存,但物理内存不足时,把部分硬盘空间当成虚拟内存使用,从而解决了物理内存容量不足。

优点:节省成本。缺点:性能不足。

这两天我那谁一直在折腾RedHat安装Oracle数据,该数据库有一项要求就是需要一定空间的swap分区。虽然早有耳闻swap分区,而且笔者经常折腾windows下的虚拟内存(swap和虚拟内存是类似概念),却很惭愧一直没想到这个办法,于是——进入今天的主题:

此方法不局限于Centos 7,Linux系统均可使用。

操作用户:root。

在添加swap分区之前我们可以了解下当前系统swap是否存在以及使用情况,可用:

free-h 或 swapon -s

了解硬盘使用情况(一般/dev/vda1为挂载硬盘):

df -hal

1.添加swap交换分区空间

dd命令

编辑dd是Linux/UNIX下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

确定硬盘的最佳块大小:

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

使用dd命令创建swap交换分区文件/dev/mapper/swap,大小为2G:

[root@vultr mapper]# dd if=/dev/zero of=/dev/mapper/swap bs=4096 count=512000

512000+0 records in
512000+0 records out
2097152000 bytes (2.1 GB) copied, 2.83708 s, 739 MB/s

[root@vultr mapper]#

格式化swap分区:

[root@vultr mapper]# mkswap /dev/mapper/swap

Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=89015f83-f9ac-4a94-be51-6a6fb903ca4d

设置交换分区:

[root@vultr mapper]# mkswap -f /dev/mapper/swap

mkswap: /dev/mapper/swap: warning: wiping old swap signature.
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=be57a113-1838-4537-b0ef-d3c427f8295e

激活swap分区:

[root@vultr mapper]# swapon /dev/mapper/swap

swapon: /swap: insecure permissions 0644, 0600 suggested.

执行以上命令可能会出现:“不安全的权限0644,建议使用0600”类似提示,不要紧张,实际上已经激活了,可以忽略提示,也可以听从系统的建议修改下权限:

chmod -R 0600 /dev/mapper/swap

设为开机自动启用:

$ vim /etc/fstab

在该文件底部添加如下内容:

/dev/mapper/swap swap swap default 0 0

或直接对fstab进行echo追加:

echo “/dev/mapper/swapswap swap defaults 0 0”>> /etc/fstab

大功告成!

Centos7下增加swap分区大小

如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的,通常Swap空间的大小应是物理内存的2-2.5倍.

此方法不限于centos,linux均适用

以下命令均需在root帐号下操作

1.先用free -m查看一下swap的大小

2. 使用dd命令创建/home/swap这么一个分区文件。文件的大小是512000个block,一般情况下1个block为1K,所以这里空间是512M。

#dd if=/dev/zero of=/dev/mapper/swap bs=1024 count=512000

3.接着再把这个分区变成swap分区。

#/sbin/mkswap /dev/mapper/swap

4.再接着使用这个swap分区。使其成为有效状态。

#/sbin/swapon /dev/mapper/swap

现在再用free -m命令查看一下内存和swap分区大小,就发现增加了512M的空间了。

删除某swap分区

先停止正在使用swap分区:

swapoff /dev/mapper/swap

删除swap分区文件

rm -rf /dev/mapper/swap

删除或注释掉我们之前在fstab文件里追加的开机自动挂载配置内容:/dev/mapper/swapswap swap defaults 0 0
3.更改Swap配置(进阶级)
swappiness值(0-100),系统对swap分区的依赖程度,越高则越倾向于使用swap分区。当然,高度依赖swap会造成物理内存远未使用完,就使用swap分区,我们知道swap分区性能远不如物理内存,这反而降低了系统性能,违背了我们创建swap分区的初衷。我们希望在物理内存即将满荷时再使用swap,这就决定了swappiness值一般为10-60为宜,固态硬盘可以偏高些。查看当前的swappiness数值:

cat /proc/sys/vm/swappiness

修改swappiness值,这里以50为例。

sysctl vm.swappiness=50

若希望vm.swappiness=50永久生效,则需要修改sysctl配置文件,直接echo追加配置内容,重启系统后即可生效:

echo “vm.swappiness = 50”>> /etc/sysctl.conf