我有一个相当繁重的数据库 我必须更改服务器,因此我使用转储导出数据库,然后在新服务器上检索它
但是在导入之后,数据库的大小是不同的:
差异很大,我不得不担心? (你认为有缺失的东西吗?) 导出然后手动导入是不是更好?
答案 0 :(得分:3)
您没有提及文件系统(du -ch
等)或查询中的这些大小数字。我猜它们来自文件系统。只要您没有导入导入错误,您的数据就可以了。
在您的SOURCE表格中检查 FRAGMENTATION 。这可能是您的来源大于目标的原因。基本上,当行更新时,它可能不再适合相同的数据块,并且该数据块被分成两个,在两个块中留下一些空闲空间(磁盘上使用16KB,但数据文件中使用9KB)。
检查fragmented tables
:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length ,
round(INDEX_LENGTH/1024/1024) as index_length,
round(DATA_FREE/ 1024/1024) as data_free
from information_schema.tables
where DATA_FREE > 0;
检查使用的总磁盘数和总可用空间:
select sum((DATA_LENGTH + INDEX_LENGTH)/1024/1024) as TTL_MB_USED ,
sum(DATA_FREE)/1024/1024 as TTL_MB_FREE
from information_schema.tables
where table_schema='<your schema>';
这可能有助于解释源和目标之间的大小差异。
我发现这个答案非常适合描述碎片:https://serverfault.com/a/265885
首先你必须明白,当一行更新时,Mysql表会碎片化,所以这是正常情况。创建表时,假设使用带数据的转储导入,所有行都存储在许多固定大小的页面中没有碎片。更新可变长度行时,包含此行的页面将分为两个或更多页面以存储更改,这些新的两个(或更多)页面包含填充未使用空间的空格。