Spec-Zone.ru › MySQL 5.7

14.6.3.3 Общие табличные пространства

Общее табличное пространство — это общее InnoDB табличное пространство, которое создаётся с помощью синтаксиса CREATE TABLESPACE. Возможности и особенности общих табличных пространств описаны в следующих разделах этого раздела:

  • Возможности общих табличных пространств

  • Создание общего табличного пространства

  • Добавление таблиц в общее табличное пространство

  • Поддержка форматов строк в общем табличном пространстве

  • Перемещение таблиц между табличными пространствами с помощью ALTER TABLE

  • Удаление общего табличного пространства

  • Ограничения общих табличных пространств

Возможности общих табличных пространств

Общие табличные пространства обеспечивают следующие возможности:

  • Подобно системному табличному пространству, общие табличные пространства являются общими табличными пространствами, способными хранить данные для нескольких таблиц.

  • Общие табличные пространства потенциально более эффективны с точки зрения памяти, чем табличные пространства по файлам на таблицу. Сервер сохраняет метаданные табличного пространства в памяти в течение всего срока службы табличного пространства. Несколько таблиц в меньшем количестве общих табличных пространств потребляют меньше памяти для метаданных табличного пространства, чем то же количество таблиц в отдельных табличных пространствах по файлам на таблицу.

  • Файлы данных общего табличного пространства могут располагаться в каталоге относительно или независимо от каталога данных MySQL, что предоставляет вам множество возможностей управления файлами данных и хранением, аналогичных возможностям табличных пространств по файлам на таблицу. Как и в случае с табличными пространствами по файлам на таблицу, возможность размещения файлов данных вне каталога данных MySQL позволяет управлять производительностью критически важных таблиц отдельно, настроить RAID или DRBD для определённых таблиц или привязать таблицы к определённым дискам, например.

  • Общие табличные пространства поддерживают форматы файлов Antelope и Barracuda, а следовательно, поддерживают все форматы строк таблиц и связанные с ними функции. Благодаря поддержке обоих форматов файлов общие табличные пространства не зависят от настроек innodb_file_format или innodb_file_per_table, а эти переменные не оказывают на них никакого влияния.

  • Параметр TABLESPACE может использоваться с CREATE TABLE для создания таблиц в общем табличном пространстве, табличном пространстве по файлам на таблицу или в системном табличном пространстве.

  • Параметр TABLESPACE может использоваться с ALTER TABLE для перемещения таблиц между общими табличными пространствами, табличными пространствами по файлам на таблицу и системным табличным пространством.

Создание общего табличного пространства

Общие табличные пространства создаются с помощью синтаксиса CREATE TABLESPACE.

CREATE TABLESPACE tablespace_name
    ADD DATAFILE 'file_name'
    [FILE_BLOCK_SIZE = value]
        [ENGINE [=] engine_name]

Общее табличное пространство можно создать в каталоге данных или вне его. Чтобы избежать конфликтов с неявно созданными табличными пространствами по файлам на таблицу, создание общего табличного пространства в подкаталоге каталога данных не поддерживается. При создании общего табличного пространства вне каталога данных каталог должен существовать до создания табличного пространства.

При создании общего табличного пространства вне каталога данных MySQL в каталоге данных создаётся файл.

Примеры:

Создание общего табличного пространства в каталоге данных:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

Создание общего табличного пространства в каталоге вне каталога данных:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

Вы можете указать путь, относящийся к каталогу данных, при условии, что каталог табличного пространства не находится в каталоге данных. В этом примере каталог my_tablespace находится на том же уровне, что и каталог данных:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
Примечание

Обязательно необходимо определить предложение ENGINE = InnoDB в рамках CREATE TABLESPACE оператора или определить InnoDB как стандартный движок хранилища (default_storage_engine=InnoDB).

Добавление таблиц в общее табличное пространство

После создания общего табличного пространства операторы CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name или ALTER TABLE tbl_name TABLESPACE [=] tablespace_name могут использоваться для добавления таблиц в табличное пространство, как показано в следующих примерах:

CREATE TABLE:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;

ALTER TABLE:

mysql> ALTER TABLE t2 TABLESPACE ts1;
Примечание

Поддержка добавления разделов таблиц в общие табличные пространства устарела в MySQL 5.7.24; ожидается, что она будет удалена в будущих версиях MySQL. К общим табличным пространствам относятся InnoDB системное табличное пространство и общие табличные пространства.

Для получения подробной информации о синтаксисе см. CREATE TABLE и ALTER TABLE.

Поддержка формата строк таблиц общего пространства таблиц

