MySQL_13.InonDB表空间

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;

你可能感兴趣的:(mysql,数据库)