的确我前的确是用docker安装的, 但是发生了一次事故, 我们开发环境的服务器的磁盘满了, 有新同学在不知情的情况下再清理磁盘的时候,把mysql容器的镜像和数据文件想当然直接给清理掉了,导致mysql废掉,同时数据都丢了, 还好所有的数据库在公共数据管理仓库都有备份, 不然就完蛋了, 于是专门搞了两台服务器做数据库服务器, 本来打算还是用docker安装的, 想着这种事故还是有发生的概率,于是就放弃了这种想法,还是直接在服务器上面安装吧,开整。
有大神就这个话题也讨论过,我觉得挺有道理的,大家有兴趣可以看看为什么不建议在 Docker 中跑 MySQL?
之前我也觉得无所谓,直到问题出现在我身上。。
这里把docker安装mysql的方式附上, 供需要的小伙伴使用:
注意这里需要先安装docker服务
docker run -d --name mysql5.7 -v /usr/local/mysql57/data:/var/lib/mysql57 -v /usr/local/mysql57/conf:/etc/mysql57/conf.d -v /usr/local/mysql57/logs:/var/log/mysql57/ -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.7.36
先卸载安装CeontOS系统默认安装的mariadb数据库
`rpm -qa | grep mariadb`
sudo rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
`find / -name mysql`
把找到的所有和mysql有关的目录都删除掉
rm -r /etc/my.cnf
安装mysql数据库需要的依赖
yum install -y ncurses-devel libaio-devel gcc gcc-c++ numactl libaio glibc cmake autoconf
我这里专门创建了一个文件夹用来放置下载的压缩包
mkdir -p /opt/packages | cd /opt/packages
我这里下载的是mysql5.7的最后一个版本5.7.36,当然你也可以选择其他的版本,甚至mysql8都可以,在/opt/packages
目录下执行
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
如果没有wget命令, 使用以下命令进行安装
yum install -y wget
在压缩包所在目录/opt/packages
下解压
tar -zxf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
重命名文件并移动文件
mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql | mv mysql /usr/local/
cd /usr/local/mysql | mkdir data log var tmp
该用户主要用来进行mysql数据库管理
useradd mysql -r -M -s /sbin/nologin
chown -R mysql:mysql /usr/local/mysql
vim ~/.bash_progfile
修改内容如下:
MYSQL_HOME=/usr/local/mysql
PATH=$PATH:$MYSQL_HOME/bin;
export PATH
wq!
保存退出,执行一下命令让修改立即生效
source ~/.bash_profile
创建配置文件
mkdir -p /etc/mysql/ | cd /etc/mysql | vim my.cnf
文件内容如下:
[mysqld]
# 包含的配置文件 ,把用户名,密码文件单独存放
# !include /usr/local/mysql/etc/mysqld.cnf
port = 3306
bind-address = 0.0.0.0
# 表示是本机的序号为1,唯一
server-id = 1
socket = /usr/local/mysql/tmp/mysql.sock
pid-file = /usr/local/mysql/var/mysql.pid
basedir = /usr/local/mysql/
datadir = /usr/local/mysql/data/
# 将警告打印输出到错误 log 文件.如果你对于MySQL有任何问题,你应该打开警告 log 并且仔细审查错误日志,查出可能的原因.
log_error_verbosity = 1
# 错误日志路径
log_error = /usr/local/mysql/log/error.log
#*** default settings 相关选项 ***#
# 当创建新表时作为默认使用的表类型,如果在创建表示没有特别执行表类型,将会使用此值
# default_table_type = InnoDB
#服务器时区
default_time_zone = system
#server 级别字符集
character_set_server = utf8
# 此目录被 MySQL用来保存临时文件.
# 例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表.
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好。
# 另一种选择是你也可以将其放置在独立的磁盘上.你可以使用”;”来放置多个路径,他们会按照 roud-robin 方法被轮询使用.
tmpdir = /usr/local/mysql/tmp/
#*** skip options 相关选项 ***#
# 禁止 MySQL 对外部连接进行 DNS 解析,使用这一选项可以消除 MySQL 进行 DNS 解析的时间。
# 但需要注意,如果开启该选项,则所有远程主机连接授权都要使用 IP 地址方式,否则 MySQL 将无法正常处理连接请求!
skip_name_resolve
# 把SYSDATE 函数编程为 NOW的别名
# sysdate-is-now = 1
#*** 系统资源相关选项 ***#
# 对于 Linux 系统推荐设置为小于512的整数。如果系统在一个短时间内有很多连接,则需要增大该参数的值
# back_log = 50
# 指定MySQL允许的最大连接进程数。如果在访问数据库时经常出现"Too Many Connections"的错误提 示,则需要增大该参数值。
max_connections = 1000
# 如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,
# 直到管理员执行 flush hosts命令或者服务重启,防止黑客 ,非法的密码以及其他在链接时的错误会增加此值
max_connect_errors = 10000
# MySQL打开的文件描述符限制,默认最小1024
# 当open_files_limit没有被配置的时候,比较max_connections*5和ulimit-n的值,哪个大用哪个
# 当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个。
open_files_limit = 10240
# 连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间
connect_timeout = 10
# 等待关闭连接的时间
wait_timeout = 28800
# 如果某个通信端口的读操作中断了,最大允许重试次数
net_retry_count = 10
wq!
保存退出
mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
执行成功之后,可以到/usr/local/mysql/log下面去看看数据库初始化生成的随机密码,把这个密码先记下来
cat /usr/local/mysql/log/error.log
cd /usr/local/mysql/support-files | ./mysql.server start
如果启动成功,查看mysql进程如下图:
ps -ef |grep mysql
这里登录一下数据库, 密码使用之前保存的初始化生成的随机密码,看看有没有问题
mysql -uroot -p
有问题, 连接不上,为什么?
因为我自定义设置了mysql.sock文件的保存目录, 怎么办,很简单, 把自定义目录跟这个临时目录的mysql.sick文件做个软链接即可
ln -s /usr/local/mysql/tmp/mysql.sock /tmp/mysql.sock
再次登录就没问题, 一操作,提示让修改密码,很简单,执行一下下面两条命令就可以了
# 修改密码
alter user 'root'@'localhost' identified by 'root';
# 刷新权限
flush privileges;
将mysql服务端的可执行文件拷贝到系统启动初始化目录下
cp mysql.server /etc/init.d/mysqld
之后就可以通过service命令进行服务管理了
service mysqld start
service mysqld stop
service mysqld restart
因为我这里使用的是CentOS7.9的版本, 所有的开机自启的任务都是通过systtemctl
命令来管理的, 这里说说怎么将自行安装的mysql使用systtemctl
来管理,从而实现开机自启。
systtemctl
命令实现开机自启都是通过/usr/lib/systemd/system
的*.service文件来实现的, 所以我们这里需要自定义mysqld.service文件
vim /usr/lib/systemd/system/mysqld.service
mysqld.service的具体内容如下
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=forking
PermissionsStartOnly=true
ExecStart= /etc/init.d/mysqld start
ExecStop= /etc/init.d/mysqld stop
ExecReload= /etc/init.d/mysqld restart
LimitNOFILE = 5000
[Install]
WantedBy=multi-user.target
wq!
保存退出
重载一下systemctl的配置,因为新增了mysqld.service
systemctl daemon-reload
之后只需要将mysqld.service 使用systemctl命令加入开机自启就可以了,
systemctl enable mysqld.service
之后既可以使用systemctl来管理我们的mysql服务了,同时mysql服务也是随服务器开机自启动的
systemctl start mysqld
systemctl status mysqld
systemctl stop mysqld
systemctl restart mysqld