一、Windows 下安装 MySQL
https://www.runoob.com/mysql/mysql-install.html
二、Linux 下安装 MySQL
1. yum 命令安装 MySQL
使用 yum 方式安装 MySQL 是最简单的,在使用压缩包安装是遇到不少问题,换用 yum 方式后简单迅速。
1.1 查看并移除旧版本 MySQL
使用命令:rpm -qa | grep -i mysql (-i,代表忽略大小写的差别)
- 如显示已经安装的相关模块,则要先卸载,再重新安装
- yum -y remove <全名称> :卸载相关模块:使用联合命令,将查询结果作为参数移除:
yum -y remove $(rpm -qa | grep -i mysql)
- 如果上述命令卸载不掉,则使用命令: rpm -er <全名称>
- yum -y remove <全名称> :卸载相关模块:使用联合命令,将查询结果作为参数移除:
- 如果执行后无任何变化,表示没有安装
使用命令查看是否存在 mysql yum 安装包,yum list mysql*
,如果有遗留,可以使用命令删除
-
rpm -e mysql
,普通删除模式 -
rpm -e --nodeps mysql
,强力删除模式
使用命令:whereis mysql 查看系统中是否存在 mysql 相关文件
- 如果存在,则使用命令删除 rm -rf …
使用命令:find / -name mysql 查看 mysql 相关文件
- 删除无用文件
1.2 下载并安装 MySQL 服务
简单安装
- 安装 mysql 客户端,
yum install mysql
- 安装 mysql 服务端,
yum install mysql-community-server
完整安装
# ①进入/usr/local文件夹下
cd /usr/local
# ②下载.rpm文件
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
# ③执行 rpm文件
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
# ④安装mysql服务(-y代表安装过程中所有提示选择为y)
yum -y install mysql-server
# 或者指定安装目录(不必要)
yum --installroot=/usr/local/mysql --releasever=/ -y install mysql-server
## 另一种快速安装方式
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
- 等待所有服务模块安装完成 即可
1.3 MySQL配置文件
- 配置文件: /etc/my.cnf
- 日志文件: /var/log/mysqld.log
- 服务启动脚本: /usr/lib/systemd/system/mysqld.service
- socket文件: /var/run/mysqld/mysqld.pid
- 添加mysql配置内容:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id = 1
expire_logs_days = 3
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
- 查看 mysql 的编码信息,登录mysql后,使用命令
show variables like 'character_set%';
- 设置 mysql 的默认字符集,在/etc/my.cnf文件中,增加
default-character-set=utf-8
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
1.4 MySQL服务相关命令
- systemctl start mysqld.service:开启 mysql 服务
- systemctl status mysqld.service:查看 mysql 服务状态,
- -l:查看详细状态信息
- systemctl stop mysqld.service:停止 mysql 服务
- systemctl restart mysqld.service:重启mysql服务
- systemctl enable mysqld:设置mysql开机自启动
- systemctl daemon-reload:作为守护进程开启
1.5 MySQL 密码修改
查看随机生成密码
安装mysql后,会在相应的日志文件中产生一个随机密码,可以使用命令查看:
- cat /var/log/mysqld.log :查看日志文件全部内容
- grep “password” /var/log/mysqld.log :使用正则匹配日志文件中的password关键字
跳过密码认证
随机密码登录失败时,需要配置跳过认证阶段,登录后使用sql语句更新密码
- vi /etc/my.cnf:修改配置文件,添加skip-grant-tables后保存退出,表示登录不验证
- mysqld_safe –skip-grant-tables –skip-networking& 命令效果相同
- 重启mysql服务,使用mysql直接登录mysql客户端
使用sql语句修改登录密码
- mysql -u root -p:使用命令登录mysql,命令回车后输入日志中密码,登录mysql
- ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘xxxxxxxx’; 修改root账户的密码为xxxxxxxx
- 如果是 skip-grant-tables 情况下执行该语句,会提示不可以执行
- 可以使用更新 user 表中密码数据的方式:
- update mysql.user set authentication_string=PASSWORD(‘newPassword’) where USER=’root’; 更新密码
- flush privileges; 刷新权限表
- 如果是 skip-grant-tables 情况下执行该语句,会提示不可以执行
- 默认密码策略要求密码是大小写字母+数字+特殊字符的组合且最少8位
- 密码修改完成后,退出,使用新密码重新登录
1.6 允许远程登录
1.6.1 设置允许其他端、navicate 远程连接。
- mysql 中开启远程访问权限,mysql 库中的 user 表新增一条记录 host 为“%”,user为“root”。
# 连接客户端(远程登录限制)
mysql -u root -p Root@2020
mysql> use mysql;
# 查看 root 用户信息,host = localhost 表示只可以本地连接,不可以远程连接
select * from user where user ='root';
update user set host = '%' where user = 'root';
# 或者是下面命令
# ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@2021';
# 如果上句运行失败,则使用下面命令
# mysql> grant all on *.* to root@"%" identified by "Root@2021";
mysql> flush privileges;
1.6.2 检查 Linux 防火墙设置
MySQL 默认占用端口号为 3306,因此需要
- 如果是云服务器,则要在安全组中开放 3306 端口
- 服务器防火墙开放 3306 端口
# 查看firewalld状态,dead 状态代表防火墙未开启,active代表已开启
systemctl status firewalld
# 查看防火墙是否已开放3306端口
firewall-cmd --query-port=3306/tcp
# 设置3306端口为永久开放
firewall-cmd --add-port=3306/tcp --permanent
# 设置后重启防火墙(设置了新的端口记得先关闭,再重启)
systemctl restart firewalld
1.7 yum 安装常见问题
1.7.1 wget 下载失败
Cannot write to ‘mysql57-community-release-el7-8.noarch.rpm’ (Permission denied).
表示下载文件时权限不够,可以加 sudo 命令或使用 su root 切换至管理器权限下载文件
1.7.2 速度慢,换镜像
修改CentOS 默认 yum 源为国内yum镜像源
- 修改为163镜像源
- 备份yum源文件,mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
- 进入yum源文件夹,cd /etc/yum.repos.d/
- 下载163镜像源文件,wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
- 运行yum命令生成缓存,yum makecache
- 更新yum会显示163信息,yum -y update
- 备份yum源文件,mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
- 修改为阿里云镜像源
- 使用阿里源的方法基本一样,阿里yum源文件下载地址为wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
1.7.3 安装报错:No package mysql-server available.
CentOS7 安装 mysql 报错:No package mysql-server available. Error: Nothing to do
报错原因:CentOS7 自带 MariaDB 而不是 MySQL,MariaDB 和 MySQL 一样也是开元的数据库,可以使用 yum -y install mariadb-server mariadb 命令安装,而安装 MySQL 需要先添加 社区 repo
解决办法:
- 下载文件,wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
- 执行文件, rpm -ivh mysql-community-release-el7-5.noarch.rpm
- 之后再次使用命令安装
1.7.4 GPG Keys are configured as …
报错信息: GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
错误原因:GPG keys是安装包发布时生成的密钥,安装是需要核对密钥来确保安全性,MySQL的GRG 升级了
https://dev.mysql.com/doc/refman/5.7/en/checking-rpm-signature.html
解决办法:
- 需要重新获取GRG,使用命令 rpm –import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022获取后,重新安装MySQL
- 如果重新获取GRG后,安装仍然显示该错误,则考虑安装时跳过GRG检查
- 安装命令最后使用**–nogpgcheck** 跳过
- 编辑 yum 配置文件, /etc/yum.repos.d/mysql-community.repo,修改其中的 gpgcheck=0
- 安装命令最后使用**–nogpgcheck** 跳过
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
1.8 MySQL 卸载
rpm -qa|grep -i mysql,查看是否安装MySQL,如果安装过,则要先移除安装
- yum -y remove <全名称> :卸载相关模块
- 如上述命令卸载不掉,则使用命令 rpm -er <全名称>
whereis mysql,查看MySQL文件信息
删除MySQL相关文件
- find / -name mysql,查看系统中MySQL相关文件信息
- 对找到的相关文件夹,使用 rm -rf 命令依次删除
2. 压缩包安装 MySQL
三、Docker 中安装 MySQL
mysql 的容器我们可以让 docker 创建和执行,但是 mysql 的数据不能仅存在容器内,需要我们开辟一个外部路径专门用来存储 mysql 数据。
1. 安装 MySQL
docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
简单讲解一下,
-p 3306:3306:将容器的3306端口映射到主机的3306端口
-v 源地址(宿主机):目标地址(容器),将主机的/mydata/mysql/log挂载到mysql容器的/var/log/mysql目录
-e 指定容器内的环境变量,这里是指定mysql密码为root
-d 后台运行容器,并返回容器ID
mysql:5.7 指定mysql版本,具体版本可以在https://hub.docker.com 查询
2. 验证 MySQL 是否安装成功
docker ps
如下,如果显示了 mysql 就是安装成功了
3. 开启 MySQL 远程访问权限:
先进入mysql容器
docker exec -it mysql /bin/bash
登录mysql,密码就是我们初始化时设置的root
mysql -uroot -p
然后开始开启远程访问权限
use mysql;
select host,user from user;
查看 host 不是 %,需要先更新成 %(如果是 % 跳过,直接进行下面的授权):然后开始授权
4. MySQL 防火墙配置
上面对 mysql 本身开启了远程访问权限,下面需要配置防火墙,阿里云还需要在控制台配置安全组开放 3306 端口。
# 如果firewalld 没有开启,先开启下
service firewalld start
#开放3306端口
firewall-cmd --permanent --add-port=3306/tcp;
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
最后配置 mysql 自启:此时使用 navicat 可以访问 MySQL 了
常见问题
docker run 之后没有启动(启动后自动退出)
- https://blog.csdn.net/x1064320359/article/details/120816832
- https://blog.csdn.net/qq_40191181/article/details/116733889
mysqld: Can’t read dir of ‘/etc/mysql/conf.d/‘ (Errcode: 2 - No such file or directory)
- https://www.cnblogs.com/eternality/p/17170773.html
- https://blog.csdn.net/qq_45564783/article/details/126440171
chown: changing ownership of ‘/var/lib/mysql/‘: Permission denied
https://blog.csdn.net/miachen520/article/details/122389701
阿里云资源安装 mysql
可以在 阿里云镜像中心 搜索相关的镜像,会跳转到docker官网镜像处。
MySQL镜像使用步骤:
- 使用命令查询mysql镜像信息:docker search mysql
- 从远程仓库拉取mysql镜像,docker pull mysql
- 通过docker run 运行镜像
- -d 进行后台运行
- -p 指定mysql镜像映射的主机端口
- -e 后跟 mysql 的参数,来连接查询数据库的名称和连接密钥
- -d 进行后台运行
- 如命令:docker run -d -p 3306:3306 -e MYSQL—_ROOT_PASSWORD=root -e MYSQL_DATABASE=datebase mysql:latest
- 属性名称必须要大写,否则无效
- -e MYSQL_ROOT_PASSWORD=root:设置 MySQL 服务 root 用户的密码为root
- -e MYSQL_DATABASE=datebase ,创建一个名为databse的数据库
- 属性名称必须要大写,否则无效
- 运行成功后,可以进入到mysql镜像中并查看mysql信息
- 使用docker ps 查看当前执行的镜像的ID,
- 使用命令进入到docker镜像中:docker exec -it 镜像ID bash ,进入后命令行前缀用户就变成了容器ID。
- 进入容器中,就相当于进入了一个轻量级Linux,命令是相同的
- 进入mysql镜像后,使用命令连接mysql:mysql –user=root –password 或mysql -h localhost -u root -p 然后输入密码登录
错误: 服务器上通过docker命令运行和访问正常,但是使用navicate远程连接mysql时报错如下:
- 首先通过mysql镜像的ID进入到镜像中,并连接mysql mysql -u root -p 输入密码
- 开启远程访问权限
- 查看数据库信息show databases;
- 切换使用mysql数据库:use mysql;
- 查询user表权限信息:select host,user from user
- ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘root’;
- 刷新操作:flush privileges;
- 然后可以远程使用navicate连接了。
- 原因:镜像中root用户已经有了远程连接的权限,但是模式不一样导致无法连接,因此要将root用户的密码改成 mysql_native_password 模式即可。
- 查看数据库信息show databases;
问题: 每次运行mysql时使用命令创建数据库,当服务stop之后,数据库就没了,下次运行要重新创建?
- 如果每次都重新run运行mysql镜像,那么每次启动后服务的ID是不同的,就是不同的服务,则数据库是一个原始的数据库
- 而使用命令 docker ps -a 可以查看所有的服务,找到之前服务的ID,直接 docker start ID 可以运行已经存在的服务,且配置是一样的。