导出的 MariaDB 转储大小不同

导出的 MariaDB 转储大小不同

我正在尝试将 MariaDB 服务器上的数据库复制到另一台服务器上。我使用以下命令转储了服务器 A 上的数据库:

sudo mysqldump -u root -p --databases database1 > /var/tmp/database1.sql

我在服务器 B 上使用以下命令创建了新的数据库:

create database database1;

然后我使用 scp 将 .sql 转储文件从服务器 A 复制到服务器 B,并使用以下命令将其导入服务器 B:

sudo mysql -u root -p database1 < database1.sql

然而,这两个数据库的大小似乎不一样:

服务器A:

MariaDB [(none)]> SELECT table_schema "database1", ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"  FROM information_schema.tables  GROUP BY table_schema;
+--------------------+---------------+
| database1          | DB Size in MB |
+--------------------+---------------+
| information_schema |           0.2 |
| mysql              |           2.5 |
| performance_schema |           0.0 |
| database1          |         516.7 |
+--------------------+---------------+

服务器B:

MariaDB [(none)]> SELECT table_schema "database1",ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"  FROM information_schema.tables  GROUP BY table_schema;
+--------------------+---------------+
| database1          | DB Size in MB |
+--------------------+---------------+
| information_schema |           0.2 |
| mysql              |           0.7 |
| performance_schema |           0.0 |
| database1          |         456.8 |
+--------------------+---------------+

此外,如果我查看两个数据库上的同一张表,它们似乎没有相同的行数。我尝试多次复制数据库,但总是得到不同的结果。我是否遗漏了什么?我不是 MariaDB 专家。两台服务器都运行 Debian 9。

答案1

这是正常的。以下是发生的事情:

  • mysqldumpINSERT从 BTree 结构数据生成语句。
  • 重新加载执行这些语句,用数据填充 BTree。
  • BTree 的设计非常灵活——你可以在表的中间添加记录;
  • BTree 由“块”组成(对于 InnoDB,每个块 16KB)
  • 如果插入内容进入“已满”块,则该块将被“拆分”——16KB 突然变为 32KB。大量此类情况会导致表增大。
  • 另一方面,垃圾场大概按“顺序”完成。在这种情况下,重新加载可能比随机插入/删除更好地打包块。
  • 这次重新加载有可能更小,但不一定。

同时...

SHOW TABLE STATUS只给出估计行数。如果您想要确切的行数,请使用SELECT COUNT(*) FROM tablename。(一次一个表)由于是STATUS“估计值”,因此它可能比实际计数多或少;有时会多很多。同样,这是“正常的”。

相关内容