17.6.3.3 Общие табличные пространства
Общее табличное пространство — это общедоступное InnoDB табличное пространство, которое создается с помощью синтаксиса CREATE
TABLESPACE. Возможности и особенности общих табличных пространств описаны в следующих разделах этого раздела:
Возможности общих табличных пространств
Общие табличные пространства предоставляют следующие возможности:
Подобно системному табличному пространству, общие табличные пространства являются общими табличными пространствами, способными хранить данные для нескольких таблиц.
Общие табличные пространства могут быть более эффективными в плане памяти по сравнению с табличными пространствами с файлами на таблицу. Сервер хранит метаданные табличного пространства в памяти на протяжении всего срока службы табличного пространства. Несколько таблиц в меньшем количестве общих табличных пространств потребляют меньше памяти для метаданных табличного пространства, чем то же количество таблиц в отдельных табличных пространствах с файлами на таблицу.
Файлы данных общего табличного пространства могут размещаться в каталоге, относительном к каталогу данных MySQL или независимом от него, что предоставляет вам множество возможностей управления файлами данных и хранением, аналогичных возможностям табличных пространств с файлами на таблицу. Как и в случае с табличными пространствами с файлами на таблицу, возможность размещения файлов данных вне каталога данных MySQL позволяет управлять производительностью критически важных таблиц отдельно, настраивать RAID или DRBD для конкретных таблиц или связывать таблицы с определенными дисками, например.
Общие табличные пространства поддерживают все форматы строк таблиц и связанные с ними функции.
Опция
TABLESPACEможет быть использована сCREATE TABLEдля создания таблиц в общем табличном пространстве, табличном пространстве с файлом на таблицу или в системном табличном пространстве.Опция
TABLESPACEможет быть использована сALTER TABLEдля перемещения таблиц между общими табличными пространствами, табличными пространствами с файлами на таблицу и системным табличным пространством.
Создание общего табличного пространства
Общие табличные пространства создаются с помощью синтаксиса CREATE TABLESPACE.
CREATE TABLESPACE tablespace_name
[ADD DATAFILE 'file_name']
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
Общее табличное пространство может быть создано в каталоге данных или вне его. Для предотвращения конфликтов с неявно созданными табличными пространствами с файлами на таблицу, создание общего табличного пространства в подкаталоге каталога данных не поддерживается. При создании общего табличного пространства вне каталога данных каталог должен существовать и быть известен InnoDB до создания табличного пространства. Чтобы сделать неизвестный каталог известным для InnoDB, добавьте каталог в значение аргумента innodb_directories. innodb_directories — это опция запуска, доступная только для чтения. Для её настройки требуется перезапуск сервера.
Примеры:
Создание общего табличного пространства в каталоге данных:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
или
mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;
Обязательной является ADD DATAFILE. Если ADD DATAFILE не указана при создании табличного пространства, файл данных табличного пространства с уникальным именем создается неявно. Уникальное имя файла представляет собой 128-битный UUID, отформатированный в пять групп шестнадцатеричных чисел, разделенных дефисами (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee). Файлы данных общего табличного пространства имеют расширение .ibd. В среде репликации имя файла данных, созданное на источнике, не совпадает с именем файла данных, созданным на реплике.
Создание общего табличного пространства в каталоге вне каталога данных:
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;
Добавление разделов таблиц в общие табличные пространства не поддерживается. Общие табличные пространства включают системное табличное пространство 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 и Раздел 17.9.1.2, «Создание сжатых таблиц».
Таблица 17.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 можно использовать для перемещения таблицы в существующую общую таблицу, в новую таблицу с файлом на таблицу или в системную таблицу.
Добавление разделов таблиц в общие таблицы не поддерживается. Общие таблицы включают в себя 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. Директория, указанная в операторе DATA DIRECTORY, должна быть известна InnoDB. Для получения дополнительной информации см. Использование оператора DATA DIRECTORY.
При перемещении таблиц из зашифрованных таблиц применяются ограничения. См. Ограничения шифрования.
Переименование общей таблицы
Переименование общей таблицы поддерживается с помощью синтаксиса ALTER
TABLESPACE ... RENAME TO.
ALTER TABLESPACE s1 RENAME TO s2;
Для переименования общей таблицы требуется привилегия CREATE TABLESPACE.
RENAME TO операции неявно выполняются в режиме autocommit независимо от настроек autocommit.
RENAME TO операция не может быть выполнена, пока LOCK TABLES или FLUSH TABLES WITH READ
LOCK активны для таблиц, находящихся в таблице.
Эксклюзивные блокировки назначаются таблицам внутри общей таблицы во время переименования таблицы, что предотвращает одновременные операции DDL. Одновременные операции DML поддерживаются.
Удаление общей таблицы
Для удаления общей таблицы используется оператор 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 |
+------------+------------+
Общая 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
Общие ограничения табличного пространства
Сгенерированное или существующее табличное пространство не может быть изменено на общее табличное пространство.
Создание временных общих табличных пространств не поддерживается.
Общие табличные пространства не поддерживают временные таблицы.
-
Подобно системному табличному пространству, обрезка или удаление таблиц, хранящихся в общем табличном пространстве, создаёт свободное внутреннее пространство в общем табличном пространстве, которое можно использовать только для новых
InnoDBданных. Место не возвращается операционной системе, как это происходит для табличных пространств.Кроме того, операция копирования таблицы
ALTER TABLEнад таблицей, находящейся в общем табличном пространстве (или системном табличном пространстве), может увеличить объём пространства, используемого табличным пространством. Такие операции требуют столько дополнительного пространства, сколько данных в таблице плюс индексы. Дополнительное пространство, необходимое для операции копирования таблицыALTER TABLE, не возвращается операционной системе, как это происходит для табличных пространств с файлом на таблицу. ALTER TABLE ... DISCARD TABLESPACEиALTER TABLE ...IMPORT TABLESPACEне поддерживаются для таблиц, принадлежащих общему табличному пространству.Размещение разделов таблиц в общих табличных пространствах не поддерживается.
Оператор
ADD DATAFILEне поддерживается в среде репликации, где источник и реплика находятся на одном хосте, так как это приведёт к созданию табличного пространства с одинаковым именем в одном и том же месте для источника и реплики, что не поддерживается. Однако, если операторADD DATAFILEопущен, табличное пространство создаётся в каталоге данных с уникальным сгенерированным именем файла, что разрешено.Общие табличные пространства не могут быть созданы в каталоге пространства отката (
innodb_undo_directory), если это не известно напрямуюInnoDB. Известные каталоги — это те, которые определены переменнымиdatadir,innodb_data_home_dirиinnodb_directories.
© 2025 Oracle
Licensed under the GPLv2 License.