首页 > 数据库 >MySQL导入导出数据表容量的一个问题场景

MySQL导入导出数据表容量的一个问题场景

时间:2023-11-10 14:03:42浏览次数:43  
标签:源库 -- 数据表 导入 MySQL test table


朋友提了一个MySQL数据导出导入的问题。

问题描述:从源库(兼容MySQL协议的TDSQL,select version()=5.7,test表字符集是utf8,test是个分区表)通过如下指令,导出一份数据,SQL格式的,文件6G,

mysqldump -hx.x.x.x -P3306 -uroot -proot 
--databases dbtest --tables test  
--complete-insert --single-transaction  --add-drop-table 
--skip-add-locks >test.sql

通过执行mysql将数据导入目标库(docker下的MySQL 8.0,test表字符集是Utf8mb),

mysql -hx.x.x.x -P3306 -uroot -proot test < test.sql

源库test通过dbeaver看到数据的长度是10G(图形界面),但是前两次导入,发现导入的目标库中test显示长度只有400MB,再导入几次,发现长度是7G,都和源库10G有些不太相同。

一开始怀疑源库中可能有很多碎片,因为是通过SQL导入到的目标库,所以顺序插入数据块中,数据都是相邻的、紧凑的,所以容量会小。但实际优化源库的表,发现表的大小,还是和之前相同,

(1)optimizer table test;(Innodb的表会提示Table does not support optimize, doing recreate + analyze instead)
(2)alter table test engine='innodb';(Innodb可直接使用)

通过show table status指令,源库就是10G,目标库就是7G,说明不是碎片导致的,

show table status like 'test';

至于客户端工具dbeaver显示的长度数据,估计封装的就是这种操作,因为通过计算(rows * avg_row_length),得到的就是上面提到的值。

但是,官方文档提到,针对分区表,"show table status"的很多字段值,都只是个预估的,不是一个准确值,更精确的方式,是通过查询information_schema的partitions表相关字段,

https://dev.mysql.com/doc/refman/8.0/en/show-table-status.html

[Rows] For InnoDB tables, the row count is only a rough estimate used in SQL optimization. (This is also true if the InnoDB table is partitioned.)


[Data_free] For partitioned tables, this value is only an estimate and may not be absolutely correct. A more accurate method of obtaining this information in such cases is to query the INFORMATION_SCHEMA PARTITIONS table, as shown in this example:
SELECT SUM(DATA_FREE)
    FROM  INFORMATION_SCHEMA.PARTITIONS
    WHERE TABLE_SCHEMA = 'mydb'
    AND   TABLE_NAME   = 'mytable';

通过partitions,可以看到目标库的每个分区数据长度,加起来就是10G,和源库的容量,其实是相同的,

MySQL导入导出数据表容量的一个问题场景_mysql

目标库的数据文件路径中,每个分区会单独存储到一个".ibd"文件中,例如"test#p#p0.ibd"这种格式的,可以看到每个文件的大小,和partitions中每个分区的data_length是对应的。

因此,从数据上来看,目标库的导入,是正确的,但是这种显示数据容量的检索方式可能会产生误解,或许TDSQL、MySQL不同的封装,也会存在一些不同的统计逻辑,因此,若需要可能还得进一步探索。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"

标签:源库,--,数据表,导入,MySQL,test,table
From: https://blog.51cto.com/u_13950417/8298090

相关文章

  • mysql 查询报错Expression #1 of SELECT list is not in GROUP BY clause and contain
    这个错误是由于MySQL的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在GROUPBY语句中的SELECT列表中,只能包含分组或聚合函数,不能包含其他列。而你的查询语句中出现了一个列senior_two.score.student_id,它既没有被分组也没有被聚合,因此MySQL报出了这个错误。5.7版本以下不......
  • docker mysql
    dockerrun-d--namemysql--restart=always--privileged=true\-v/opt/mysql/log:/var/log/mysql\-v/opt/mysql/data:/var/lib/mysql\-v/opt/mysql/conf.d:/etc/mysql/conf.d\-v/etc/localtime:/etc/localtime:ro\-eMYSQL_ROOT_PASSWORD=123456-p33......
  • MySQL 死锁后事务无法回滚是真的吗?
    MySQL作为目前互联网企业使用最多的,或者说在基于成本下,最流行的数据库之一,MySQL在国内使用者众多,那么在MySQL偶然安装后,在使用中出现死锁后,死锁中的事务到底能不能回滚 ?我们来进行相关的实验我们先验证一遍1 我们打开一个MySQL版本为8.027 官方版本2通过下面的操作我们可以......
  • MySQL 内部Server 层机制
    主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。1.连接器像navicat、JDBC、MySQL等客户端软件需要先和mysql建立通信之后......
  • MySQL8
    MySQL8.0:窗口函数一、MySQL8.0窗口函数概述1、什么是窗口函数窗口函数是类似于可以返回聚合函数值的函数,例如SUM(),COUNT(),MAX()。但是窗口函数又与普通的聚合函数不一样,它不会对结果进行分组,使输出中的行数和输入中的行数相同。窗口函数示例:selectsum()over(partitionby_......
  • windows系统上如何给mysql导入数据库和表
    1.连接数据库2.输入密码3.进入数据库4.创建数据库 createdatabase数据库名;5.进入数据库use  数据库名;6.查看当前所在数据库selectdatabase();7.把需要导入的数据库放到没有中文名的路径下面(蜜蜂这里放D盘了),之后使用SOURCE导入SOURCE数据库的位置/需要导入的数据库名称(中间......
  • mysql基本使用
    MySQL常用图形化工具:NavicatSqlyogMysqlworkbend(msi自动安装) //////////////////////////////////////////////////////////Mysql数据库基本操作1、ddl数据定义语言对数据库的常用操作 l 查看所有的数据库:showdatabases;l 创建数据库:createdatabase[i......
  • datax抽取mysql数据到hive报错:javax.net.ssl.SSLException: Connection reset
    datax抽取mysql数据报错:[INFO]2023-11-0912:35:14.090+0000-->2023-11-0920:35:13.492[0-0-0-reader]ERRORReaderRunner-ReaderrunnerReceivedExceptions:com.alibaba.datax.common.exception.DataXException:Code:[DBUtilErrorCode-07],Description:[......
  • 远程连接 Mysql 失败的解决方法
    今天在虚拟机Ubuntu上折腾了一晚上mysql,然后试着用java连接,搞了很久都没成功,但是同学配好的Debian上却连接成功了,也就是说我的配置有问题。折腾了很久,最后还是通过理解异常信息来大致猜测。远程连接是输入mysql所在主机的IP和端口来确定主机的逻辑地址,再通过用户和密码来确定登......
  • 线上SQL超时场景分析-MySQL超时之间隙锁
    前言之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。背景说明分布式事务消息表:业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案消息表名:mq_messages数据量:3000多万索引:create_time和statusstatus:有两个值,1和2,其中99%以上的状态都是2,表......