我正在尝试将 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
这是正常的。以下是发生的事情:
mysqldump
INSERT
从 BTree 结构数据生成语句。- 重新加载执行这些语句,用数据填充 BTree。
- BTree 的设计非常灵活——你可以在表的中间添加记录;
- BTree 由“块”组成(对于 InnoDB,每个块 16KB)
- 如果插入内容进入“已满”块,则该块将被“拆分”——16KB 突然变为 32KB。大量此类情况会导致表增大。
- 另一方面,垃圾场大概按“顺序”完成。在这种情况下,重新加载可能比随机插入/删除更好地打包块。
- 这次重新加载有可能更小,但不一定。
同时...
SHOW TABLE STATUS
只给出估计行数。如果您想要确切的行数,请使用SELECT COUNT(*) FROM tablename
。(一次一个表)由于是STATUS
“估计值”,因此它可能比实际计数多或少;有时会多很多。同样,这是“正常的”。