Общие пространства таблиц поддерживают все форматы строк таблиц (REDUNDANT, COMPACT, DYNAMIC, COMPRESSED) с оговоркой, что сжатые и несжатые таблицы не могут сосуществовать в одном общем пространстве таблиц из-за разного размера физических страниц.

Для того, чтобы общее пространство таблиц содержало сжатые таблицы (ROW_FORMAT=COMPRESSED), необходимо указать опцию FILE_BLOCK_SIZE, а значение FILE_BLOCK_SIZE должно быть допустимым размером сжатой страницы по отношению к значению innodb_page_size. Кроме того, размер физической страницы сжатой таблицы (KEY_BLOCK_SIZE) должен быть равен FILE_BLOCK_SIZE/1024. Например, если innodb_page_size=16KB и FILE_BLOCK_SIZE=8K, размер KEY_BLOCK_SIZE таблицы должен быть 8.

В следующей таблице показаны допустимые сочетания innodb_page_size, FILE_BLOCK_SIZE и KEY_BLOCK_SIZE. Значения FILE_BLOCK_SIZE также могут быть указаны в байтах. Чтобы определить допустимое значение KEY_BLOCK_SIZE для заданного значения FILE_BLOCK_SIZE, разделите значение FILE_BLOCK_SIZE на 1024. Сжатие таблиц не поддерживается для размеров страниц InnoDB 32К и 64К. Для получения дополнительной информации о KEY_BLOCK_SIZE см. CREATE TABLE и Раздел 14.9.1.2, «Создание сжатых таблиц».

Таблица 14.3 Допустимые сочетания размеров страниц, FILE_BLOCK_SIZE и KEY_BLOCK_SIZE для сжатых таблиц

Таблица 14.3 Допустимые сочетания размеров страниц, FILE_BLOCK_SIZE и KEY_BLOCK_SIZE для сжатых таблиц
Размер страницы InnoDB (innodb_page_size) Допустимое значение FILE_BLOCK_SIZE Допустимое значение KEY_BLOCK_SIZE
64КБ 64К (65536) Сжатие не поддерживается
32КБ 32К (32768) Сжатие не поддерживается
16КБ 16К (16384) Нет. Если innodb_page_size равно FILE_BLOCK_SIZE, пространство таблиц не может содержать сжатую таблицу.
16КБ 8К (8192) 8
16КБ 4К (4096) 4
16КБ 2К (2048) 2
16КБ 1К (1024) 1
8КБ 8К (8192) Нет. Если innodb_page_size равно FILE_BLOCK_SIZE, пространство таблиц не может содержать сжатую таблицу.
8КБ 4К (4096) 4
8КБ 2К (2048) 2
8КБ 1К (1024) 1
4КБ 4К (4096) Нет. Если innodb_page_size равно FILE_BLOCK_SIZE, пространство таблиц не может содержать сжатую таблицу.
4К 2К (2048) 2
4КБ 1К (1024) 1

Этот пример демонстрирует создание общего пространства таблиц и добавление сжатой таблицы. Пример предполагает значение по умолчанию innodb_page_size 16КБ. Значение FILE_BLOCK_SIZE 8192 требует, чтобы сжатая таблица имела значение KEY_BLOCK_SIZE 8.

mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

Если при создании общего пространства таблиц не указано FILE_BLOCK_SIZE, FILE_BLOCK_SIZE по умолчанию равно innodb_page_size. Когда FILE_BLOCK_SIZE равно innodb_page_size, пространство таблиц может содержать только таблицы с несжатым форматом строк (COMPACT, REDUNDANT и DYNAMIC форматы строк).

Перемещение таблиц между пространствами таблиц с помощью ALTER TABLE

ALTER TABLE с опцией TABLESPACE можно использовать для перемещения таблицы в существующее общее пространство таблиц, в новое пространство таблиц с файлом на таблицу или в системное пространство таблиц.

Примечание

Поддержка размещения разделов таблицы в общих пространствах таблиц была устаревшей в MySQL 5.7.24; ожидается, что она будет удалена в будущих версиях MySQL. Общие пространства таблиц включают InnoDB системное пространство таблиц и общие пространства таблиц.

Для перемещения таблицы из пространства таблиц с файлом на таблицу или из системного пространства таблиц в общее пространство таблиц укажите имя общего пространства таблиц. Общее пространство таблиц должно существовать. Дополнительную информацию см. в ALTER TABLESPACE.

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;

Для перемещения таблицы из общего пространства таблиц или пространства таблиц с файлом на таблицу в системное пространство таблиц укажите innodb_system в качестве имени пространства таблиц.

ALTER TABLE tbl_name TABLESPACE [=] innodb_system;

Для перемещения таблицы из системного пространства таблиц или общего пространства таблиц в пространство таблиц с файлом на таблицу укажите innodb_file_per_table в качестве имени пространства таблиц.

ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;

