Назад | Перейти на главную страницу

Экспортированный дамп MariaDB разного размера

Я пытаюсь скопировать базу данных с сервера MariaDB на другой. Я сделал дамп базы данных на сервере A:

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

Я создал новую базу данных на сервере B с помощью:

create database database1;

Затем я скопировал файл дампа .sql с сервера A на сервер B с помощью scp и импортировал его на сервер 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.

Это нормально. Вот что произошло:

  • mysqldump генерирует INSERT операторы из данных с древовидной структурой BT.
  • Перезагрузка выполняет эти операторы, заполняя данными BTree.
  • BTrees разработаны для гибкости - вы можете добавить запись в середину таблицы;
  • BTree состоит из «блоков» (по 16 КБ каждый в случае InnoDB).
  • Если вставка переходит в «полный» блок, тогда этот блок «разбивается» - 16 КБ внезапно становятся 32 КБ. Многое из этого может привести к росту таблицы.
  • С другой стороны, свалка была наверное сделано в «порядке». В этом случае перезагрузка мощь упаковать блоки лучше, чем при случайных вставках / удалениях.
  • Эта перезагрузка скорее всего быть меньше, но не обязательно.

Между тем ...

SHOW TABLE STATUS дает только оценить количества строк. Если вам нужно точное количество строк, используйте SELECT COUNT(*) FROM tablename. (по одной таблице за раз) Поскольку STATUS это «оценка», она может быть больше или меньше реального количества; иногда на значительную сумму. Опять же это «нормально».