第01章 Linux下MySQL的安装与使用【1.MySQL架构篇】【MySQL高级】

前言

2022/7/25

暑假学习ing

推荐

【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】

尚硅谷MySQL学习笔记

第01章 Linux下MySQL的安装与使用

1、安装前说明

1.1 Linux系统及工具的准备

虚拟机VMWare+Linux系统CentOS7安装【Linux】

  • 安装并启动好两台虚拟机:Centos 7
    • 掌握克隆虚拟机的操作
      • mac 地址
      • 主机名
      • ip 地址
      • UUID

mysql-1 安装mysql5.7
mysql-2 安装mysql8.0

[root@centos7-mysql-2 ~]# vim /etc/hostname 
[root@centos7-mysql-2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
[root@centos7-mysql-2 ~]# systemctl restart network

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3bd21fb4-a2f2-40f2-bb41-d00fff5b2283
DEVICE=ens33
ONBOOT=yes
~            

UUID改一下
注意:ONBOOT=yes

注意重启网络服务systemctl restart network

测试 ip addr

[root@centos7-mysql-2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:50:56:25:79:f6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.253.131/24 brd 192.168.253.255 scope global noprefixroute dynamic ens33
       valid_lft 1790sec preferred_lft 1790sec
    inet6 fe80::2e52:b232:7baa:c97d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:63:fe:86 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:63:fe:86 brd ff:ff:ff:ff:ff:ff
[root@centos7-mysql-2 ~]# 

可以看到ip地址了
在这里插入图片描述

1.防火墙:6是iptables,  7是firewalld
2.启动服务的命令:6是service,7是systemctl  

准备工作

mysql1
/opt放入
centos7下安装mysql5.7(rpm)

官网:https://downloads.mysql.com/archives/community/

可以总体下载
在这里插入图片描述
然后解压抽离出以下文件

也可以分别下载
下载以下文件

在这里插入图片描述

如图
在这里插入图片描述

mysql1的/opt放入
在这里插入图片描述

mysql2
/opt放入

下载以下文件
在这里插入图片描述
如图
在这里插入图片描述

mysql2的/opt放入

在这里插入图片描述

1.2 查看是否安装过MySQL

1.3 MySQL的卸载

2.MySQL的Linux版的安装

2.1 MySQL的4大版本

  • MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
  • MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完 备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
  • MySQL Cluster 集群版,开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
  • MySQL Cluster CGE高级集群版,需付费。
  • 截止目前,官方最新版本为8.0.27。此前,8.0.0在2016.9.12日就发布了。
  • 本课程主要使用8.0.25版本。同时为了更好的说明MySQL8.0新特性,还会安装MySQL5.7版本,作为对比。

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

2.2下载MySQL指定版本

1.下载地址

https://downloads.mysql.com/archives/community/

5.Linux系统下安装MySQL的几种方式

5.1Linux系统下安装软件的常用三种方式:

方式1:rpm命令

使用rpm命令安装扩展名为".rpm"的软件包。

.rpm包的一般格式:
在这里插入图片描述

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

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

5.2Linux系统下安装MySQL,官方给出多种安装方式

2.3 CentOS7下检查MySQL依赖

1.检查/tmp临时目录权限(必不可少)

由于mysql安装过程中,会通过mysql用户在/tmp_db文件,所以请给/tmp较大的权限。执行:chmod -R 777 /tmp
在这里插入图片描述

2.安装前,检查依赖

rpm -qa|grep libaio
  • 如果存在libaio包如下:
    在这里插入图片描述
rpm -qa|grep net-tools
  • 如果存在net-tools包如下:
    在这里插入图片描述

  • 如果不存在需要在centos安装盘里面进行rpm安装。安装linux如果带图形化界面,这些都是安装好的。

2.4 CentOS7下MySQL安装过程

1.将安装程序拷贝到/opt目录下

2.安装过程截图

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

rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugirps-8.o.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
  • 注意:如在检查工作时,没有检查mysql依赖环境在安装mysql-community-server会报错
  • rpm是Redhat Package Manage缩写,通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。
  • -i,–install安装软件包
  • -v,–verbose 提供更多的详细信息输出
  • -h,–hash 软件包安装的时候列出哈希标记(和-v一起使用效果更好),展示进度条

安装过程中可能报错信息:
在这里插入图片描述

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

解决:
在这里插入图片描述

mysql2 5.7.28的顺序

rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm 
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm 
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm 

3.查看MySQL的版本

执行如下命令,如果成功表示mysql安装成功。类似java -version如果打印出版本等信息

mysql --version
# 或
mysqladmin --version

在这里插入图片描述

在这里插入图片描述
执行如下命令,查看是否安装成功。需要增加-i不用区分大小写,否则搜索不到。

rpm -qa|grep -i mysql

在这里插入图片描述
在这里插入图片描述

4.服务的初始化

为了保证数据库目录与文件的所有者为mysql登录用户,如果你是以root身份运行mysql服务,需要执行下面的命令初始化:

mysqld --initialize --user=mysql

说明:–initialize 选项默认以“安全”模式来初始化,则会为root用户生成一个密码并将该密码标记为过期,登录后你需要设置一个新的密码。生成的临时密码会往日志中记录一份。
111
查看密码:

cat /var/log/mysqld.log

1
在这里插入图片描述

j:hz2hS7Y0XY

2
在这里插入图片描述

+Zj1y#:UH:xE

5.启动mysql,查看状态

先查看mysql服务启动没有
在这里插入图片描述
如何启动


```bash
systemctl start mysqld

在这里插入图片描述

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

systemctl list-unit-files|grep mysqld.service

在这里插入图片描述
默认是enabled

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

尝试登录
具体查看3.1

修改密码
具体查看3.2

7/25 20:35


3.登录

3.1 首次登录

尝试登录

[root@centos7-mysql-2 opt]# mysql -uroot -pj:hz2hS7Y0XY

在这里插入图片描述

[root@centos7-mysql-2 opt]# mysql -uroot -p+Zj1y#:UH:xE

在这里插入图片描述

查看库,需要更改密码
在这里插入图片描述

3.2 修改密码

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'

请添加图片描述

测试修改密码
在这里插入图片描述
查看库
在这里插入图片描述
和Windows下是一样的

3.3 设置远程登录

1.当前问题

SQLyog实现远程连接,发现是连接不成功的
在这里插入图片描述

2.确认网络

1.在远程机器上使ping ip地址 保证网络通畅
在这里插入图片描述

2.在远程机器上使用telnet 命令保证端口号开放访问

telnet ip地址 端口号

在这里插入图片描述
需要跳转第3步

拓展:telnet命令开启

  1. 打开控制面板-》查看方式=小图标-》点击程序和功能
    在这里插入图片描述
  2. 打开程序和功能-》点击启动或关闭Windows功能
    在这里插入图片描述
  3. 打开Windows功能-》找到Telnet客户端-》打√-》点击确定
    在这里插入图片描述
  4. Windows已完成请求更改-》点击关闭
    在这里插入图片描述

3.关闭防火墙或开放端口

关闭Windows防火墙

  1. 打开防火墙窗口-》点击启动或关闭防火墙
    在这里插入图片描述
  2. 设置关闭-》点击确定
    在这里插入图片描述
  3. 关闭成功
    在这里插入图片描述

还需关闭虚拟机的防火墙

  1. 检查防火墙状态,发现开启
systemctl status firewalld

在这里插入图片描述

  1. 关闭防火墙
systemctl stop firewalld
  1. 重新查看
systemctl status firewalld

在这里插入图片描述
拓展:可以设置自启动关闭防火墙

systemctl disable firewalld

在这里插入图片描述

测试,还是不行
在这里插入图片描述

4. Linux下修改配置

mysql下

show databases;

在这里插入图片描述

use mysql;
select host,user from user;

在这里插入图片描述
可以发现root只能在localhost登录

所以需要设置可以远程连接

update user set host = '%' where user = 'root';

实际开发中,可以写得严谨一点

update user set host = '192.168.1.%' where user = 'root';

重新查看:
在这里插入图片描述
一定要执行操作,刷新权限,才可以起作用

flush privileges;

在这里插入图片描述

测试连接,发现报错不一样了。这个问题只会在mysql8.0中出现。
因为mysql8.0新特性:对密码进行加密。
在这里插入图片描述
解决方法:Linux下,登录mysql之后,执行这条SQL:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

在这里插入图片描述

然后再重新配置SQLyog连接,则可连接成功了,OK。

跳转5

5.测试

mysql1 mysql8.0的连接成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
连接mysql2 mysql5.7

提示:
关闭防火墙
修改root用户远程登录

一定要执行操作,刷新权限,才可以起作用

flush privileges;

成功:
在这里插入图片描述

4. MySQL8的密码强度评估(了解)

5.字符集的相关操作

5.1 修改MySQL5.7字符集

1.修改步骤

在MySQL8.0版本之前,默认字符集为latin1,utf8字符集指向的是utf8mb3。网站开发人员在数据库设计的时 候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改为utf8mb4,从而避免上述乱码的问题。

操作1:查看默认使用的字符集

show variables like 'character%';
#或者
show variables like '%char%'; 

MySQL8.0中执行:

在这里插入图片描述
MySQL5.7中执行:
在这里插入图片描述

show create table emp1;
show create database dbtest1;

2.修改

vim /etc/my.cnf

修改文件
最后添加语句

character_set_server=utf8

3.最后重启mysql服务

systemctl restart mysqld.service

4.重新登录并查看

show variables like '%character%';

在这里插入图片描述
注意:
已有的数据库的字符集不会修改,
已有数据库下新建表(没有指明字符集)和数据库的字符集保持一致

2.已有库&表字符集的变更

修改已有数据库的字符集

alter database dbtest1 character set 'utf8';

修改已有数据表的字符集

alter table t_emp convert to character set 'utf8';

注意:可能会有已有数据的乱码问题

5.2 各级别的字符集

MySQL有4个级别的字符集和比较规则,分别是:

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

执行如下SQL语句:

show variables like 'character%';

在这里插入图片描述

  • character_set_server:服务器级别的字符集
  • character_set_database:当前数据库的字符集
  • character_set_client:服务器解码请求时使用的字符集
  • character_set_connection:服务器处理请求时会把请求字符串从character_set_client转为 character_set_connection
  • character_set_results:服务器向客户端返回数据时使用的字符集

创建数据库,如无指明字符集,则默认和服务器级别一样
同理:当前一级的默认创建,其字符集和上一级相同

可以显示指明创建的字符集

character set 'utf8'

实际开发中不太需要,统一utf8字符集

5.3 字符集与比较规则(了解)

1. utf8与utf8mb4

通过如下指令可以查看mysql支持的字符集:

SHOW CHARSET;
# 或者
SHOW CHARACTER SET;

在这里插入图片描述
在这里插入图片描述

2. 比较规则

常用操作1

# 查看GBK字符集的比较规则
SHOW COLLATION LIKE 'gbk%'

在这里插入图片描述

# 查看UTF-8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'

在这里插入图片描述
在这里插入图片描述
常用操作2

#查看服务器的字符集和比较规则
SHOW VARIABLES LIKE '%_server';

在这里插入图片描述

#查看数据库的字符集和比较规则
SHOW VARIABLES LIKE '%_database';

在这里插入图片描述

#查看具体数据库的字符集和比较规则
SHOW CREATE DATABASE dbtest1;

在这里插入图片描述

#修改具体数据库的字符集和比较规则
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

在这里插入图片描述

常用操作3

#查看表的字符集
SHOW CREATE TABLE emp1;

在这里插入图片描述

#查看表的比较规则
SHOW TABLE STATUS FROM dbtest1 LIKE 'emp1';

在这里插入图片描述

#修改表的字符集和比较规则
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

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

在这里插入图片描述

在这里插入图片描述
同一编码解码的字符集需一样

经验
都设置成utf8

SET NAMES utf8

6.SQL大小写规范

6.1 Windows和Linux平台区别

在SQL中,关键字和函数名是不区分大小写的。

大小写规范:
Windows系统默认大小写不敏感
Linux系统默认大小写敏感

通过命令查看:

SHOW VARIABLES LIKE '%lower_case_table_name%';
  • Windows 系统下

在这里插入图片描述

  • Linux 系统下:
    在这里插入图片描述

  • lower_case_table_names参数值的设置:

    • 默认为0,大小写敏感。
    • 设置1, 大小写不敏感。创建的表,数据库都是以小写的形式存放在磁盘上,对于sql语句都是转换为小写对表和数据库进行查找。
    • 设置2,创建的表和数据库依据语句上的格式存放,凡是查找都是转换为小写进行的。
  • 两个平台上SQL大小写的区别具体来说:

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名、表名、表的别名、变量名是严格区分大小写的;
2、关键字、函数名称在SQL中不区分大小写;
3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;


MySQL在Windows的环境下全部不区分大小写

6.2Linux下大小写规则设置

当想设置为大小写不敏感时,要在my.cnf这个配置文件[mysqld]中加入lower_case_table_names=1,然后重启服务器。

  • 但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。
  • 此参数适用于MySQL5.7。在MySQL8下禁止在重新启动MySQL服务时将lower_case_table_names设置成不同于初始化MySQL服务时设置的lower_case_table_names值。如果非要将MySQL8设置为大小写不敏感,具体步骤为:
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语句必须以分号结尾。

数据库名、表名和字段名在LinuxMySQL环境下是区分大小写的,因此建议你统一这些字段的命名规则,比如全部采用小写的方式。

虽然关键字和函数名称在SQL中不区分大小写,也就是如果小写的话同样可以执行。但是同时将关键词和函数名称全部大写,以便于区分数据库名、表名、字段名。

7. sql_mode的合理设置

7.1 介绍

sql_mode会影响MySQL支持的SQL语法以及它执行的数据验证检查。通过设置sql_mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。

MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。

MySQL5.6和MySQL5.7默认的sql_mode模式参数是不一样的:

  • 5.6的mode默认值为空(即:NO_ENGINE_SUBSTITUTION),其实表示的是一个空值,相当于没有什么模式设置,可以理解为宽松模式。在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。
  • 5.7的mode是STRICTITRANS_TABLES,也就是严格模式。用于进行数据的严格校验,错误数据不能插入,报 error(错误),并且事务回滚。

7.2宽松模式vs严格模式

宽松模式:
如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受,并且不报错。

举例:我在创建一个表时,该表中有一个字段为name,给name设置的字段类型时char(10),如果我在插入数 据的时候,其中name这个字段对应的有一条数据的长度超过了10,例如’1234567890abc,超过了设定的字段长度10,那么不会报错,并且取前10个字符存上,也就是说你这个数据被存为了’1234567890,而’abc’就没有了。但是,我们给的这条数据是错误的,因为超过了字段长度,但是并没有报错,并且mysqI自行处理并接受了,这就 是宽松模式的效果。

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

严格模式:
出现上面宽松模式的错误,应该报错才对,所以MySQL5.7版本就将sql_mode默认值改为了严格模式。所以在生产等环境中,我们必须采用的是严格模式,进而开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可 以发现问题。并且我们即便是用的MySQL5.6,也应该自行将其改为严格模式。

开发经验:MySQL等数据库总想把关于数据的所有操作都自己包揽下来,包括数据的校验,其实开发中,我们应该在自己开发的项目程序级别将这些校验给做了,虽然写项目的时候麻烦了一些步骤,但是这样做之后,我们在进 行数据库迁移或者在项目的迁移时,就会方便很多。

改为严格模式后可能会存在的问题:

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

7.3 宽松模式再举例

7.4 模式查看和设置

  • 查看当前的sql-mode
select @@session.sql_mode ;

select @@global.sql_mode ;

#或者

show variable like 'sql_mode';

在这里插入图片描述

  • 临时设置方式:设置当前窗口中设置sql_mode
select @@global.sql_mode ; #全局
# 重启mysql服务就不生效了

select @@session.sql_mode ; #当前会话
# 关闭当前会话就不生效了

  • 永久设置方式:在/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_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

然后重启mysql

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

  • 测试数据:
CREATE TABLE mytbl2(id INT,NAME VARCHAR(16),age INT,dept INT);

INSERT INTO mytbl2 VALUES(1, 'zhang3',33,101);  
INSERT INTO mytbl2 VALUES(2,'li4',34,101);  
INSERT INTO mytbl2 VALUES(3,'wang5',34,102);  
INSERT INTO  mytbl2 VALUES(4,'zhao6',34,102);  
INSERT  INTO  mytbl2  VALUES(5,'tian7',36,102);

#查询每个部门年龄最大的人
SELECT NAME, dept,MAX(age) FROM mytbl2 GROUP BY dept;


报错:
在这里插入图片描述

# 设置sql_mode
SET SESSION sql_mode='';

再查询,结果不一定对
在这里插入图片描述


INSERT INTO mytbl2 (id,NAME,age)
VALUES(6,'Tom','aaa');

SELECT * FROM mytbl2;

没有报错
在这里插入图片描述

7.5 sql_mode的常用值

最后

p97~p103

2022/7/28 12:27

Markdown 18369 字数 871 行数
HTML 11368 字数 423 段落

猜你喜欢

转载自blog.csdn.net/qq_51625007/article/details/125972148