mysql open table_MySQL open table

背景:

MySQL经常会遇到Too many open files,MySQL上的open_files_limit和OS层面上设置的open file limit有什么关系?

源码中也会看到不同的数据结构,TABLE, TABLE_SHARE,跟表是什么关系?

MySQL flush tables又做了些什么,这几个东西放在一起,就会比较迷惑,下面进行梳理一下:

1 数据结构

table:   MySQL为每一个查询sql中的表建一个TABLE对象

table_share:  MySQL为每一张表建立一个table_share对象,与frm文件对应

handler:  对应于每个TABLE对象,innodb引擎创建一个handler

dict_table_t:  innodb为每一个ibd表load一个数据字典对象

简略图如下:

be454b391fc7c64e48815650b4e0938e.png

1. open table的过程

测试sql:select * from xpchild.pp

函数调用栈:

open_and_lock_tables

open_tables

open_and_process_table

open_table:打开一个table,并赋值给table_list->table

下面进入核心的逻辑:

开始锁lock_open:

1.1 table_share:

首先根据db&&table_name创建一个table_share.

函数调用栈:

get_table_share_with_discover: 创建或者查找table_share对象。

get_table_share:如果全局cache:table_def_cache中存在,就直接使用,如果不存在,就创建一个table_share

alloc_table_share: 如果不存在,先分配一个share的对象。

open_table_def: 打开frm文件。

mysql_file_open: my_open打开

inline_mysql_file_close: my_close关闭

share->ref_count++;

要点:

MySQL server层维护了一个全局的table definition cache即table_def_cache,所以一个table_share只会创建一次,后续进行共享。

初始化table_share的过程中,调用文件系统打开frm文件,初始化完成后,关闭frm文件。

share结构中ref_count来表示有多少个table关联

1.2 打开table:

open_table_from_share

step1: 初始化table中的变量,包括file handler (get_new_handler(share->db_type()))

step2: 添加各种索引,字段结构

step3: file->ha_open:ha_innobase::open 为innodb的table创建一个handler。

要点:

1. 在open table的过程中,innodb会创建一个handler,并打开ibd文件,初始化dict_table结构。

释放锁lock_open

1.3 close table:

sql执行结束之前,会调用close table

close_open_tables(thd)

table_def_unuse_table:

要点:

1.table_share维护了两个双向链表used_tables,free_tables,当close table的时候,

1.1 table->in_use=NULL,

1.2 把table从used_tables移除

1.3 加入到free_tables

2.全局参数table_cache_size,已经当前table_cache_count计数控制cache的置换策略

2. 再次执行sql

因为第一步已经完成了table_share的创建,并且cache了table,再次执行sql时,open table的过程就比较简单:

2.1: get_table_share:从cache中直接获取table_share对象

2.2:open_table_from_share:从s->free_tables中获取缓存的可以使用的table,然后增加ref计数。

if (!share->free_tables.is_empty())

table= share->free_tables.front();

++share->ref_count;

3 系统计数:

opened_tables:系统在open_table_from_share中,对新建的table,进行thd->status_var.opened_tables++计数。

opened_shares: 系统在 open_table_def的函数中,对于首次进行open的table_share进行thd->status_var.opened_shares++计数

注: 所以当系统的status:open_tables增长比较多的时候,可以适当的增加table_cache_size,用于缓存更多的table,毕竟open table的开销还是不小的。

4 status统计

使用show status命令,跟open有关的几个:

{"Open_files", (char*) &my_file_opened, SHOW_LONG_NOFLUSH}

注释:【全局变量】MySQL和innodb通过文件系统打开的文件的计数,这里包括了所有的文件,binlog,relay,alert,slow log等。

{"Open_table_definitions", (char*) &show_table_definitions, SHOW_FUNC},

注释:【全局变量】server当前打开的table_share数量,等于table_def_cache.records的数量

{"Open_tables", (char*) &show_open_tables, SHOW_FUNC}

