Skip to content

MySQL 安装之 CentOS & Docker

环境准备

注意:这里使用 docker 模拟 centos 7 环境,前提已安装好 docker。

bash
拉取镜像
$ docker pull centos:7

创建并运行容器
$ docker run --name centos -p 3307:3306 --privileged=true -d centos:7 /usr/sbin/init
模拟真实的 centos 环境不能用下面这条命令,否则无法使用 systemctl 命令启动服务
$ docker run --name centos -p 3307:3306 --privileged=true -d centos:7 /bin/bash

进入容器
$ docker exec -it 容器ID或名称 /bin/bash

安装 wget
$ yum -y install wget

更换国内 yum 源

bash
Linux yum更换国内源(任选一个)
1 备份
$ cd /etc/yum.repos.d/
$ mv CentOS-Base.repo CentOS-Base.repo_bak

2 网易yum源:
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
$ yum clean all
$ yum makecache

3 阿里云yum源:
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum clean all
$ yum makecache

4 epel源
$ yum -y install epel-release
$ yum clean all
$ yum makecache

安装 MySQL 5.7

bash
下载Mysql源安装包
$ wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

yum安装mysql源
$ yum localinstall mysql57-community-release-el7-8.noarch.rpm -y

检查mysql源是否安装成功
$ yum repolist enabled | grep "mysql.*-community.*"

yum安装Mysql
$ yum install mysql-community-server -y

启动Mysql服务(如果 cmd 终端控制台不退出,貌似不影响,Ctrl+C 退出,继续执行后面的命令)
$ systemctl start mysqld

并添加开机启动
$ systemctl enable mysqld
$ systemctl daemon-reload

查看Mysql状态
$ systemctl status mysqld

查看默认的mysql密码。此时Mysql安装完成!接下来修改密码。
$ vi /var/log/mysqld.log

登录mysql
$ mysql -uroot -p 回车
密码: =>g6hj.Nx4e (上面查看的原始密码)

修改mysql的密码
第一次进入必须修改密码,建议先修改为默认密码加上几个字符,然后再更改密码规则策略,
才能修改为简单的密码,否则密码规则验证不通过,就不能修改密码成功。
mysql> set password for 'root'@'localhost'=password('g6hj.Nx4eAAA');

密码策略的修改仅限于开发环境下方便记忆
查看 mysql 初始的密码策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
设置密码的验证强度等级为 LOW,长度最小为4
mysql> set global validate_password_policy=LOW;
mysql> set global validate_password_length=4;

修改 root 用户密码
mysql> set password for 'root'@'localhost'=password('root');

创建和删除用户(可省略)
mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';
授权(开发环境,所有数据库所有权限)
mysql> GRANT ALL ON *.* TO 'username'@'%';
mysql> DROP USER 'username'@'%';

添加远程登陆的用户权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

查看用户
mysql> use mysql;
mysql> select host,user,plugin from user;

退出mysql
mysql> exit;

修改mysql字符编码
$ vi /etc/my.cnf
添加
character_set_server=utf8mb4
init_connect='SET NAMES utf8mb4'

重启Mysql
$ systemctl stop mysqld
$ systemctl start mysqld

查看Mysql字符集(登录 mysql 后)
mysql> show variables like '%character%';
my.cnf 文件内容

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# 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

character_set_server=utf8mb4
init_connect='SET NAMES utf8mb4'

MySQL 卸载

bash
$ rpm -qa|grep -i mysql
$ yum remove mysql-community-server -y
$ rpm -ev mysql-community-libs-5.7.33-1.el7.x86_64 --nodeps

删除文件
$ find / -name mysql
$ rm -rf /var/lib/mysql
$ rm -rf /etc/my.cnf

使用 Docker 安装 MySQL 8

docker 命令

bash
$ docker run \
--name mysql3307 \
-p 3307:3306 \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=username \
-e MYSQL_PASSWORD=password \
-v /home/docker-data/mysql/3307/conf:/etc/mysql/conf.d \
-v /home/docker-data/mysql/3307/data:/var/lib/mysql \
-v /home/docker-data/mysql/3307/logs:/var/log/mysql \
-d mysql:8

cmd:
$ docker run --name mysql3307 -p 3307:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=test -e MYSQL_USER=username  -e MYSQL_PASSWORD=password -v C:/home/docker-data/mysql/3307/conf:/etc/mysql/conf.d -v C:/home/docker-data/mysql/3307/data:/var/lib/mysql -v C:/home/docker-data/mysql/3307/logs:/var/log/mysql -d mysql:8

注意:
1. 使用 docker 安装MySQL,可以自定义挂载这个配置文件,/etc/mysql/conf.d/config-file.cnf。参考:https://hub.docker.com/_/mysql,测试没成功。
2. cmd中命名需要去掉 \ 符号和 \r\n 换行符来执行,并且只能有一行命令。
3. Windows 下,挂在卷需要添加磁盘名称 C:/。如:-v C:/home/docker-data/mysql3307/log/:/var/log/mysql \
4. -v /home/docker-data/mysql3307/logs:/var/log/mysql 挂载目录时写成这样启动报错,/home/docker-data/mysql3307/logs 改为 /home/docker-data/mysql/3307/logs就好了,可能是本地环境的问题。

命令说明:

  1. --privileged=true :是否让 docker 应用容器 获取宿主机 root 权限

MySQL 5.7 版本 config-file.cnf 文件内容示例

命令:vi /etc/mysql/conf.d/config-file.cnf

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
#character_set_server=utf8mb4
#init_connect='SET NAMES utf8mb4'

# 修改mysql默认CST时区(美国中部)为中国上海东八区时区
default-time-zone='+08:00'

MySQL 8 版本 config-file.cnf 文件内容示例

命令:vi /etc/mysql/conf.d/config-file.cnf

-v C:/home/docker-data/mysql/3307/conf:/etc/mysql/conf.d

  1. 在挂载的本地目录下新建文件:C:/home/docker-data/mysql/3307/conf/config-file.cnf
  2. 把下面的内容复制到 config-file.cnf 文件中,保存。
  3. 重启 docker 容器:docker restart mysql3307
  4. 检查配置是否生效。
  • 登录到 mysql 数据库后:mysql> show variables like '%character%';
  • 登录到 mysql 数据库后:mysql> show variables like '%max_connections%';
[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
#character_set_server=utf8mb4
#init_connect='SET NAMES utf8mb4'

# 修改默认密码验证方式插件,以兼容navicat等不支持caching_sha2_password验证方式的客户端工具,
# 这将放弃提供的改进的身份验证安全性 caching_sha2_password
default_authentication_plugin=mysql_native_password

# 修改mysql默认最大连接数(默认:151)
max_connections=1000

# 修改mysql默认CST时区(美国中部)为中国上海东八区时区
default-time-zone='+08:00'

# 当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。
# 如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。
# 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。
# 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。
# log-bin-trust-function-creators=1

# 修改Error 1055,去掉前面的ONLY_FULL_GROUP_BY,
# 原始值为:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION