mysql系列(5)--表结构缓存

本文介绍了MySQL中表对象缓存的基本概念与实现原理。主要包括表对象缓存的定义、缓存过程、table_share结构体的作用及表结构实例化的过程。

数据库操作最普遍的就是对表的操作,所以需要先了解下表的结构
MySQL是一个插件式存储引擎,导致每种对象(包括表,视图,存储过程,存储函数)的缓存方式都不相同,先来了解下最常用的表对象缓存
定义
表对象缓存是将表对象的字典信息(定义的内容)缓存到内存中,提高访问效率。
实现过程
表被访问的时候,MySQL先从缓存中查找这个表,缓存中没有对应的表缓存时,会去系统表中读取它的定义并解析。表字典对象的缓存是通过hash表来存储管理的,通过对表名Hash来搜索对象
表结构缓存使用了共享私有化缓存,缓存过程使用了一个叫table_share的结构体。TABLE_SHARE是表定义缓存,是一个静态表缓存,唯一对应一张表,所有用户都共享这个表对象。其内容从系统表获取(frm),它保存在table_def_cache(hash表,key为表名(含库名))中。
表打开时,先从系统表中将表的所以信息读入内存,包括表名,库名,列,字符集等信息。读取的信息通过结构体table_share存储。这个表可以让所有用户访问,且不能被修改的。
当用户得到table_share后,系统会重新构造一个新的对象(名字叫table)交给当前的操作。与用户进行交互。从table_share 到table实例的过程叫表结构实例化
MySQL中表对象的缓存分为2部分,一部分是table_share 的缓存,一部分是实例化后实例对象的缓存table。table_share是静态的,不能修改的,且只能存在一份。只要在表结构被修改后才会删除,或者缓存使用满了会淘汰。
被实例化后的table对象是动态的,正在进行操作的实例,并且需要构造这个对应表的存储引擎信息并且打开这个表。table实例可以理解为MYSQL与存储引擎之间交流的通道。
每一个用户的操作及不同时间的状态都是不同的,所以每一个用户必须要再在SHARE的基础上实例化一个新的对象出来

这里写图片描述

当一个操作完成之后,它所实例化的表就不需要了,此时系统不是将这个本地的实例直接释放掉,而是将其保存下来了,保存下来是为了下次某一个用户再次访问这个表的时候不需要再次进行实例化了,直接拿过来用即可

### 使用 `mysql-utilities` 工具恢复 MySQL 表结构 为了在 Linux 中使用 `mysql-utilities` 恢复 MySQL 数据库的表结构,可以按照如下方法操作: #### 安装必要的软件包 确保已经安装了 `mysql-utilities` 和其他依赖项。可以通过以下命令来获取所需的 RPM 文件并安装它。 对于 Fedora 用户: ```bash wget http://dev.mysql.com/get/mysql-community-release-fc21-6.noarch.rpm sudo rpm -Uvh mysql-community-release-fc21-6.noarch.rpm ``` 对于 CentOS 7 用户: ```bash wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm sudo yum localinstall mysql-community-release-el7-5.noarch.rpm ``` 接着更新 YUM 缓存,并安装 `mysql-utilities` 及其相关组件: ```bash sudo yum update sudo yum install mysql-utilities ``` #### 备份现有数据(可选) 建议先备份现有的数据库以防万一出现问题时能够快速回滚。 ```bash mysqldump --all-databases > all_databases.sql ``` #### 导出表结构 利用 `mysqldbcopy` 或者 `mysqldumputils` 来导出目标数据库中的表定义而不复制实际的数据记录。 ```bash # 使用 mysqldbcopy 命令仅拷贝架构而忽略数据部分 mysqldbcopy --source=user:password@localhost \ --destination=user:password@localhost \ old_database:new_database --skip-data ``` 或者也可以通过 `mysqldump` 实现相同的效果: ```bash mysqldump -u user -p --no-data database_name > structure_only.sql ``` #### 还原表结构至新位置 最后一步就是把之前创建好的 SQL 脚本导入到新的环境中去重建这些表格。 ```bash mysql -u user -p new_database < structure_only.sql ``` 检查 MySQL 服务状态以确认一切正常运行: ```bash systemctl status mysqld ``` 需要注意的是,在执行上述任何一条指令前,请务必替换掉其中占位符式的用户名 (`user`)、密码(`password`)以及具体的数据库名称等信息为自己环境下的真实值[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值