Anolis OS 8.8 & CentOS8离线安装mysql-8.0.9

下载mysql安装包:
mysql下载地址

在Linux系统中,mysql的安装包除了要区分系统和cpu架构之外,还区分安装方式,下载不同的包,安装方式也完全不一样,安装完成后的效果也完全不一样。

我之前下载的包按照官方安装方式安装后,mysql的运行文件,配置文件,数据文件等等存储在不同的目录,这样对于经常离线操作的我来说,很不方便,迁移起来极为复杂,所以我在习惯上更倾向于安装完成后,是一整块文件夹,方便后期维护管理,这篇文章也是记录安装完成后一整块文件的方式。

下载界面

系统类型选择Linux - Generic,我之前选择的别的,安装完成后,mysql文件就是东一块西一块的,目录还不能自定义,注意根据自己系统情况下载。

特别注意:

如果系统已经安装过mysql了,一定要先清空系统上已经存在的mysql,不然后面在初始化、运行、登录的时候会出现各种错误,并且很不好解决!

除非已经存在的mysql也是一整块文件夹,存放在自定义的目录中,没有放在系统默认目录,这种就不影响。

卸载存在的mysql: 如果数据重要,卸载之前记得备份数据

停止mysql服务:

go 复制代码
sudo systemctl stop mysqld

卸载mysql包:

go 复制代码
sudo dnf remove mysql-server mysql-client

卸载mysql相关组件:

go 复制代码
sudo dnf remove $(dnf list installed | grep mysql | awk '{print $1}')

删除MySQL配置文件:

go 复制代码
sudo rm -f /etc/my.cnf /etc/mysql/my.cnf

删除MySQL数据目录:

go 复制代码
sudo rm -rf /var/lib/mysql

删除MySQL日志文件:

go 复制代码
sudo rm -rf /var/log/mysql

删除MySQL PID文件:

go 复制代码
sudo rm -f /var/run/mysqld/mysqld.pid

删除MySQL套接字文件:

go 复制代码
sudo rm -f /tmp/mysql.sock

删除MySQL临时目录:

go 复制代码
sudo rm -rf /tmp/mysql

清理缓存文件:

go 复制代码
sudo dnf clean all

安装:

安装包上传到服务器指定目录,上传方式就不说了,不同的软件方式都不一样,但方式大差不差,上传目录自定义,无所谓,图方便的话,直接上传到自己想安装的目录。

解压安装包:

go 复制代码
tar -Jxvf mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

解压完成后,想改文件夹名称的可以自定义改一下,随便你怎么改,以我这里为例,我直接改成"mysql"名字。

这个包是免安装的,其实解压完成后,相当于就安装完成了,但是还需要配置一些东西。

进入mysql目录:

go 复制代码
cd mysql

新建tmp、log、etc、data等目录:

tmp目录不是必须的,根据现场情况而定,根据项目程序而定,因为我遇到过类似的问题,如果没有这个文件夹,在程序与mysql交互期间,不定时会出现各种问题,具体啥问题抱歉我也忘了,只是当时找到解决方式就是在mysql根目录创建这个文件夹,并配置在my.cnf配置文件中,久而久之,这个习惯就保留下来了。

go 复制代码
mkdir tmp
mkdir log
mkdir etc
mkdir data

在etc目录中创建my.cnf文件,并复制以下配置:

注意mysql目录根据自己实际情况做更改,用户也根据自己实际情况做更改。

go 复制代码
[client]
port = 3306

#设置socke文件所在目录,必须和mysqld下socket配置一致
socket =  /tmp/mysql.sock
 
[mysqld]
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id = 1
 
#服务端口号 默认3306
port = 3306

#用户
user = user

#允许访问的IP网段
bind-address = 0.0.0.0

#设置socke文件所在目录,必须和client下socket配置一致
socket =  /tmp/mysql.sock

# MySQL X 插件配置
mysqlx-bind-address = ::
mysqlx_socket = /home/user/project/serv/mysql/mysqlx.sock
 
#mysql安装根目录
basedir = /home/user/project/serv/mysql
 
#mysql数据文件所在位置
datadir = /home/user/project/serv/mysql/data
 
#pid
pid-file = /home/user/project/serv/mysql/mysql.pid

 
#设置临时目录
tmpdir = /home/user/project/serv/mysql/tmp
 
#错误日志
log_error=/home/user/project/serv/mysql/log/mysql.log

#共享库
plugin-dir = /home/user/project/serv/mysql/lib/plugin

#用来存放一些特定类型的数据文件的目录
#secure-file-priv = /home/user/project/serv/mysql/mysql-files
 
#设置认证插件
authentication_policy=mysql_native_password
 
#设置sqlmode(根据需求自定义)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

#跳过密码登录
#skip-grant-tables
 
#主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
skip-external-locking
 
#只能用IP地址检查客户端的登录,不用主机名
skip_name_resolve = 1
 
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
 
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
 
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
 
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 0

#用于指定 MySQL 错误消息文件的位置
#lc-messages-dir = /home/user/project/serv/mysql/share/mysql-8.0
 
#最大连接数
max_connections = 2048
 
#最大错误连接数
max_connect_errors = 1000
 
#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true
 
