MySQL_13.InonDB表空间

发布时间:2023年12月17日

InnoDB 表空间介绍以及管理
1.mysql表空间类型
?? ??? ?

system tablespace ? ??? ??? ??? ?系统表空间?? ??? ?
file-per-table tablespace?? ??? ?独立表空间
temporary tablespace?? ??? ???  ?临时表空间
undo tablespace?? ??? ??? ??? ? ?UNDO表空间
general tablespace?? ??? ??? ?? ?通用表空间
transportable tablespace?? ???  ?传输表空间

2.扩展IBDATA系统表空间案例,加多一个1G的ibdata4的系统表空间文件

show global variables like '%innodb_data_file_path%';


修改my.cnf文件 innodb_data_file_path 参数
?? ??? ??? ??? ?

innodb_data_file_path=ibdata1:1024M;ibdata2:1024M;ibdata3:1024M:autoextend:max:20G

?修改成:? ? ? ? ? ? ??

innodb_data_file_path=?ibdata1:1024M;ibdata2:1024M;ibdata3:1024M;ibdata4:1024M:autoextend:max:20G


重启mysql、初始化:

systemctl restart mysql;


3.收缩ibdata系统表空间innodb system tablespace 案例

场景:原来是共享表空间,转换成独立表空间以后,数据和索引迁移出ibdata,原来的ibdata占用500G空间不会自动缩小。

(1)导出所有的数据(逻辑备份):

mysqldump --all-databases --flush-privileges \
--quick --routines --triggers -uroot -p > mysqldump_all_database.sql

(2)查询 mysql 系统数据下所有innodb表、导出内容、删掉表结构 :

SELECT?
CONCAT('ls -lah /mysql/data/3306/data/mysql/',table_name,'.frm') "查看.frm路径",
CONCAT('rm -rf /mysql/data/3306/data/mysql/',table_name,'.frm') "删除.FRM"
FROM information_schema.tables?
WHERE table_schema='mysql' AND ENGINE='innodb';

(3)停止mysql数据库 :

systemctl stop mysql;?

(4)冷备打包mysql datadir目录 :
?? ??? ??? ??? ??? ?

cd /mysql/data/3306/
tar zcvf data.tar.gz data?

(5)删除所有的表空间文件?
删除ibdata、ib_log*、undo*、mysql目录下面的*.ibd文件、以及mysql中innodb表的.frm文件。

find /mysql/data/3306/data/ ?-name "ibdata*" ?-exec rm -rf {} \;
find /mysql/data/3306/data/ ?-name "ib_logfile*" ?-exec rm -rf {} \;
find /mysql/data/3306/data/ ?-name "undo*" ?-exec rm -rf {} \;
find /mysql/data/3306/data/ ?-name "*.ibd" ?-exec rm -rf {} \;

(6)修改my.cnf参数文件
将innodb_data_file_path 参数改小,生产如果是500G大小,改成100M。

innodb_data_file_path=ibdata1:500G;ibdata2:500G;ibdata3:500G:autoextend:max:500G

修改成:

innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M;ibdata4:100M:autoextend:max:20G

(7)启动mysql、恢复数据库、查询数据

systemctl start mysql;?
mysql -uroot -p123456?
source /root/mysqldump/mysqldump_all_database.sql;
commit;
select count(*) from scott.emp;
select count(*) from yzjtestdb.yzjtest_m1;


4.临时表空间
临时表空间:主要用于临时排序/非压缩的临时表,默认12M的文件。
mysql 5.7 之前 : 临时表都放在 ibdata 里面
mysql 5.7之后 : 临时表放在临时表空间
相关参数

show variables like '%innodb_temp_data_file_path%';

# 临时表空间优化案例

问:临时表空间主要用于临时排序、分组作用,而临时表空间路径不允许修改,只能放在$datadir目录内,如果SQL语句有大量的排序分组操作,然而磁盘IO又跟不上,对数据库造成阻塞,我们改怎么优化数据库?

答:我们可以将临时表空间存放在/dev/shm目录(内存)下。

ln -sf /dev/shm /mysql/data/3306/data/temp
chown -R mysql:mysql /mysql
vi /mysql/data/3306/my.cnf
innodb_temp_data_file_path=ibtmp1:500M;ibtmp2:500M:autoextend:max:20G

修改成:

innodb_temp_data_file_path=temp/ibtmp1:500M;temp/ibtmp2:500M:autoextend:max:20G
systemctl restart mysql
ls -l /mysql/data/3306/data/temp/*
*/

5.UNDO回滚表空间
mysql5.7 以后,从系统表空间独立出来的 undo 回滚表空间
相关的参数

show variables like '%undo%';


6.mysql常用空间信息查询SQL
(1)查看数据库大小

select SUM( data_length + index_length ) / 1024 / 1024 "Database Size in MB" from information_schema.TABLES;

(2)查看各数据库大小

select table_schema "Database Name",?
SUM( data_length + index_length ) /1024 / 1024 "Database Size in MB"?
from information_schema.TABLES group by table_schema;

(3)查看索引大小

select CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB')?
as 'Total Index Size' from information_schema.TABLES?
where table_schema like 'scott';

(4)查看数据库中所有表和索引的空间信息

select CONCAT(table_schema,'.',table_name) as 'Table Name', CONCAT(ROUND(table_rows,2))?
as 'Number of Rows', CONCAT(ROUND(data_length/(1024*1024*1024),2),'G')?
as 'Data Size', CONCAT(ROUND(index_length/(1024*1024*1024),2),'G')?
as 'Index Size', CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),2),'G')
as 'Total'?
from information_schema.TABLES where table_schema like 'scott';

(5)查看表空间大小

select CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB')?
as data_size, CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB')?
as max_data_size, CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB')?
as data_free, CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB')?
as index_size from information_schema.tables where TABLE_SCHEMA = 'scott';
select CONCAT(ROUND(SUM(data_length/1024/1024),2),'MB')?
as data_length_MB, CONCAT(ROUND(SUM(index_length/1024/1024),2),'MB')?
as index_length_MB from information_schema.tables?
where table_schema='scott' and table_name = 'emp';

(6)找出占用空间前10的表大小

select CONCAT(table_schema, '.', table_name),?
CONCAT(table_rows) rows, CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') data,
CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') idx,
CONCAT(ROUND(( data_length + index_length ) /?( 1024 * 1024 * 1024 ), 2), 'G') total_size,ROUND(index_length / data_length, 2) idxfrac
from information_schema.TABLES order by data_length + index_length desc limit 10;

文章来源:https://blog.csdn.net/mmmmm168m/article/details/135043381
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。