本章内容
关系型数据库基础
安装 MySQL
管理数据库和表
用户和权限管理
函数,存储过程,触发器和事件
MySQL 架构
存储引擎
服务器选项,系统和状态变量
优化查询和索引管理
锁和事务管理
日志管理
备份还原
MySQL 集群
压力测试
1)数据库原理
1.1)数据的时代
涉及的数据量大
数据不随程序的结束而消失
数据被多个应用程序共享
大数据
数据的分类:
结构化的数据:即有固定格式和有限长度的数据。
例如:填的 EXCEL 表格 就是结构化的数据
国籍:中华人民共和国
民族:汉
性别:男
这都叫 结构化数据
非结构化的数据:非结构化的数据越来越多,就是不定长、无固定格式的数据。
例如:网页,图片文件,有时候非常大,有时候很小;
例如:语音,视频。
都是 非结构化数据。
半结构化数据:
比如:XML 或者 HTML 的格式的数据。
1.2)数据库的发展史
1.2.1)文件管理模式 的缺点
编写应用程序不方便
不支持对文件的并发访问
无安全控制功能
难以按用户视图表示数据
数据间联系弱
数据冗余不可避免
应用程序依赖性
1.2.2)数据库管理的发展阶段
萌芽阶段:文件系统
使用磁盘文件来存储数据
初级阶段:第一代数据库
出现了网状模型、层次模型的数据库
中级阶段:第二代数据库
关系型数据库和结构化查询语言
高级阶段:新一代数据库
"关系-对象" 型数据库
1.3)DBMS 数据库管理系统
Database:数据库是数据的汇集,它以一定的组织形式存于存储介质上。
DBMS:Database Management System,是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心。
DBA:Database Administrator,负责数据库的规划、设计、协调、维护和管理等工作。
Application:应用程序,指以数据库为基础的应用程序。
1.4)数据库管理系统的优点
程序与数据相互独立。
保证数据的安全、可靠。
最大限度地保证数据的正确性。
数据可以并发使用并能同时保证一致性。
相互关联的数据的集合。
较少的数据冗余。
1.5)数据库管理系统的基本功能
数据定义
数据处理
数据安全
数据备份
1.6)数据库系统的架构
单机式架构(Access)
大型主机/终端架构
主从式架构(C/S)
分布式架构(TiDB)
1.7)各种数据库管理系统
1.7.1)层次 数据库
参考:https://www.yuque.com/blogking/linux/ud18vxqsn6afzfy6
分层结构由 IBM 在 20 世纪 60 年代开发,并在早期大型机 DBMS 中使用。
记录的关系形成了一个树状模型。这种结构简单,但缺乏灵活性,因为这种关系仅限于一对多关系。
代表数据库:IBM IMS (信息管理系统)
优点:这是导航结构
优点:结构清晰,分类查询方便
缺点:有可能造成数据无效,如:无法区分是哪个 "李白"
1.7.2)网状 数据库
1964 年通用电气 GE 公司的 Charles Bachman 成功地开发出世界上第一个网状数据库 IDS ( 集成数据存储),IDS 具有数据模式和日志的特征,只能在 GE 主机运行。
特点:
1、每个表都是独立的
2、通过关系字段将两个表连接起来
3、关系:两个表的公共字段
4、关系型数据库中多表联合查询效率低下。比如查询整个公司的四月的营业额( 张经理 + 李经理+xxx )。
1.7.3)RDBMS 关系型数据库
Relational Database Management System,关系模型最初由 IBM 公司的英国计算机科学家埃德加·科德(Edgar F. Codd)于 1969 年描述,1974 年,IBM 开始开发系统 R,这是一个开发 RDBMS 原型的研究项目。
然而,第一个商业上可用的 RDBMS 是甲骨文,于 1979 年由关系软件(现为甲骨文公司)发布。
特点:
1、每个表都是独立的
2、通过关系字段将两个表连接起来
3、关系:两个表的公共字段
4、关系型数据库中多表联合查询效率低下。
1.7.3.1)关系统型数据库 相关概念
关系 Relational:关系就是 二维数据表,其中:表中的行、列次序并不重要
行 row:表中的每一行,又称为一条 记录 record
列 column:表中的每一列,称为 属性,字段,域 field
主键 Primary key:PK ,一个或多个字段的组合,用于唯一确定一个记录的字段,一张表只有一个主键, 主键字段不能为空 NULL。
唯一性:主键值必须是唯一的,不允许重复。
非空性:主键值不能为空,即不得为 NULL。
独特性:每张表只能定义一个主键。
不可变性:一旦记录被插入,主键值便不可被修改。
唯一键 Unique key:一个或多个字段的组合,用于唯一确定一个记录的字段,一张表可以有多个 UK 唯一键,而且 UK 唯一键字段可以为 NULL。
域 Domain:属性的 取值范围
如:性别只能是 男 和 女 两个值
如:人类的年龄只能 0-150。
1.7.3.2)常用 关系数据库
MySQL:
MySQL
MariaDB
Percona Server
PostgreSQL:简称为 pgsql,EnterpriseDB
Oracle
MSSQL Server
DB2
1.7.3.3)数据库排名
DB-Engines Ranking - popularity ranking of database management systems
1.8)关系型数据库理论
1.8.1)实体-联系 模型( E-R 模型 )
E-R 模型 即 实体-关系模型 :E-R 模型就是描述数据库存储数据的结构模型
对于大型公司开发项目:需要根据产品经理的设计,先使用建模工具
如:power designer,db desinger 等这些软件来 画出实体-关系模型( E-R 模型)
实体 Entity:客观存在并可以相互区分的客观事物或抽象事件称为实体即表,在 E-R 图中用 矩形 表示实体,把实体名写在框内。( 类似表 )
属性 Attribute:实体所具有的特征或性质,描述实体里面的单个信息, 使用 椭圆形 表示。( 类似字段 )
联系 Relationship:描述了实体的属性之间的关联规则。( 关系 )
实体内部的联系:指组成同一个实体内的各属性之间的联系。如职工实体中,职工号和部门经理号之间有一种关联关系
实体之间的联系:指不同实体之间的属性的联系。例:学生选课实体和学生基本信息实体之间
实体之间的联系用 菱形 框表示
E-R 模型 范例:
参考:开放平台
实体:类似数据库中的表。
属性:类似数据库表中的字段。
联系:类似描述数据表之间的关系。( 指实体之间的联系 )
(1)地址实体 包括 用户编号,省,市,地区,收件人,联系电话,是否默认地址。
(2)用户实体 包括 用户编号,用户名称,昵称,用户密码,手机号,邮箱,头像,用户级别
(3)购物车实体 包括 购物车编号,用户编号,商品编号,商品数量,图片文件 url
(4)订单实体 包括 订单编号,收货人,收件人电话,总金额,用户编号,付款方式,送货地址,下单时间
(5)订单详情实体 包括 订单详情编号,订单编号,商品名称,商品编号,商品数量。
总结
其实,任何一个基于数据库的应用项目,都可以通过这种先建立 ER 模型,再转换成数据表的方式,完成数据库的设计工作,创建ER模型不是目的,目的是把业务逻辑梳理清楚,设计出优秀的数据库。
我建议你不是为了建模而建模,要利用创建 ER 模型的过程来整理思路,这样创建 ER 模型才有意义。
1.8.2)联系类型( ER 模型的 3 个要素 )
一对一:指实体之间的关系是一一对应的,比如个人与身份证信息之间的关系就是一对一的关系。一个人只能有一个身份证信息,一个身份证也只属于一个人。
一对多:指一边的实体通过关系,可以对应多个另一边的实体。
相反另外一边的实体通过这个关系,则只能对应唯一的一边的实体。
比如说:我们新建一个班级表,而每个班级都有多个学生,每个学生则对应一个班级,班级对学生就是一对多的关系。
多对多:
指关系两边的实体都可以通过关系对应多个对方的实体。
比如在进货模块中,供货商与超市之间的关系就是多对多的关系,一个供货商可以给多个超市供货,一个超市也可以从多个供货商那里采购商品。
再比如一个选课表,有许多科目,每个科目有很多学生选,而每个学生又可以选择多个科目,这就是多对多的关系。
主键与外键 的区别与联系
参考:数据库外键主键_51CTO博客_数据库的主键和外键
主键 和 外键 是关系型数据库中非常重要的概念,用于描述表之间的关系。下面是它们的区别和联系:
主键 是数据表中的一列或一组列,用于唯一地标识每一行记录。主键必须是唯一的,不能重复,并且不能为 NULL 。通常情况下,主键会自动递增,从而保证每一行记录的唯一性。主键可以由单个列或多个列组成,多列主键也称为复合主键。
外键 是一个表中的列,它指向另一个表的主键列,用于描述表之间的关系。外键可以为空,也可以有重复值。外键在建立表之间的关系时非常重要,它确保了表之间的数据完整性,同时也是查询和更新表之间数据的基础。
主键和外键之间的联系 在于外键关联到另一个表的主键上。外键通常是在一张表中,引用另一张表的主键,这样就能够建立表与表之间的关联关系。主键和外键都是用来维护表之间的关系的,主键作为表中每一行记录的唯一标识,而外键作为表与表之间的桥梁,建立了表之间的关联关系。
总的来说,主键和外键是非常重要的概念,它们在关系型数据库的设计和使用中起着至关重要的作用。主键和外键的建立需要根据具体的业务需求和数据库设计原则进行,以确保数据的完整性和一致性。
1.8.3)数据的操作( 增删改查 )
开发工程师 CRUD( 增加 Create、查询 Retrieve 或 Read、更新 Update、 删除 Delete)
数据提取:在数据集合中提取感兴趣的内容。SELECT
数据更新:变更数据库中的数据。INSERT、DELETE、UPDATE
1.8.4)数据库规划流程
参考:https://www.cnblogs.com/daniumeng/p/8715911.html
CDM 模型:概念数据库模型,建立在传统的ER图模型的理论上,主要的三大元素有实体型,属性 和 联系。
LDM 模型:在 CDM 的基础上,对于每个实体定义了主键和外键,需要进行范式化处理。LDM 是为了尽可能详细的描述数据,但是不考虑数据在物理上是如何实现的。
PDM 模型:主要涉及到的基本概念有: 表、列、试图、主键、候选键、储存过程、触发器、索引、完整性检查约束。
收集数据,得到字段
收集必要且完整的数据项
转换成数据表的字段
把字段分类,归入表,建立表的关联
关联:表和表间的关系
分割数据表并建立关联的优点
节省空间
减少输入错误
方便数据修改
规范化数据库
1.8.5)数据库的正规化分析
参考:
第一范式、第二范式、第三范式、BCNF范式详解-腾讯云开发者社区-腾讯云
数据库-第一范式、第二范式、第三范式、BC范式、第四范式简析-腾讯云开发者社区-腾讯云
数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。
关系模型的发明者 埃德加·科德 最早提出这一概念,并于 1970 年代初定义了第一范式、第二范式和第三范式的概念。
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式 (4NF)和第五范式(5NF,又称完美范式)。
满足最低要求的范式是 第一范式(1NF)。
在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
规则是死的,人是活的,所以范式是否必须遵守,要看业务需要而定。
掌握范式的目的:是为了在合适的场景下违反范式。
参考:简单了解第一,二,三范式(图文详细)_第一范式-CSDN博客
什么是范式?
范式:范式是符合某一种级别的关系模式的集合,表示一个关系内部属性之间的联系何合理化程度。
粗略理解:就是一张数据表的表结构所符合的某种设计标准的级别
1.8.5.1)第一范式:1NF
概念:指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性
无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,确保每一列的原子性。除去同类型的字段,就是无重复的列。
说明:第一范式(1NF)是对关系模式的 基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
1.8.5.2)第二范式:2NF
概念:在第一范式(1NF)的基础上,实体的属性完全函数依赖于关键字(复合主键),不能存在部分依赖函数于主关键字(复合主键)
第二范式:必须先满足第一范式,属性完全依赖于主键,要求表中的每个行必须可以被唯一地区分,通常为表加上每行的唯一标识主键 PK。非 PK 的字段需要与整个 PK 有直接相关性,即非 PK 的字段不能只依赖于部分主键。
参考:mysql复合主键是什么意思-mysql教程-PHP中文网
什么是 复合主键?
复合主键 是指 数据库表的主键含有一个以上的字段组成,即多字段主键;复合主键是主键的一种,与主键具有相同的功能和定义。
为什么会出现 复合主键?
因为数据表 name 字段可能出现重名的情况,所以要加上 id 字段来保证记录的唯一性。
1.8.5.3)第三范式:3NF
满足第三范式 必须先满足第二范式属性,非主键属性不依赖于其它非主键属性。
第三范式:要求一个数据表中不包含已在其它表中已包含的非主关键字信息,非 PK 的字段间不能有从属关系。
1.8.6)SQL 结构化查询语言简介
SQL:Structure Query Language,( 结构化查询语言 )是 1974 年由 Boyce 和 Chamberlin 提出的一个通用的、功能极强的关系性数据库语言。
SQL 解释器:将 SQL 语句解释成机器语言
数据存储协议:应用层协议,C/S
S:Server, 监听于套接字,接收并处理客户端的应用请求
C:Client
客户端程序接口
CLI
GUI
应用编程接口
ODBC:Open Database Connectivity
JDBC:Java Data Base Connectivity
1.8.7)数据约束
约束:Constraint,表中的数据在数据类型限定的基础上额外要遵守的限制
常见约束 如下:
非空 not null:此字段不允许填写空值
主键 primary key:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即 NOT NULL,一个表只能有一个。
惟一键 unique:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为 NULL,一个表可以存在多个。
默认值 default:当不填写字段对应的值会使用默认值,如果填写时以填写为准。
外键 foreign key:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据。
检查:字段值在一定范围内,如年龄在 0 到 150 之间。
1.8.8)关系运算
选择:挑选出符合条件的行。( 类似 grep 命令 )
投影:挑选出需要的字段。( 类似 cut 命令 )
连接:表间字段的关联。
1.8.9)数据抽象
物理层:数据存储格式,即 RDBMS 在磁盘上如何组织文件。
逻辑层:DBA 角度,描述存储什么数据,以及数据间存在什么样的关系。
视图层:用户角度,描述 DB 中的部分数据。
1.8.10)关系模型的分类
关系模型
基于对象的关系模型
半结构化的关系模型:XML 数据
2)MySQL 安装和基本使用
2.1)MySQL 介绍
2.1.1)MySQL 历史
MySQL 的历史可以追溯到 1979 年,它的创始人 叫作 Michael Widenius,他在开发一个报表工具的时候,设计了一套 API,后来他的客户要求他的 API 支持 SQL 语句,他直接借助于 mSQL(当时比较牛)的代码,将它集成到自己的存储引擎中。但是他总是感觉不满意,萌生了要自己做一套数据库的想法。
直到 1996 年,MySQL 1.0 发布,Michael Widenius 的大女儿的简称就是 MY,Michael Widenius 大概也是把 MySQL 当成自己的女儿一样来对待,仅仅过了几个月的时间,1996 年 10 月 MySQL 3.11.1 当时发布了 Solaris 的版本,一个月后,Linux 的版本诞生,从那时候开始,MySQL 慢慢的被人所接受。
1999年,Michael Widenius 成立了 MySQL AB 公司,MySQL 由个人开发转变为团队开发,2000 年使用 GPL 协议开源。
2001 年,MySQL 生命中的大事发生了,那就是存储引擎 InnoDB 的诞生!Oracle 在 2005 年收购了 InnoDB,只不过 InnoDB 一直以来都只能作为第三方插件供用户选择。直到现在,MySQL 可以选择的众多存储引擎中,InnoDB 依然是第一选择。
2008 年 1 月,MySQL AB 公司被 Sun 公司以 10 亿美金收购,MySQL 数据库进入 Sun 时代。Sun 为 MySQL 的发展提供了绝佳的环境,2008 年 11 月,MySQL 5.1 发布,MySQL 成为了最受欢迎的小型数据库。
2009 年 4 月,Oracle 公司以 74 亿美元收购 Sun 公司,MySQL 也随之进入 Oracle 时代。
2010 年 12 月,MySQL 5.5 发布,Oracle 终于把 InnoDB 做成了 MySQL 默认的存储引擎,MySQL 从此进入了辉煌时代。
然而,从那之后,Oracle 对 MySQL 的态度渐渐发生了变化,Oracle 虽然宣称 MySQL 依然尊少 GPL 协议,但却暗地里把开发人员全部换成了 Oracle 自己人,开源社区再也影响不了 MySQL 发展的脚步,真正有心做贡献的人也被拒之门外,MySQL 随时都有闭源的可能……
看着自己辛苦养大的 MySQL 被 Oracle 搞成这样,Michael Widenius 非常失望,决定在 MySQL 走向闭源前,将 MySQL 进行分支化,依然是使用了自己小女儿的名字 MariaDB( 玛莉亚DB )。
MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可 MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行,使之能轻松成为 MySQL 的代替品。在存储引擎方面,使用 XtraDB 来代替 MySQL 的 InnoDB。
MariaDB 由 MySQL 的创始人 Michael Widenius 主导,由开源社区的大神们进行开发。因此,大家都认为,MariaDB 拥有比 MySQL 更纯正的 MySQL 血脉。
最初的版本更新与 MySQL 同步,相对 MySQL5 以后的版本,MariaDB 也有相应的 5.1~5.5 的版本。后来 MariaDB 终于摆脱了 MySQL ,它的版本号直接从 10.0 开始,以自己的步伐进行开发,当然,还是可以对 MySQL 完全兼容。
MySQL 大事记
1979 年:TcX 公司 Monty Widenius,Unireg
1996 年:发布 MySQL1.0,Solaris 版本,Linux 版本
1999 年:MySQL AB 公司,瑞典
2003 年:MySQL 5.0 版本,提供视图、存储过程等功能
2008 年:Sun 公司以 10 亿美元收购 MySQL
2009 年:Oracle 公司以 74 亿美元收购 Sun 公司
2009 年:Monty 成立 MariaDB
2.1.2)MySQL 系列
2.1.2.1)MySQL 的三大主要分支
MySQL
MariaDB
Percona Server
2.1.2.2)官方网址
MySQL
MariaDB Foundation - MariaDB.org
Open Source Database Software Support & Services | Percona
2.1.2.3)官方文档
MySQL :: MySQL Documentation
MariaDB Knowledge Base
Percona Server for MySQL - Open Source MySQL Server Alternative
2.1.2.4)版本演变
MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 --> 8.0
MariaDB:5.1 -->5.5 --> 10.0--> 10.1 --> 10.2 --> 10.3 --> 10.4 --> 10.5 --> 10.6
MySQL 被 Sun 收购后, 搞了个过渡的 6.0 版本, 没多久就下线了, 后来被 Oracle 收购后, 终于迎来了像样的 5.6
版本, 之后就是 5.7, 8.0 版本.
由于 6.0 版本号已被用过, 7.x 系列版本专用于 NDB Cluster, 因而新版本号从 8.0 开始.
2.1.3)MySQL 的特性
开源免费
插件式存储引擎:也称为 "表类型",存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,MySQL 5.5.5 开始 innoDB 引擎是 MYSQL 默认引擎
MyISAM ==> Aria
InnoDB ==> XtraDB
单进程,多线程
诸多扩展和新特性
提供了较多测试组件
2.2)MySQL 安装方式介绍和快速安装
2.2.1)安装方式介绍
程序包管理器管理的程序包
源代码编译安装
二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
2.2.2)RPM 包安装 MySQL
CentOS6 默认光盘镜像仓库 带有 MySQL 5.1 版本
CentOS7 默认光盘镜像仓库 不再包含 MySQL 软件,而存在 MariaDB 5.5 版本 。
CentOS8 默认光盘镜像仓库 即包含 MySQL 软件,也包含 MariaDB 10.3 软件。
[root@centos6 ~] yum info mariadb-server
[root@centos7 ~] yum info mariadb-server
[root@centos8 ~] yum info mysql-server
[root@centos8 ~] yum info mariadb-server
CentOS 安装光盘
项目官方:Download MariaDB Server - MariaDB.org
国内镜像:Index of /mariadb/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
Index of /mysql/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
CentOS 8:安装光盘直接提供
MySQL-Server:8.0
MariaDB-Server : 10.3.17
CentOS 7:安装光盘直接提供
MariaDB-Server:5.5 服务器包
MariaDB 客户端工具包
CentOS 6:
MySQL-Server:5.1 服务器包
MySQL:客户端工具包
默认可以直接基于 Yum 命令安装数据库软件
// "基于 YUM 源安装"
// "CentOS7" 默认可以安装 MariaDB ( 光盘镜像仅包含 MariaDB )
// "CentOS8" 默认可以安装 MySQL ( 光盘镜像两者都包含 )
[root@centos7 ~] yum install mariadb-server -y
[root@centos8 ~] yum install mysql-server -y
// "启用 数据库 服务"
[root@centos7 ~] systemctl enable --now mariadb
[root@centos8 ~] systemctl enable --now mysqld
"连接数据库"
// 使用 Yum 命令基于光盘镜像源安装的数据库服务
// 默认可以直接使用 mysql 客户端工具连接, 密钥为空 ( "不安全" )
[root@centos7 ~] mysql
[root@centos8 ~] mysql
演示:基于 MySQL 官网下载软件包( 自定义安装 MySQL 版本 )
下载 老版本
下载完成后,直接使用 rpm -ivh 安装即可
范例:
Linux 小技巧:CentOS 7 利用 Yum 源安装 MySQL5.7
// 清华源
[root@centos7 ~] tee /etc/yum.repos.d/mysql.repo <
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
EOF
[root@centos7 ~] yum clean all
[root@centos7 ~] yum makecache
// 安装软件包 ( mysql-community 综合软件包 )
[root@centos7 ~] yum -y install mysql-community-server
[root@centos7 ~] systemctl enable --now mysqld
[root@centos7 ~] netstat -nltp
// 使用 mysql 客户端验证
[root@centos7 ~] mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
// 查看日志 ("过滤出临时密码")
[root@centos7 ~] cat /var/log/mysqld.log | grep password
2023-12-28T17:30:19.636282Z 1 [Note] A temporary password is generated for root@localhost: 9JuVv4/?tejN
2023-12-28T17:30:34.693639Z 2 [Note] Access denied for user 'root'@'localhost' (using password: NO)
// 修改初始密码方法 1
[root@centos7 ~] mysql -uroot -p'9JuVv4/?tejN' ( 注意: 密码建议使用引号包含 )
// 注意: "使用初始密码登录无法执行操作, 需要修改密码后才可以!!!"
mysql> status
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
# 修改简单密码不符合密码策略
mysql> alter user root@'localhost' identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
# 修改为复杂密码
mysql> alter user root@'localhost' identified by 'P@ssw0rd123456';
Query OK, 0 rows affected (0.00 sec)
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.44, for Linux (x86_64) using EditLine wrapper
Connection id:3
Current database:
Current user:root@localhost
SSL:Not in use
Current pager:stdout
Using outfile:''
Using delimiter:;
Server version:5.7.44
Protocol version:10
Connection:Localhost via UNIX socket
Server characterset:latin1
Db characterset:latin1
Client characterset:utf8
Conn. characterset:utf8
UNIX socket:/var/lib/mysql/mysql.sock
Uptime:2 min 19 sec
Threads: 1 Questions: 11 Slow queries: 0 Opens: 107 Flush tables: 1 Open tables: 100 Queries per second avg: 0.079
--------------
mysql> exit
// 修改初始密码方法 2
[root@centos7 ~] mysqladmin -uroot -p'9JuVv4/?tejN' password 'P@ssw0rd123456'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
常用 MySQL 客户端命令( MySQL 客户端 内置命令 )
helpDisplay this help.
statusGet status information from the server.
systemExecute a system shell command.
sourceExecute an SQL script file. Takes a file name as an argument.
exitExit mysql. Same as quit.
mysql -uroot -p'P@ssw0rd123456'
// 注意事项
mysql> help ( 'MySQL 客户端' 内置命令无需以分号结尾 )
mysql> show databases; ( 'MySQL 服务端' 命令则需要使用分号结尾 )
查看 某个进程 是否为 多线程( 面试题 )
// 方法 1
// 主线程 + 次线程 = 线程总和
pstree -p | grep mysqld
// 方法 2
cat /proc/10538/status | grep Threads
范例:CentOS 7 利用 Yum 源安装 MariaDB
Download MariaDB Server - MariaDB.org
参考网站信息,配置 Yum 源
[root@centos7 ~] cat /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.nju.edu.cn/mariadb/yum/10.5/centos7-amd64
gpgkey = https://mirrors.nju.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
[root@centos7 ~] yum install MariaDB-server -y
[root@centos7 ~] systemctl enable --now mariadb.service
[root@centos7 ~] mysql
MariaDB [(none)]> status
范例:Ubuntu 利用默认仓库安装 MySQL 5.7
[root@ubuntu1804 ~] apt install mysql-server
[root@ubuntu1804 ~] systemctl status mysql.service
[root@ubuntu1804 ~] mysql
mysql> status
2.2.3)初始化脚本 提高安全性
CentOS7 默认安装的 MariaDB 数据库 不安全
// CentOS7 默认安装的 MariaDB 数据库 "不安全"
mysql ( 空密码登录 )
mysql -uxxx ( 任意用户名可登录 )
su - wangj
mysql -uadb ( 普通用户任意登录 )
运行脚本:mysql_secure_installation
1. 设置数据库管理员 root 口令
2. 禁止 root 远程登录
3. 删除 anonymous 用户帐号
4. 删除 test 数据库
范例:针对 MySQL5.6 前版本 进行 安全加固( 重要 )
[root@centos7 ~] file `which mysql_secure_installation`
/usr/bin/mysql_secure_installation: POSIX shell script, ASCII text executable
// 执行数据库 "安全加固脚本"
[root@centos7 ~] mysql_secure_installation
回车
y
设置口令
重复口令
y
y
y
y
// "验证"
[root@centos7 ~] mysql
[root@centos7 ~] mysql -uxxx
[root@centos7 ~] mysql -uroot -p'P@ssw0rd123456'
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
3 rows in set (0.00 sec)
MariaDB [(none)]> exit
Bye
2.3)MySQL 组成和常用工具
2.3.1)客户端程序
mysql:交互式或非交互式的 CLI 工具
mysqldump:备份工具,基于 mysql 协议向 mysqld 发起查询请求,并将查得的所有数据转换成 insert 等写操作语句保存文本文件中
mysqladmin:基于 mysql 协议管理 mysqld
mysqlimport:数据导入工具
MyISAM 存储引擎的管理工具:
myisamchk:检查 MyISAM 库
myisampack:打包 MyISAM 表,只读
2.3.2)服务器端程序
mysqld_safe
mysqld
mysqld_multi 多实例,示例:mysqld_multi --example
2.3.3)用户账号
MySQL 用户账号 由 两部分组成:
'USERNAME'@'HOST'
wang@'10.0.0.100'
wang@'10.0.0.%'
说明:
HOST:限制此用户可通过哪些远程主机连接 MySQL 服务器( 重点 )
支持使用通配符:
注意:HOST 必须使用 ' ' 单引号包含
% 匹配任意长度的任意字符, 相当于 shell 中 *
示例: 172.16.0.0/255.255.0.0 或 172.16.%.%
_ 匹配任意单个字符,相当于shell中?
注意:如下三行信息 表示三个不同的用户,因为 MySQL 的 用户账号 是用 user@host 组合使用的。
root@127.0.0.1( 表示 root 用户 只能在 MySQL 服务端 本机 进行登录 )
root@::1( 表示 root 用户 只能在 MySQL 服务端 本机 进行登录 )
root@localhost( 表示 root 用户 只能在 MySQL 服务端 本机 进行登录 )
// 检索并显示 mysql.user 表中的 user 和 host 列的内容
# mysql 数据库
# user 数据表
MariaDB [(none)]> select user,host from mysql.user;
// 或者进入 mysql 数据库
// 然后查看 user 数据表
MariaDB [mysql]> use mysql;
MariaDB [mysql]> select user,host from user;
2.3.4)MySQL 客户端命令
2.3.4.1)MySQL 运行命令类型
客户端命令:本地执行,每个命令都有 完整形式 和 简写格式。
mysql> \h, help
mysql> \u, use
mysql> \s, status
mysql> \!, system
服务端命令:通过 mysql 协议发往服务器执行并取回结果,命令末尾都必须使用 ; 命令结束符号,默认为 分号。
// 示例:
mysql> SELECT VERSION();
2.3.4.2)MySQL 使用模式
交互模式
脚本模式
// 交互模式
mysql -uUSERNAME -pPASSWORD < /path/somefile.sql
cat /path/somefile.sql | mysql -uUSERNAME -pPASSWORD
// 脚本模式
mysql> source /path/from/somefile.sql
2.3.4.3)MySQL 命令使用格式
mysql [OPTIONS] [database]
MySQL 客户端 常用选项:
-A, --no-auto-rehash # 禁止补全
-u, --user= # 用户名, 默认为 root
-h, --host= # 服务器主机, 默认为 localhost
-p, --passowrd= # 用户密码, 建议使用 -p, 默认为空密码
-P, --port= # 服务器端口
-S, --socket= # 指定连接 socket 文件路径
-D, --database= # 指定默认数据库
-C, --compress # 启用压缩
-e "SQL" # 执行 SQL 命令
-V, --version # 显示版本
-v --verbose # 显示详细信息
--print-defaults # 获取程序默认使用的配置
登录系统:
// 默认空密码登录
mysql -uroot -p
运行 MySQL 命令:
mysql> use mysql // 切换数据库
mysql> select database(); // 查看当前所在数据库
mysql> select user(); # 查看当前用户
mysql> SELECT User,Host,Password FROM user;
mysql> system clear # 清屏
mysql> ^D # Ctrl + D 退出
Bye
范例:MySQL 的配置文件,修改提示符( Linux 小技巧:修改 MySQL 提示符 )
// 查看 MySQL 版本
[root@centos8 ~] mysql -V
mysql Ver 15.1 Distrib 10.3.11-MariaDB, for Linux (x86_64) using readline 5.1
// 临时修改 MySQL 提示符
[root@centos8 ~] mysql -uroot -pP@ssw0rd123456 --prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"
// 临时修改 MySQL 提示符
[root@centos8 ~] export MYSQL_PS1="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"
// 持久修改 MySQL 提示符
[root@centos8 ~] vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"
[root@centos8 ~] mysql --print-defaults -v
[root@centos8 ~] mysql
10:29:30(root@localhost) [(none)]> use mysql;
10:29:34(root@localhost) [mysql]> exit
范例:配置 MySQL 客户端的 自动登录
[root@centos7 ~] vim /etc/my.cnf.d/client.cnf
[client]
user=root
password=P@ssw0rd123456
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
[root@centos7 ~] mysql --print-defaults -v
[root@centos7 ~] mysql
2.3.4.4)mysqladmin 命令
mysqladmin 命令格式
// 查看 mysql 服务是否正常, 如果正常提示 mysqld is alive
mysqladmin -uroot -pP@ssw0rd123456 ping ( 可以用来做探针监控数据库状态 )
// 关闭 mysql 服务 ( 但 mysqladmin 命令无法开启 )
mysqladmin -uroot -pP@ssw0rd123456 shutdown
// 开启 mysql 服务
systemctl start mariadb
// 创建数据库 testdb
mysqladmin -uroot -pP@ssw0rd123456 create testdb
// 删除数据库 testdb
mysqladmin -uroot -pP@ssw0rd123456 drop testdb
// 修改 root 密码
mysqladmin -uroot -pP@ssw0rd123456 password 'magedu'
// 日志滚动, 生成新文件 /var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pP@ssw0rd123456 flush-logs
2.3.4.5)mycli( MySQL 花哨客户端工具 )
MyCLI 是 MySQL,MariaDB 和 Percona 的命令行界面
具有 自动补全命令 和 语法突出显示 功能
// CentOS 安装
[root@centos7 ~] yum -y install epel-release
[root@centos7 ~] yum -y install python-pip
[root@centos7 ~] yum -y install python-devel
[root@centos7 ~] yum clean all
[root@centos7 ~] pip install mycli
// Ubuntu 安装
[root@ubuntu1804 ~] apt -y install mycli
[root@ubuntu1804 ~] mycli -u root -S /var/run/mysqld/mysqld.sock
使用 Mycli
[root@centos7 ~] mycli -u root -p P@ssw0rd123456
[root@centos7 ~] mycli -u root -p P@ssw0rd123456 -S /var/run/mysqld/mysqld.sock
2.3.5)服务器端配置
2.3.5.1)服务器端配置文件
服务器端(mysqld):工作特性有多种配置方式
1、命令行选项:
2、配置文件:类ini格式,集中式的配置,能够为 mysql 的各应用程序提供配置信息
服务器端配置文件:
/etc/my.cnf # Global 选项
/etc/mysql/my.cnf # Global 选项
~/.my.cnf # User-specific 选项
cat /etc/my.cnf
持久修改 MySQL 提示符
// 持久修改 MySQL 提示符
[root@centos8 ~] vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"
[root@centos8 ~] mysql --print-defaults -v
[root@centos8 ~] mysql
10:29:30(root@localhost) [(none)]> use mysql;
10:29:34(root@localhost) [mysql]> exit
配置文件格式:
[mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server]
[client]
格式:
parameter = value
说明:
_和- 相同
1, ON, TRUE意义相同, 0, OFF, FALSE 意义相同, 无区分大小写
2.3.5.2)socket 连接说明
官方说明:
https://dev.mysql.com/doc/mysql-port-reference/en/mysql-ports-reference-tables.html#mysql-client-server-ports
服务器监听的两种 socket 地址:
ip socket:监听在 tcp 的 3306 端口,支持远程通信 ,侦听 3306/tcp 端口可以在绑定有一个或全部接口 IP 上
unix sock:监听在 sock 文件上,仅支持本机通信,如:/var/lib/mysql/mysql.sock )
说明:host 为 localhost 时自动使用 unix sock
范例:MySQL 的端口
mysql> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
1 row in set (0.01 sec)
# MySQL8.0 增加了一个 33060/tcp 端口
# Port 33060 is the default port for the MySQL Database Extended Interface (the MySQL X Protocol).
mysql> SHOW VARIABLES LIKE 'mysqlx_port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mysqlx_port | 33060 |
+---------------+-------+
1 row in set (0.00 sec)
2.3.5.3)关闭 mysqld 网络连接
只侦听本地客户端, 所有客户端和服务器的交互都通过一个 socket 文件实现,socket 的配置存放在 /var/lib/mysql/mysql.sock ) 可在 /etc/my.cnf 修改
范例:
vim /etc/my.cnf
[mysqld]
skip-networking=1
bind_address=127.0.0.1