谈谈什么是MySQL的表空间?
今天我要跟你分享的话题是:“大家常说的表空间到底是什么?究竟什么又是数据表?”
这其实是一个概念性的知识点,当作拓展知识。涉及到的概念大家了解一下就好,涉及的参数,留个印象就好。
一、什么是表?
但凡是用过MySQL都知道,直观上看,MySQL的数据都存在数据表中。
比如一条Update SQL:
update user set username = '白日梦' where id = 999;
它将user这张数据表中id为1的记录的username列修改成了‘白日梦’
这里的user其实就是数据表。当然这不是重点,重点是我想表达:数据表其实是逻辑上的概念。而下面要说的表空间是物理层面的概念。
二、什么是表空间?
不知道你有没有看到过这句话:“在innodb存储引擎中数据是按照表空间来组织存储的”。其实有个潜台词是:表空间是表空间文件是实际存在的物理文件。
大家不用纠结为啥它叫表空间、为啥表空间会对应着磁盘上的物理文件,因为MySQL就是这样设计、设定的。直接接受这个概念就好了。
MySQL有很多种表空间,下面一起来了解一下。
三、sys表空间
你可以像下面这样查看你的MySQL的系统表空间
Value部分的的组成是:name:size:attributes
默认情况下,MySQL会初始化一个大小为12MB,名为ibdata1文件,并且随着数据的增多,它会自动扩容。
这个ibdata1文件是系统表空间,也是默认的表空间,也是默认的表空间物理文件,也是传说中的共享表空间。
关于这个共享表空间,直观上看,如果这个表空间能为multiple tables.存储数据,那么它就可以被称为共享表空间,所以你可以认为系统表空间是共享表空间。
四、配置sys表空间
系统表空间的数量和大小可以通过启动参数:innodb_data_file_path
# my.cnf
[mysqld]
innodb_data_file_path=/dir1/ibdata1:2000M;/dir2/ibdata2:2000M:autoextend
ibdata1表空间为固定大小2000M,而ibdata2的2000M使用完后会自动增长。
假设你的服务器有两块存储A、B。并且A、B上分别挂载着dir1目录和dir2目录。那你再看上面的配置,它其实是在使用两个不同磁盘上的文件共同构建表空间。由于这两个文件位于不同的磁盘上,磁盘的负载就会被均分,数据库整体的性能也有所提升。
五、file per table 表空间
如果你想让每一个数据库表都有一个单独的表空间文件的话,可以通过参数innodb_file_per_table
设置。
这个参数只有在MySQL5.6或者是更高的版本中才可以使用。
可以通过配置文件
[mysqld]
innodb_file_per_table=ON
也可以通过命令
mysql> SET GLOBAL innodb_file_per_table=ON;
让你将其设置为ON,那之后InnoDB存储引擎产生的表都会自己独立的表空间文件。
独立的表空间文件命名规则:表名.ibd
注意:
独立表空间文件中仅存放该表对应数据、索引、insert buffer bitmap。
其余的诸如:undo信息、insert buffer 索引页、double write buffer 等信息依然放在默认表空间,也就是共享表空间中。
这里的undo、insert buffer、double write buffer 如果你不了解他们是啥也没关系。按照大纲排期,我会在第 41、42 篇文中跟大家分享。在这里只需要先了解即使你设置了
innodb_file_per_table=ON
共享表空间的体量依然会不断的增长,并且你即使你不断的使用undo进行rollback,共享表空间大小也不会缩减就好了。
查看我的表空间文件:
最后再简述一下这种file per table的优缺点:
优点:
- 提升容错率,表A的表空间损坏后,其他表空间不会收到影响。s
- 使用MySQL Enterprise Backup快速备份或还原在每表文件表空间中创建的表,不会中断其他
InnoDB
表的使用
缺点:
- 对fsync系统调用来说不友好,如果使用一个表空间文件的话单次系统调用可以完成数据的落盘,但是如果你将表空间文件拆分成多个。原来的一次fsync可能会就变成针对涉及到的所有表空间文件分别执行一次fsync,增加fsync的次数。
fsync我计划会在第 18 篇文章中跟大家分享。欢迎关注!持续更新中~
六、临时表空间
临时表空间用于存放用户创建的临时表和磁盘内部临时表。
参数innodb_temp_data_file_path
定义了临时表空间的一些名称、大小、规格属性如下图:
查看临时表空间文件存放的目录
七、undo表空间
相信你肯定听过说undolog,常见的当你的程序想要将事物rollback时,底层MySQL其实就是通过这些undo信息帮你回滚的。
在MySQL的设定中,有一个表空间可以专门用来存放undolog的日志文件。
然而,在MySQL的设定中,默认的会将undolog放置到系统表空间中。
如果你的MySQL是新安装的,那你可以通过下面的命令看看你的MySQL undo表空间的使用情况:
大家可以看到,我的MySQL的undo log 表空间有两个。
也就是我的undo从默认的系统表空间中转移到了undo log专属表空间中了。
那undo log到底是该使用默认的配置放在系统表空间呢?还是该放在undo表空间呢?
这其实取决服务器使用的存储卷的类型。
如果是SSD存储,那推荐将undo info存放在 undo表空间中。
白日梦计划在第19篇文章中跟大家分享 undolog 相关的知识点。欢迎关注
参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-file-per-table-tablespaces.html
https://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
关注送书!《Netty实战》
文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽活动
诚信第一,活动真实有效
谈谈什么是MySQL的表空间?的更多相关文章
- MySQL的表空间管理
表空间: MySQL没有真正意义上的表空间管理. MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间. 一般来说,当数据量很小的时候建议使用共享表空间的管理方式. ...
- mysql通过表空间来恢复或者传递数据
mysql的备份工具通常有 mysqldump ,mysqlpump(5.7后新特性)等备份工具,这里我们可以尝试使用表空间进行传递 方式是:拷贝数据文件+拷贝表空间 对应innodb引擎就是 i ...
- mysql共享表空间转独立表空间
使用innodb_export_import.py脚本: https://github.com/thecpaneladmin/innodb-tools 安装MySQL-python模块: shell ...
- 浅析mysql 共享表空间与独享表空间以及他们之间的转化
innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共 ...
- mysql 案例 ~ 表空间迁移数据与数据导入
一 简介:mysql5.6+的表空间传输二 目的:复制数据到另一个表三 步骤 1 create table b like a ->创建一个空表 2 alter table b disc ...
- mysql之 表空间传输
说明:MySQL(5.6.6及以上),innodb_file_per_table开启. 1.1. 操作步骤: 0. 目标服务器创建相同表结构1. 目的服务器: ALTER TABLE t DISCAR ...
- MySQL 独立表空间恢复案例
创建表的时候就会得到元数据.可以通过定义的方式对表的元数据进行生成 这个地方要注意的是 独立表空间当中 ibd & frm分别存储的是什么数据? 表空间:文件系统,为了更好的扩容数据库的存 ...
- MySQL共享表空间扩容
一.什么是共享表空间和独占表空间 共享表空间以及独占表空间都是针对数据的存储方式而言的. 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目 ...
- mysql共享表空间和独立表空间
innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等. 对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 什么是共享表空间和独占表空间 共享 ...
随机推荐
- scrapy 采集数据存入excel
# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to t ...
- C++ Primer第5版 第二章课后练习
练习2.1 C++ 语言规定short 和 int 至少 16 位, long 至少32位, long long 至少64位.带符号类型可以表示整数.负数或0, 无符号类型则仅能表示大于等于0的值Th ...
- C#中的SqlBulkCopy批量插入数据
在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// < ...
- 第七章 TCP和UDP原理
一.引入 1.TCP/IP协议族的传输层协议主要包括TCP和UDP 2.TCP是面向连接的可靠的传输层协议.它支持在并不可靠的网络上实现面向连接的可靠的数据传输 3.UDP是无连接的传输协议,主要用于 ...
- Python常用模块之random和time
常用模块: time: 分为三种格式: 1.时间戳:从1970年1月1日0点0分0秒到现在经过的秒数 用于时间间隔的计算 import time print(time.time()) 2.字符串显示时 ...
- c++ qsort的使用
c++ qsort的使用 qsort函数定义在头文件algorithm中,使用时需要include该头文件 void qsort (void* base, size_t num, size_t siz ...
- pxe装机部署
批量全自动安装操作系统 dhcp:自动分配IP tftp:微系统安装系统 httpd:网络源 检查环境(永久性关闭selinux) setenforce 0 sed -i s/=enforcing/= ...
- MySQL全面瓦解4:数据定义-DDL
前言 SQL的语言分类主要包含如下几种: DDL 数据定义语言 create.drop.alter 数据定义语言 create.drop.alter 语句 . DML 数据操纵语言 insert.de ...
- CodeForces 题目乱做
是个补题记录. 1419 除了 F 场上都过了. CF1419A Digit Game 这题好多人 FST 啊-- 考虑如果串长为奇数那么最后操作的肯定是第一个人,串长为偶数的最后操作的肯定是第二个, ...
- 循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)
在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用.更少代码的组件:另外有些则是直接采用第三方 ...