表空间及回收

一、

Innodb存储引擎表中所有数据都是存储在表空间中的,表空间又分为系统表空间,以ibdata1来命名,在数据安装初始化时系统会创建一个ibdata1的表空间文件,它会存储所有数据的信息以及回滚段(undo)的信息。在MySQL5.6以后,undo表空间可以通过参数单独设置存储位置了,可从ibdata1中独立出来。Innodb_data_file_path负责定义系统表空间的路径、初始化大小、自动化扩展策略。数据库默认的自动扩展大小是64MB。

mysql> show variables like "%auto%";                                      
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
| innodb_autoextend_increment | 64 | 数据库默认的自动扩展大小是64MB
| innodb_autoinc_lock_mode | 2 |
| innodb_stats_auto_recalc | ON |
| sql_auto_is_null | OFF |
+-----------------------------+-------+
8 rows in set (0.01 sec)

mysql> show variables like "%innodb_data%";
+-----------------------+-------------------------+
| Variable_name | Value |
+-----------------------+-------------------------+
| innodb_data_file_path | ibdata1:100M:autoextend | 建议把初始值调为1GB
| innodb_data_home_dir | |
+-----------------------+-------------------------+
2 rows in set (0.00 sec)

除了系统表空间,还有独立表空间,设置参数innodb_file_per_table=1.独立表空间文件存储对应表的B+树数据、索引和插入缓冲等信息,其余信息还存储在默认表空间中。

mysql> show variables like "%innodb_file_per%";
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)

二、共享表空间和独立表空间有什么区别?

独立表空间的每个表有自己的表空间,且可以实现表空间的转移,回收表空间也方便。

使用alter table table_name engine=innodb或pt-online_schema_change命令即可,但有一个不好的地方在每个表下都有.frm和.ibd两个文件描述符,如果单表增长过快也容易出现性能问题。

共享表空间的数据和文件放在一起方便管理。共享表空间无法在线回收空间,如果想回收,必须将全部Innodb表中的数据备份,删除原表,然后再把数据导回到与原表结构一样的新表中。特别是统计分析、日志系统不太适合用共享表空间。

5.7之后增加了临时表空间和通用表空间。

5.7把临时表的数据从系统表空间中抽离出来,形成了自己的独立表空间参数innodb_temp_data_file_path,且把临时表的相关检索信息保存在系统信息表的information_schema库下的innodb_temp_table_info表中

通用表空间,就是把多个表放在同一个空间中,可以根据活跃度来划分表,存放在不同的磁盘上,可以减少metadata的存储开销。目前生产中很少使用。

mysql> show variables like "%temp%";
+----------------------------+-----------------------+
| Variable_name | Value |
+----------------------------+-----------------------+
| avoid_temporal_upgrade | OFF |
| innodb_temp_data_file_path | ibtmp1:12M:autoextend | 
| show_old_temporals | OFF |
+----------------------------+-----------------------+
3 rows in set (0.02 sec)

[[email protected] data]# ll
total 726532
drwxr-x--- 2 mysql mysql 46 Jul 20 06:51 andyhsi
drwxr-x--- 2 mysql mysql 78 Jul 19 18:24 andyxi
-rw-r----- 1 mysql mysql 56 Jul 17 08:19 auto.cnf
drwxr-x--- 2 mysql mysql 332 Jul 17 13:12 employees
-rw-r----- 1 mysql mysql 1236 Jul 20 05:36 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 Jul 20 06:51 ibdata1
-rw-r----- 1 mysql mysql 104857600 Jul 20 06:51 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 Jul 17 13:14 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 Jul 20 05:28 ib_logfile2
-rw-r----- 1 mysql mysql 12582912 Jul 20 05:36 ibtmp1   //临时表空间

四、表空间回收

参考: https://blog.csdn.net/php521php/article/details/45112465

解决办法:
方法1:

执行  OPTIMIZE TABLE 表名;

mysql>use mysql;

mysql>optimize table test.t1;

注意:
1.OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用;
2.OPTIMIZE TABLE会产生锁,推荐在业务低峰时执行;
3.对于DDL频繁的表,定期执行OPTIMIZE TABLE
方法2:
写一SQL,创建新表,删除旧表,新表重命名;
mysql>old_tables create new_table;
mysql>truncate table old_tables;

mysql>rename new_tables to old_tables.

方法3:执行ALTER TABLE t1 ENGINE = InnoDB;

原理就是:重建表!!!

参考链接:http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

关键描述:

情况2:删除对应的表和数据,但是ibdata空间并未释放
形成原因:
临时解决办法:
1.使用mysqldump备份数据库,关闭mysql,
2.手动删除ibdata,ib_logfile文件
3.恢复数据库

永久解决办法:

参考链接:http://blog.csdn.net/jacson_bai/article/details/45919403

1.使用独立表空间
2.限制ibdata单个文件的大小

原文地址:https://www.cnblogs.com/chinaops/p/9344781.html

