1. 安装说明

1. 1 准备

  • 克隆虚拟机需要修改的操作
    • mac 地址
    • 主机名
    • ip 地址
    • UUID
  • CentOS 6 和 CentOS 7 在使用中的区别
1. 防火墙:6 是 iptables  7 是 firewalld
2. 启动服务命令: 6 是 service   7 是 systemctl

1.2 查看是否安装过 MySQL

  • 若使用 rpm 安装
    rpm -qa | grep -i mysql # -i 忽略大小写

  • 若存在 mysql-libs 的旧版本包,则会显示;若不存在,则什么都不显示

  • 检查 mysql service
    systemctl status mysqld.service

1.3 MySQL 的卸载

  1. 停止服务
    systemctl stop mysqld.service
  2. 查看当前 mysql 安装状况
rpm -qa|grep -i mysql
或
yum list installed | grep mysql
  1. 卸载上述命令查询出的已安装程序
    yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx
    一定要卸载干净,反复执行rpm -qa|grep -i mysql 确认是否有卸载残留
  2. 删除 mysql 相关文件
  • 查找相关的文件
    find / -name mysql
  • 删除上述命令查询出的相关文件
    rm -rf xxx
  1. 删除 my.cnf
    rm -rf /etc/my.cnf

2. MySQL 的 Linux 版本 安装

2.1 MySQL 的 4 大版本

  • MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。

  • MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。

  • MySQL Cluster 集群版,开源免费。用于用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。

  • MySQL Cluster CGE 高级集群版,需付费

  • 截止目前,官方最新版本为 8.0.29 。此前,8.0.0 在 2016.9.12日就发布了

此外,官方还提供了 MySQL Workbench (GUITOOL)一款专为MySQL设计的 ER/数据库建模工具 。它是著名的数据库设计工具DBDesigner4的继任者。MySQLWorkbench又分为两个版本,分别是 社区版(MySQL Workbench OSS)、 商用版 (MySQL WorkbenchSE)。

2.2 下载 MySQL

  1. 地址
    官网:https://www.mysql.com

  2. 打开官网,点击DOWNLOADS
    然后,点击 MySQL Community(GPL) Downloads

  3. 点击 MySQL Community Server

  4. 在General Availability(GA) Releases中选择适合的版本

    • 如果安装Windows 系统下MySQL ,推荐下载 MSI安装程序 ;点击 Go to Download Page 进行下载即可
    • Windows下的MySQL安装有两种安装程序
      • mysql-installer-web-community-8.0.25.0.msi 下载程序大小:2.4M;安装时需要联网安装组件
      • mysql-installer-community-8.0.25.0.msi 下载程序大小:435.7M;安装时离线安装即可。推荐
  5. Linux系统下安装MySQL的几种方式

  6. Linux系统下安装软件的常用三种方式:
    方式一:rpm 命令

使用rpm命令安装扩展名为".rpm"的软件包
.rpm包的一般格式:
Snipaste_2022-06-25_10-48-16

方式二:yum 命令
需联网,从互联网获取的 yum 源,直接使用 yum 命令安装

方式三:编译安装源码包
针对 tar.gz 这样的压缩格式,要用tar命令来解压;如果是其它压缩格式,就使用其它命令。

安装方式 特点
rpm 安装简单,灵活性差,无法灵活选择版本、升级
rpm repository 安装包极小,版本安装简单灵活,升级方便,需要联网安装
通用二进制包 安装比较复杂,灵活性高,平台通用性好
源码包 安装最复杂,时间长,参数设置灵活,性能好
  • 选择 Red Hat enterprise Linux即可,下载 RPM Bundle 全量包;已包括下面所有组件
  • 下载的 tar 包,使用解压工具打开
    • 解压后 rpm 安装包
      Snipaste_2022-06-25_10-56-44

2.3 CentOS 7 下检查 MySQL 依赖

1. 检查 /tmp 临时目录权限

由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。执行 :
chmod -R 777 /tmp
Snipaste_2022-06-25_10-57-40

2. 安装前,检查依赖

rpm -qa|grep libaio

  • 若存在 libaio 包如下:
    Snipaste_2022-06-25_10-59-22
    rpm -qa|grep net-tools
  • 若存在 net-tools 包如下:
    Snipaste_2022-06-25_11-00-01
    rpm -qa|grep net-tools
  • 如果不存在需要到centos安装盘里进行rpm安装。安装linux如果带图形化界面,这些都是安装好的。

