表空间及回收
Posted chinaops
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表空间及回收相关的知识,希望对你有一定的参考价值。
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单个文件的大小
以上是关于表空间及回收的主要内容,如果未能解决你的问题,请参考以下文章