Spec-Zone.ru › MySQL 5.7

8.12.3.2 Использование символических ссылок для таблиц MyISAM в Unix

Символьные ссылки полностью поддерживаются только для таблиц MyISAM. Для файлов, используемых таблицами других типов хранилищ, при попытке использования символических ссылок могут возникнуть странные проблемы. Для таблиц InnoDB вместо этого используйте альтернативный метод, описанный в разделе 14.6.1.2 «Создание таблиц внешним образом».

Не используйте символические ссылки для таблиц на системах, не имеющих полностью функционального вызова realpath(). (Linux и Solaris поддерживают realpath()). Чтобы определить, поддерживает ли ваша система символические ссылки, проверьте значение системной переменной have_symlink с помощью следующей команды:

SHOW VARIABLES LIKE 'have_symlink';

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

  • В каталоге данных всегда присутствуют файл формата таблицы (.frm), файл данных (.MYD) и файл индекса (.MYI). Файлы данных и индексов можно переместить в другое место и заменить в каталоге данных символическими ссылками. Файл формата нельзя.

  • Вы можете создать символические ссылки на файлы данных и индексов в разные каталоги независимо друг от друга.

  • Чтобы указать работающему серверу MySQL выполнить создание символических ссылок, используйте опции DATA DIRECTORY и INDEX DIRECTORY для CREATE TABLE. См. раздел 13.1.18 «Оператор CREATE TABLE». В качестве альтернативы, если mysqld не запущен, создание символических ссылок можно выполнить вручную с помощью ln -s из командной строки.

    Примечание

    Путь, используемый с опциями DATA DIRECTORY и/или INDEX DIRECTORY, не должен включать каталог MySQL data. (Ошибка #32167)

  • myisamchk не заменяет символическую ссылку файлом данных или индекса. Она работает непосредственно с файлом, на который указывает символическая ссылка. Любые временные файлы создаются в каталоге, где находится файл данных или индекса. То же самое относится к операторам ALTER TABLE, OPTIMIZE TABLE и REPAIR TABLE.

  • Примечание

    При удалении таблицы, использующей символические ссылки, удаляются как сама символическая ссылка, так и файл, на который она указывает. Это очень веская причина не запускать mysqld от пользователя операционной системы или разрешать пользователям операционной системы доступ к записи в каталоги базы данных MySQL.

  • Если вы переименовываете таблицу с помощью ALTER TABLE ... RENAME или RENAME TABLE и не перемещаете таблицу в другую базу данных, символические ссылки в каталоге базы данных переименовываются в новые имена, а файлы данных и индексов переименовываются соответствующим образом.

  • Если вы используете ALTER TABLE ... RENAME или RENAME TABLE для перемещения таблицы в другую базу данных, таблица перемещается в каталог другой базы данных. Если имя таблицы изменилось, символические ссылки в новом каталоге базы данных переименовываются в новые имена, а файлы данных и индексов переименовываются соответствующим образом.

  • Если вы не используете символические ссылки, запустите mysqld с опцией --skip-symbolic-links, чтобы гарантировать, что никто не сможет использовать mysqld для удаления или переименования файла за пределами каталога данных.

Эти операции со символическими ссылками для таблиц не поддерживаются:

  • ALTER TABLE игнорирует опции таблицы DATA DIRECTORY и INDEX DIRECTORY.

  • Как указано ранее, только файлы данных и индексов могут быть символическими ссылками. Файл формата (.frm) никогда не должен быть символической ссылкой. Попытка сделать это (например, чтобы одно имя таблицы было синонимом другого) приводит к неправильным результатам. Предположим, что у вас есть база данных db1 в каталоге данных MySQL, таблица tbl1 в этой базе данных, и в каталоге db1 вы создали символическую ссылку tbl2, указывающую на файл tbl1:

    $> cd /path/to/datadir/db1
    $> ln -s tbl1.frm tbl2.frm
    $> ln -s tbl1.MYD tbl2.MYD
    $> ln -s tbl1.MYI tbl2.MYI
    

    Возникают проблемы, если один поток читает db1.tbl1, а другой поток обновляет db1.tbl2:

    • Кэш запросов «сбивается с толку» (он не может знать, что tbl1 не был обновлён, поэтому возвращает устаревшие результаты).

    • Операторы ALTER для таблицы tbl2 завершаются с ошибкой.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/symbolic-links-to-tables.html

Spec-Zone.ru

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