2.4 CentOS7 下 MySQL 安装过程

1. 将安装程序复制到 /opt 目录下

在mysql的安装文件目录下执行:(必须按照顺序执行)

rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
  • rpm 是Redhat Package Manage缩写,通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。
  • -i , --install 安装软件包
  • -v , --verbose 提供更多的详细信息输出
  • -h , --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条

注意: 如在检查工作时,没有检查mysql依赖环境在安装mysql-community-server会报错
Snipaste_2022-06-25_11-02-46

2. 安装过程

Snipaste_2022-06-25_11-03-07

安装过程中可能的报错信息:
Snipaste_2022-06-25_11-10-01

一个命令:yum remove mysql-libs 解决,清除之前安装过的依赖即可

3. 查看 MySQL 版本

查看版本

mysql --version

mysqladmin --version

查看是否安装成功
rpm -qa|grep -i mysql

4. 初始化

若以 root 身份运行 mysql 服务,则需要执行下面的命令初始化
mysqld --initialize --user=mysql

说明: --initialize 选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将 该密码标记为过期 ,登录后你需要设置一个新的密码。生成的 临时密码 会往日志中记录一份。
查看密码:
cat /var/log/mysqld.log
Snipaste_2022-06-25_11-19-05

root@localhost: 后面就是初始化的密码

5. 启动 MySQL,查看状态

加不加.service后缀都可以

启动:systemctl start mysqld.service

关闭:systemctl stop mysqld.service

重启:systemctl restart mysqld.service

查看状态:systemctl status mysqld.service

Snipaste_2022-06-25_11-32-26

查看进程:
ps -ef | grep -i mysql

6. 查看 MySQL 服务是否自启动

systemctl list-unit-files|grep mysqld.service
Snipaste_2022-06-25_11-33-22
默认是enabled

  • 如不是enabled可以运行如下命令设置自启动
    systemctl enable mysqld.service

  • 若不希望进行自启
    systemctl disable mysqld.service

3. MySQL 登录

3.1 首次登录

通过 mysql -hlocalhost -P3306 -uroot -p 进行登录,输入初始化密码

注意
若登录出现 ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor)问题

  1. 在配置文件 /etc/my.cnf[mysqld] 下添加 skip-grant-tables 则可以无密码进入 mysql;在MySQL 之前应重启 mysql 服务systemctl restart mysqld
  2. 进入后修改密码ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
  3. 若出现 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 。则执行flush privileges 命令再执行修改密码的命令即可

3.2 修改密码

  • 因为初始化密码默认是过期的,所以查看数据库会报错
  • 修改密码:
    ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

5. 字符集的相关操作

5.1 修改 MySQL 5.7 字符集

  1. 查看默认使用的字符集
show variables like 'character%';

# 或

show variables like '%char%';
  1. 修改字符集
    vim /etc/my.cnf
    在MySQL5.7 或之前,在文件上加上
    character_set_server = utf8

  2. 重启 mysql 服务
    systemctl restart mysqld

在修改之前创建的库和表不会发生变化,需要手动修改

5.2 各级别的字符集

MySQL 中有 4 个级别的字符集和比较规则

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别
    show variables like 'character%';
    Snipaste_2022-06-25_11-51-51
  • character_set_server:服务器级别的字符集
  • character_set_database:当前数据库的字符集
  • character_set_client:服务器解码请求时使用的字符集
  • character_set_connection:服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
  • character_set_results:服务器向客户端返回数据时使用的字符集

5.4 请求到相应过程中字符集的变化

系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器处理请求时把请求字符串从 character_set_client 转为 character_set_connection
character_set_results 服务器向客户端返回数据时使用的字符集

Snipaste_2022-06-25_14-48-33

变化过程:

  1. 客户端发送请求所使用的字符集
    1. Unix 系统使用的是 UTF-8
    2. Windows 使用的是 gbk

