Spec-Zone.ru › MariaDB

Копирование таблиц между различными базами данных MariaDB и серверами MariaDB

С MariaDB очень легко копировать таблицы между различными базами данных MariaDB и различными серверами MariaDB. Это работает для таблиц, созданных с помощью движков Archive, Aria, CSV, InnoDB, MyISAM, MERGE и XtraDB.

Обычные процедуры копирования таблицы:

FLUSH TABLES db_name.table_name FOR EXPORT

# Copy the relevant files associated with the table

UNLOCK TABLES;

Файлы таблиц можно найти в datadir/databasename (вы можете выполнить SELECT @@datadir для поиска правильного каталога). При копировании файлов следует скопировать все файлы с тем же именем таблицы + различные расширения. Например, для таблицы Aria с именем foo у вас будут файлы foo.frm, foo.MAI, foo.MAD и, возможно, foo.TRG, если у вас есть триггеры.

Если нужно распределить таблицу пользователю, который не нуждается в праве записи в таблицу, и нужно минимизировать размер хранения таблицы, рекомендуемым движком является Aria или MyISAM, так как можно упаковать таблицу с помощью aria_pack или myisampack соответственно, чтобы сделать её заметно меньше. MyISAM — это наиболее переносимый формат, так как он не зависит от того, отличаются ли настройки сервера. Aria и InnoDB требуют одинаковый размер блока на обоих серверах.

Копирование таблиц при выключенном сервере MariaDB

Следующие движки хранения поддерживают экспорт без FLUSH TABLES ... FOR EXPORT, предполагая, что исходный сервер выключен, а принимающий сервер не обращается к файлам во время копирования.

Движок Комментарий
Archive
Aria Требуется чистая остановка. Таблица будет автоматически исправлена на принимающем сервере, если aria_chk --zerofill не выполнялась. Если aria_chk --zerofill выполнено, таблица сразу же доступна без задержек
CSV
MyISAM
MERGE Файлы .MRG можно копировать даже при работе сервера, так как файл содержит только список таблиц, которые являются частью объединения.

Копирование таблиц с работающего сервера MariaDB

Для всех вышеперечисленных движков хранения (Archive, Aria, CSV, MyISAM и MERGE) можно копировать таблицы даже с работающего сервера в следующих обстоятельствах:

  • Вы выполнили FLUSH TABLES или FLUSH TABLE table_name для конкретной таблицы.
  • Сервер не обращается к таблицам во время процесса копирования.

Преимущество FLUSH TABLES table_name FOR EXPORT заключается в том, что таблица блокируется на чтение до тех пор, пока не будет выполнено UNLOCK TABLES.

Предупреждение: Если вы делаете вышеуказанное копирование в режиме реального времени, вы делаете это на свой страх и риск, так как если вы что-то сделаете неправильно, скопированная таблица, скорее всего, будет повреждена. Исходная таблица, конечно, будет в порядке.

Эффективный способ предоставить кому-то другому доступ к таблице только для чтения

Если вы хотите предоставить пользователю доступ к данным в таблице для использования на их сервере MariaDB, вы можете сделать следующее:

Сначала создадим таблицу, которую мы хотим экспортировать. Для ускорения мы создаем её без индексов. Мы используем TRANSACTIONAL=0 ROW_FORMAT=DYNAMIC для Aria, чтобы использовать наименьший возможный формат строк.

CREATE TABLE new_table ... ENGINE=ARIA TRANSACTIONAL=0;
ALTER TABLE new_table DISABLE_KEYS;
# Fill the table with data:
INSERT INTO new_table SELECT * ...
FLUSH TABLE new_table WITH READ LOCK;

# Copy table data to some external location, like /tmp with something
# like cp /my/data/test/new_table.* /tmp/

UNLOCK TABLES;

Затем мы упаковываем её и генерируем индексы. Мы используем большой буфер сортировки для ускорения генерации индекса.

> ls -l /tmp/new_table.*
-rw-rw---- 1 mysql my 42396148 Sep 21 17:58 /tmp/new_table.MAD
-rw-rw---- 1 mysql my     8192 Sep 21 17:58 /tmp/new_table.MAI
-rw-rw---- 1 mysql my     1039 Sep 21 17:58 /tmp/new_table.frm
> aria_pack /tmp/new_table
Compressing /tmp/new_table.MAD: (922666 records)
- Calculating statistics
- Compressing file
46.07%
> aria_chk -rq --ignore-control-file --sort_buffer_size=1G /tmp/new_table
Recreating table '/tmp/new_table'
- check record delete-chain
- recovering (with sort) Aria-table '/tmp/new_table'
Data records: 922666
- Fixing index 1
State updated
> ls -l /tmp/new_table.*
-rw-rw---- 1 mysql my 26271608 Sep 21 17:58 /tmp/new_table.MAD
-rw-rw---- 1 mysql my 10207232 Sep 21 17:58 /tmp/new_table.MAI
-rw-rw---- 1 mysql my     1039 Sep 21 17:58 /tmp/new_table.frm

Процедура для таблиц MyISAM идентична, за исключением того, что у myisamchk нет опции --ignore-control-file.

Копирование переносимых табличных пространств InnoDB

Табличные пространства InnoDB с файлами на таблицу переносимы, что означает, что вы можете скопировать табличное пространство с файлами на таблицу с одного сервера MariaDB на другой сервер. Подробнее см. Копирование переносимых табличных пространств.

Импорт таблиц

Таблицы, использующие большинство движков хранения, сразу же доступны после копирования их файлов на новый datadir.

Однако это не относится к таблицам, использующим InnoDB. Таблицы InnoDB необходимо импортировать с помощью ALTER TABLE ... IMPORT TABLESPACE. Подробнее см. Копирование переносимых табличных пространств.

См. также

  • FLUSH TABLES FOR EXPORT
  • FLUSH TABLES
  • myisampack — Сжатие файла данных MyISAM для более простого распределения.
  • aria_pack — Сжатие файла данных Aria для более простого распределения
  • mariadb-dump — Копирование таблиц на другие SQL-серверы. Вы можете использовать --tab для создания CSV-файла содержимого вашей таблицы.
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не просматривается заранее MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/copying-tables-between-different-mariadb-databases-and-mariadb-servers/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API