首页 > 其他分享 >存储引擎-2

存储引擎-2

时间:2025-01-13 13:03:46浏览次数:3  
标签:存储 ibd t1 引擎 mysql table schema

存储引擎的查看

  • 查看MySQL默认存储引擎

select @@default_storage_engine;

  • 查看表存储引擎

select table_schema,table_name ,engine from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema');

存储引擎的修改

  • 修改存储引擎

create table t222 (id int,name varchar(20)) engine=myisam;

show table status like 't222'\G

alter table t222 engine=innodb;

show table status like 't222'\G

  • 整理碎片

平常处理过的MySQL问题--碎片处理

环境:centos7.4、MySQL 5.7.20、InnoDB存储引擎

业务特点:数据量级较大,经常需要按月删除历史数据

问题:磁盘空间占用很大,不释放

处理方法:

以前:

将数据逻辑导出,手工truncate表,然后导入进去(delete:删除行或所有行,但不释放空间;truncate:删除表所有行,释放空间) 

现在:

对表进行按月进行分表(partition,中间件)

业务替换为truncate方式(释放空间)

定期进行碎片整理

  • 批量替换zabbix 100多张表, innodb为tokudb

alter table zabbix.a  engine=tokudb;

select concat("alter table ",table_schema,".",table_name,"  engine=tokudb;") from information_schema.tables

where table_schema='zabbix';

InnoDB存储引擎物理存储结构

  • 5.6版本:

由于MySQL 5.5版本共享表空间的缺陷,5.6版本后增加了独立表空间的概念,即将“数据字典(元数据)”、“表的列信息”、“表的数据、索引”分开存储,Redo log的主要作用是用于数据库的崩溃恢复,undo日志即撤销还原,用于记录更改前的一份copy,在操作出错时,可以用于回滚、撤销还原,只将数据库逻辑地恢复到原来的样子

  • 5.7版本

5.7版本下,临时表也被独立出来了(临时表空间,对应Linux中的文件为:ibtmp1)。可以从上图中看出,Genreal tablespaces中存储着一些临时表,而在5.6 版本中,临时表是存储在ibdata1中的Tables中

  • 8.0版本

8.0版本中,Doublewrite、undo信息也被独立出来了

  • MySQL5.7文件介绍

查看MySQL数据目录

select @@datadir;

auto.cnf:mysql实例的UUID号,主从群集中不允许重复

ibdata1:系统数据字典信息(统计信息、元数据信息、information_schema)、UNDO(回滚)表空间等数据

ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件

ibtmp1:临时表空间磁盘位置,存储临时表

frm:存储表的列信息

ibd:表的数据行和索引

表空间(Tablespace)

  • 共享表空间

5.5版本出现的管理模式,也是默认的管理模式。需要将所有数据存储到同一个表空间中 ,管理比较混乱

5.6版本以后数据表(表空间)独立,共享表空间保留,只用来存储数据字典信息、undo、临时表

5.7 版本临时表被独立出来了

8.0版本undo也被独立出去了

  • 共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)

select @@innodb_data_file_path;

show variables like '%extend%';

mysqld --initialize-insecure --user=mysql --basedir=xxxxxx......

innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend

注释:autoextend 每次最大自增空间64MB

  • 独立表空间

从5.6版本默认表空间不再使用共享表空间,替换为独立表空间。主要存储的是用户数据

存储特点为:一个表一个ibd文件,存储数据行和索引信息

  • 最终结论

一张InnoDB表= frm+ibd+ibdata1

MySQL的存储引擎日志:

Redo Log(重做日志):ib_logfile0  ib_logfile1

Undo Log(回滚日志):ibdata1 ibdata2(存储在共享表空间中)

ibtmp1(临时表):在做join union操作产生临时数据,用完就自动清理

  • 独立表空间设置

select @@innodb_file_per_table;

  • 真实故障案例

案例背景:

硬件及软件环境:

联想服务器(IBM)

磁盘500G 没有raid(raid50)

centos 6.8

mysql 5.6.33  innodb引擎  独立表空间

备份没有,日志也没开

开发用户专用库:

track(bug追踪) 、 inner(内部数据库)    ------>LNMT  (linux+nginx+mysql+tomcat)app测试平台

故障描述:

断电了,启动系统失败,"/"只读

fsck  重启,系统成功启动,mysql启动不了。

(注:centos6修复文件系统用fsck ,centos7修复文件系统用xfs_repair)

结果:inner库在,track库不见了

求助内容:

这种情况怎么恢复?

连二进制日志都没有,没有备份,没有主从

没办法,track库需要硬盘恢复

求助:

1、track问题找,数据修复公司

2、能不能暂时把inner库先打开用着

将生产库inner,拷贝到1:1虚拟机上/var/lib/mysql,直接访问时访问不了的

有没有工具能直接读取ibd?

最后发现没有

办法:

表空间迁移:

在新的mysql服务器上

create table t1;

alter table  inner.t1 discard tablespace;

alter table t1 row_format=compact;   //5.6升级5.7的时候需要执行

复制源ibd文件,改权限: chown mysql.mysql t1.ibd

alter table inner.t1 import tablespace;

虚拟机测试可行。

处理问题思路:

inner库中一共有107张表。

1、创建107张和原来一模一样的表。

开发电脑上 mysqldump备份inner库

mysqldump -uroot -ppassw0rd -B  inner --no-data >test.sql

拿到测试库,进行恢复

到这步为止,表结构有了

2、表空间删除

select concat('alter table ',table_schema,'.',table_name,' discard tablespace;') from information_schema.tables where table_schema='test' into outfile '/tmp/discad.sql';

source /tmp/discard.sql

