从结绳记事到 MySQL:数据库原理 + MySQL 基础一篇通

文章目录

数据库原理

数据的分类

在数据的获取和使用的过程中,我们可以根据数据的结构类型,将数据分成三类,分别是:结构化数据,半结构化数据,非结构化数据。

结构化数据

结构化数据一般是指可以用二维表来逻辑表达实现的数据。是有固定的格式和有限长度的数据,可以用关系型数据库表示和存储。

其特点是:数据以行为单位,一行数据表示一个实体信息,每一行数据的属性是相同的,存储在数据库中;能够用统一的数据类型和结构加以表示;也能够用二维表结构来逻辑表达实现,包含属性和元组。

对于结构化数据来讲通常是先有结构再有数据。

范例:二维表

no name age
1 唐三 123
2 叶凡 456

半结构化数据

半结构化数据就是介于完全结构化数据和完全无结构的数据之间的数据。

半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其它数据表的形式关联起来的数据模型结构,但包含相关的标记,用来分隔语义元素及对记录和字段进行分层,数据的结构和内容混在一起,没有明显的区分,因此,这种数据也被称为自描述结构的数据。

例如:HTML文档,JSON,XML和一些NoSQL数据库等就属于半结构化数据。

对于半结构化数据来说则是先有数据再有结构。

范例:json

bash 复制代码
[
  {
      "id":1,
      "name": "唐三",
      "age":123
  },
  {      
      "id":2,
      "name": "叶凡",
      "age":456
  }
]

非结构化数据

顾名思义,就是没有固定结构的数据,这种数据没有固定格式和有限长度,无法用数据库二维逻辑表来表现其结构,对于这类数据,我们一般进行整体存储。

典型的非结构化数据包括:二进制文件,音视频文件,位置信息等

数据管理发展历史

如何有效管理大量数据,方法和手段都在随着计算机技术的发展而进步。

数据管理的发展经历了人工管理、文件系统和数据库系统三个发展阶段。

数据管理的三个阶段

人工管理阶段

时间:20世纪50年代中期以前

特点:当时的计算机主要用于科学计算。外部存储设备只有磁带,打孔纸带等,也没有专业的数据管理软件,所以在当时数据管理主要由人工完成。数据处理方式上基本是批处理。

文件系统管理阶段

时间:20世纪50年代后期至60年代中期

特点:随着时间的发展,计算机不仅用于科学计算,还用于信息管理,需要处理的数据量大增,数据存储,检索和维护等问题迫切需要解决,同一时期,在硬件方面,出现了磁盘,磁鼓等可以直接连机存取的设备,在此基础上,出现了基于文件系统的数据管理软件。使用磁盘文件的形式来管理数据,数据可以在系统中长期保存,文件也有了各种各样的格式。在数据处理方式上可以批处理,也可以联机实时处理。

数据库系统阶段

时间:20世纪60年代后期至今

特点:此时己经出现大容量的磁盘,且硬件价格开始下降。数据管理技术进入数据库系统阶段。数据库系统克服了文件系统的缺陷,提供了对数据更高级、更有效的管理。这个阶段的程序和数据的联系是通过数据库管理系统来实现的。数据库系统采用了复杂的结构化的数据模型,数据拥有高独立性,低冗余度。

文件管理系统的特点

优点

文件形式和格式多样化,数据可以长期保存,且数据具有一定的独立性,由文件系统进行管理。

缺点

应用程序对接不方便,没有统一接口,也不支持对文件的并发访问,无安全控制功能,难以按用户视图表示数据,数据间联系弱,数据冗余不可避免。

数据库管理系统

相关概念

数据库:Database

数据库是按照一定的数据结构来组织,存储和管理数据的仓库。

是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

数据库管理系统:Database Management System(DBMS)

数据库管理系统是一种操纵和管理数据库的大型软件,用于建立,使用和维护数据库,简称DBMS。

它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

数据库管理员:Database Administrator(DBA)

DBA是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。

DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高可用性能。

应用程序:Application

一个应用程序通常是指能够执行某种功能的软件程序。

数据库管理系统特点

数据库管理系统中采用了复杂的数据模型表示数据结构,数据冗余小,易扩充,实现了数据共享。

具有较高的数据和程序独立性。数据库的独立性表现在物理独立性和逻辑独立性两个方面。

数据库管理系统为用户和应用程序提供了方便和统一的查询接口。

数据库管理系统的存在,使得数据可以和应用程序解耦。

数据库管理系统还具有并发控制,数据备份和恢复,完整性和安全性保障等功能。

数据库管理系统基本功能

  1. 数据的定义:DBMS提供了数据定义语言DDL(DataDefinition Language),供用户定义数据库的三级模式结构,两级映像以及完整性约束和保密限制等约束。DDL主要用于建立、修改数据库的库结构。DDL所描述的库结构仅仅给出了数据库的框架,数据库的框架信息被存放在数据字典中。

  2. 数据操作:DBMS提供数据操作语言DML(DataManipulation Language),供用户实现对数据的追加、删除、更新、查询等操作。

  3. 数据组织、存储与管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、存取路径等,需确定以何种文件结构和存取方式在存储级上组织这些数据,如何实现数据之间的联系。数据组织和存储的基本目标是提高存储空间利用率,选择合适的存取方法提高存取效率。

  4. 数据库的运行管理:数据库的运行管理功能是DBMS的运行控制、管理功能,包括多用户环境下的并发控制、安全性检查和存取限制控制、完整性检查和执行、运行日志的组织管理、事务的管理和自动恢复,即保证事务的原子性。这些功能保证了数据库系统的正常运行。

  5. 数据库的维护:这一部分包括数据库的数据载入、转换、转储、数据库的重组和重构以及性能监控等功能,这些功能分别由各个使用程序来完成。

  6. 数据库的保护:数据库中的数据是信息社会的战略资源,所以数据的保护至关重要。DBMS对数据库的保护通过4个方面来实现:数据库的恢复、数据库的并发控制、数据库的完整性控制、数据库安全性控制。DBMS的其他保护功能还有系统缓冲区的管理以及数据存储的某些自适应调节机制等。

  7. 通信:DBMS具有与操作系统的联机处理、分时系统及远程作业输入的相关接口,负责处理数据的传送。对网络环境下的数据库系统,还应该包括DBMS与网络中其他软件系统的通信功能以及数据库之间的互操作功能。

数据库管理系统的发展历史

自20世纪60年代中后期开始,使用电脑进行数据处理的规模越来越大,同时也出现了大容量的磁盘存储设备,操作系统也日渐成熟,为了解决数据的独立性问题,实现数据的统一管理,达到数据共享的目的,出现了数据库技术。

数据库技术从出现至今,经历了多次的迭代行进,在这个过程中,按时间和特性,可以将数据库管理系统分为三类。

层次数据库

层次模型数据库系统是最早研制成功的数据库系统,这种数据库中的数据被组织成一个树状模型,这种结构简单,但缺乏灵活性,各数据之间仅限于一对多的关系。

这种数据库最成功的典型代表是IBM的IMS(信息管理系统)。

网状数据库

网状数据库是采用网状原理和方法,以网状数据模型为基础建立的数据库。

网状数据模型是以记录类型为结点的网络结构,即一个结点可以有一个或多个下级结点,也可以有一个或多个上级结点,两个结点之间甚至可以有多种联系,两个记录类型之间的值可以是多对多的联系。

关系型数据库管理系统

关系数据库管理系统:Relational DatabaseManagement System(RDBMS)

