MySQL 安装
通过 Yum Repository 方式安装
注意点:CentOS7 默认安装了 mariadb 数据库,先移除:yum remove mariadb-libs
添加 MySQL Yum源
简要概况,它是通过安装 mysql80-community-release-el7-2.noarch.rpm
包来实现配置 Yum 源的,这个 rpm 包并非 MySQL 的真正安装包。
你可以通过下载两个途径下载这个 mysql80-community-release-el7-2.noarch.rpm
包:
wget https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm
下载下来;- MySQL Yum Repository page 手动下载,再上传到服务器上;
下载下来之后,执行:
yum localinstall mysql80-community-release-el7-2.noarch.rpm
可以通过以下命令检查MySQL Yum源是否已成功添加:
yum repolist enabled | grep "mysql.*-community.*"
上面步骤执行完之后,会在 /etc/yum.repos.d/
目录下生成 MySQL 相关的 Yum 源配置,需要对这个配置文件进行一些设置,启用你想安装的版本对应的源。
选择一个 MySQL 发行版
1.查看一下 Yum 源的配置,可以看到那些源是 enable
、disable
yum repolist all | grep mysql
2.选择你需要安装的版本对应的源
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
由于生产环境大部分还是采用 MySQL5.7 版本,因此,我这里启用了5.7版本的源。除了上述方式,你还可以采用编辑/etc/yum.repos.d/mysql-community.repo
文件,enable
相应的源(enbaled=1
表示启动)。
3.验证源配置启动成功
yum repolist enabled | grep mysql
yum list|grep mysql-community-server
安装 MySQL
yum install mysql-community-server
yum install mysql-community-server-5.7.25-1.el7 # 建议指定具体的版本,保证一致性
这将安装 MySQL Server( MySQL -community-server
)的包,以及运行服务器所需组件的包,包括客户机(MySQL -community-client
)的包、客户机和服务器的通用错误消息和字符集(MySQL -community-common
)以及共享的客户机库(MySQL -community-libs
)的包。
MySQL 配置
MySQL 默认的配置文件在 /etc/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
修改默认的数据保存目录以及数据库编码
数据库保存的数据和日志是相当宝贵的,数据保存位置默认是这里:datadir=/var/lib/mysql
,现在,我们需要改变默认的存储位置。
1.创建相关目录
mkdir -p /data/mysql/data
mkdir -p /data/mysql/log
2.修改属组
cd /data
chown -R mysql:mysql mysql
3.移动数据
这个步骤是针对已经有数据生成时的情况,如果是刚刚安装 MySQL 数据库,那么这一步可以跳过。
注意:为了确保数据的完整性,先 systemctl stop mysqld
停止 MySQL,然后再保存数据。
- 暂停服务:
systemctl stop mysqld
; - 备份数据:
cp -R /var/lib/mysql /var/lib/mysql_bak
; - 移动数据:
rsync -av /var/lib/mysql/ /data/mysql/data/
,这个会将原 mysql 下的所有数据,保存到/data/mysql/data
文件夹下,
使用-a
标志保留的权限和其他目录属性,而-v
提供详细输出,以便能够按照进度。
修改配置文件
vi /etc/my.cnf
编辑配置文件,数据位置和套接字都指向新的目录:
# 修改位置
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
# 新增配置
[client]
socket=/data/mysql/mysql.sock
配置预览:
[mysqld]
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
#普通项目的编码方式可以设置成 utf8
#这里设置成utf8mb4,是因为我的项目需要存储 emoji 表情,
#这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而MySQL utf8编码只能存放3字节的字符。
#在MySQL 5.6 以上版本中,可以设置编码为utf8mb4,这个字符集是utf8的超集。
#注意KEY不要写错,网上很多文章都是写default-character-set是错的
character-set-server=utf8mb4
#版本5.6.19以后必须设置这一句才能使[client]中设置的编码有效
character-set-client-handshake = FALSE
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
#表名是否区分大小写:1表示不区分大小写,2表示区分
lower_case_table_names=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/data/mysql/log/mysqld.log
#skip-grant-tables # 如果去除注释,可以实现免密登录,不建议开启免密
[mysql]
default-character-set=utf8mb4
[client]
socket=/data/mysql/mysql.sock
#普通项目的编码方式可以设置成 utf8
#这里设置成utf8mb4,是因为我的项目需要存储 emoji 表情,
#这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而MySQL utf8编码只能存放3字节的字符。
#在MySQL 5.6 以上版本中,可以设置编码为utf8mb4,这个字符集是utf8的超集。
default-character-set=utf8mb4
以上配置之外,还进行了编码的配置,支持 UTF-8
。
启动 systemctl start mysqld
,这样子,之前的账户密码等数据才会保留!!!
4.验证
启动 MySQL
systemctl start mysqld # 启动
systemctl status mysqld # 状态查询
systemctl enable mysqld # 开机自启
systemctl daemon-reload # 重载所有修改过的配置文件
默认初始密码:
grep 'temporary password' /var/log/mysqld.log # 未未修改日志路径
grep 'temporary password' /data/mysql/log/mysqld.log # 修改日志路径
验证:
mysql -u root -p
select @@datadir; # 执行这个命令,需要先用 ALTER USER 初始化命令
SHOW VARIABLES LIKE 'character%'; # 查看编码,character_set_system 一直都会是 utf8,不能被更改
修改 root 密码
注意:MySQL 5.7 默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于 8 位
设置管理员密码,以下几种方式都一样:
SET PASSWORD = PASSWORD("Root_123456");
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root_123456';
set password for 'root'@'localhost'=password('Root_123456');
以后可以通过如下命令修改:
use mysql;
update user set password=PASSWORD('MyNewPass5!') where user='root';
还需要刷新使其密码生效:
alter user 'root'@'localhost' password expire never;
flush privileges;
如果你是安装的8.0版本,则需要这么改:
ALTER USER 'root'@'localhost' identified by 'Root_123456';
新建用户
create user 'cicd'@'%' identified by 'Root_123456'; # 因为要可以从任何 ip 登录,所以 host 设置的是%号
赋予权限:
grant all privileges on *.* to 'cicd'@'%' with grant option; # MySQL 8.0 语法 *.* 表示任何数据库的任何表
grant all privileges on *.* to 'cicd'@'%' identified by '123456' with grant option; # MySQL 5.7 语法
flush privileges; # 这时候登录时,就可以看到所有数据库了
grant select,insert on *.* to 'imooc'@'%' with grant option; # 只赋予部分权限
revoke all privileges on *.* from imooc; # 收回所有权限
远程连接 MySQL
需要关闭防火墙:
systemctl stop firewalld # 关闭防火墙
默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须添加一个允许远程连接的帐户。或者修改 root 为允许远程连接(不推荐)。
mysql -u root -p
进入mysql 终端:
use mysql;
select * from user G; # G 格式化显示 host 和 user 两个字段
select Host,User from user G; # Host表示允许哪些主机访问
update user set Host='%' where Host='localhost' and User='root';
flush privileges; # 刷新权限 或者 systemctl restart mysqld
MySQL 常用命令
show databases;
use tables;
show variables like 'character%'; # 查询编码
MySQL 命令补全行工具
pip install -U mycli
mycli -u root [-h localhost]
mycli local_database
mycli -h localhost -u root app_db
mycli mysql://amjith@localhost:3306/django_poll
FAQ
如何查看 MySQL 版本?
mysql -V
忘记 Root 密码?
sudo vim /etc/my.cnf # 打开配置文件,最后增加下面一行,实现MySQL免密登录
skip-grant-tables # 跳出授权表的验证
systemctl restart mysqld
use mysql;
show tables;
update user set authentication_string = password('root_123456') where user = 'root'; # 旧方法
flush privileges;
alter user 'root'@'%' identified by 'Root_1234'; # 将 skip-grant-tables 去掉
参考
安装
- 官宣-安装MySQL
- 在CentOS7上编译安装MySQL 5.7.13步骤详解 编译安装是官方不推荐的,,除非你对各个编译选项比较清楚,官方有编译参数介绍
- geerlingguy/ansible-role-mysql ansible 安装 mysql 的参考,我也总结了一个自己调通的 ansible-learn/ansible-own/mysql/
配置
- CentOS 7 安装 MySQL 5.7 编码介绍比较详细
- 修改MySQL的字符集为utf8mb4 对编码进行介绍
- 更改MySQL数据库的编码为utf8mb4
- 简书-Mysql配置文件/etc/my.cnf解析
- MySQL之my.cnf配置文件优化
- CentOS 7离线安装MySQL 5.7 对配置文件也介绍的比较详细
修改目录