执行过程中发现,有20-30个表无法成功。主外键关系

很绝望,一个表一个表分析表结构,很痛苦

set foreign_key_checks=0 跳过外键检查。

把有问题的表表空间也删掉了

3、拷贝生产中inner库下的所有表的ibd文件拷贝到准备好的环境中

select concat('alter table ',table_schema,'.',table_name,' import tablespace;') from information_schema.tables where table_schema='test' into outfile '/tmp/import.sql';

4、验证数据

表都可以访问了,数据挽回到了出现问题时刻的状态

  • 独立表空间迁移

实验环境:

实验步骤:

1、创建数据库和表并插入内容(源MySQL)

create database lkk default charset utf8mb4 collate utf8mb4_bin;

use lkk;

create table t1 (id int,name varchar(20));

insert into t1(id,name) values(1,'张三');

select * from t1;

2、查看库和表的创建语句并在目标数据库上执行

源数据库:

show create database lkk;

目标数据库:

CREATE DATABASE `lkk` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;

源数据库:

show create table t1;

目标数据库:

use lkk;

CREATE TABLE `t1` (

`id` int(11) DEFAULT NULL,

`name` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3、将目标数据库lkk库t1表分离表空间文件(目标数据库)

alter table lkk.t1 discard tablespace;

select * from t1;

表分离后无法查看内容,因为没有表空间文件

4、将源数据库lkk库t1表的t1.ibd文件拷贝到目标数据库(源数据库)

cd /usr/local/mysql/data/lkk/

scp -rp t1.ibd root@192.168.8.6:/root/

5、修改t1.ibd文件属主和属组并将t1.ibd文件移动到/usr/local/mysql/data/lkk/(目标数据库)

chown mysql.mysql t1.ibd

mv t1.ibd /usr/local/mysql/data/lkk/t1.ibd

6、将分离的表空间文件重新导入表中(目标数据库)

alter table lkk.t1 import tablespace;

use lkk;

select * from t1;

标签:存储,ibd,t1,引擎,mysql,table,schema
From: https://blog.csdn.net/2402_88627342/article/details/144987488

相关文章

  • 定时抓取数据:Python爬虫与定时任务实现每日数据采集与存储
    引言在现代数据驱动的世界中,实时获取和存储数据是许多应用的核心需求。无论是金融行业的实时汇率监控,还是电商行业的价格变化追踪,定时抓取数据都是一种高效的数据采集方式。本文将详细介绍如何使用Python结合爬虫技术和定时任务,实现每天定时抓取数据并将其存入数据库。一......
  • 数据在内存的存储
    数据类型介绍前面我们已经学习了基本的内置类型:(后边跟的是字节)char    //字符数据类型  1字节 打印%c      short   //短整型    2字节  打印%hdint    //整形    4字节  打印%dlong ......
  • AccessData FTK Imager 是一款由 AccessData 公司开发的数字取证工具,用于创建计算机系
    AccessDataFTKImager是一款由AccessData公司开发的数字取证工具,用于创建计算机系统和存储设备的完整数据镜像,并且支持从中提取和分析数据。它是一款非常流行的取证软件,尤其在计算机取证、数据恢复和法律领域应用广泛。FTKImager的主要功能:创建数据镜像:FTKImager可以......
  • PCIe总线-存储器域和PCIe总线域访问流程分析(二)
    1.概述PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转换才可以完成。2.跨域......
  • 跟我一起学 Python 数据处理(三十五):数据获取与存储的关键要点
    跟我一起学Python数据处理(三十五):数据获取与存储的关键要点在数据处理的领域中,我们不断探索前行,今天的目标是深入了解数据获取与存储方面的知识,希望能与大家共同提升这方面的技能,一起在数据处理的道路上迈出坚实的步伐。一、文章写作初衷在数据的世界里,获取高质量、可靠......
  • FOFA搜索引擎语法---信息收集篇
    FOFA搜索引擎语法前言好多小伙伴对FOFA的语法有些不熟练今天带大家一起来看一下,学好FOFA让其成为信息收集的一大助力。介绍FOFA作为一个搜索引擎,其查询语法和google类似。如:目前支持的检索字段包括:domain,host,ip,title,server,header,body,port,cert,country,city,os,appserver,mi......
  • JVM内存模型:Java的秘密引擎
    Java虚拟机(JVM)内存模型是Java程序性能优化和代码调优的核心。理解JVM内存模型对于编写高效、稳定的Java程序至关重要。1.1JVM内存模型概述JVM内存模型定义了Java程序中变量的存储位置以及变量在不同线程间可见性、访问权限等规则。它包括以下几个主要部分:方法区(MethodAr......
  • Redis 是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。
    Redis服务器是什么?Redis是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图等。它被广泛用于需要快速读写操作、低延迟的场景。Redis可以作为一个独立的数据库使用,也可以作为缓......
  • C语言常用数据类型和自定义数据类型的存储空间
    C语言常用数据类型和自定义数据类型的存储空间想知道各种数据类型的存储空间长度,编码测试,代码如下:注意:用到offsetof宏,在stddef.h头文件中定义,一定要包含进去!!!/*filename:sizeof.c*/#include<stdio.h>#include<stddef.h>//foroffsetofmacro/*compile:gccsizeof......
  • 国微pcie switch 8748高速存储方案设计
    今天聊聊纯国产高速存储方案怎么设计,主要是针对pcie switch架构做深入分析,switch架构方案的优点是特别灵活,对速率和盘的容量可以任意扩展,并且支持标准ext4文件系统,可以将磁盘取下插入到windows系统上被识别到标准盘符,同样也可以插入到linux系统被识别成标准盘符。下面开始分......