是指包括相互联系的逻辑组织和存取这些数据的一套程序(数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织的系统。

常见的关系型数据库管理系统有Oracle,MySQL,DB2,SQLServer等。

关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

关系型数据库中的相关概念

在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

数据库: 数据库是一些关联表的集合。

数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

列(column): 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。

行(Row): 一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。

冗余: 存储两倍数据,冗余降低了性能,但提高了数据的安全性。

主键(Primary key): 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

外键: 外键用于关联两个表。

复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引。

索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

表头(header): 每一列的名称;

列(col): 具有相同数据类型的数据的集合;

行(row): 每一行用来描述某条记录的具体信息;

值(value): 行的具体信息, 每个值必须与该列的数据类型相同;

键(key): 键的值在当前列中具有唯一性。

常见的关系型数据库系统

  • MySQL:MySQL,MariaDB,Percona Server
  • PostgreSQL:PgSQL,EnterpriseDB
  • Oracle:Oracle
  • SQLServer:MS SQLServer
  • DB2

数据库软件排名

https://db-engines.com/en/ranking

关系型数据库理论

E-R模型

ER模型,全称为实体联系模型、实体关系模型或实体联系模式图(ERD:Entity-relationship model),它提供不受任何DBMS约束的面向用户的表达方法,在数据库设计中被广泛用作数据建模的工具。

E-R图模型的组成是由实体,属性和联系三部份组成。

实体:(Entity)实体是数据的使用者,代表软件系统中客观存在的生活中的实物,同一类实体构成实体集。在ER图中,实体用矩形表示。

属性:(Attribute)实体中的所有特性称为属性,每个属性描述的是实体的单个特性。在ER图中,属性用椭圆形表示。

联系:(Relationship)描述了实体的属性之间的关联规则。在ER图中,联系用菱形表示。ER模型范例:

联系类型

实体间的联系有三种类型:

**一对一联系(1:1):**一个 A 对应一个B,一个 B 对应一个A

例:

  • 人 ↔ 身份证
  • 丈夫 ↔ 妻子

**一对多联系(1:n):**一个 A 对应多个B,一个 B 只对应一个A

例:

  • 一个班级 → 多个学生
  • 一个老师 → 多个学生
  • 一个部门 → 多个员工

**多对多联系(m:n):**一个 A 对应多个 B,一个 B 对应多个 A

例:

  • 学生 ↔ 课程(一个学生选多门课,一门课多个学生)
  • 商品 ↔ 订单

学生表一对---

stu_id name
1 唐三
2 叶凡

老师表一对---

teacher_id name
1 gao
2 ma

老师与课程一对多

class_id name teacher_id
1 linux 1
2 golang 1
3 python 2
4 java 2

学生与课程多对多

class_id stu_id
1 1
1 2
2 1
2 2
3 1
3 2

数据的操作

数据库中对数据的操作主要包括增删改查

SQL关键字 操作描述 作用
Create / Insert Insert 增加数据
Read / Select Select 读取数据
Update / Update Update 更新数据
Delete / Delete Delete 删除数据

数据库的正规化分析(理论)

数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般数据库只需满足第三范式(3NF)即可。

第一范式1NF(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第一范式需要根据系统的实际需求来定。其核心是要保证数据表中的列里面没有重复值,即实体中的某个属性不能有多个值或者不能有重复的属性,确保每一列的原子性。

列重复

id teacher_name class_1 class_2 class_3
1 ma golang linux python
2 gao golang linu
3 ma golang

列不重复

id teacher_name class
1 ma golang
2 ma linux
3 ma python
4 gao golang
5 gao linux
6 ma golang

第一范式(1NF)------原子性

**核心要求:**表中的每个字段都必须是不可再分的原子值。

反例:

bash 复制代码
学生ID | 联系方式
001    | 13800138000, zhang@example.com

→ "联系方式"包含多个值,违反 1NF。

正例:

bash 复制代码
学生ID | 手机号         | 邮箱
001    | 13800138000     | zhang@example.com

💡 简单说:每一列只能存一个值,不能是列表、集合或复合结构。

第二范式2NF(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

teacher_name 和city组成联合主键,city_code与city------对应,city_code依赖了部份主键,违反了第二范式

teacher_name city age city_code
gao bj 22 010
teacher_name city age city_code
ma bj 33 010
gao sh 44 021

teacher_name与ctiy_id组成联合主键,再用city_id关联city_name和city_code,这样符合第二范式

teacher_name city_id age
gao 1 22
ma 1 33
gao 2 44
city_id city_name city_code
1 bj 010
2 sh 021

第二范式(2NF)------消除部分依赖

前提:已满足 1NF

**核心要求:**所有非主键字段必须完全依赖于整个主键(不能只依赖主键的一部分)。

适用于复合主键场景。

**部分依赖:**非主属性只依赖于主键中的某一部分。

反例(订单明细表):

bash 复制代码
订单ID | 商品ID | 商品名称 | 数量
1001   | P001   | 苹果     | 5

主键 = (订单ID, 商品ID)

但"商品名称"只依赖于"商品ID",不依赖"订单ID" → 违反 2NF。

**解决方法:**拆表

  • 商品表(商品ID, 商品名称)
  • 订单明细表(订单ID, 商品ID, 数量)

💡 简单说:非主键字段不能"只认主键的一部分"。

第三范式3NF(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。

teacher 表一对一

teacher_id teacher_name
1 ma
2 gao
3 ma

class表一对一

class_id class_name
1 golang
2 linux
3 python

teacher与class多对多

teacher_id class_id
1 1
1 2
1 3
2 1
2 2
2 3

第三范式(3NF)------消除传递依赖

前提:已满足 2NF

**核心要求:**非主键字段之间不能有依赖关系(即不能存在"传递依赖")。

传递依赖:A → B → C,则 C 传递依赖于 A。

所有非主属性必须直接依赖于主键,不能通过其他非主属性间接依赖。

反例:

bash 复制代码
学生ID | 学院ID   | 学院地址
2001    | CS01    | 北京中关村

主键 = 学生ID

依赖关系:学生ID → 学院ID → 学院地址

→ "学院地址"传递依赖于"学生ID",违反 3NF。

**解决方法:**拆表

  • 学生表(学生ID, 学院ID)
  • 学院表(学院ID, 学院地址)

💡 简单说:非主键字段之间不能"互相推导"。

总结:

总结对比

范式 核心目标 关键规则
1NF 原子性 字段不可再分
2NF 消除部分依赖 非主属性必须完全依赖整个主键
3NF 消除传递依赖 非主属性之间不能相互依赖

越高范式,冗余越少,表越多。

实际开发:一般满足 3NF 即可。

SQL结构化查询语言

SQL:(StructureQueryLanguage),结构化查询语言。是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,SQL语句就是用SQL语言写的用于操作数据库的语句。

关系型数据库一般工作于C/S模式下,使用专有协议进行通信,服务端程序监听特有端口,客户端程序发送查询语句到服务端,服务端将查询结果返回给客户端。

MySQL自带CLI接口,GUI接口可以使用第三方工具实现,在应用程序或后端开发语言中,使用相应的编程语言下的数据库驱动来进行与数据库服务端的通信。

MySQL安装和基本使用

MySQL介绍

MySQL 历史

MySQL 之父

关于 MariaDB、MySQL、MaxDB 名字的由来,这里有个不得不说的小插曲。Monty 有一个女儿,名叫 My,因此他将自己开发的数据库命名为 MySQL。Monty 还有一个儿子,名为 Max,因此在 2003 年,SAP 公司与 MySQL 公司建立合作伙伴关系后,Monty 又将与 SAP 合作开发的数据库命名为 MaxDB。而现在的 MariaDB 中的 Maria 是 Monty 小孙女(小女儿?)的名字。

Michael "Monty" Widenius, 1962 年 3 月 3 日出生于芬兰赫尔辛基。

开源 MySQL 数据库的创始成员、MySQL AB 公司的首席技术官、MySQL 数据库第一行代码的作者、MySQL 数据库命名人、MariaDB 创始人兼首席技术官;独自完成撰写 MySQL 数据库服务器端 95% 的代码。

MySQL历史

MySQL 的海豚标志的名字叫 "sakila",它是由 MySQL AB 的创始人从用户在 "海豚命名" 的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者 Ambrose Twebaze 提供。根据 Ambrose 所说,Sakila 来自一种叫 SiSwati 的斯威士兰方言,也是在 Ambrose 的家乡乌干达附近的坦桑尼亚的 Arusha 的一个小镇的名字

MySQL 的历史可以追溯到 1979 年。当时 Allan Larsson 和 Michael Widenius (Monty) 开了一家自己的咨询公司,取名 TcX,名字的由来已无从考证。有道是" 前世尽付真情,今生亦现福缘积厚"。那年一个夜黑风高的晚上,Michael 基于 BASIC 语言写出了他的第一款数据库报表工具 UNIREG。

有当年的天气记录为证,Michael 写完该工具时极光异常明亮,炫彩无比。大凡重大事情的发生,后来的著述人都会记录有一些类似的怪现象。比如刮风、下雨、冒仙气什么的,还有天上星星异常闪烁等等,反正就是说明这种事情很不简单。

最初的 UNIREG 是运行在瑞典人制造的 ABC800 计算机上的。ABC800 的内存只有 32KB,CPU 是频率只有 4MHz 的 Z80。在 1983 年 Monty 遇到了 David Axmark,两人相见恨晚,开始合作运营 TcX,Monty 负责技术,David 搞管理。后来 TcX 将 UNIREG 移植到其他更加强大的硬件平台,主要是 Sun 的平台。

一次 Monty 接到了一个项目,需要为当时的 UNIREG 提供更加通用的 SQL 接口,Monty 找到了 David Hughes --mSQL 的发明人,商讨合作事宜。然而,经过一番测试后,他们发现 mSQL 的速度并不尽如人意,无法满足客户的需求。

遇到这种问题,程序员出身的 Monty 无法委曲求全,毅然采取了革命性的态度--重新设计整个系统。

1995 年 5 月 23 日,MySQL 的第一个内部版本发行了,并在第二年对外公布了 MySQL 官方正式发行版 (3.11.1)。有趣的是,第一个 MySQL 正式版恰巧只能运行在 Sun Solaris 上,仿佛昭示了它日后被 Sun 收购的命运。

在接下来的两年中,MySQL 被移植到不同的平台,同时加入了不少新的特性。到 1998 时,MySQL 能够运行在 10 多种操作系统之上,其中包括应用非常广泛的 FreeBSD、Linux、Windows 95 和 Windows NT 等。很快 MySQL 3.22 也发布了,但它仍然存在很多问题--如不支持事务操作、子查询、外键、存储过程和视图等功能。正因为这些缺陷,当时许多 Oracle 和 SQL Server 的用户对 MySQL 根本不屑一顾。

大概在 1999 的冬天,下了很大一场雪。然后独立的商业公司 MySQL AB 就在瑞典的中部城市 Uppsala 成立了。并于同年发布了包含事务型存储引擎 BDB 的 MySQL 3.23。在集成 BDB 存储引擎的过程中,MySQL 开发团队得到了很好的锻炼,为后来能将 InnoDB 整合以及开发开放插件式的存储引擎架构打下了坚实的基础。

MySQL 从诞生之初就提供了双重的授权标准:个人使用是免费的,如果用于商业网站搭建或者 Windows 平台下就必须购买商业许可证。在 2000 年的时候 MySQL 做了一个重大的决定,改换成了 GPL 许可模式,也就是说商业用户也无需再购买许可证,但必须把他们的源码公开。虽然 MySQL AB 因此在收入上遭受了巨大的打击,损失了将近 80% 的收入,但他们依然坚持了 GPL 许可模式。

与此同时,芬兰公司 Heikki 开始接触 MySQL AB,讨论将 Heikki 的存储引擎 InnoDB 整合到 MySQL 数据库中的可行性。双方的合作非常顺利,并于 2001 年推出 MySQL 4.0 Alpha 版本。经过两年的公开测试和应用,到了 2003 年,包含 InnoDB 的 MySQL 已经变得非常稳定了。随即在同一年,MySQL 推出 4.1 版,第一次使得 MySQL 支持子查询,支持 Unicode 和预编译 SQL 等功能。

MySQL 4.1 还在 Alpha 版时,公司已决定并行开发 5.0 版。因为他们打算加快 MySQL 的开发速度以适应日益苛刻的市场需求。这个新版本是有史以来 MySQL 最大的变化,添加了存储过程、服务端游标、触发器、查询优化以及分布式事务等在大家看来一个" 正常数据库管理系统" 应当拥有的一整套功能。

2008 年 2 月,当时的业界开源老大 Sun Microsystems 动用 10 亿美元收购了 MySQL,造就了开源软件的收购最高价。这次交易给开源交易设立了一个新的基准。在此之前的交易金额 (JBoss、Zimbra、XenSource、Gluecode) 从没接近过 10 亿美元,全部加起来才差不多与 Sun Microsystems 购买 MySQL 的花费持平。MySQL 被收购之后,MySQL 图标停止使用,取而代之的是 Sun/MySQL 图标。

MySQL 和 Sun 合并之后,推出了 MySQL 5.1GA 版和 MySQL 5.4 Beta 版。5.4 的推出照搬了 4.1 和 5.0 当时的开发模式,让 5.4 和 6.0 并行处于 Beta 开发阶段。

螳螂捕蝉,黄雀在后。2009 年,数据库老大 Oracle 大笔一挥,开出 74 亿美元的支票,将 Sun Microsystems 和 MySQL 通盘收于旗下。

这里附带说明一下 Drizzle,它是 Sun/MySQL 的 Brian 在 2008 年提出的一个计划。目标是将开发一个更小、更轻、更快的数据库,用作云计算 (Cloud Computing) 和 Web 应用的基础架构。

标志性事件

  • 1999 年,MySQL AB 在瑞典正式宣布成立。

  • 2000 年,ISAM 华丽转身 MyISAM 存储引擎。同年 MySQL 开放了自己的源代码,并且基于 GPL 许可协议。同年 9 月 innoDB 推出。

  • 2003 年,MySQL4.0 发布,正式集成 innodb

  • 2005 年,MySQL 5.0 发布。同年 Oracle 把 InnoDB 引擎的开发公司 innobase 收购完成。MySQL 明确地表现出迈向高性能数据库的发展步伐。

  • 2006 年,sun 公司收购了 MySQL 公司,出价 10 亿美元。

  • 2009 年,Oracle 公司收购 sun,将 MySQL 纳入囊中。

  • 2010 年,MySQL 5.5 正式版发布,Oracle 完成了大量改进,并将 innodb 改成默认引擎。

  • 2013 年,MySQL 5.6 GA 版本发布。

  • 近期 - MySQL 5.7 GA 版本横空出世,其性能、新特性、性能分析带来了质的改变。

全球最大网站Top20,90%在使用Mysql

全球MySQL行业应用

国内MySQL行业应用

MySQL 系列

尽管 MySQL 是最受欢迎的程序之一,但是许多开发人员认为有必要将其拆分成其他项目,并且每个分支项目都有自己的专长。该需求以及 Oracle 对核心产品增长缓慢的担忧,导致出现了许多开发人员感兴趣的子项目和分支。本文将讨论受人们关注的三个流行 MySQL 分支:Drizzle、MariaDB 和 Percona Server(包括 XtraDB 引擎)

MySQL

官方 MySQL,前身 MySQL AB / SUM / 最后被 Oracle 公司收入麾下。

Percona

Percona Server 就是这样一款产品,由领先的 MySQL 咨询公司 Percona 发布。Percona Server 是一款独立的数据库产品,为用户提供了换出其 MySQL 安装并换入 Percona Server 产品的能力。通过这样做,就可以利用 XtraDB 存储引擎。Percona Server 声称可以完全与 MySQL 兼容,因此从理论上讲,您无需更改软件中的任何代码。这确实是一个很大的优势,适合在您寻找快速性能改进时控制质量。因此,采用 Percona Server 的一个很好的理由是,利用 XtraDB 引擎来尽可能地减少代码更改。

此外,他们是 XtraDB 存储引擎的原作者。Percona 将此代码用作开源代码,因此您可以在其他产品中找到它,但引擎的最初创建者与编写此产品的是同一个人,所以您可以随心所欲地使用此信息。

Percona 团队的最终声明是 "Percona Server 是由 Oracle 发布的最接近官方 MySQL Enterprise 发行版的版本",因此与其他更改了大量基本核心 MySQL 代码的分支有所区别。Percona Server 的一个缺点是他们自己管理代码,不接受外部开发人员的贡献,以这种方式确保他们对产品中所包含功能的控制。

下面是 Percona Server 的声明,该声明来自它们自己的网站:

  • 可扩展性:处理更多事务;在强大的服务器上进行扩展
  • 性能:使用了 XtraDB 的 Percona Server 速度非常快
  • 可靠性:避免损坏,提供崩溃安全 (crash-safe) 复制
  • 管理:在线备份,在线表格导入 / 导出
  • 诊断:高级分析和检测
  • 灵活性:可变的页面大小,改进的缓冲池管理

MariaDB

MySQL 之父 Widenius 先生离开了 Sun 之后,觉得依靠 Sun/Oracle 来发 展 MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做 MariaDB;

在卖出 MySQL 之后 Widenius 发现两个主要问题:

  • MySQL 核心开发团队是封闭的,完全没有 Oracle 之外的成员参加。很多高手即使 有心做贡献,也没办法做到
  • MySQL 新版本的发布速度,在 Oracle 收购 Sun 之后大为减缓。Widenius 用数据比 较了收购之前和之后新版本的发布速度。有很多 bugfix 和新的 feature,都没有及 时加入到发布版本之中

目标是提供一个由社区开发的、稳定的、总是免费的 MySQL 分支,在用 户级别上兼容主流版本。我们为自己的版本和上游、社区版的互操作性 提高而努力;Monty Program 公司承诺 MariaDB 将会一直保持独立和开源。值得一提的是,Fedora 及 OpenSUSE Linux 更宣布将在 MariaDB 推出下 一个版本后抛弃 MySQL 使用 MariaDB。

MariaDB 提供了 MySQL 提供的标准存储引擎,即 MyISAM 和 InnoDB。因此,实际上,可以将它视为 MySQL 的扩展集,它不仅提供 MySQL 提供的所有功能,还提供其他功能。MariaDB 还声称自己是 MySQL 的替代,因此从 MySQL 切换到 MariaDB 时,无需更改任何基本代码即可安装它。

最后可能也是最重要的一点是,MariaDB 的主要创建者是 Monty Widenius,也是 MySQL 的初始创建者。Monty 成立了一家名为 Monty Program 的公司来管理 MariaDB 的开发,这家公司雇佣开发人员来编写和改进 MariaDB 产品。这既是一件好事,也是一件坏事:有利的一面在于他们是 Maria 功能和 bug 修复的佼佼者,但公司不是以赢利为目的,而是由产品驱动的,这可能会带来问题,因为没有赢利的公司不一定能长久维持下去。

MySQL 的特性

  • MySQL是基于开源协议发布的,可以免费使用,也可以基于源码进行二次开发。
  • MySQL使用标准SQL语言进行管理。
  • MySQL可以运行于多个系统上,具有跨平台特性,并且支持多种语言。
  • MySQL使用插件式存储引擎,不同的存储引擎,有着不同的功能和特性,使用者可以根据需要灵活选择。
  • MySQL基于单进程,多线程的模式进行工作。
  • MySQL提供了大量的测试组件和诸多的扩展。

MySQL安装

参考mysql安装手册

MySQL多实例

数据库多实例介绍

什么是数据库多实例

拿MySQL数据库来说明,就是在一台服务器上运行多个MySQL服务端进程,每个进程监听一个端口(3306,3307,3308),维护一套属于其自己的配置和数据,客户端使用不同的端口来连接具体服端进程,从而实现对不同的实例的操作。

多实例的优点

节约硬件资源:在某些场景下(比如说测试,调研,新旧业务并存等),需要配置不同的MySQL数据库版本,而又没有足够多的服务器资源,则可以选择在一台服务器上用不同的版本实现多开来满足需求。

便于对比:在一个完全相同的硬件环境中,运行不同的MySQL版本,使用相同的参数进行测试,调研时,可以最大程度的减少外部环境因素的影响,便于得出更准确的结论。

便于管理:在一台服务器上运行多个实例,同理,只需要在这一台服务器上配置安全规则,就可以完成对多个实例的访问授权,而且对于数据库的备份,停启等工作,也只需要在这一台服务器上完成。

多实例的缺点

资源抢占:一台服务器上运行多个服务实例,资源总量恒定,一个实例占用的资源无法被另一个实例所使用,在这种情况下,服务性能会受到影响,无法体现MySQL服务的实际性能。

存在单点风险:一台服务器上部署多个服务实例,如果该服务器当机,则这多个服务实例都会受影响。

MySQL多实例配置方案

可以用不同的MySQL版本实现多实例,也可以用相同的MySQL版本实现多实例。

MySQL组成和常用工具

MySQL主要组成

mysql基于C/S模式提供服务,主要有客户端程序和服务端程序组成,另外还有一些管理工具。

服务端主要组成

程序 功能
mysqld_safe 安全启动脚本
mysqld 服务端程序,是mysql服务的核心程序
mysqld_multi 多实例工具

客户端主要组成

程序 功能
mysql 基于mysql协议的交互式CLI工具
mysqldump 备份工具
mysqladmin 服务端管理工具
mysqlimport 数据导入工具

MyISAM存储引擎的管理工具

程序 功能
myisamchk 检测MyISAM库
myisampack 打包MyISAM表,只读

配置文件

不同版本配置文件略有不同

bash 复制代码
# 查看MySQL主配置文件内容
# cat 查看文件内容
[root@localhost ~]# cat /etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

# 查看配置文件目录结构
# tree 树状显示目录结构
[root@localhost ~]# tree /etc/my.cnf.d/
/etc/my.cnf.d/     #配置文件路径列表
├── client.cnf                  #客户端配置
├── mysql-default-authentication-plugin.cnf
└── mysql-server.cnf             #服务器端配置
0 directories, 3 files     #tree命令汇总

生效顺序

bash 复制代码
# 查看MySQL读取配置文件的顺序
# --help 显示帮助信息,| 管道,前命令输出作为后命令输入
[root@localhost ~]# mysql --help | grep my.cnf
                         order of preference, my.cnf, $MYSQL_TCP_PORT,     #配置文件读取优先级顺序
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf     #配置文件路径列表

MySQL中的用户账户

详见MySQL用户管理

MySQL 命令类型

MySQL中的命令分为两类,分别是客户端命令和服务端命令。

客户端命令在本地执行。服务端命令发送到服务端执行,再返回执行结果到客户端上。

客户端命令和服务端命令,都是通过MySQL客户端工具进行输入输出。

查看所有客户端命令

bash 复制代码
# 在MySQL交互界面中输入?查看所有客户端命令
# ? 查看所有客户端命令
mysql> ?
For information about MySQL products and services, visit:     #MySQL官方链接
  http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:     #MySQL开发文档链接
  http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:     #企业版购买链接
  https://shop.mysql.com/
List of all MySQL commands:     #所有客户端命令列表
Note that all text commands must be first on line and end with ';'     #注意:文本命令须在行尾以分号结束
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
query_attributes Sets string parameters (name1 value1 name2 value2 ...) for the next query to pick up.
For server side help, type 'help contents'     #服务端帮助输入help contents

查看所有服务端命令

bash 复制代码
# 查看服务端帮助目录分类
# help 查看服务端命令帮助
mysql> help contents
You asked for help about help category: "Contents"     #帮助查询结果
For more information, type 'help <item>', where <item> is one of the following categories:     #可输入help <条目>查看详情
  Account Management
  Administration
  Components
  Compound Statements
  Contents
  Data Definition
  Data Manipulation
  Data Types
  Functions
  Geographic Features
  Help Metadata
  Language Structure
  Loadable Functions
  Plugins
  Prepared Statements
  Replication Statements
  Storage Engines
  Table Maintenance
  Transactions
  Utility

查看服务端命令具体项

bash 复制代码
# 查看Administration分类下的所有命令
# help 查看服务端命令帮助
mysql> help Administration
You asked for help about help category: "Administration"     #帮助查询结果
For more information, type 'help <item>', where <item> is one of the following topics:     #可输入help <条目>查看详情
  BINLOG
  CACHE INDEX
  FLUSH
  HELP COMMAND
KILL
  LOAD INDEX
  RESET
  RESET PERSIST
  RESTART
  SET
  SET CHARACTER SET
  SET CHARSET
  SET NAMES
  SHOW
  SHOW BINARY LOGS
  SHOW BINLOG EVENTS
  SHOW CHARACTER SET
  SHOW COLLATION
  SHOW COLUMNS
  SHOW CREATE DATABASE
  SHOW CREATE EVENT
  SHOW CREATE FUNCTION
  SHOW CREATE PROCEDURE
  SHOW CREATE SCHEMA
  SHOW CREATE TABLE
  SHOW CREATE TRIGGER
  SHOW CREATE USER
  SHOW CREATE VIEW
  SHOW DATABASES
  SHOW ENGINE
  SHOW ENGINES
  SHOW ERRORS
  SHOW EVENTS
  SHOW FIELDS
  SHOW FUNCTION CODE
  SHOW FUNCTION STATUS
  SHOW GRANTS
  SHOW INDEX
  SHOW MASTER LOGS
  SHOW MASTER STATUS
  SHOW OPEN TABLES
  SHOW PLUGINS
  SHOW PRIVILEGES
  SHOW PROCEDURE CODE
  SHOW PROCEDURE STATUS
  SHOW PROCESSLIST
  SHOW PROFILE
  SHOW PROFILES
  SHOW RELAYLOG EVENTS
  SHOW REPLICA STATUS
  SHOW REPLICAS
  SHOW SCHEMAS
  SHOW SLAVE HOSTS
  SHOW SLAVE STATUS
  SHOW STATUS
  SHOW TABLE STATUS
  SHOW TABLES
  SHOW TRIGGERS
  SHOW VARIABLES
  SHOW WARNINGS
  SHUTDOWN

查看详细帮助

bash 复制代码
# 查看BINLOG命令的详细帮助文档
# help 查看服务端命令帮助
mysql> help BINLOG
Name: 'BINLOG'
Description:
Syntax:
BINLOG 'str'
BINLOG is an internal-use statement. It is generated by the mysqlbinlog program as the printable representation of certain events in binary log files. (See https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html.)
The 'str' value is a base 64-encoded string the that server decodes to determine the data change indicated by the corresponding event.
To execute BINLOG statements when applying mysqlbinlog output, a user account requires the BINLOG_ADMIN privilege (or the deprecated SUPER privilege), or the REPLICATION_APPLIER privilege plus the appropriate privileges to execute each log event.
URL: https://dev.mysql.com/doc/refman/8.0/en/binlog.html

MySQL客户端使用

MySQL服务基于C/S架构,用户主要使用客户端工具来与远程服务端进行连接,从而与MySQL服务进行交互。

MySQL客户端常用选项

格式:

bash 复制代码
# 查看mysql客户端帮助信息
# --help 显示帮助信息
[root@localhost ~]# mysql --help
Usage: mysql [OPTIONS] [database]     #命令用法
#常用选项
-V|--version                #显示客户端版本
-u|--user=name              #指定远程连接用户名
-p|--password[=name]        #指定密码,默认为空
-h|--host=host              #指定服务端主机
-P|--port=port              #指定端口,默认3306
-S|--socket=name            #指定连接时使用的socket文件,该文件在服务端启动后生成
-D|--database=db            #指定数据库
-H|--html                   #以html格式输出
-X|--xml                    #以xml格式输出
-t|--table                  #以table格式输出,默认项
-E|--vertical               #垂直显示执行结果
-v|--verbose                #显示详细信息,配合-t选项
-C|--compress               #启用压缩
-G|--named-commands         #启用长命令
-e|--execute=sql            #执行完就退出,非交互式运行
-prompt=name                #修改命令提示符
--line-numbers              #输出行号
--print-defaults            #打印参数列表,放在最前面
--connect-timeout=N         #连接超时时长,单位S
--max-allowed-packet=N      #一次查交互发送或反回数据的大小,默认16MB,最大值为1GB,最小值为4096字节

范例:

bash 复制代码
#免密登录
# -u 指定登录用户名,-p 指定登录密码
[root@localhost ~]# mysql -uroot -pHuawei@123
#将mysql root账号密码设置为空
# ALTER USER 修改用户属性,IDENTIFIED BY 设置新密码
mysql> alter user root@localhost identified by '';
#退出mysql
# QUIT 退出MySQL客户端
mysql> quit

#显示版本
# -V 显示客户端版本号
[root@localhost ~]# mysql -V
mysql  Ver 8.0.26 for Linux on x86_64 (Source distribution)     #客户端版本信息

#指定用户名,主机,端口
# -u 指定登录用户名,-h 指定服务端主机地址,-P 指定服务端端口,默认3306
[root@localhost ~]# mysql -uroot -h127.0.0.1 -P3306
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 22     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
mysql>

#使用主机名
# -u 指定登录用户名,-h 指定服务端主机地址,-P 指定服务端端口,默认3306
[root@localhost ~]# mysql --user=root --host=localhost --port=3306
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 23     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
mysql>

#默认使用root连接,密码为空
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 24     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
bash 复制代码
#打印参数列表,并不连接服务端,--print-defaults要放在第一个
# -u 指定登录用户名,-h 指定服务端主机地址,--print-defaults 打印参数后退出,须放首位,--connect-timeout 连接超时秒数
[root@localhost ~]# mysql --print-defaults -uroot -hlocalhost --connect-timeout=2
mysql would have been started with the following arguments:     #mysql实际将使用以下参数启动
-uroot -hlocalhost --connect-timeout=2

#以html格式显示输出
# -H 以HTML格式输出
[root@localhost ~]# mysql -H
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 25     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
# SELECT version() 查询服务端版本号
mysql> select version();
<TABLE BORDER=1><TR><TH>version()</TH></TR><TR><TD>8.0.26</TD></TR></TABLE>1 row in set (0.00 sec)     #HTML格式输出结果

范例:执行完退出,非交互式执行

bash 复制代码
#环境准备
# vim 编辑文件
[root@localhost ~]# vim /root/test.sql
show databases;

#执行客户端命令
# -e 执行指定SQL后退出(非交互)
[root@localhost ~]# mysql -e "source /root/test.sql"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

#管道执行
# cat 查看文件内容
[root@localhost ~]# cat test.sql | mysql
Database
information_schema
mysql
performance_schema
sys
bash 复制代码
#标准输入重定向执行
# -u 指定登录用户名,< 从文件重定向读取SQL执行
[root@localhost ~]# mysql -uroot < test.sql
Database
information_schema
mysql
performance_schema
sys

#以table格式输出
# -e 执行指定SQL后退出(非交互)
[root@localhost ~]# mysql -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

#垂直显示
# -E 垂直显示结果,-e 执行指定SQL后退出(非交互)
[root@localhost ~]# mysql -e "show databases;" -E
*************************** 1. row ***************************     #垂直显示第1行
Database: information_schema     #数据库名
*************************** 2. row ***************************     #垂直显示第2行
Database: mysql     #数据库名
*************************** 3. row ***************************     #垂直显示第3行
Database: performance_schema     #数据库名
*************************** 4. row ***************************     #垂直显示第4行
Database: sys     #数据库名

范例:修改提示符

bash 复制代码
# 登录时通过--prompt参数修改命令提示符为[test]
# --prompt 自定义命令提示符
[root@localhost ~]# mysql --prompt=[test]
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 37     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
[test]

范例:指定数据库

bash 复制代码
#默认
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 38     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
# SHOW DATABASES 列出所有数据库
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)     #共4行结果,耗时0.00秒
mysql>
bash 复制代码
#指定数据库
# 连接后直接进入information_schema数据库
[root@localhost ~]# mysql information_schema
Reading table information for completion of table and column names     #正在读取表信息以补全提示
You can turn off this feature to get a quicker startup with -A     #加-A选项可关闭此功能以加快启动
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 41     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
# SELECT DATABASE() 查看当前数据库
mysql> SELECT DATABASE();
+--------------------+
| DATABASE()         |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)     #共1行结果,耗时0.01秒
mysql>
MySQL客户端常用命令
bash 复制代码
# 查看所有客户端命令帮助
# ? 查看所有客户端命令
mysql> ?
For information about MySQL products and services, visit:     #MySQL官方链接
  http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:     #MySQL开发文档链接
  http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:     #企业版购买链接
  https://shop.mysql.com/
List of all MySQL commands:     #所有客户端命令列表
Note that all text commands must be first on line and end with ';'     #注意:文本命令须在行尾以分号结束
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
query_attributes Sets string parameters (name1 value1 name2 value2 ...) for the next query to pick up.
For server side help, type 'help contents'     #服务端帮助输入help contents

范例:显示当前数据库

bash 复制代码
#显示当前数据库
# \s 查看连接状态信息
mysql> \s
--------------
mysql  Ver 8.0.26 for Linux on x86_64 (Source distribution)     #客户端版本信息
Connection id:           8                                        #连接ID
Current database:                                                  #当前使用的数据库
Current user:            root@localhost                   #连接使用的用户名
SSL:                     Not in use                       #是否使用ssl
Current pager:           stdout
Using outfile:           ''
Using delimiter:         ;
Server version:          8.0.26 Source distribution       #版本
Protocol version:        10                               #协议版本
Connection:              Localhost via UNIX socket     #连接方式
Server characterset:     utf8mb4                         #服务器编码
Db     characterset:     utf8mb4                         #数据库编码
Client characterset:     utf8mb4                         #客户端编码
Conn.  characterset:     utf8mb4
UNIX socket:             /var/lib/mysql/mysql.sock       #连接使用的socket文件
Binary data as:          Hexadecimal
Uptime:                  28 min 46 sec                   #服务器运行时长
Threads: 2  Questions: 6  Slow queries: 0  Opens: 117  Flush tables: 3  Open tables: 36  Queries per second avg: 0.003     #线程与查询统计
--------------

范例:切换数据库

bash 复制代码
# 切换当前使用的数据库为mysql
# USE mysql 切换数据库
mysql> use mysql;
Reading table information for completion of table and column names     #正在读取表信息以补全提示
You can turn off this feature to get a quicker startup with -A     #加-A选项可关闭此功能以加快启动
Database changed     #数据库切换成功
mysql>

范例:调用系统命令

bash 复制代码
# \! 调用操作系统命令
mysql> \! hostname           #查看宿主机主机名,!号后面有空格
localhost.localdomain     #主机名
# \! 调用操作系统命令
mysql> \! clear             #清屏

范例:修改提示符

bash 复制代码
# 在MySQL交互界面中用prompt命令修改提示符,\h为主机名,\D为完整日期时间
# prompt 修改命令提示符
mysql> prompt [\h--\D]
PROMPT set to '[\h--\D]'     #提示符设置成功
[localhost--Mon Sep 15 22:09:09 2025]
[localhost--Mon Sep 15 22:10:01 2025]
# 将提示符修改为abcd
# \r 重新连接服务器
mysql> \R abcd
PROMPT set to 'abcd'     #提示符设置成功
abcd
abcd

在配置文件中修改提示符

bash 复制代码
# 编辑MySQL客户端配置文件
# vim 编辑文件
[root@localhost ~]# vim /etc/my.cnf.d/client.cnf
[client]
prompt=(\\u@\\h) [\\d]>\\
bash 复制代码
# 验证效果
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 12     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
(root@localhost) [(none)]>        #效果

提示符中可用的变量,全部可用的替换符用man mysql查看

bash 复制代码
\C  #计数器
\D  #年月日时分秒
\d  #当前使用的数据库
\h  #服务器主机名
\l  #命令分隔符,默认;
\m  #当前时间,分钟
\n  #换行
\O  #月份,以英文显示
\o  #月份,数字显示
\P  #pm/am
\R  #小时,24小时制
\r  #小时,12小时制
\S  #分号
\s  #秒,数字显示
\t  #tab键
\U  #客户端用户名和主机
\u  #客户端用户名
\v  #服务端版本
\w  #星期几,英文显示
\Y  #年份,四位,数字显示
\y  #年份,两位,数字显示

范例:执行SQL脚本

bash 复制代码
# 编辑SQL脚本文件
# vim 编辑文件
[root@localhost ~]# vim test.sql
show databases;
# 在MySQL交互界面中用source命令执行SQL脚本文件
# source 执行SQL脚本文件
mysql> \. /root/test.sql
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)     #共4行结果,耗时0.00秒

范例:重连

bash 复制代码
# 登录MySQL
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 19     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
# 重连服务器
# \r 重新连接服务器
mysql> \r
Connection id:    20     #连接ID
Current database: *** NONE ***     #当前使用的数据库
# 先切换到mysql数据库
# USE mysql 切换数据库
mysql> use mysql
Reading table information for completion of table and column names     #正在读取表信息以补全提示
You can turn off this feature to get a quicker startup with -A     #加-A选项可关闭此功能以加快启动
Database changed     #数据库切换成功
# 再次重连,验证当前数据库是否保持
# \r 重新连接服务器
mysql> \r
Connection id:    21     #连接ID
Current database: mysql     #当前使用的数据库
mysql>

范例:往文件中保存输出结果

bash 复制代码
# tee 将输出写入文件
mysql> tee db.txt                  #设置写到文件db.txt
Logging to file 'db.txt'     #tee已开启,输出写入文件
# SELECT version() 查询服务端版本号
mysql> select version();            #执行SQL语句
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒
# \t 关闭tee写文件
mysql> \t                           #设置不写文件
Outfile disabled.     #已关闭写文件
# SHOW DATABASES 列出所有数据库
mysql> show databases;              #执行SQL语句
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)     #共4行结果,耗时0.00秒
mysql> quit                        #退出
Bye     #退出MySQL客户端
# cat 查看文件内容
[root@localhost ~]# cat db.txt     #只记录了\t之前的命令
# SELECT version() 查询服务端版本号
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒
# \t 关闭tee写文件
mysql> \t
[root@localhost ~]#

