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等软件远程连接一下,能正常连接基本就没啥问题了。

相关推荐
小生不才yz1 分钟前
shell编程 - 数据流指南
linux
lisanmengmeng6 分钟前
添加ceph节点
linux·服务器·ceph
Tinyundg10 分钟前
Linux系统分区
linux·运维·服务器
江畔何人初17 分钟前
service发现
linux·运维·云原生
Dxy123931021619 分钟前
MySQL删除表语句详解
数据库·mysql
life码农24 分钟前
Linux系统清空文件内容的几种方法
linux·运维·chrome
uoKent28 分钟前
MySQL常见命令梳理大纲
数据库·mysql
zbguolei29 分钟前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu
UP_Continue31 分钟前
Linux--基础IO
linux·运维·服务器
予枫的编程笔记33 分钟前
【MySQL筑基篇】从排名统计到非结构化存储:MySQL窗口函数与JSON实战教程
mysql·数据处理·窗口函数·后端开发·json数据类型·数据库进阶·mysql高级特性