Операции ALTER TABLE ... TABLESPACE приводят к полному перестроению таблицы, даже если атрибут TABLESPACE не изменился со своего предыдущего значения.

Синтаксис ALTER TABLE ... TABLESPACE не поддерживает перемещение таблицы из временного пространства таблиц в постоянное пространство таблиц.

Оператор DATA DIRECTORY разрешен с CREATE TABLE ... TABLESPACE=innodb_file_per_table, но в противном случае не поддерживается в сочетании с опцией TABLESPACE.

При перемещении таблиц из зашифрованных пространств таблиц применяются ограничения. См. Ограничения шифрования.

Удаление общего пространства таблиц

Для удаления общего пространства таблиц используется оператор DROP TABLESPACE.

Все таблицы должны быть удалены из пространства таблиц перед операцией DROP TABLESPACE. Если пространство таблиц не пустое, DROP TABLESPACE возвращает ошибку.

Используйте запрос, подобный следующему, чтобы определить таблицы в общем пространстве таблиц.

mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a,
       INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1';
+------------+------------+
| space_name | table_name |
+------------+------------+
| ts1        | test/t1    |
| ts1        | test/t2    |
| ts1        | test/t3    |
+------------+------------+

Если операция DROP TABLESPACE на пустом общем пространстве таблиц возвращает ошибку, пространство таблиц может содержать оборванную временную или промежуточную таблицу, оставшуюся после прерванной операции ALTER TABLE выходом сервера. Дополнительную информацию см. в Раздел 14.22.3, «Устранение неполадок операций словаря данных InnoDB».

Общее пространство таблиц InnoDB не удаляется автоматически при удалении последней таблицы в пространстве таблиц. Пространство таблиц необходимо явно удалить, используя DROP TABLESPACE tablespace_name.

Общее пространство таблиц не принадлежит к какому-либо конкретному базе данных. Операция DROP DATABASE может удалить таблицы, которые принадлежат общему пространству таблиц, но не может удалить само пространство таблиц, даже если операция DROP DATABASE удаляет все таблицы, принадлежащие пространству таблиц.

Подобно системному пространству таблиц, обрезка или удаление таблиц, хранящихся в общем пространстве таблиц, создаёт свободное пространство внутри общего пространства таблиц, которое может быть использовано только для новых InnoDB данных. Пространство не возвращается операционной системе, как это происходит при удалении пространства таблиц с файлом на таблицу во время операции DROP TABLE.

В этом примере показано, как удалить общее пространство таблиц InnoDB. Общее пространство таблиц ts1 создается с одной таблицей. Таблица должна быть удалена перед удалением пространства таблиц.

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 Engine=InnoDB;

mysql> DROP TABLE t1;

mysql> DROP TABLESPACE ts1;
Примечание

tablespace_name — это чувствительный к регистру идентификатор в MySQL.

Общие ограничения табличных пространств
  • Сгенерированное или существующее табличное пространство не может быть изменено на общее табличное пространство.

  • Создание временных общих табличных пространств не поддерживается.

  • Общие табличные пространства не поддерживают временные таблицы.

  • Таблицы, хранящиеся в общем табличном пространстве, могут быть открыты только в выпусках MySQL, поддерживающих общие табличные пространства.

  • Подобно системному табличному пространству, удаление или отключение таблиц, хранящихся в общем табличном пространстве, создаёт свободное место внутри общего табличного пространства, которое может быть использовано только для новых InnoDB данных. Место не возвращается операционной системе, как это происходит для табличных пространств.

    Кроме того, операция копирования таблицы ALTER TABLE над таблицей, находящейся в общем табличном пространстве (или системном табличном пространстве), может увеличить объём занимаемого пространства табличным пространством. Такие операции требуют дополнительного пространства, равного объёму данных таблицы плюс индексы. Дополнительное пространство, необходимое для операции копирования таблицы ALTER TABLE, не возвращается операционной системе, как это происходит для табличных пространств с файлом на таблицу.

  • ALTER TABLE ... DISCARD TABLESPACE и ALTER TABLE ...IMPORT TABLESPACE не поддерживаются для таблиц, принадлежащих общему табличному пространству.

  • Поддержка размещения разделов таблиц в общих табличных пространствах была устарела в MySQL 5.7.24; ожидается, что она будет удалена в будущей версии MySQL.

  • Клауза ADD DATAFILE не поддерживается в среде репликации, где источник и реплика находятся на одном хосте, так как это приведёт к созданию табличного пространства с одинаковым именем в одном и том же месте и у источника, и у реплики.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/general-tablespaces.html

Spec-Zone.ru

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