下载mysql安装包:
mysql下载地址
在Linux系统中,mysql的安装包除了要区分系统和cpu架构之外,还区分安装方式,下载不同的包,安装方式也完全不一样,安装完成后的效果也完全不一样。
我之前下载的包按照官方安装方式安装后,mysql的运行文件,配置文件,数据文件等等存储在不同的目录,这样对于经常离线操作的我来说,很不方便,迁移起来极为复杂,所以我在习惯上更倾向于安装完成后,是一整块文件夹,方便后期维护管理,这篇文章也是记录安装完成后一整块文件的方式。
下载界面
系统类型选择Linux - Generic,我之前选择的别的,安装完成后,mysql文件就是东一块西一块的,目录还不能自定义,注意根据自己系统情况下载。
特别注意:
如果系统已经安装过mysql了,一定要先清空系统上已经存在的mysql,不然后面在初始化、运行、登录的时候会出现各种错误,并且很不好解决!
除非已经存在的mysql也是一整块文件夹,存放在自定义的目录中,没有放在系统默认目录,这种就不影响。
卸载存在的mysql: 如果数据重要,卸载之前记得备份数据
停止mysql服务:
sudo systemctl stop mysqld
卸载mysql包:
sudo dnf remove mysql-server mysql-client
卸载mysql相关组件:
sudo dnf remove $(dnf list installed | grep mysql | awk '{print $1}')
删除MySQL配置文件:
sudo rm -f /etc/my.cnf /etc/mysql/my.cnf
删除MySQL数据目录:
sudo rm -rf /var/lib/mysql
删除MySQL日志文件:
sudo rm -rf /var/log/mysql
删除MySQL PID文件:
sudo rm -f /var/run/mysqld/mysqld.pid
删除MySQL套接字文件:
sudo rm -f /tmp/mysql.sock
删除MySQL临时目录:
sudo rm -rf /tmp/mysql
清理缓存文件:
sudo dnf clean all
安装:
安装包上传到服务器指定目录,上传方式就不说了,不同的软件方式都不一样,但方式大差不差,上传目录自定义,无所谓,图方便的话,直接上传到自己想安装的目录。
解压安装包:
tar -Jxvf mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz
解压完成后,想改文件夹名称的可以自定义改一下,随便你怎么改,以我这里为例,我直接改成"mysql"名字。
这个包是免安装的,其实解压完成后,相当于就安装完成了,但是还需要配置一些东西。
进入mysql目录:
cd mysql
新建tmp、log、etc、data等目录:
tmp目录不是必须的,根据现场情况而定,根据项目程序而定,因为我遇到过类似的问题,如果没有这个文件夹,在程序与mysql交互期间,不定时会出现各种问题,具体啥问题抱歉我也忘了,只是当时找到解决方式就是在mysql根目录创建这个文件夹,并配置在my.cnf配置文件中,久而久之,这个习惯就保留下来了。
mkdir tmp
mkdir log
mkdir etc
mkdir data
在etc目录中创建my.cnf文件,并复制以下配置:
注意mysql目录根据自己实际情况做更改,用户也根据自己实际情况做更改。
[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反而运行不了了。
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软件的用户。
mysqld --initialize --user=普通系统用户的名称
初始化完成后,界面会输出临时密码,记录好这个密码,后面会用。
准备工作完成,到这里可以测试运行一下:
/home/user/project/serv/mysql/bin/mysqld --defaults-file=/home/user/project/serv/mysql/etc/my.cnf
如果运行失败,大概率是配置文件有问题,小概率是其他原因,这个原因就多了,各种各样,这个就不细说了,每个人遇到的情况不一样,只能遇到问题时再去排查。
命令登录mysql:
mysql -uroot -p
输入刚才的密码,然后回车登录:
修改mysql密码:
alter user root@localhost identified by '新密码';
进入mysql数据库:
use mysql;
设置远程连接:
意思是任何ip都能远程访问mysql的root用户,这里的root就是mysql的用户了,不是系统用户。
update user set host='%' where user='root';
刷新权限:
flush privileges;
退出mysql登录:
quit;
到这里,可以用navicat等类似工具远程访问试试,注意开通3306端口,能连接成功,mysql算是安装完成了一大半,为什么说一大半,是因为像mysql这种关系库,在linux系统中,一般是安装成系统服务,当系统重启或开机时,会自动启动mysql,而刚刚我们是手动命令运行的,所以接下来要把mysql安装成系统服务,也很简单。
把程序安装成系统服务,我记得是有三种方式,我就记录我最常用的一种,另外两种我也忘了,懒得去找了,安装系统服务之前,记得先关闭刚刚启动的mysql。
创建"mysql.service"文件,并复制以下内容到此文件,注意根据自己实际情况更改目录和用户:
[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目录:
sudo cp mysql.service /usr/lib/systemd/system
设置mysql服务为开机自启:
sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql
最后一步,重启服务器测试mysql是否开机自启:
sudo reboot
系统重启后,用navicat等软件远程连接一下,能正常连接基本就没啥问题了。