范例:自定义

bash 复制代码
#两条查询语句,默认用;分隔
# SELECT version() 查询服务端版本号
mysql> select version();show databases;
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)     #共4行结果,耗时0.01秒

#设置$分隔
# \d 修改语句结束分隔符
mysql> \d $
bash 复制代码
# SELECT version() 查询服务端版本号
mysql> select version()$show databases$
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.01 sec)     #共1行结果,耗时0.01秒
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)     #共4行结果,耗时0.00秒

范例:发送语句到服务端

bash 复制代码
# SELECT version() 查询服务端版本号
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.01 sec)     #共1行结果,耗时0.01秒

# 使用\g发送语句到服务端,等同于;结尾
# SELECT version() 查询服务端版本号
mysql> select version()\g
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒

# 使用\G发送语句到服务端并垂直显示结果
# SELECT version() 查询服务端版本号
mysql> select version()\G
*************************** 1. row ***************************     #垂直显示第1行
version(): 8.0.26     #服务端版本号
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒

#开启长命令格式
# --named-commands 启用长命令go/ego
[root@localhost ~]# mysql --named-commands
Welcome to the MySQL monitor.  Commands end with ; or \g.     #MySQL客户端连接成功欢迎信息
Your MySQL connection id is 26     #连接ID
Server version: 8.0.26 Source distribution     #服务端版本号
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.     #输入提示:help查看帮助,\c清空当前输入
bash 复制代码
# SELECT version() 查询服务端版本号
mysql> select version()         #这里要断句
    -> go
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒

# SELECT version() 查询服务端版本号
mysql> select version()        #这里要断句
    -> ego
*************************** 1. row ***************************     #垂直显示第1行
version(): 8.0.26     #服务端版本号
1 row in set (0.00 sec)     #共1行结果,耗时0.00秒

范例:只输出不执行

bash 复制代码
# 使用\p打印当前输入的命令但不执行
# SELECT version() 查询服务端版本号
mysql> select version()\p
--------------
select version()
--------------
    ->
mysqladmin工具

mysqladmin也是用于管理mysql服务的本地工具

格式

bash 复制代码
# 查看mysqladmin帮助信息
[root@localhost ~]# mysqladmin --help
mysqladmin  Ver 8.0.26 for Linux on x86_64 (Source distribution)     #客户端版本信息
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
owners.
Administration program for the mysqld daemon.     #mysqladmin是mysqld管理工具
Usage: mysqladmin [OPTIONS] command command....     #命令用法
  --bind-address=name IP address to bind to.
  -c, --count=#       Number of iterations to make. This works with -i (#总共执行多少次,配合-i选项使用) (--sleep) only.
  -#, --debug[=#]     This is a non-debug version. Catch this and exit.
  --debug-check       This is a non-debug version. Catch this and exit.
  --debug-info        This is a non-debug version. Catch this and exit.
  -f, --force         Don't ask for confirmation on drop database; with multiple commands, continue even if an error occurs.
  -C, --compress      Use compression in server/client protocol.            #启用压缩
  --character-sets-dir=name
                      Directory for character set files.