如果你使用的是可视化工具,比如navicat之类的,这些工具可能会使用自定义的字符集来编码发送到服务器的字符串,而不采用操作系统默认的字符集(所以在学习的时候还是尽量用命令行窗口)。

  1. 服务器接收到客户端发来的请求,是一串二进制的字节,会默认认为这串字节使用 的字符集是 character_set_client,按照 character_set_client 字符集解码,后将此串字节转换为 character_set_connection 字符集编码
  2. 注意:若字段使用的字符集和 character_set_connection 的字符集不一致,则还需要进行一次字符集转换。
  3. 服务器返回客户端数据,查找到指定数据,使用 character_set_connection的字符集 进行解码,后再使用 character_set_results 字符集编码 ,返回给客户端

Snipaste_2022-06-25_14-48-57

6. SQL 大小写规范

6.1 Windows 和 Linux 平台区别

windows系统默认大小写不敏感Linux系统是大小写敏感的

SHOW VARIABLES LIKE '%lower_case_table_names%'

  • Windows 系统
    Snipaste_2022-06-25_15-09-03

  • Linux 系统:
    Snipaste_2022-06-25_15-09-22

  • lower_case_table_names 参数值的设置:

    • 默认为 0 ,大小写敏感
    • 设置为1,大小写不敏感。创建的表,库都是以小写的形式存放在磁盘上,sql语句转为小写对表和数据库进行查找
    • 设置为 2,创建表和库按照语句进行存放,查找则都是转为小写进行

在 Linux 中数据库名、表名、列名、别名规则如下:

  1. 数据库名、表名、表别名、变量名是严格区分大小写
  2. 关键字、函数名在 SQL 中不区分大小写
  3. 字段名 与 字段别名 所有情况下都忽略大小写
    在 Windows 环境下全部不区分大小写

6.2 Linux 大小写规则设置

设置大小写不敏感时,应在 /etc/my.cnf 配置文件中 [mysqld] 中加入 lower_case_table_names = 1,后重启服务器。

注意:

  • (MySQL 5.7)要在重启之前将数据库中的数据库名和表名转换为 小写 ,否则找不到数据库名
  • MySQL 8 禁止在重启 MySQL 服务器时修改此参数。若非要修改
1、停止MySQL服务
2、删除数据目录,即删除 /var/lib/mysql 目录
3、在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1
4、启动MySQL服务

6.3 SQL 编写建议

  1. 关键字和函数名全部大写
  2. 数据库名、表名、表别名、字段名、字段别名等全部小写
  3. SQL语句必须以分号结尾

7. sql_mode 的合理设置

7.1 宽松模式 vs 严格模式

宽松模式:
在插入数据时,若数据是错误的,也可能插入成功并且不报错

举例:表中 name 字段类型为 char(10),若插入数据时,超过长度为 10,仍会插入成功,只是将数据进行截断。

应用场景: 通过设置sql mode为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行 迁移 时,则不需要对业务sql 进行较大的修改。

严格模式
出现上述情况,应该报错。 Mysql 5.7 sql_mode 默认值为严格模式。在 生产环境 中,我们必须使用 严格模式,进而 开发、测试环境 的数据库也要设置

开发经验:我们应该在 应用层就做这些校验。再进行数据库迁移或项目迁移时,会方便很多

改为严格模式后可能会存在的问题:
若设置模式中包含了 NO_ZERO_DATE ,那么MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警告。例如,表中含字段TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT ‘0000-00-00 00:00:00’(零时间戳),这显然是不满足sql_mode中的NO_ZERO_DATE而报错。

7.3 模式查看和设置

  • 查看当前的 sql_mode
select @@session.sql_mode

select @@global.sql_mode

或者

show variables like 'sql_mode';
  • 临时设置方式:设置当前窗口中设置 sql_mode
改为严格模式。此方法在当前服务中生效,重启MySQL服务后失效。
SET GLOBAL sql_mode = 'modes...'; #全局

改为严格模式。此方法只在当前会话中生效,关闭当前会话就不生效了
SET SESSION sql_mode = 'modes...'; #当前会话
  • 永久设置方式:在/etc/my.cnf中配置sql_mode
    在my.cnf文件(windows系统是my.ini文件),新增:
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后 重启MySQL
当然生产环境上是禁止重启MySQL服务的,所以采用临时设置方式 + 永久设置方式 来解决线上的问题,那么即便是有一天真的重启了MySQL服务,也会永久生效了。

文章作者: 临川
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 临川羡鱼
MySQL MySQL
喜欢就支持一下吧