13.1.19 Оператор CREATE TABLESPACE
CREATE TABLESPACE tablespace_name
InnoDB and NDB:
ADD DATAFILE 'file_name'
InnoDB only:
[FILE_BLOCK_SIZE = value]
NDB only:
USE LOGFILE GROUP logfile_group
[EXTENT_SIZE [=] extent_size]
[INITIAL_SIZE [=] initial_size]
[AUTOEXTEND_SIZE [=] autoextend_size]
[MAX_SIZE [=] max_size]
[NODEGROUP [=] nodegroup_id]
[WAIT]
[COMMENT [=] 'string']
InnoDB and NDB:
[ENGINE [=] engine_name]
Этот оператор используется для создания табличного пространства. Точный синтаксис и семантика зависят от используемого движка хранения. В стандартных выпусках MySQL 5.7 это всегда табличное пространство InnoDB. MySQL NDB Cluster 7.5 также поддерживает табличные пространства, использующие движок хранения NDB, помимо тех, которые используют InnoDB.
Учитываемые моменты для InnoDB
CREATE TABLESPACE используется для создания общих табличных пространств. Общее табличное пространство — это совместное табличное пространство. Оно может содержать несколько таблиц и поддерживает все форматы строк таблиц. Общие табличные пространства могут создаваться в расположении, относящемся к каталогу данных или независимом от него.
После создания общего табличного пространства InnoDB, вы можете использовать CREATE
TABLE или tbl_name ... TABLESPACE [=]
tablespace_nameALTER TABLE
для добавления таблиц в табличное пространство. Дополнительную информацию см. в Разделе 14.6.3.3, «Общие табличные пространства». tbl_name TABLESPACE [=]
tablespace_name
Учитываемые моменты для NDB Cluster
Этот оператор используется для создания табличного пространства, которое может содержать один или несколько файлов данных, предоставляя пространство для хранения таблиц данных диска NDB Cluster (см. Раздел 21.6.11, «Таблицы данных диска NDB Cluster»). С помощью этого оператора создается и добавляется один файл данных в табличное пространство. Дополнительные файлы данных можно добавить в табличное пространство, используя оператор ALTER TABLESPACE (см. Раздел 13.1.9, «Оператор ALTER TABLESPACE»).
Все объекты данных диска NDB Cluster используют один и тот же пространство имен. Это означает, что каждый объект данных диска должен иметь уникальное имя (а не только каждый объект данных диска заданного типа). Например, вы не можете иметь табличное пространство и группу файлов журнала с одним и тем же именем, или табличное пространство и файл данных с одним и тем же именем.
Группа файлов журнала из одного или нескольких UNDO файлов журнала должна быть назначена создаваемому табличному пространству с помощью предложения USE LOGFILE GROUP. logfile_group должен быть существующей группой файлов журнала, созданной с помощью CREATE LOGFILE
GROUP (см. Раздел 13.1.15, «Оператор CREATE LOGFILE GROUP»). Несколько табличных пространств могут использовать одну и ту же группу файлов журнала для UNDO логирования.
При установке EXTENT_SIZE или INITIAL_SIZE можно необязательно добавить после числа однобуквенное сокращение для порядка величины, аналогичное тем, что используются в my.cnf. Обычно это одна из букв M (для мегабайтов) или G (для гигабайтов).
INITIAL_SIZE и EXTENT_SIZE подвергаются округлению следующим образом:
EXTENT_SIZEокругляется вверх до ближайшего целого кратного 32К.INITIAL_SIZEокругляется вниз до ближайшего целого кратного 32К; этот результат округляется вверх до ближайшего целого кратногоEXTENT_SIZE(после любого округления).
NDB резервирует 4% табличного пространства для операций перезапуска узла данных. Это резервированное пространство нельзя использовать для хранения данных. Это ограничение действует начиная с NDB 7.6.
Описанное округление выполняется явно, и MySQL Server выдает предупреждение, когда выполняется такое округление. Округленные значения также используются ядром NDB для вычисления значений столбца FILES схемы информации и для других целей. Однако, чтобы избежать непредвиденного результата, рекомендуется всегда использовать целые кратные 32К при указании этих параметров.
Когда CREATE TABLESPACE используется с ENGINE [=] NDB, табличное пространство и соответствующий файл данных создаются на каждом узле данных кластера. Вы можете проверить, были ли созданы файлы данных, и получить информацию о них, запросив таблицу схемы информации FILES. (См. пример позже в этом разделе.)
(См. Раздел 24.3.9, «Таблица INFORMATION_SCHEMA FILES».)
Параметры
-
ADD DATAFILE: Определяет имя файла данных табличного пространства; этот параметр всегда обязателен., включая любой указанный путь, необходимо заключить в одинарные или двойные кавычки. Имена файлов (без учёта расширения) и имена каталогов должны иметь длину не менее одного байта. Файлы и каталоги с нулевой длиной имени не поддерживаются.file_nameПоскольку существуют значительные различия в том, как
InnoDBиNDBобрабатывают файлы данных, два движка хранения рассматриваются отдельно в последующем обсуждении.Файлы данных InnoDB. Табличное пространство InnoDB поддерживает только один файл данных, имя которого должно включать расширение
.ibd.Для табличного пространства
InnoDBфайл данных по умолчанию создаётся в каталоге данных MySQL (datadir). Чтобы разместить файл данных в другом месте, помимо стандартного, укажите абсолютный путь к каталогу или путь, относительный к стандартному расположению.Когда табличное пространство
InnoDBсоздаётся вне каталога данных, создаётся файл в каталоге данных. Чтобы избежать конфликтов с неявно созданными табличными пространствами по одному файлу на таблицу, создание общего табличного пространстваInnoDBв подкаталоге каталога данных не поддерживается. При создании общего табличного пространстваInnoDBвне каталога данных, каталог должен существовать до создания табличного пространства.ПримечаниеВ MySQL 5.7,
ALTER TABLESPACEне поддерживаетсяInnoDB.Файлы данных NDB. Табличное пространство NDB поддерживает несколько файлов данных, которые могут иметь любые допустимые имена файлов; к табличному пространству NDB Cluster можно добавить больше файлов данных после его создания, используя оператор
ALTER TABLESPACE.Файл данных табличного пространства
NDBпо умолчанию создаётся в каталоге файловой системы узла данных — то есть в каталоге с именемndb_в каталоге данных узла данных (nodeid_fs/TSDataDir), гдеnodeid— идентификатор узла данных (NodeId). Чтобы разместить файл данных в другом месте, помимо стандартного, укажите абсолютный путь к каталогу или путь, относительный к стандартному расположению. Если указанный каталог не существует,NDBпытается создать его; учётная запись системного пользователя, под которой работает процесс узла данных, должна иметь соответствующие разрешения.ПримечаниеПри определении пути, используемого для файла данных,
NDBне расширяет символ~(тильда).Если на одном физическом узле запускается несколько узлов данных, применимы следующие соображения:
Нельзя указывать абсолютный путь при создании файла данных.
Невозможно создать файлы данных табличного пространства вне каталога файловой системы узла данных, если каждый узел данных не имеет отдельного каталога данных.
Если каждый узел данных имеет свой каталог данных, файлы данных можно создать где угодно внутри этого каталога.
Если каждый узел данных имеет свой каталог данных, также может быть возможно создать файл данных за пределами каталога данных узла, используя относительный путь, при условии, что этот путь разрешается в уникальное местоположение в файловой системе хоста для каждого узла данных, работающего на этом хосте.
-
FILE_BLOCK_SIZE: Этот параметр, специфичный дляInnoDBи игнорируемыйNDB, определяет размер блока для файла данных табличного пространства. Значения могут быть указаны в байтах или килобайтах. Например, размер блока файла 8 килобайт может быть указан как 8192 или 8К. Если этот параметр не указан,FILE_BLOCK_SIZEпо умолчанию использует значениеinnodb_page_size.FILE_BLOCK_SIZEтребуется, если вы планируете использовать табличное пространство для хранения сжатыхInnoDBтаблиц (ROW_FORMAT=COMPRESSED). В этом случае необходимо определить табличное пространствоFILE_BLOCK_SIZEпри создании табличного пространства.Если
FILE_BLOCK_SIZEравно значениюinnodb_page_size, табличное пространство может содержать только таблицы со сжатым форматом строк (COMPACT,REDUNDANTиDYNAMIC). Таблицы со сжатым форматом строк имеют другой размер физической страницы, чем несжатые таблицы. Поэтому сжатые таблицы не могут сосуществовать в одном табличном пространстве с несжатыми таблицами.Для общего табличного пространства, содержащего сжатые таблицы, необходимо указать
FILE_BLOCK_SIZE, а значениеFILE_BLOCK_SIZEдолжно быть допустимым размером страницы сжатия, связанным со значениемinnodb_page_size. Кроме того, размер физической страницы сжатой таблицы (KEY_BLOCK_SIZE) должен быть равенFILE_BLOCK_SIZE/1024. Например, еслиinnodb_page_size=16K, иFILE_BLOCK_SIZE=8K, размер физической страницы таблицы должен быть 8. Дополнительная информация приведена в Разделе 14.6.3.3, «Общие табличные пространства». USE LOGFILE GROUP: Обязательный дляNDBпараметр, представляющий собой имя группы файлов журнала, ранее созданной с помощьюCREATE LOGFILE GROUP. Не поддерживается дляInnoDB, где выдает ошибку.-
EXTENT_SIZE: Этот параметр специфичен для NDB и не поддерживается InnoDB, где он приводит к ошибке.EXTENT_SIZEзадаёт размер, в байтах, экстентов, используемых любыми файлами, принадлежащими табличному пространству. Значение по умолчанию составляет 1МБ. Минимальный размер составляет 32КБ, а теоретический максимальный размер — 2ГБ, хотя практический максимальный размер зависит от ряда факторов. В большинстве случаев изменение размера экстентов не оказывает ощутимого влияния на производительность, и рекомендуется использовать значение по умолчанию, за исключением самых необычных ситуаций.Экстент — единица выделения дискового пространства. Один экстент заполняется данными до тех пор, пока этот экстент не будет заполнен, после чего используется другой экстент. Теоретически, до 65 535 (64К) экстентов могут использоваться на файл данных; однако, рекомендуется использовать максимальное значение 32 768 (32К). Рекомендуемый максимальный размер для одного файла данных составляет 32ГБ — то есть 32К экстентов × 1 МБ на экстент. Кроме того, после выделения экстенту для определенного раздела, он не может быть использован для хранения данных из другого раздела; экстент не может хранить данные более чем из одного раздела. Это означает, например, что табличное пространство с одним файлом данных, чьё значение
INITIAL_SIZE(описано в следующем пункте) составляет 256 МБ, а значениеEXTENT_SIZEсоставляет 128МБ, содержит всего два экстенты и может использоваться для хранения данных не более чем из двух различных разделов таблиц данных.Вы можете узнать, сколько экстентов осталось свободными в определённом файле данных, запросив таблицу Information Schema
FILES, и таким образом получить оценку того, сколько места осталось свободным в файле. Более подробное обсуждение и примеры см. в Разделе 24.3.9, «Таблица INFORMATION_SCHEMA FILES». -
INITIAL_SIZE: Этот параметр специфичен дляNDBи не поддерживаетсяInnoDB, где он приводит к ошибке.Параметр
INITIAL_SIZEзадаёт общий размер, в байтах, файла данных, указанного с помощьюADD DATATFILE. После создания этого файла его размер изменить нельзя; однако, вы можете добавить дополнительные файлы данных в табличное пространство, используяALTER TABLESPACE ... ADD DATAFILE.INITIAL_SIZE— необязательный параметр; его значение по умолчанию — 134217728 (128 МБ).На 32-битных системах максимальное поддерживаемое значение для
INITIAL_SIZE— 4294967296 (4 ГБ). AUTOEXTEND_SIZE: В настоящее время игнорируется MySQL; зарезервировано для возможного использования в будущем. Не оказывает никакого эффекта ни в одной версии MySQL 5.7 или MySQL NDB Cluster 7.5, независимо от используемого движка хранения.MAX_SIZE: В настоящее время игнорируется MySQL; зарезервировано для возможного использования в будущем. Не оказывает никакого эффекта ни в одной версии MySQL 5.7 или MySQL NDB Cluster 7.5, независимо от используемого движка хранения.NODEGROUP: В настоящее время игнорируется MySQL; зарезервировано для возможного использования в будущем. Не оказывает никакого эффекта ни в одной версии MySQL 5.7 или MySQL NDB Cluster 7.5, независимо от используемого движка хранения.WAIT: В настоящее время игнорируется MySQL; зарезервировано для возможного использования в будущем. Не оказывает никакого эффекта ни в одной версии MySQL 5.7 или MySQL NDB Cluster 7.5, независимо от используемого движка хранения.COMMENT: В настоящее время игнорируется MySQL; зарезервировано для возможного использования в будущем. Не оказывает никакого эффекта ни в одной версии MySQL 5.7 или MySQL NDB Cluster 7.5, независимо от используемого движка хранения.ENGINE: Определяет движок хранения, использующий табличное пространство, гдеengine_name— имя движка хранения. В настоящее время стандартные релизы MySQL 5.7 поддерживают только движок храненияInnoDB. MySQL NDB Cluster 7.5 поддерживает как табличные пространстваNDB, так иInnoDB. Значение системной переменнойdefault_storage_engineиспользуется дляENGINE, если этот параметр не указан.
Примечания
Правила наименования MySQL-табличных пространств см. в разделе 9.2 «Имена объектов схемы». В дополнение к этим правилам, запрещён символ косой черты (“/”), а также имена, начинающиеся с
innodb_, так как этот префикс зарезервирован для системного использования.Табличные пространства не поддерживают временные таблицы.
Параметры
innodb_file_per_table,innodb_file_formatиinnodb_file_format_maxне влияют на операцииCREATE TABLESPACE.innodb_file_per_tableне нужно включать. Общие табличные пространства поддерживают все форматы строк таблиц независимо от настроек формата файлов. Аналогично, общие табличные пространства поддерживают добавление таблиц любого формата строк с помощьюCREATE TABLE ... TABLESPACE, независимо от настроек формата файлов.innodb_strict_modeне применим к общим табличным пространствам. Правила управления табличными пространствами строго выполняются независимо отinnodb_strict_mode. Если параметрыCREATE TABLESPACEнекорректны или несовместимы, операция завершается неудачно независимо от параметраinnodb_strict_mode. При добавлении таблицы в общее табличное пространство с помощьюCREATE TABLE ... TABLESPACEилиALTER TABLE ... TABLESPACE,innodb_strict_modeигнорируется, но оператор оценивается так, как если быinnodb_strict_modeбыл включён.Используйте
DROP TABLESPACEдля удаления табличного пространства. Все таблицы должны быть удалены из табличного пространства с помощьюDROP TABLEперед удалением самого табличного пространства. Перед удалением табличного пространства NDB Cluster необходимо также удалить все его файлы данных с помощью одного или нескольких операторовALTER TABLESPACE ... DROP DATATFILE. См. раздел 21.6.11.1 «NDB Cluster Disk Data Objects».-
Все части таблицы
InnoDB, добавленные в общее табличное пространствоInnoDB, находятся в этом общем табличном пространстве, включая индексы и страницыBLOB.Для таблицы
NDB, назначенной табличному пространству, на диске хранятся только те столбцы, которые не индексированы, и фактически используют файлы данных табличного пространства. Индексы и индексированные столбцы для всех таблицNDBвсегда хранятся в памяти. Подобно системному табличному пространству, операция обнуления или удаления таблиц, хранящихся в общем табличном пространстве, создаёт внутреннее свободное пространство в общем табличном пространстве, которое может использоваться только для новых данных
InnoDB. Пространство не возвращается операционной системе, как это происходит для табличных пространств на основе файла на таблицу.Общее табличное пространство не ассоциируется ни с какой базой данных или схемой.
ALTER TABLE ... DISCARD TABLESPACEиALTER TABLE ...IMPORT TABLESPACEне поддерживаются для таблиц, принадлежащих общему табличному пространству.Сервер использует блокировку метаданных на уровне табличного пространства для DDL, который ссылается на общие табличные пространства. В сравнении, сервер использует блокировку метаданных на уровне таблицы для DDL, который ссылается на табличные пространства на основе файла на таблицу.
Сгенерированное или существующее табличное пространство не может быть изменено на общее табличное пространство.
Таблицы, хранящиеся в общем табличном пространстве, могут открываться только в MySQL 5.7.6 и более поздних версиях из-за добавления новых флагов таблиц.
Нет конфликта между именами общих табличных пространств и именами табличных пространств на основе файла на таблицу. Символ “/”, присутствующий в именах табличных пространств на основе файла на таблицу, не допускается в именах общих табличных пространств.
mysqldump и mysqlpump не выполняют дамп
InnoDBоператоровCREATE TABLESPACE.
Примеры InnoDB
Этот пример демонстрирует создание общего табличного пространства и добавление трёх нескомпрессированных таблиц разных форматов строк.
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=REDUNDANT;
mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;
mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;
Этот пример демонстрирует создание общего табличного пространства и добавление сжатой таблицы. В примере предполагается значение по умолчанию 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;
Пример NDB
Предположим, что вы хотите создать табличное пространство NDB Cluster Disk Data под названием myts, используя файл данных под названием mydata-1.dat. Табличное пространство NDB всегда требует использования группы файлов журнала, состоящей из одного или нескольких файлов журнала отката. В этом примере мы сначала создаём группу файлов журнала mylg, содержащую один файл журнала отката myundo-1.dat, используя оператор CREATE LOGFILE GROUP, показанный здесь:
mysql> CREATE LOGFILE GROUP myg1
-> ADD UNDOFILE 'myundo-1.dat'
-> ENGINE=NDB;
Query OK, 0 rows affected (3.29 sec)
Теперь вы можете создать описанное ранее табличное пространство с помощью следующего оператора:
mysql> CREATE TABLESPACE myts
-> ADD DATAFILE 'mydata-1.dat'
-> USE LOGFILE GROUP mylg
-> ENGINE=NDB;
Query OK, 0 rows affected (2.98 sec)
Теперь вы можете создать таблицу Disk Data, используя оператор CREATE TABLE с параметрами TABLESPACE и STORAGE DISK, подобно тому, что показано здесь:
mysql> CREATE TABLE mytable (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> lname VARCHAR(50) NOT NULL,
-> fname VARCHAR(50) NOT NULL,
-> dob DATE NOT NULL,
-> joined DATE NOT NULL,
-> INDEX(last_name, first_name)
-> )
-> TABLESPACE myts STORAGE DISK
-> ENGINE=NDB;
Query OK, 0 rows affected (1.41 sec)
Важно отметить, что только столбцы dob и joined из mytable фактически хранятся на диске, поскольку столбцы id, lname и fname индексированы.
Как уже упоминалось ранее, при использовании CREATE TABLESPACE с ENGINE [=] NDB создаются табличное пространство и ассоциированный файл данных на каждом узле данных NDB Cluster. Вы можете проверить, что файлы данных были созданы, и получить информацию о них, обратившись к таблице Information Schema FILES, как показано здесь:
mysql> SELECT FILE_NAME, FILE_TYPE, LOGFILE_GROUP_NAME, STATUS, EXTRA
-> FROM INFORMATION_SCHEMA.FILES
-> WHERE TABLESPACE_NAME = 'myts';
+--------------+------------+--------------------+--------+----------------+
| file_name | file_type | logfile_group_name | status | extra |
+--------------+------------+--------------------+--------+----------------+
| mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=5 |
| mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=6 |
| NULL | TABLESPACE | mylg | NORMAL | NULL |
+--------------+------------+--------------------+--------+----------------+
3 rows in set (0.01 sec)
Дополнительную информацию и примеры см. в разделе 21.6.11.1 «NDB Cluster Disk Data Objects».
© 2025 Oracle
Licensed under the GPLv2 License.