时间: 2024-08-11 17:02:53

表空间及回收的相关文章

Ora-01536:超出了表空间users的空间限量(转)

Ora-01536:超出了表空间users的空间限量(转) 正在开会,同事跑过来说数据库有问题,通讯程序不能入库,赶快获取一条insert into a values()语句后在toad工具中手动插入,发现报错:Ora-01536:超出了表空间users的空间限量. 该表a的是用户A下的一个大表,表空是users,而非A用户的默认表空间.users表空间有大约70%的空闲空间,为什么a表就不能使用了呢?从网上搜索后终于明白: ora-1536 是指的你建表的那个user 所能使用的空间没有了,不

[原创] ORA-01536 超出表空间 'xxxx' 的空间限额

1.故障情况 星期一上班一早,客户打电话来,说数据库空间满了.检查表空间情况,还有剩余,检查alert_XXX.log也未有报错. 软件方手工测试,执行插入数据时报错,如下: ORA-01536: 超出表空间 'xxxx' 的空间限额 2.故障解决 使用业务用户'AA'登陆数据库,查询业务用户'AA'对表空间'XXXX'的限额 select * from user_ts_quotes; max_bytes字段为“0”,说明限额用完了,需要调整 增大用户对表空间的读写限额,由原来的2.5G加大到5

optimize 回收表空间的一些说明

optimize命令回收表空间的说明 线上服务器,有张大表需要用pt-archiver根据时间划分归档大量数据到另一个新表中.原先200G的表,在归档完成后,du -hs 显示依然是200G的大小,删除了大量的行记录但是实际上空间是不会释放的. 这种情况下,我们就要使用optimize命令重建表以达到释放表空间的目的. (好像是从5.6.6之后,optimize不锁表了,但是optimize操作会进行rebuild表操作,要确保磁盘剩余空间足够存放新表的大小,不然操作会失败) 另外,如果在主库执

oracle 回收表空间的数据文件大小

查看表空间的使用情况: select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/1024 "used MB",b.bytes/1024/1024 "free MB", round(((a.bytes-b.bytes)/a.bytes)*100,2) "percent_used" from (select tablespace_name

回收数据库表空间的一个思路

有些项目比较小,硬盘空间也只有40多G,加上无人维护,久而久之就出现了硬盘空间告警的问题.经过查看之后,发现有些数据文件一开始就设置成2G,但实际可能就只使用了100M左右.为了解决硬盘空间告警的问题,就想到了重置数据文件大小的方法. 第一步是查看各个表空间的适用率,找出可以缩小的数据文件. --查看表空间使用率,找到闲置的表空间 SELECT Upper(F.TABLESPACE_NAME)         "表空间名", D.TOT_GROOTTE_MB              

表空间回收操作判断

今天刚上班,一个朋友问我“我们这边有个表空间扩大到,1.4T,但是删除数据没有用,这个都不变小?”. 我给他这样解释了下 "这个数据文件:你删除数据是不会影响到它的大小:可以这样理解:这个数据文件相当于一个水桶:这个水桶的大小是1.4T:删除数据这个操作相当于把里面水抽出来. 水桶的大小是不变的:水是变少了.水桶可用的空间变大了:可以装更多的水." 想一个表空间扩张到1T多.有下面两种可能 1. 真的有怎么多的数据量的业务. 2. 这表空间一定是设置为自动扩张的:导致数据文件暴涨:其中

mysql共享表空间和独立表空间

innodb表的数据结构 innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等. 对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 什么是共享表空间和独占表空间 共享表空间以及独占表空间都是针对数据的存储方式而言的. 共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1  初始化为10M. 独占表空间:  每一个表都将会生成以独立的文件方式

Oracle移除表空间的数据文件 ora-00604 ora-01426

 项目背景:在之前开发环境数据库管理比較乱,在表空间不足时仅仅是加入数据文件,測试完后数据己删除,但数据库表空间所占的空间不能回收,导致数据库的存储文件夹使用率达到97%以上实际使用仅仅有10%,迫切须要将不用空间进行回收. 技术背景:Oracle不提供如删除表.视图一样删除数据文件的方法.数据文件是表空间的一部分,所以不能"移走"表空间.Oracle 10G R2開始,能够採用:Alter tablespace tablespace_name drop datafile file

Oracle 10g创建表空间的完整步骤详解

本文我们主要介绍了Oracle 10g创建表空间的完整步骤,包括表空间的创建与删除.为应用创建用户以及权限的授予等操作,希望能够对您有所帮助. AD:WOT2014:用户标签系统与用户数据化运营培训专场 Oracle 10g数据库中,当在数据库中创建用户时,基于应用性能和管理方面的考虑,最好为不同的用户创建独立的表空间. 那么创建表空间的步骤是怎样实现的呢?本文我们主要就介绍了这一部分内容,接下来就让我们一起来了解一下这部分内容吧. 1.创建表空间 不论是Lnux环境,还是Wndows环境,都要