Spec-Zone.ru › MySQL 8.4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Файлы данных общего табличного пространства могут располагаться в каталоге, относительном к каталогу данных 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_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;

Добавление табличных разделов в общие табличные пространства не поддерживается. Общие табличные пространства включают 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 32K и 64K. Дополнительную информацию о KEY_BLOCK_SIZE см. в CREATE TABLE и Разделе 17.9.1.2, «Создание сжатых таблиц».

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

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

В данном примере показано создание общего табличного пространства и добавление сжатой таблицы. Пример предполагает значение innodb_page_size по умолчанию 16KB. Значение 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 операции поддерживаются.

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

Для удаления InnoDB общего табличного пространства используется оператор 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;
Примечание

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

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

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

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

  • Подобно системному табличному пространству, обрезка или удаление таблиц, хранящихся в общем табличном пространстве, создаёт свободное внутреннее пространство в общем табличном пространстве, которое можно использовать только для новых 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/general-tablespaces.html

Spec-Zone.ru

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