注释:【全局变量】 server当前打开的table数量,server维护了一个全局变量table_cache_count

{"Opened_files", (char*) &my_file_total_opened, SHOW_LONG_NOFLUSH}

注释:【全局变量】 启动以来打开过的文件的总数

{"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables), SHOW_LONG_STATUS}

注释: 【线程变量】 在真正open_table_from_share的过程中,累计计数

{"Opened_table_definitions", (char*) offsetof(STATUS_VAR, opened_shares), SHOW_LONG_STATUS}

注释: 【线程变量】 在真正打开share的时候,累计计数

注: use test的过程:

在use test的过程中,会轮询把test db下的所有表的table_share都创建一遍,即open所有的frm文件,并创建table_share对象,最后close 所有的frm文件。

为了方便调试,写了一个进程监控的程序:pidmon.py

在gdb的时候,可以看到mysqld进程打开的所有文件:

dbcd58bda7ab6473ba10197e5e68f036.png

Too many open files:

这里包括了server层的open frm,和innodb层open ibd的时候,当打开的文件超过limit限制,就会报这个错误。

但这个限制牵涉到两个参数:

一个是MySQL配置的open_files_limit

一个是OS层配置的进程的open file limit

下一篇:

flush tables究竟做了什么:close了server层创建的所有的table_share和table。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 视图 mybatis_Mybatis调用视图和存储过程的方法

现在的项目是以Mybatis作为O/R映射框架,确实好用,也非常方便项目的开发。MyBatis支持普通sql的查询、视图的查询、存储过程调用,是一种非常优秀的持久层框架。它可利用简单的XML或注解用语配置和原始映射,将接口和java中的POJO映射…

JUC详解

JUC 前言: 在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的。下面一起来看看它怎么使用。 一、volatile关键字与内存可见…

mongodb mysql 写_MySQL和MongoDB语句的写法对照

查询:MySQL:SELECT * FROM userMongo:db.user.find()MySQL:SELECT * FROM user WHERE name ’starlee’Mongo:db.user.find({‘name’ : ’starlee’})插入:MySQL:INSERT INOT user (name, age) values (’starlee’,25)Mongo:db.user.insert({‘name’…

抓包工具,知道手机app上面使用的接口是哪个

fiddler。大家可以百度上面好多选择一个安装。这里随便扔一个 在电脑上安装以后。你再配置手机上的一些设置。 首先保证手机和电脑在同一个局域网上,连得wifi域名前面一样的,在电脑的cmd输入ipconfig 然后打开手机的设置。wifi页面点开查看你连的wifi的…

munin mysql_munin 监控 mysql 2种方法

munin自带的有mysql监控功能,但是没有启用。试了二种方法,都可以监控mysql。一,安装munin mysql的perl扩展# yum install perl-Cache-Cache perl-IPC-ShareLite perl-DBD-MySQL二,为监控创建mysql用户mysql> CREATE USER munin…

使用fiddler实现手机抓包

使用fiddler实现手机抓包 手机上无法直接查看网络请求数据,需要使用抓包工具。Fiddler是一个免费的web调试代理,可以用它实现记录、查看和调试手机终端和远程服务器之间的http/https通信。 一、PC端fiddler配置 1. 安装HTTPS证书 手机上的应用很多涉及…

mysql查询最小的id_Mysql查询表中最小可用id值的方法

今天在看实验室的项目时,碰到了一个让我“棘手”的问题,其实也是自己太笨了。先把 sql 语句扔出来// 这条语句在id没有1时,不能得到正确的查询结果。select min(id1) from oslist c where not exists (select id from oslist where id c.id1…

小米手机上安装https证书(例如pem证书,crt证书)详解

小米手机上安装https证书(例如pem证书,crt证书)关键三步: 1.使用第三方浏览器下载.pem 格式的文件 (我使用的是QQ浏览器) 2.将这个文件放入小米的 DownLoad 文件夹下 (这步也可以不做,只要在4…

php打印mysql sql_php的打印sql语句的方法

echo M()->_sql();这样就可以调试当前生成的sql语句;//获取指定天的开始时间和结束时间$datez"2016-05-12";$t strtotime($datez);$start mktime(0,0,0,date("m",$t),date("d",$t),date("Y",$t));$end mktime(23,59,5…

spring的@ControllerAdvice注解

ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。 对于ControllerAdvice,我们比较熟知的用法是结合ExceptionHandler用于全局异常的处理,但其作用不止于此。…

mysql游标的用法及作用_Mysql 游标的用法及其作用

mysql 游标的用法和作用,话不多说,这个是网上看到的例子,简答粗暴。例子:当前有三张表a、b、c其中a和b是一对多关系,b和c是一对多关系,现在需要将b中a表的主键存到c中;常规思路就是将b中查询出来…

@ControllerAdvice实现优雅地处理异常

ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理 统一异常处理 需要配合ExceptionHandler使用。 当将异常抛到controller时,可以对异常进行统一处理,规定返…

python django图书管理系统_Python框架:Django写图书管理系统(LMS)

Django模版文件配置文件路径 test_site -- test_site -- settings.pyTEMPLATES [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [os.path.join(BASE_DIR, "template")], # template文件夹位置 APP_DIRS: True, OPTIONS: { context_processor…

springsecurity中session失效后怎样处理_结合Spring Security进行web应用会话安全管理

结合Spring Security进行web应用会话安全管理在本文中,将为大家说明如何结合Spring Security 管理web应用的会话。如果您阅读后觉得本文对您有帮助,期待您能关注、转发!您的支持是我不竭的创作动力!一、Spring Security创建使用se…

如何把数据库从sql变成mysql_如何将数据库从SQL Server迁移到MySQL

一、迁移Database Schema。首先使用Sybase Powerdesigner的逆向工程功能,逆向出SQL Server数据库的物理模型。具体操作是在Powerdesigner中选择“File”,“Reverse Engine”再选择Database,将DBMS选择为SQL Server,如图&#xff1…

mysql查询单词出现的位置_在MySQL中从左侧获取一些单词

为此,请在MySQL中使用LEFT。让我们首先创建一个表-mysql> create table DemoTable-> (-> Title text-> );使用插入命令在表中插入一些记录-mysql> insert into DemoTable values(Java database connectivity to MySQL database);mysql> insert in…

linux转mysql_[转] linux下安装mysql服务器

[转自:http://www.extmail.org/forum/archive/2/0510/563.html]安装MySQL服务器你可以根据服务器的CPU类型,下载适合你所用CPU和操作系统的MySQL发行包。从下面的URL下载MySQL 4.1.16以tar.gz形式发布的二进制发行包:http://www.mysql.com增加…

mysql数据库开发要求_MYSQL数据库开发规范

MYSQL数据库开发规范(一) 建表规约1.【推荐】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1 表示是,0 表示否)。说明:任何字段如果为非负数,必须是 unsigned。正例:表…

HTTP 学习,程序员不懂网络怎么行,一篇HTTP入门 不收藏都可惜

文章目录📢前言HTTP 必备干货学习,程序员不懂网络怎么行HTTP 协议五个特点:网络结构图解HTTP概述🏳️‍🌈基于 HTTP 的系统的组件客户端:用户代理网络服务器代理HTTP 的基本方面HTTP 很简单HTTP 是可扩展的…

docker mysql5.7 主从_docker-compose mysql5.7.30 主从

一、安装mysql5.7.30主库1.准备docker和docker-compose环境2.创建yml目录,相关数据挂载#yml存放的目录mkdir -p /root/docker-compse/mysql#主库的/var/lib/mysql 数据的挂载目录mkdir -p /data/mysql5matser#不用slave 了,用replication的缩写replic , …