1. 概述
官网:https://www.mysql.com/
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,MySQL是最流行的关系型数据库管理系统之一,在 WEB
应用方面,MySQL是最好的RDBMS (Relational Database Management
System,关系数据库管理系统)应用软件之一。它最初由瑞典MySQL AB公司开发,后来被Sun Microsystems收购。 2009年被Oracle公司收购,属于 Oracle
旗下产品。MySQL的版本分为社区版和企业版。社区版是完全免费的,但不提供官方技术支持。
本文重点讲述版本为Mysql版本mysql-community-5.7.43版本,5.7版本基于mysql最稳定版本,选择5.7.43版本,后面会讲述选择该版本原因。
2. 版本选择
MySQL社区版本,从5.0~8.0版本演变,中间经历不少漏洞修复和版本升级。 直到最新版本升级到Mysql8.x。
本文未采用Mysql8版本,而是采用基于mysql 5.7版本为研发版本、相对稳定。 刚开始选择mysql社区版本5.7.30,
即mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar
通过专业漏洞软件扫描,出现以下数据库漏洞,通过软件升级和打补丁方式来解决。
漏洞名称 漏洞等级
Oracle MySQL 输入验证错误漏洞CVE-2022-21417 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21454 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21427 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21245 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21344 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21270 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21367 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21304 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21303 中危
Oracle MySQL Server 安全漏洞CVE-2020-2780 中危
Oracle MySQL Server 安全漏洞CVE-2020-2812 中危
Oracle MySQL Server 安全漏洞CVE-2020-14568 中危
Oracle MySQL Server 安全漏洞CVE-2020-14663 中危
Oracle MySQL Server 安全漏洞CVE-2020-14697 中危
Oracle MySQL Server 安全漏洞CVE-2020-14678 中危
Oracle MySQL Server 安全漏洞CVE-2020-14591 中危
Oracle MySQL Server Server:Optimizer组件安全漏洞CVE-2020-14680 中危
Oracle MySQL Server 安全漏洞CVE-2020-14539 中危
Oracle MySQL Server 安全漏洞CVE-2020-14576 中危
Oracle MySQL Server 安全漏洞CVE-2020-14619 中危
Oracle MySQL Server 安全漏洞CVE-2020-14643 中危
Oracle MySQL Server 安全漏洞CVE-2020-14651 中危
Oracle MySQL Server 安全漏洞CVE-2020-14624 中危
Oracle MySQL Server 安全漏洞CVE-2020-14623 中危
Oracle MySQL Server 安全漏洞CVE-2020-14540 中危
Oracle MySQL Server 安全漏洞CVE-2020-14575 中危
Oracle MySQL Server 安全漏洞CVE-2020-14656 中危
Oracle MySQL Server 安全漏洞CVE-2020-14620 中危
Oracle MySQL Server 安全漏洞CVE-2020-14614 中危
Oracle MySQL Server 安全漏洞CVE-2020-14547 中危
Oracle MySQL Server 安全漏洞CVE-2020-14597 中危
Oracle MySQL Server 安全漏洞CVE-2020-14654 中危
Oracle MySQL Server 安全漏洞CVE-2020-14567 中危
Oracle MySQL Server 安全漏洞CVE-2020-14632 中危
Oracle MySQL Server 安全漏洞CVE-2020-14631 中危
Oracle MySQL Server 安全漏洞CVE-2020-14586 中危
Oracle MySQL Server 安全漏洞CVE-2020-14702 中危
Oracle MySQL Server 安全漏洞CVE-2020-14641 中危
Oracle MySQL Server 安全漏洞CVE-2020-14559 中危
Oracle MySQL Server 安全漏洞CVE-2020-14553 中危
Oracle MySQL Server 安全漏洞CVE-2020-14633 中危
Oracle MySQL Server 安全漏洞CVE-2020-14634 中危
Oracle MySQL Server 安全漏洞CVE-2020-2761 中危
Oracle MySQL Server 安全漏洞CVE-2020-2759 中危
Oracle MySQL Server 安全漏洞CVE-2020-2763 中危
Oracle MySQL Server 安全漏洞CVE-2020-2770 中危
Oracle MySQL Server 安全漏洞CVE-2020-2765 中危
Oracle MySQL Server 安全漏洞CVE-2020-2774 中危
Oracle MySQL Server 安全漏洞CVE-2020-2780 中危
Oracle MySQL Server 安全漏洞CVE-2020-2804 中危
Oracle MySQL Server 安全漏洞CVE-2020-2814 中危
Oracle MySQL Server 安全漏洞CVE-2020-2853 中危
Oracle MySQL Server 安全漏洞CVE-2020-2892 中危
Oracle MySQL Server 安全漏洞CVE-2020-2893 中危
Oracle MySQL Server 安全漏洞CVE-2020-2895 中危
Oracle MySQL Server 安全漏洞CVE-2020-2896 中危
Oracle MySQL Server 安全漏洞CVE-2020-2897 中危
Oracle MySQL Server 安全漏洞CVE-2020-2901 中危
Oracle MySQL Server 安全漏洞CVE-2020-2898 中危
Oracle MySQL Server 安全漏洞CVE-2020-2903 中危
Oracle MySQL Server 安全漏洞CVE-2020-2904 中危
Oracle MySQL Server 安全漏洞CVE-2020-2924 中危
Oracle MySQL Server 安全漏洞CVE-2020-2923 中危
Oracle MySQL Server 安全漏洞CVE-2020-2925 中危
Oracle MySQL Server 安全漏洞CVE-2020-2580 中危
Oracle MySQL Server 安全漏洞CVE-2020-2679 中危
Oracle MySQL Server 安全漏洞CVE-2020-2572 中危
Oracle MySQL Server 安全漏洞CVE-2020-2577 中危
Oracle MySQL Server 安全漏洞CVE-2020-2579 中危
Oracle MySQL Server 安全漏洞CVE-2020-2588 中危
Oracle MySQL Server 安全漏洞CVE-2020-2589 中危
Oracle MySQL Server 安全漏洞CVE-2020-2627 中危
Oracle MySQL Server 安全漏洞CVE-2020-2660 中危
Oracle MySQL Server 安全漏洞CVE-2020-2686 中危
Oracle MySQL Server 安全漏洞CVE-2019-3011 中危
Oracle MySQL Server 安全漏洞CVE-2019-2963 中危
Oracle MySQL Server 安全漏洞CVE-2019-2950 中危
Oracle MySQL Server 安全漏洞CVE-2019-2957 中危
Oracle MySQL Server 安全漏洞CVE-2019-2966 中危
Oracle MySQL Server 安全漏洞CVE-2019-2968 中危
Oracle MySQL Server 安全漏洞CVE-2019-2967 中危
Oracle MySQL MySQL Server 安全漏洞CVE-2019-2982 中危
Oracle MySQL MySQL Server 安全漏洞CVE-2019-2991 中危
Oracle MySQL MySQL Server 安全漏洞CVE-2019-3009 中危
Oracle MySQL Server 安全漏洞CVE-2019-2997 中危
Oracle MySQL Server 安全漏洞CVE-2019-3004 中危
Oracle MySQL MySQL Server 安全漏洞CVE-2019-2998 中危
Oracle MySQL Server 安全漏洞CVE-2019-3003 中危
Oracle MySQL Server 安全漏洞(CVE-2019-2530)CVE-2019-2530 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21515 中危
Oracle MySQL 安全漏洞CVE-2022-21589 中危
Oracle MySQL 安全漏洞CVE-2022-21592 中危
Oracle MySQL 安全漏洞CVE-2022-21617 中危
Oracle MySQL 安全漏洞CVE-2022-21617 中危
Oracle MySQL 安全漏洞CVE-2022-21595 中危
Oracle MySQL 输入验证错误漏洞CVE-2022-21451 低危
Oracle MySQL 输入验证错误漏洞CVE-2022-21460 低危
Oracle MySQL 输入验证错误漏洞CVE-2022-21444 低危
Oracle MySQL Server 安全漏洞CVE-2020-2752 低危
Oracle MySQL Server 安全漏洞CVE-2020-14550 低危
Oracle MySQL Server 安全漏洞CVE-2020-2752 低危
Oracle MySQL Server 安全漏洞CVE-2020-2921 低危
Oracle MySQL Server 安全漏洞CVE-2020-2926 低危
Oracle MySQL Server 安全漏洞CVE-2020-2930 低危
Oracle MySQL Server 安全漏洞CVE-2020-2584 低危
Oracle MySQL Server 安全漏洞CVE-2020-2694 低危
Oracle MySQL MySQL Server 输入验证错误漏洞CVE-2019-3018 低危
最终解决办法:升级版本为mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar
3. 下载与卸载
3.1 下载
步骤1: 输入https://dev.mysql.com/downloads/, 点击红色标签。
步骤2:点击Archives(档案库)
步骤3:选择版本
产品版本:5.7.43
操作系统:Red Had企业Linux/Oracle Linux
系统版本:Linux7/X86,64-bit
#命令行下载:
[root@localhost software]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar
3.2 卸载
- 查询是否安装
[root@localhost software]# ps -ef | grep mysql
[root@localhost software]# whereis mysql
[root@localhost software]# rpm -qa|grep -i mysql
[root@localhost software]# netstat -anp | grep 3306
[root@localhost software]# find / -name mysql
- 服务配置命令
#停止服务
[root@localhost software]# systemctl stop mysqld
#启动服务
[root@localhost software]# systemctl start mysqld
#服务状态
[root@localhost software]# systemctl status mysqld
#重启服务
[root@localhost software]# systemctl restart mysqld
#设置开启自启动
[root@localhost software]# systemctl enable mysqld
#重新导入设置
[root@localhost software]# systemctl daemon-reload
- 卸载服务
#本文采用Rpm安装方式,这里只讲述Rpm卸载Mysql
#rpm查找mysql安装
[root@localhost software]# rpm -qa|grep -i mysql
mysql-community-client-5.7.43-1.el7.x86_64
mysql-community-server-5.7.43-1.el7.x86_64
mysql-community-common-5.7.43-1.el7.x86_64
mysql-community-libs-5.7.43-1.el7.x86_64
#依次执行命令卸载服务
[root@localhost software]#
rpm -ev mysql-community-server-5.7.43-1.el7.x86_64 --nodeps
rpm -ev mysql-community-client-5.7.43-1.el7.x86_64 --nodeps
rpm -ev mysql-community-common-5.7.43-1.el7.x86_64 --nodeps
rpm -ev mysql-community-libs-5.7.43-1.el7.x86_64 --nodeps
#删除其他配置文件
[root@localhost software]# find / -name mysql
[root@localhost software]# rm -rf /var/lib/mysql
[root@localhost software]# rm -rf /var/lib/mysql/mysql
[root@localhost software]# rm -rf /usr/share/mysql
[root@localhost software]# rm -rf /etc/my.cnf.*
4. 安装
- 步骤1:复制安装包
#创建解压目录
[root@localhost local]# mkdir mysql-5.7.43
#复制安装包至目录
[root@localhost local]# cp /home/sqyr/software/mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar /home/sqyr/local/mysql-5.7.43
- 步骤2:解压安装包
#解压安装包
[root@localhost mysql-5.7.43]# tar -xvf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar
#删除源安装包
[root@localhost mysql-5.7.43]# rm -rf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar
- 步骤3:依次执行安装
[root@localhost mysql-5.7.43]# rpm -ivh mysql-community-common-5.7.43-1.el7.x86_64.rpm
[root@localhost mysql-5.7.43]# rpm -ivh mysql-community-libs-5.7.43-1.el7.x86_64.rpm
[root@localhost mysql-5.7.43]# rpm -ivh mysql-community-client-5.7.43-1.el7.x86_64.rpm
[root@localhost mysql-5.7.43]# rpm -ivh mysql-community-server-5.7.43-1.el7.x86_64.rpm
[root@localhost mysql-5.7.43]# rpm -qa|grep -i mysql
5. mysql优化及配置
- 步骤1:配置默认my.cnf
[root@localhost etc]# vi my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
[mysqld]
#注释默认配置datadir和scoket
#datadir=/var/lib/mysqlk
#socket=/var/lib/mysql/mysql.sock
#基础目录
basedir=/home/sqyr/local/mysql-5.7.43/install/data/mysql
#数据目录
datadir=/home/sqyr/local/mysql-5.7.43/install/data/mysql/data
#通讯链接文件
socket=/home/sqyr/local/mysql-5.7.43/install/data/mysql/mysql.scok
#端口号
port=3306
#绑定地址
bind-address=0.0.0.0
#符号链接
skip-name-resolve
#默认采用InnoDB存储引擎
default-storage-engine=INNODB
#调整innodb_buffer_pool_size大小,如果是单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的50% ~ 70%左右;
innodb_buffer_pool_size=512M
#如果要求数据不能丢失,为了数据安全,那么两个都设为1。
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#使用独立表空间
innodb_file_per_table=1
innodb_buffer_pool_size=128M
#默认编码
character-set-server=utf8
#设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;
innodb_log_file_size=500M
innodb_log_files_in_group=2
innodb_open_files=2048
#千万不要用默认的10M,否则在有高并发事务时,会受到不小的影响
#innodb_data_file_path=ibdata1:12m;ibdata2:1g:autoextend
#时间格式
explicit_defaults_for_timestamp=true
#服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上
max_connections=1024
#阻止过多尝试失败的客户端,如果值为10时,失败(如密码错误)10次,mysql会无条件阻止用户连接
max_connect_errors=10000
#索引块的缓冲区大默认16M
key_buffer_size=128M
#消息缓冲区会用到该列,该值太小则会在处理大包时产生错误。如果使用大的text,BLOB列,必须增加该值
max_allowed_packet=512M
#数据读取超时时间、数据库写超时时间
net_read_timeout=10800
net_write_timeout=10800
#是MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段,如果不能,可以尝试增加sort_buffer_size变量的大小
sort_buffer_size=4M
#若果多表连接需求大,则这个值要设置大一点
join_buffer_size=6M
#读缓冲区大小
read_buffer_size=4M
read_rnd_buffer_size=8M
#决定是否缓存查询结果。这个变量有三个取值:0,1,2,分别代表了off、on、demand。
query_cache_type=0
#在高并发,写入量大的系统,建义把该功能禁掉
query_cache_size=64M
#指定单个查询能够使用的缓冲区大小,缺省为1M
query_cache_limit=32M
#表描述符缓存大小,可减少文件打开/关闭次数,一般max_connections*2。
table_open_cache=2048
table_definition_cache=2048
#设置临时表最大值,不要设置过大,否则容易导致OOM发生
tmp_table_size=64M
max_heap_table_size=128M
open_files_limit=10240
innodb_open_files=10240
#跳过指定error no类型的错误
slave-skip-errors=1114
#表名字忽略大小写
lower_case_table_names=1
#请求等待时长,默认28800秒,即8小时。调整为1天
wait_timeout=86400
interactive_timeout=86400
#优化mysql的线程缓存,服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量
thread_cache_size=50
#开启慢日志查询
slow_query_log=ON
#慢查询的阈值为5秒
long_query_time=5
#输出慢日志文件
slow_query_log_file=/home/sqyr/local/mysql-5.7.43/install/data/mysql/data/mysql-slow.log
#一般有两种形式,FILE和TABLE,默认FILE; TABLE时mysql库的slow_log表中
log_output=TABLE
#控制binlog日志文件保留时间,超过时间会删除
expire_logs_days=7
#符号连接的使用被禁用
symbolic-links=0
#用来缓存批量插入数据的时候临时缓存写入数据。如果有大量数据插入可提高此参数值,默认是8M
bulk_insert_buffer_size=64M
#MyISAM设置恢复表之时使用的缓冲区的尺寸,默认为8M,最小值4k。当在REPAIR TABLE 或用 CREATE INDEX 创建索引或ALTER TABLE过程中对MyISAM索引排序时分配的缓冲区
myisam_sort_buffer_size=64M
#注释默认log-error和pid-file
#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
log-error=/home/sqyr/local/mysql-5.7.43/install/data/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
[client]
socket=/home/sqyr/local/mysql-5.7.43/install/data/mysql/mysql.scok
default-character-set=utf8
[mysql]
socket=/home/sqyr/local/mysql-5.7.43/install/data/mysql/mysql.scok
default-character-set=utf8
- 步骤2:创建对应目录
#切换目录
[root@localhost mysql-5.7.43]# cd /home/sqyr/local/mysql-5.7.43/
#级联创建目录
[root@localhost mysql-5.7.43]# mkdir -p install/data/mysql
[root@localhost mysql-5.7.43]# mkdir -p /home/sqyr/local/mysql-5.7.43/install/data/mysql/share/mysql/english
#创建日志文件
[root@localhost mysql-5.7.43]# touch /home/sqyr/local/mysql-5.7.43/install/data/mysql/mysqld.log
[root@localhost mysql-5.7.43]# cd /home/sqyr/local/mysql-5.7.43/install/data/mysql/
[root@localhost mysql-5.7.43]# chmod 775 mysqld.log
#执行初始化命令【出现如下错误】
[root@localhost mysql-5.7.43]# mysqld --defaults-file=/etc/my.cnf --basedir=/home/sqyr/local/mysql-5.7.43/install/data/mysql --datadir=/home/sqyr/local/mysql-5.7.43/install/data/mysql/data --lc-messages-dir=/home/sqyr/local/mysql-5.7.43/install/data/mysql/share/mysql/english --user=mysql –initialize
#错误1 (Errcode: 13 - Permission denied) 说权限不足, 对应切换到目录, 核查发现只有家目录权限。
mysqld: Can’t change dir to ‘/home/sqyr/local/mysql-5.7.43/install/data/mysql/data/’ (Errcode: 13 - Permission denied)
[root@localhost home]# ll -h
total 4.0K
drwx------. 18 sqyr sqyr 4.0K Mar 21 23:25 sqyr
#设置目录权限,解决错误1
[root@localhost home]# chmod 775 /home/sqyr/
#错误2 (Errcode: 13 - Permission denied) [ERROR]
Can’t find error-message file’/home/sqyr/local/mysql-5.7.43/install/data/mysql/share/mysql/english/errmsg.sys’. Check error-message file location and ‘lc-messages-dir’ configuration directive.
#查找错误文件
[root@localhost home]# find / -name errmsg.sys
#复制查找文件到对应目录
[root@localhost home]#
cp /usr/share/mysql/english/errmsg.sys /home/sqyr/local/mysql-5.7.43/install/data/mysql/share/mysql/english/
#赋值权限,再次执行初始化命令
[root@localhost mysql]# chomd -R mysql:mysql /home/sqyr/local/mysql-5.7.43
[root@localhost mysql]# chmod -R 775 /home/sqyr/local/mysql-5.7.43
# SELINUX配置成
[root@localhost data]# vim /etc/selinux/config
SELINUX=disabled
#再次执行初始化命令【执行初始化成功】
[root@localhost mysql-5.7.43]# mysqld --defaults-file=/etc/my.cnf --basedir=/home/sqyr/local/mysql-5.7.43/install/data/mysql --datadir=/home/sqyr/local/mysql-5.7.43/install/data/mysql/data --lc-messages-dir=/home/sqyr/local/mysql-5.7.43/install/data/mysql/share/mysql/english --user=mysql –initialize
#查看初始化默认密码
[root@localhost mysql]# tail -f /home/sqyr/local/mysql-5.7.43/install/data/mysql/mysqld.log
#启动mysql服务
[root@localhost mysql]# systemctl start mysqld
#采用默认密码登录
[root@localhost mysql]# mysql -u root -p
#修改root默认密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '********';
#设置root用户权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '********' WITH GRANT OPTION;
#查看firewall防火墙状态
systemctl status firewalld
#添加3306端口
firewall-cmd --permanent --add-port=3306/tcp
#重启firewal防火墙
firewall -cmd –reload
#查看firewall防火墙开放端口
firewall-cmd --list-ports
#打开/关闭/禁用firewall防火墙
systemctl [start|stop|disable]firewalld.service
6. 设置自启动
#手动启动命令行
systemctl [status|start|stop|restat] mysqld
#自启动设置
[root@localhost init.d]# systemctl enable mysqld.service
[root@localhost init.d]# systemctl list-unit-files | grep mysqld.service
#重启
[root@localhost init.d]# reboot
#查询启动进程
[root@localhost software]# ps -ef | grep mysql
mysql 2775 1 0 04:44 ? 00:00:05 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
#查找3306端口
[root@localhost software]# netstat -anp | grep 3306
[root@localhost software]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 2775 mysql 30u IPv4 39152 0t0 TCP *:mysql (LISTEN)