MySQL中的实例、数据库关系简介

说实话,MySQL的这些概念我讲了很长时间。
你说的四点确实很准确,但换个说法会更直观。

首先我们来谈谈“例子”。
我第一次在测试环境中遇到一些奇怪的事情——一台服务器上有两个MySQL实例。
一个使用默认参数,另一个从 spfile 启动。
当时我很困惑,但后来我发现了MySQL实例的灵活性。
它本质上是一个服务进程,但可以管理多个库。
例如,我们公司使用 Percona XtraDB Cluster。
每个节点都是一个单独的实例,并通过组复制连接。
这与管理多个库的单个实例完全不同。
实例的启动依赖于配置文件。
如果没有找到,它将默认启动。
这真的很像甲骨文。

有趣的是,“数据库”。
这实际上是一个逻辑概念。
我有一个客户把所有数据库名称都改成了中文。
结果,备份工具崩溃,因为许多工具与文件名编码中的文件名编码不匹配。
这凸显了数据库是一个人为的概念 - 它由许多文件组成(ibd和frm在数据目录中)但您可以使用CREATE DATABASE自动构建它。
比如你的自习室。
书籍虽然是实体文件; “学习”是一个逻辑部分。

我在给出电商场景的时候会理清例子和数据库的关系。
例如,淘宝不一定每个店铺都使用单独的实例,而是采用主从复制+读写分离。
您的查询将转到从数据库实例;订单和写入操作转到主数据库实例。
此时,一个实例可以同时处理三个不同的数据库(用户数据库、产品数据库、订单数据库)。
但是,如果您打开一个新商店,您仍将使用共享实例资源,但会话将指定要运行的数据库。

说话的方式特别有趣。
调优时发现了一个错误:一个连接上打开了 1 00 个会话,并且 CPU 受到限制。
这是因为会话是逻辑单元,但每个会话都占用线程资源。
这意味着,如果你在网吧,自己打开5 0个网页,你肯定会被卡住。
因此,现在用户必须保持连接尽可能短或者您需要使用连接池。

我在生意上遇到了很多困难。
有一次,系统突然报错。
经过查看记录,发现某个会话中有一个未提交的事务被占用了。
当时数据量并不大,但整个实例其实卡住了——就是“线程和事务”的关系。
您所说的“事务可以从会话中发出”尤其重要。
我见过Python用于在许多主题上运行MySQL,结果,由于没有线程正在执行的事务,所有线程都被锁定。

最后,从整体来看,这个结构就像一个工厂。
比如工厂的主体,数据库就是车间。
一个会话就是一个工作指令。
连接性是看门人。
工作指令(会话)在工作站(数据库)上运行,并且网守(连接)传递工作指令。
工单(传输)必须执行,但工单执行时工作站资源(线程)将被锁定。
这种设计实际上非常聪明,但需要注意边界条件 - 例如如果连接突然断开,则未完成的会话我应该怎么办?这是MySQL 8 .0改进的会话持久机制将要解决的问题。

我个人从来没有在集群环境中运行过。
请记住,XtraDB Cluster 可以支持数千个节点;但是如何在分布式环境中保持一定程度的事务隔离呢?我们建议检查 Percona 的文档。
我当时不明白。

实例与数据库的对应关系区别是什么

结论: 一个例子是数据库运行时实体,包括进程和内存结构,而数据库是存储的数据集合。
一个实例可以对应多个数据库,但每个数据库通常由单个实例管理。
实例负责资源管理和运行环境,数据库负责数据存储和组织。
实例故障影响数据库性能和可用性,数据库安全取决于设计和管理。
实例与数据库配合构成完整的数据库系统。

MySQL中的实例、数据库关系简介

说实话,我花了很多时间才明白如何理解MySQL实例。
让我们考虑一个我自己遇到的场景。
在服务器资源匮乏的环境下,我在同一系统上安装了三个MySQL实例,每个实例的端口号不同,以区分不同项目的数据库操作。
如果您在启动时打开任务管理器,您将看到三个 MySQL 服务进程挂在那里,并且彼此不干扰。

有趣的是,尽管都是MySQL,你仍然需要为每个实例单独准备配置文件。
例如,项目A使用my.cnf,项目B使用my.ini,项目C使用mysql.ini。
启动时会加载相应的文件。
如果未找到该文件,MySQL 将使用默认参数启动。
这与Oracle的spfile非常相似。
但我还是不太明白Oracle的事情。
我只知道它是一个启动参数文件。

在实例配置方面,线程和内存非常重要。
之前做过运维方面的工作,也遇到过内存泄漏的情况。
原因是一个实例的线程池已满,无法处理任何新请求。
如果您检查日志,您会发现线程数不断增加并最终减慢系统速度。
因此,了解每个实例的线程和内存配置非常重要。

谈话特别有趣。
我的一个朋友在第一次学习 MySQL 时总是混淆连接和会话。
他曾经问我为什么实际处理的线程数不会随着连接数的增加而改变。
当时不太明白,后来看资料才知道,单个连接可以支持多个线程,特别是在事务处理和备份操作时。
例如,Oracle 的 RMAN 备份可能会创建多个线程来处理数据块,所有这些都在一个会话内。

说说情况吧。
我曾经在一个开发团队工作过,遇到过一个非常复杂的订单流程,涉及到三个表:库存、订单和物流。
开发人员在编写SQL时,使用了2 0多个事务的嵌套。
结果,在第二次测试时,其中一笔中间交易因网络抖动而回滚,导致整个订单链路崩溃。
然后我把它改为分布式事务。
这很痛苦,但至少数据是一致的。

其实,坦白说,MySQL实例、会话、事务、线程的概念就像搭积木一样。
实例是最大的构建块,可以包含多个数据库。
会话正在建立它是块上的一个小孔,可以插入许多螺纹。
交易就是将一块小砖插入一个小孔中。
您可以在一个会话中插入许多块,但在一个会话中只能插入一个块。
操作系统也有自己的线程概念,这可能会引起混乱。
我个人没有在这方面运行过 Linux 内核,但它看起来相当复杂。

我记得数据大约是X,但我建议检查一下。
不管怎样,在过去的十年里,我意识到使用数据库最可怕的事情就是把事情视为理所当然。
许多陷阱都是由于对基本原则的无知而产生的。

数据库与实例的关系

是的,服务器可以安装多个实例。
默认实例是 MSSQLSERVER。
安装过程中,只需选择默认实例即可。
如果要再次安装,请选择命名实例并更改名称。
不同版本也可以一起安装,如SQL2 000、2 005 、2 008 等,不会发生冲突。
如果出现问题,请不要惊慌,这可能是配置问题。
内存大,可安装多个实例、多个版本。
你自己看看吧。