加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql引擎与操作系统的关系_MySQL Study案例之

发布时间:2022-10-27 14:31:21 所属栏目:MySql教程 来源:未知
导读: MySql Study案例之--MySql体系和存储引擎
1、数据库和实例
数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL中,数据库文件可以是frm、myd、myi、ibd结尾的文件。当使用NDB引擎

MySql Study案例之--MySql体系和存储引擎

1、数据库和实例

数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL中,数据库文件可以是frm、myd、myi、ibd结尾的文件。当使用NDB引擎时,数据库文件可能不是操作系统上的文件,而是存放与内存之中的文件,但是定义仍然不变。

数据库实例:由数据库后台进程/线程以及一个共享内存区组成。共享内存可以被运行的后台进程/线程所共享。需要牢记的是,数据库实例才是真正用来操作数据库文件的。

在MySQL中,实例和数据库通常关系是一一对应,即一个实例对应一个数据库,一个数据库对应一个实例。但是,在集群情况下可能存在一个数据库可被多个实例访问的情况。

MySQL被设计为一个单进程多线程架构的数据库。

2、MySQL进程[root@rh6~]#mysqld_safe&

[root@rh6~]#ps-ef|grepmysql|grep-vgrep

root41684130014:48pts/100:00:00/bin/sh./mysqld_safe

mysql42944168014:48pts/100:00:14/usr/local/mysql/bin/mysqld--basedir=/usr/local/mysql--datadir=/var/lib/mysql--plugin-dir=/usr/local/mysql/lib/plugin--user=mysql--log-error=/var/log/mysqld.log--pid-file=/var/run/mysqld/mysqld.pid--socket=/var/lib/mysql/mysql.sock

root46434130015:26pts/100:00:00mysql-hlocalhost-uroot-p

MySQL配置文件:

[root@rh6~]#mysql--help|grepmy.cnf

orderofpreference,my.cnf,$MYSQL_TCP_PORT,

/etc/mysql/my.cnf/etc/my.cnf~/.my.cnf

数据文件路径:

mysql>showvariableslike'datadir'\G

***************************1.row***************************

Variable_name:datadir

Value:/var/lib/mysql/

1rowinset(0.00sec)

[root@rh6bin]#ls-l/var/lib/mysql/

total28688

-rw-rw----1mysqlmysql56Jan2817:25auto.cnf

-rw-rw----1mysqlmysql18874368Feb214:48ibdata1

-rw-rw----1mysqlmysql5242880Feb214:48ib_logfile0

-rw-rw----1mysqlmysql5242880Jan2817:21ib_logfile1

drwx------2mysqlroot4096Jan2817:21mysql

srwxrwxrwx1mysqlmysql0Feb214:48mysql.sock

drwx------2mysqlmysql4096Jan2817:21performance_schema

drwx------2mysqlroot4096Jan2817:21test

3、MySQL的结构

在具体介绍MySQL的存储引擎之前,先来介绍一下MySQL的结构。

从图中可以看到MySQL由以下几个部分组成:连接池

管理服务和工具组件

SQL接口

查询分析器

优化器

缓存

插入式存储引擎

物理文件

4、InnoDB存储引擎:

5473a210a30b5d84f09bcda26a682f3e.png

InnoDB是Mysql数据库的一种存储引擎:

InnoDB给Mysql的表提供了 事务、回滚、崩溃修复能力、多版本并发控制的事务安全、间隙锁(可以有效的防止幻读的出现)、支持辅助索引、聚簇索引、自适应hash索引、支持热备、行级锁。还有InnoDB是Mysql上唯一一个提供了外键约束的引擎。

InnoDB存储引擎中,创建的表的表结构是单独存储的并且存储在.frm文件中。数据和索引存储在一起的并且存储在表空间中。但是默认情况下mysql会将数据库的所有InnoDB表存储在一个表空间中的。其实这种方式管理起来非常的不方便而且还不支持高级功能所以建议每个表存储为一个表空间实现方式为:使用服务器变量innodb_file_per_table = 1。

如果需要频繁的进行更新、删除操作的数据库也可选择InnoDB存储引擎。因为该存储引擎可以实现事务提交和回滚。

InnoDB存储引擎内存由以下几个部分组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool),分别由配置文件中的参数innodb_buffer_pool_size和innodb_log_buffer_size的大小决定。

eb6d5554c80c9b061cb558627511a96e.png

InnoDB体系结构:后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外,将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常情况下InnoDB能恢复到正常运行状态。

后台线程

由于Oracle是多进程的架构(Windows下除外),因此可以通过一些很简单的命令来得知Oracle当前运行的后台进程,如ipcs命令。一般来说,Oracle的核心后台进程有CKPT、DBWn、LGWR、ARCn、PMON、SMON等。

