14.6.3.3 Общие табличные пространства
Общее табличное пространство — это общее InnoDB табличное пространство, которое создаётся с помощью синтаксиса CREATE
TABLESPACE. Возможности и особенности общих табличных пространств описаны в следующих разделах этого раздела:
Возможности общих табличных пространств
Общие табличные пространства обеспечивают следующие возможности:
Подобно системному табличному пространству, общие табличные пространства являются общими табличными пространствами, способными хранить данные для нескольких таблиц.
Общие табличные пространства потенциально более эффективны с точки зрения памяти, чем табличные пространства по файлам на таблицу. Сервер сохраняет метаданные табличного пространства в памяти в течение всего срока службы табличного пространства. Несколько таблиц в меньшем количестве общих табличных пространств потребляют меньше памяти для метаданных табличного пространства, чем то же количество таблиц в отдельных табличных пространствах по файлам на таблицу.
Файлы данных общего табличного пространства могут располагаться в каталоге относительно или независимо от каталога данных 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_nameALTER TABLE
могут использоваться для добавления таблиц в табличное пространство, как показано в следующих примерах:tbl_name TABLESPACE [=]
tablespace_name
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
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 для сжатых таблиц
| Размер страницы 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;
— это чувствительный к регистру идентификатор в MySQL.tablespace_name
Общие ограничения табличных пространств
Сгенерированное или существующее табличное пространство не может быть изменено на общее табличное пространство.
Создание временных общих табличных пространств не поддерживается.
Общие табличные пространства не поддерживают временные таблицы.
Таблицы, хранящиеся в общем табличном пространстве, могут быть открыты только в выпусках 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.