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就好了,可能是本地环境的问题。
命令说明:
- --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
- 在挂载的本地目录下新建文件:C:/home/docker-data/mysql/3307/conf/config-file.cnf
- 把下面的内容复制到 config-file.cnf 文件中,保存。
- 重启 docker 容器:docker restart mysql3307
- 检查配置是否生效。
- 登录到 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