--default-character-set=name
                      Set the default character set.
  -?, --help          Display this help and exit.              #显示帮助信息
  -h, --host=name     Connect to host.                        #指定服务器地址
  -b, --no-beep       Turn off beep on error.
  -p, --password[=name]                                       #指定连接服务器的密码
                      Password to use when connecting to server. If password is not given it's asked from the tty.
  -P, --port=#        Port number to use for connection or 0 for default to, in (#指定服务器端口,默认3306) order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306).
  --protocol=name     The protocol to use for connection (tcp, socket, pipe, #指定连接方式(tcp\socket\pipe\memory) memory).
  -r, --relative      Show difference between current and previous values when used with -i. Currently only works with extended-status.
  -s, --silent        Silently exit if one can't connect to server.          #如果无法连接,则静默退出
  -S, --socket=name   The socket file to use for connection.                 #指定连接时使用socket文件
  -i, --sleep=#       Execute commands repeatedly with a sleep between.      #持续执行命令,间隔N秒执行一次
  --ssl-mode=name     SSL connection mode.
  --ssl-ca=name       CA file in PEM format.
  --ssl-capath=name   CA directory.
  --ssl-cert=name     X509 cert in PEM format.
  --ssl-cipher=name   SSL cipher to use.
  --ssl-key=name      X509 key in PEM format.
  --ssl-crl=name      Certificate revocation list.
  --ssl-crlpath=name  Certificate revocation list path.
  --tls-version=name  TLS version to use, permitted values are: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3
  --ssl-fips-mode=name
                      SSL FIPS mode (applies only for OpenSSL); permitted values are: OFF, ON, STRICT
  --tls-ciphersuites=name
                      TLS v1.3 cipher to use.
  --server-public-key-path=name
                      File path to the server public RSA key in PEM format.
  --get-server-public-key
                      Get server public key
  -u, --user=name     User for login if not current user.               #指定用户名
  -v, --verbose        Write more information.
  -V, --version       Output version information and exit.              #显示客户端版本
  -E, --vertical      Print output vertically. Is similar to --relative, but prints output vertically.
  -w, --wait[=#]      Wait and retry if connection is down.            #如果连接失败,是否等待重试,如果指定了具体数字,则表示重试几次
  --connect-timeout=#                                                  #指定连接超时时长
  --shutdown-timeout=#                                                 #指定关机超时时长
  --plugin-dir=name   Directory for client-side plugins.                 #客户端插件目录
  --default-auth=name Default authentication client-side plugin to use.
  --enable-cleartext-plugin
                      Enable/disable the clear text authentication plugin.
  --show-warnings     Show warnings after execution
  --compression-algorithms=name
                      Use compression algorithm in server/client protocol. Valid values are any combination of 'zstd','zlib','uncompressed'.
  --zstd-compression-level=#
                      Use this compression level in the client/server protocol, in case --compression-algorithms=zstd. Valid range is between 1 and 22, inclusive. Default is 3.
Variables (--variable-name=value)     #变量说明
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
bind-address                        (No default value)
count                               0
force                               FALSE
compress                            FALSE
character-sets-dir                  (No default value)
default-character-set               auto
host                                (No default value)
no-beep                             FALSE
port                                0
relative                            FALSE
socket                              (No default value)
sleep                               0
ssl-ca                              (No default value)
ssl-capath                          (No default value)
ssl-cert                            (No default value)
ssl-cipher                          (No default value)
ssl-key                             (No default value)
ssl-crl                             (No default value)
ssl-crlpath                         (No default value)
tls-version                         (No default value)
tls-ciphersuites                    (No default value)
server-public-key-path              (No default value)
get-server-public-key               FALSE
user                                (No default value)
verbose                             FALSE
vertical                            FALSE
connect-timeout                     43200
shutdown-timeout                    3600
plugin-dir                          (No default value)
default-auth                        (No default value)
enable-cleartext-plugin             FALSE
show-warnings                       FALSE
compression-algorithms              (No default value)
zstd-compression-level              3
Default options are read from the following files in the given order:     #默认配置文件读取顺序
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf     #配置文件路径列表
The following groups are read: mysqladmin client     #读取的配置组
The following options may be given as the first argument:     #以下选项可作为首参数
--print-defaults        Print the program argument list and exit.              #显示运行参数
--no-defaults           Don't read default options from any option file, except for login file.
 --defaults-file=#       Only read default options from the given file #.     #从指定文件中读取选项
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=#
                        Also read groups with concat(group, suffix)
--login-path=#          Read this path from the login file.
Where command is a one or more of: (Commands may be shortened)     #mysqladmin支持的管理命令
  create databasename   Create a new database                            #创建新的数据库
  debug                 Instruct server to write debug information to log  #开启调试模式,将调试信息写入log
  drop databasename     Delete a database and all its tables              #删除指定数据库
  extended-status       Gives an extended status message from the server    #显示扩展状态
  flush-hosts           Flush all cached hosts                              #刷新所有缓存的主机
  flush-logs            Flush all logs                                      #刷新所有日志
  flush-status          Clear status variables                              #刷新状态变量
  flush-tables           Flush all tables                                    #刷新所有表,会强制关闭已打开的表
  flush-threads         Flush the thread cache                              #刷新线程缓存
  flush-privileges      Reload grant tables (same as reload)                #刷新访问权限
  kill id,id,...        Kill mysql threads
  password [new-password] Change old password to new-password in current format #修改密码
  ping                  Check if mysqld is alive                            #心跳检测
  processlist           Show list of active threads in server               #显示活动线程列表
  reload                Reload grant tables                                 #刷新授权信息
  refresh               Flush all tables and close and open logfiles         #刷新所有数据库表,重新打开日志文件
  shutdown              Take server down                                    #关闭服务
  status                Gives a short status message from the server        #简短显示服务端状态
  start-replica         Start replication
  start-slave           Deprecated: use start-replica instead                #开启主从同步
  stop-replica          Stop replication
  stop-slave            Deprecated: use stop-replica instead                #停止主从同步
  variables             Prints variables available                          #显示服务端所有变量
  version               Get version info from server                        #显示客户端和服务端版本

范例:显示版本信息

bash 复制代码
#客户端版本
# -V 显示mysqladmin版本号
[root@localhost ~]# mysqladmin -V
mysqladmin  Ver 8.0.26 for Linux on x86_64 (Source distribution)     #客户端版本信息

#客户端和服务端版本信息
# version 同时显示客户端和服务端版本
[root@localhost ~]# mysqladmin version
mysqladmin  Ver 8.0.26 for Linux on x86_64 (Source distribution)     #客户端版本信息
Copyright (c) 2000, 2021, Oracle and/or its affiliates.     #版权声明
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.     #商标声明
Server version          8.0.26     #服务端版本
Protocol version        10     #通信协议版本
Connection              Localhost via UNIX socket     #连接方式
UNIX socket             /var/lib/mysql/mysql.sock     #socket文件路径
Uptime:                 1 hour 44 min 34 sec     #服务端运行时长
Threads: 4  Questions: 189  Slow queries: 0  Opens: 287  Flush tables: 3  Open tables: 206  Queries per second avg: 0.030     #线程与查询统计

范例:显示状态信息

bash 复制代码
# 查看mysqladmin简短状态信息
# status 简短显示服务端状态
[root@localhost ~]# mysqladmin status
Uptime: 6352  Threads: 4  Questions: 191  Slow queries: 0  Opens: 287  Flush tables: 3  Open tables: 206  Queries per second avg: 0.030     #服务端运行时长

范例:设置连接超时

bash 复制代码
# 连接到不存在的主机1.2.3.4,超时时间2秒,执行ping命令
# -h 指定服务端主机,--connect-timeout 连接超时秒数,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -h1.2.3.4 --connect-timeout=2 ping
mysqladmin: connect to server at '1.2.3.4' failed     #连接服务器失败
error: 'Can't connect to MySQL server on '1.2.3.4:3306' (110)'     #错误信息
Check that mysqld is running on 1.2.3.4 and that the port is 3306.     #排查提示
You can check this by doing 'telnet 1.2.3.4 3306'     #排查提示:可用telnet测试端口连通性
# 查看上一条命令的返回值,1表示失败
# echo 输出文本,$?取上一条命令返回值
[root@localhost ~]# echo $?
1     #命令返回值,0表示成功,非0表示失败

#静默退出,不输出错误信息
# -h 指定服务端主机,-s 连接失败时静默退出,--connect-timeout 连接超时秒数,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -h1.2.3.4 --connect-timeout=2 -s ping
# 查看返回值
# echo 输出文本,$?取上一条命令返回值
[root@localhost ~]# echo $?
1     #命令返回值,0表示成功,非0表示失败

范例:持续执行

bash 复制代码
#每秒执行一次ping命令,一直执行下去
# -i 间隔N秒重复执行,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -i 1 ping
mysqld is alive     #MySQL服务运行正常
mysqld is alive     #MySQL服务运行正常
mysqld is alive     #MySQL服务运行正常
......     #省略重复输出

#每秒执行一次ping命令,总共执行3次
# -i 间隔N秒重复执行,-c 总共执行N次(配合-i),ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -i 1 -c 3 ping
mysqld is alive     #MySQL服务运行正常
mysqld is alive     #MySQL服务运行正常
mysqld is alive     #MySQL服务运行正常

范例:关闭服务

bash 复制代码
#mysqladmin只能关闭服务,不能启动服务
# shutdown 关闭MySQL服务
[root@localhost ~]# mysqladmin shutdown
# 验证服务已关闭,ping会失败
# ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin ping
mysqladmin: connect to server at 'localhost' failed     #连接服务器失败
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'     #错误信息
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!     #排查提示
# 查看返回值,1表示连接失败
# echo 输出文本,$?取上一条命令返回值
[root@localhost ~]# echo $?
1     #命令返回值,0表示成功,非0表示失败
# 使用systemctl重新启动mysqld服务
# start 启动服务
[root@localhost ~]# systemctl start mysqld

范例:创建数据库和删除数据库

bash 复制代码
#创建
# create 创建新数据库
[root@localhost ~]# mysqladmin create mysqladmin-db1
# create 创建新数据库
[root@localhost ~]# mysqladmin create mysqladmin-db2
# 查看当前所有数据库
# -e 执行指定SQL后退出(非交互)
[root@localhost ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysqladmin-db1     |
| mysqladmin-db2     |
| performance_schema |
| sys                |
+--------------------+

#删除
# drop 删除数据库及其所有表
[root@localhost ~]# mysqladmin drop mysqladmin-db1
Dropping the database is potentially a very bad thing to do.     #删除数据库警告
Any data stored in the database will be destroyed.     #警告:数据将被销毁
Do you really want to drop the 'mysqladmin-db1' database [y/N] y     #回答y确认
Database "mysqladmin-db1" dropped     #数据库已删除
# -f 强制执行,不确认,drop 删除数据库及其所有表
[root@localhost ~]# mysqladmin -f drop mysqladmin-db2     #强制删除,不需要确认
Database "mysqladmin-db2" dropped     #数据库已删除
# -e 执行指定SQL后退出(非交互)
[root@localhost ~]# mysql -e 'show databases'     #验证mysqladmin-db1和mysqladmin-db2已经删除
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost ~]#

范例:修改连接密码

bash 复制代码
#旧密码为空,root用户,localhost主机连接
# password 修改当前用户密码
[root@localhost ~]# mysqladmin password 123456            #设置密码为123456
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.     #警告:密码明文传输,建议SSL

# ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin ping                     #不使用密码不行
mysqladmin: connect to server at 'localhost' failed     #连接服务器失败
error: 'Access denied for user 'root'@'localhost' (using password: NO)'     #错误信息

# -h 指定服务端主机,-u 指定登录用户名,-p 指定登录密码,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -uroot -hlocalhost -p123456 ping     #使用密码
123456     #提示输入密码
mysqladmin: [Warning] Using a password on the command line interface can be insecure.     #警告:命令行明文输入密码不安全
mysqld is alive     #MySQL服务运行正常

#用旧密码修改新密码
# -h 指定服务端主机,-u 指定登录用户名,-p 指定登录密码,password 修改当前用户密码
[root@localhost ~]# mysqladmin -uroot -p123456 -hlocalhost password abcde     #更改密码为abcde
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.     #警告:密码明文传输,建议SSL

# -h 指定服务端主机,-u 指定登录用户名,-p 指定登录密码,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -uroot -p123456 -hlocalhost ping         #使用原密码测试不行
mysqladmin: [Warning] Using a password on the command line interface can be insecure.     #警告:命令行明文输入密码不安全
mysqladmin: connect to server at 'localhost' failed     #连接服务器失败
error: 'Access denied for user 'root'@'localhost' (using password: YES)'     #错误信息

# -h 指定服务端主机,-u 指定登录用户名,-p 指定登录密码,ping 心跳检测服务是否存活
[root@localhost ~]# mysqladmin -uroot -pabcde -hlocalhost ping         #使用新密码测试
mysqladmin: [Warning] Using a password on the command line interface can be insecure.     #警告:命令行明文输入密码不安全
mysqld is alive     #MySQL服务运行正常
mycli 工具

MyCLI是基于Python开发的MySQL的命令行工具,具有自动完成和语法突出显示功能

bash 复制代码
# 安装python39
# yum 安装软件包,-y自动确认
[root@localhost ~]# yum install -y python39
# 配置pip3.9使用清华镜像源
# pip 安装Python包,==指定版本
[root@localhost ~]# pip3.9 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Writing to /root/.config/pip/pip.conf     #pip配置写入成功
# 使用pip3安装mycli 1.2.0版本
# pip 安装Python包,==指定版本
[root@localhost ~]# pip3 install mycli==1.2.0

#使用
# -u 指定用户名,-p 指定密码
[root@localhost ~]# mycli -uroot -pabcde
Connecting to socket /var/lib/mysql/mysql.sock, owned by user mysql     #mycli连接本地socket
MySQL     #mycli欢迎
mycli 1.38.4     #mycli版本号
Home: http://mycli.net     #mycli官网
Bug tracker: https://github.com/dbcli/mycli/issues     #问题反馈地址
Thanks to the contributor - Artem Bezsmertnyi     #致谢
MySQL root@(none):(none)>     #mycli提示符
相关推荐
逃逸线LOF1 小时前
Redis快速入门
数据库·redis·缓存
施嘉伟1 小时前
Oracle 在线重定义卡了一个多小时:查不到阻塞会话
数据库·oracle
꯭自꯭闭꯭1 小时前
达梦守护集群手工切换及故障切换
linux·运维·服务器·数据库
j7~1 小时前
【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》
数据库·redis·缓存·redis的特性·redis的主要应用场景·redis重要文件及其作用·安装并启动redis
Elastic 中国社区官方博客2 小时前
使用 NVIDIA cuVS 在 Elasticsearch 中实现 GPU 加速的向量索引:在 10 分钟内处理 1.38 亿个向量
大数据·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
我们从未走散2 小时前
AI 生图平台如何避免资损:用“扣款与凭据同事务”构建三态账本
开发语言·数据库·php
Shadow(⊙o⊙)3 小时前
MySQL复合查询
数据库·mysql
L·S·P8 小时前
25MB 管理 100+ 种数据库:开源轻量客户端 DBX 介绍与上手
数据库·mysql·开源·database·dbx
笃行35010 小时前
KingbaseES KSQL Developer 的连接管理、数据处理与对象管理
数据库