#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet = 128M
 
#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800
 
#内部内存临时表的最大值 ,设置成128M。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size = 134217728
max_heap_table_size = 134217728
 
#mysql binlog日志文件保存的过期时间,过期后自动删除(3天)
binlog_expire_logs_seconds = 259200

授权:

如果有tmp目录,就要给这个目录最高权限。

而bin目录是给bin目录里面的东西最高权限,所以两个命令不一样。

其他的目录与文件就不需要给权限了,默认权限就行,特别是etc配置文件,我有次自作主张改了它的权限,mysql反而运行不了了。

go 复制代码
sudo chmod 777 /home/user/project/serv/mysql/tmp
sudo chmod 777 /home/user/project/serv/mysql/bin/*

初始化数据库:

然后我看很多教程说要创建一个mysql用户,刚开始接触linux部署mysql时,让我进入了一个误区,以为在linux上面安装mysql,必须创建名称叫mysql的用户才行,后来才慢慢知道,只要除root用户外,另外有一个普通用户就行,叫啥名字都行,就比如我这里用户名是user,那我就不需要再去创建mysql用户,这个用户其实就是系统用户,注意并不是mysql软件的用户。

go 复制代码
mysqld --initialize --user=普通系统用户的名称

初始化完成后,界面会输出临时密码,记录好这个密码,后面会用。

准备工作完成,到这里可以测试运行一下:

go 复制代码
/home/user/project/serv/mysql/bin/mysqld --defaults-file=/home/user/project/serv/mysql/etc/my.cnf

如果运行失败,大概率是配置文件有问题,小概率是其他原因,这个原因就多了,各种各样,这个就不细说了,每个人遇到的情况不一样,只能遇到问题时再去排查。

命令登录mysql:

go 复制代码
mysql -uroot -p

输入刚才的密码,然后回车登录:

修改mysql密码:

go 复制代码
alter user root@localhost identified by '新密码';

进入mysql数据库:

go 复制代码
use mysql;

设置远程连接:

意思是任何ip都能远程访问mysql的root用户,这里的root就是mysql的用户了,不是系统用户。

go 复制代码
update user set host='%' where user='root';

刷新权限:

go 复制代码
flush privileges;

退出mysql登录:

go 复制代码
quit;

到这里,可以用navicat等类似工具远程访问试试,注意开通3306端口,能连接成功,mysql算是安装完成了一大半,为什么说一大半,是因为像mysql这种关系库,在linux系统中,一般是安装成系统服务,当系统重启或开机时,会自动启动mysql,而刚刚我们是手动命令运行的,所以接下来要把mysql安装成系统服务,也很简单。

把程序安装成系统服务,我记得是有三种方式,我就记录我最常用的一种,另外两种我也忘了,懒得去找了,安装系统服务之前,记得先关闭刚刚启动的mysql。

创建"mysql.service"文件,并复制以下内容到此文件,注意根据自己实际情况更改目录和用户:

go 复制代码
[Unit]
Description=MySQL server
After=syslog.target network.target
 
[Service]
#这个设置适用于那些在启动时会fork一个子进程,然后父进程立即退出的服务。
Type=forking

#mysql只能用普通用户运行,用root用户运行有问题,且用户组配置必须是root
User=user
Group=root

#设置为0也意味着systemd将不再能够强制终止或重启长时间无响应的服务
TimeoutSec=0

#当这个选项被设置为true时,它指示systemd在服务启动时应用权限更改,但在服务运行过程中不维持这些权限。
PermissionsStartOnly=true

#on-failure意味着当服务的退出状态表明它遭遇了一个错误或异常情况时,systemd将尝试重启该服务。
Restart=on-failure

#这个延迟可以用来避免过于频繁的重启循环,即所谓的"restart storm"。在本例中,systemd将在尝试重启服务前等待3秒。
RestartSec=3

#1被添加到这个列表中,意味着如果服务以状态码1退出,systemd将不会重启该服务,即使它认为这是一个失败状态。
RestartPreventExitStatus=1

#如果设置为true,service将获得一个独立的临时文件存储区域,与其他服务和系统进程隔离。这有助于增强安全性,防止服务之间可能的干扰。但是,如果设置为false(如所示),则服务将使用系统共享的/tmp和/var/tmp目录,这可能会降低安全性,但也可能在某些情况下提供更好的性能或资源利用。
PrivateTmp=false

#运行命令
ExecStart=/home/user/project/serv/mysql/bin/mysqld --defaults-file=/home/user/project/serv/mysql/etc/my.cnf --daemonize
 
[Install]
WantedBy=multi-user.target

复制mysql.service文件到/usr/lib/systemd/system目录:

go 复制代码
sudo cp mysql.service /usr/lib/systemd/system

设置mysql服务为开机自启:

go 复制代码
sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql

最后一步,重启服务器测试mysql是否开机自启:

go 复制代码
sudo reboot

系统重启后,用navicat等软件远程连接一下,能正常连接基本就没啥问题了。

相关推荐
内核程序员kevin1 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
i道i4 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
Oak Zhang6 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
xiaozhiwise6 小时前
Makefile 之 自动化变量
linux
久醉不在酒7 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
WindFutrue7 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
意疏8 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker