CentOS8安装mysql8.0具体步骤
操作系统:CentOS Linux release 8.0及以上
Mysql版本:Mysql 8.0.22 x86_64 (MySQL Community Server - GPL)
Mysql8下载地址:MySQL :: Download MySQL Community Server
Oracle官网下载很慢,国内镜像:Index of /mysql/MySQL-8.0/
下载以下几个包就可以
一、首先检查服务器上是否安装有mysql
1、查看mysql安装版本
rpm -qa|grep -i mysql
如果没有输入就可以跳过直接看安装,有输出的话继续
2、mysql卸载
彻底清除服务器上所有相关Mysql文件
主要分为三步:
1.卸载已安装的mysql程序;
# 查看已安装的mysql程序
shell> rpm -qa | grep -i mysql
mysql-errmsg-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
mysql-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
mysql-common-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
mysql-server-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
# 按照查询结果一一删除,可能会有顺序要求,因为部分文件存在依赖关系
shell> rpm -ev mysql-server-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
shell> rpm -ev mysql-errmsg-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
shell> rpm -ev mysql-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
shell> rpm -ev mysql-common-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
# rpm -qa | grep -i mariadb(删除centos默认系统自带的)
shell> rpm -qa | grep -i mariadb
shell> rpm -ev mariadb-connector-c-config-3.0.7-1.el8.noarch
2.删除相关的文件夹;
# 查看对应的MySQL目录
find / -user mysql
find / -name mysql
# 结果:
/var/lib/docker/volumes/wp_db_data/_data/mysql
/var/lib/docker/volumes/94f2988e2ff63103c8c14f2bd69df6a4579e16bc2e5fd364b366878cd1e2fdc3/_data/mysql
... ...
# 删除对应目录文件[和docker有关的不删,那是另外的东西]:
rm -rf /var/log/mysql
rm -rf /usr/share/selinux/packages/mysql
rm -rf /lanblue/conf/mysql
... ...
3.删除my.cnf文件。
# 最后删除配置文件
shell> rm -rf /etc/my.cnf
二、安装mysql
将刚刚下载的4个文件上传到服务器中的文件夹下 (可以在/home/Mysql8路径下创建存放)
RPM包简介
mysql-community-server 数据库服务端与相关工具
mysql-community-client MySQL客户端
mysql-community-common 服务端和客户端常用库文件
mysql-community-devel 客户端开发用的头文件及库(非必须)
mysql-community-libs MySQL数据库客户端共享库
mysql-community-libs-compat 兼容老版本的共享库(非必须)
mysql-community-embedded MySQL嵌入式版本(非必须)
mysql-commercial-embedded-devel 嵌入式版本的头文件与库(非必须)
mysql-community-test MySQL测试套件(非必须)
1.依次进行安装解压后会生成四个rpm包(注意:--force --nodeps为不检查依赖关系,强制安装,一定要带上否则容易失败)
rpm -ivh mysql-community-common-8.0.22-1.el8.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-8.0.22-1.el8.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-8.0.22-1.el8.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-8.0.22-1.el8.x86_64.rpm --force --nodeps
2.检查是否全部安装成功
rpm -aq|grep mysql
3.初始化密码设计,并生成随机密码,方便初次进行密码设置:
注:两个命令选一个执行,第一个不设置区分大小,第二设置了是否区分大小写。
如果不小心执行了第一个再执行第一个命令是无效的,需要将存储所有数据库的文件删除默认在/var/lib/mysql/,删除后重新执行
mysqld --initialize //会在/var/log/mysqld.log生成随机密码
mysqld --initialize --user=mysql --lower-case-table-names=1 // 初始化时设置不区分大小写(win默认1-不缺分,mac默认2-部分区分,linux默认0-全部区分)
4.改变属主
chown -R mysql:mysql /var/lib/mysql/
5.配置my.cnf
mysql安装完成后千万不要直接启动,先编辑my.cnf 配置好数据存储路径和忽略大小写,8.0大小写在第一次初始化启动之后,无法再设置忽略大小写配置
my.cnf 添加配置 lower_case_table_names=1
[mysqld]
port = 3306
# MySQL监听端口
socket = /usr/local/mysql/data/mysql.sock
# 为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
pid-file = /usr/local/mysql/data/mysql.pid
# pid文件所在目录
basedir = /usr/local/mysql
# 使用该目录作为根目录(安装目录)
datadir = /usr/local/mysql/database
# 数据文件存放的目录
tmpdir = /usr/local/mysql/data/tmp
# MySQL存放临时文件的目录
character_set_server = utf8mb4
# 服务端默认编码(数据库级别)
collation_server = utf8mb4_bin
# 服务端默认的比对规则,排序规则
user = root
# MySQL启动用户。如果是root用户就配置root,mysql用户就配置mysql
log-error=/usr/local/mysql/data/error.log
# 错误日志配置文件(configure file)
secure-file-priv = null
log_bin_trust_function_creators = 1
# 开启了binlog后,必须设置这个值为1,主要是考虑binlog安全。此变量适用于启用二进制日志记录的情况。它控制是否可以信任存储函数创建者,而不是创建将导致要写入二进制日志的不安全事件。如果设置为0(默认值),则不允许用户创建或更改存储函数,除非用户具有除创建例程或更改例程特权之外的特权
performance_schema = 0
# 性能优化的引擎,默认关闭
# ft_min_word_len = 1
# 开启全文索引
# myisam_recover
# 自动修复MySQL的myisam表
explicit_defaults_for_timestamp
# 明确时间戳默认null方式
event_scheduler
# 计划任务(事件调度器)
skip-external-locking
# 以避免外部锁定,该选项默认开启。用于多进程条件下为MyISAM数据表进行锁定。
skip-name-resolve
# 跳过客户端域名解析;当新的客户连接mysqld时,mysqld创建一个新的线程来处理请求。该线程先检查是否主机名在主机名缓存中。如果不在,线程试图解析主机名。
#使用这一选项以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
# bind-address=localhost # MySQL绑定IP
# 1.这个bind-address强烈推荐不配置。
# 2.如果要配置bind-address的话,这个localhost不能修改,否则在初始化数据库(执行/opt/cloudera/cm/schema/scm_prepare_database.sh mysql cm cm password)时便会报错。如果配置了localhost的话,那么在CDH的安装页面中,配置连接数据库的主机名称必须为localhost
# 3.强烈不推荐写bind-address=xxx,那么后面的CDH安装对应的组件时要填写的“数据库主机名称”默认使用主机名。
# 4.如果/etc/my.cnf中配置了bind-address=localhost 的话,那么在CDH的安装页面中,配置连接数据库的主机名称必须为localhost。缺点:但是在安装hue时,“数据库主机名称”并无法使用localhost或任何主机名,所以造成无法安装hue
# 5.不配置 bind-address=localhost 的话,则使用主机名(NDOE1)作为此处的数据库主机名称。
skip-slave-start
# 为了安全起见,复制环境的数据库还是设置--skip-slave-start参数,防止复制随着mysql启动而自动启动
slave_net_timeout = 30
# 在中止读取之前等待来自主/从连接的更多数据的秒数。 MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。
#Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据。
# 1.用这三个参数来判断主从是否延迟是不准确的:Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master. 还是用pt-heartbeat吧。
# 2.slave_net_timeout不要用默认值,设置一个你能接受的延时时间。
local-infile = 0
# 设定是否支持命令load data local infile。如果指定local关键词,则表明支持从客户主机读文件。
back_log = 1024
# 指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
# back_log 参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
# sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
# sql_mode,定义了mysql应该支持的sql语法,数据校验等!
# NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户。
# NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
key_buffer_size = 32M
# 索引块的缓冲区大小,对MyISAM表性能影响最大的一个参数.决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests 和Key_reads,可以知道key_buffer_size设置是否合理。
max_allowed_packet = 512M
# 一个查询语句包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。
# 该值太小则会在处理大包时产生错误。如果使用大的BLOB列,必须增加该值。
# 这个值来限制server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。
thread_stack = 256K
# 线程缓存;主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。
sort_buffer_size = 16M
# 是MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。
# 如果不能,可以尝试增加sort_buffer_size变量的大小。
read_buffer_size = 16M
# 是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
# 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
join_buffer_size = 16M
# 应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index join),为了减少参与Join的“被驱动表”的
# 读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。
read_rnd_buffer_size = 32M
# 是MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
net_buffer_length = 16K
# 通信缓冲区在查询期间被重置到该大小。通常不要改变该参数值,但是如果内存不足,可以将它设置为查询期望的大小。(即,客户发出的SQL语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)
myisam_sort_buffer_size = 128M
# 当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”
bulk_insert_buffer_size = 32M
# 默认8M,当对MyISAM非空表执行insert … select/ insert … values(…),(…)或者load data infile时,使用树状cache缓存数据,每个thread分配一个;
# 注:当对MyISAM表load 大文件时,调大bulk_insert_buffer_size / myisam_sort_buffer_size / key_buffer_size会极大提升速度
thread_cache_size = 384
# thread_cahe_size线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。
query_cache_size = 0
# 工作原理: 一个SELECT查询在DB中工作后,DB会把该语句缓存下来,当同样的一个SQL再次来到DB里调用时,DB在该表没发生变化的情况下把结果从缓存中返回给Client。
# 在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建系把该功能禁掉。
query_cache_type = 0
# 决定是否缓存查询结果。这个变量有三个取值:0,1,2,分别代表了off、on、demand。
tmp_table_size = 1024M
# 它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)
# 如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下
max_heap_table_size = 512M
# 独立的内存表所允许的最大容量。此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
open_files_limit = 10240
# mysql打开最大文件数
max_connections = 2000
# MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。
# 因此MySQL的实际最大可连接数为max_connections+1;
# 这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;
# 增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
# 该参数设置过小的最明显特征是出现”Too many connections”错误;
max-user-connections = 0
# 用来限制用户资源的,0不限制;对整个服务器的用户限制
max_connect_errors = 100000
# max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
# 当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。
table_open_cache = 5120
# 表描述符缓存大小,可减少文件打开/关闭次数;
interactive_timeout = 86400
# interactive_time -- 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接
wait_timeout = 86400
#wait_timeout -- 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数
binlog_cache_size = 16M
#二进制日志缓冲大小
# InnoDB存储引擎是支持事务的,实现事务需要依赖于日志技术,为了性能,日志编码采用二进制格式。那么,我们如何记日志呢?有日志的时候,就直接写磁盘?
# 可是磁盘的效率是很低的,如果你用过Nginx,,一般Nginx输出access log都是要缓冲输出的。因此,记录二进制日志的时候,我们是否也需要考虑Cache呢?
# 答案是肯定的,但是Cache不是直接持久化,于是面临安全性的问题——因为系统宕机时,Cache中可能有残余的数据没来得及写入磁盘。因此,Cache要权衡,要恰到好处:
#既减少磁盘I/O,满足性能要求;又保证Cache无残留,及时持久化,满足安全要求。
slow_query_log = true
# 开启慢查询
slow_query_log_file = /usr/local/mysql/data/slow_query_log.log
# 慢查询地址
long_query_time = 1
# 超过的时间为1s;MySQL能够记录执行时间超过参数 long_query_time 设置值的SQL语句,默认是不记录的。
log-slow-admin-statements
log-queries-not-using-indexes
# 记录管理语句和没有使用index的查询记录
6.启动Mysql
systemctl start mysqld
CentOS8其他命令
# 启动数据库
systemctl start mysqld
# 关闭数据库
systemctl stop mysqld
# 重启数据库
systemctl restart mysqld
# 查看数据库状态
systemctl status mysqld
# 进入mysql
mysql -u root -p'密码'
7.查看第一次生成的Mysql随机密码
cat /var/log/mysqld.log | grep password (注意不要带空格)
8.
数据库Mysql进行设置
mysql_secure_installation
三、创建账户及远程连接
create user '账户名'@'%' identified by '密码'; //创建账户
grant all on *.* to `账户名`@`%` WITH GRANT OPTION; //给用户赋予所有表权限 并且所有ip可以访问
ALTER USER '用户名'@'%' IDENTIFIED with mysql_native_password by '密码'; //指定的用户名和它的登录主机地址和密码
flush privileges;//刷新权限
1、创建新账户
2、设置权限(新旧账户都可以操作)
grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
with grant option的意思是:权限赋予/取消是关联的
其中"."代表所有资源所有权限, “‘root’@%”其中root代表账户名,%代表所有的访问地址。IDENTIFIED BY ‘密码’,这里换成数据库root用户的密码(可忽略),WITH GRANT OPTION表示允许级联授权。
3、指定登录名、密码、地址(设置旧账户)
'用户名'@'%' 是指定的用户名和它的登录主机,'%'表示任何远程主机。
IDENTIFIED WITH mysql_native_password 指定用户使用的认证插件(在MySQL 5.7.6及更高版本中,默认的认证插件是
caching_sha2_password
)。BY '密码' 是新的密码。
4.刷新权限
5.查看用户表验证是否成功
select user,host from mysql.user;