很多DBA问我,InnoDB存储引擎是否也是这样的架构,只不过是多线程版本的实现后mysql系统,我决定去看InnoDB的源代码,发现InnoDB并不是这样对数据库进程进行操作的。InnoDB存储引擎是在一个被称做master thread的线程上几乎实现了所有的功能。

默认情况下,InnoDB存储引擎的后台线程有7个—4个IO thread,1个master thread,1个锁(lock)监控线程,1个错误监控线程。IO thread的数量由配置文件中的innodb_file_ io_threads参数控制,默认为4,如下所示。mysql>showengineinnodbstatus\G

***************************1.row***************************

Type:InnoDB

Name:

Status:

=====================================

15020217:15:33INNODBMONITOROUTPUT

=====================================

Persecondaveragescalculatedfromthelast19seconds

-----------------

BACKGROUNDTHREAD

-----------------

srv_master_threadloops:0srv_active,0srv_shutdown,8787srv_idle

srv_master_threadlogflushandwrites:8787

----------

SEMAPHORES

----------

OSWAITARRAYINFO:reservationcount3

OSWAITARRAYINFO:signalcount3

Mutexspinwaits2,rounds60,OSwaits1

RW-sharedspins2,rounds60,OSwaits2

RW-exclspins0,rounds0,OSwaits0

Spinroundsperwait:30.00mutex,30.00RW-shared,0.00RW-excl

------------

TRANSACTIONS

------------

Trxidcounter2305

Purgedonefortrx'sn:o

Historylistlength0

LISTOFTRANSACTIONSFOREACHSESSION:

---TRANSACTION0,notstarted

MySQLthreadid3,OSthreadhandle0x7fe2a80c2700,queryid45localhostrootinit

showengineinnodbstatus

--------

FILEI/O

--------

I/Othread0state:waitingforcompletedaiorequests(insertbufferthread)

I/Othread1state:waitingforcompletedaiorequests(logthread)

I/Othread2state:waitingforcompletedaiorequests(readthread)

I/Othread3state:waitingforcompletedaiorequests(readthread)

I/Othread4state:waitingforcompletedaiorequests(readthread)

I/Othread5state:waitingforcompletedaiorequests(readthread)

I/Othread6state:waitingforcompletedaiorequests(writethread)

I/Othread7state:waitingforcompletedaiorequests(writethread)

I/Othread8state:waitingforcompletedaiorequests(writethread)

I/Othread9state:waitingforcompletedaiorequests(writethread)

Pendingnormalaioreads:0[0,0,0,0],aiowrites:0[0,0,0,0],

ibufaioreads:0,logi/o's:0,synci/o's:0

Pendingflushes(fsync)log:0;bufferpool:0

161OSfilereads,5OSfilewrites,5OSfsyncs

0.00reads/s,0avgbytes/read,0.00writes/s,0.00fsyncs/s

-------------------------------------

INSERTBUFFERANDADAPTIVEHASHINDEX

-------------------------------------

Ibuf:size1,freelistlen0,segsize2,0merges

mergedoperations:

insert0,deletemark0,delete0

discardedoperations:

insert0,deletemark0,delete0

Hashtablesize276707,nodeheaphas0buffer(s)

0.00hashsearches/s,0.00non-hashsearches/s

---

LOG

---

Logsequencenumber1602871

Logflushedupto1602871

Pagesflushedupto1602871

Lastcheckpointat1602871

0pendinglogwrites,0pendingchkpwrites

8logi/o'sdone,0.00logi/o's/second

----------------------

BUFFERPOOLANDMEMORY

----------------------

Totalmemoryallocated137363456;inadditionalpoolallocated0

Dictionarymemoryallocated43148

Bufferpoolsize8192

Freebuffers8042

Databasepages150

Olddatabasepages0

Modifieddbpages0

Pendingreads0

Pendingwrites:LRU0,flushlist0singlepage0

Pagesmadeyoung0,notyoung0

0.00youngs/s,0.00non-youngs/s

Pagesread150,created0,written1

0.00reads/s,0.00creates/s,0.00writes/s

Nobufferpoolpagegetssincethelastprintout

Pagesreadahead0.00/s,evictedwithoutaccess0.00/s,Randomreadahead0.00/s

LRUlen:150,unzip_LRUlen:0

I/Osum[0]:cur[0],unzipsum[0]:cur[0]

--------------

ROWOPERATIONS

--------------

0queriesinsideInnoDB,0queriesinqueue

0readviewsopeninsideInnoDB

Mainthreadprocessno.4294,id140611110070016,state:sleeping

Numberofrowsinserted0,updated0,deleted0,read0

0.00inserts/s,0.00updates/s,0.00deletes/s,0.00reads/s

----------------------------

ENDOFINNODBMONITOROUTPUT

============================

1rowinset(0.00sec)

附:

Oracle 体系结构图

33a1cc05035f0a9ddcc3414ab927322b.png

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!