8.12.3.2 在 Unix 上对 MyISAMtable 使用符号链接
仅MyISAM
table 完全支持符号链接。对于 table 用于其他存储引擎的文件,如果尝试使用符号链接,则可能会遇到奇怪的问题。对于InnoDB
table,请使用第 14.6.1.2 节“在外部创建 table”中说明的替代技术。
在没有完全运行realpath()
调用的系统上,请勿对 table 进行符号链接。 (Linux 和 Solaris 支持realpath()
)。要确定您的系统是否支持符号链接,请使用以下语句检查have_symlink系统变量的值:
SHOW VARIABLES LIKE 'have_symlink';
MyISAM
table 的符号链接的处理方式如下:
-
在数据目录中,您始终具有 table 格式(
.frm
)文件,数据(.MYD
)文件和索引(.MYI
)文件。数据文件和索引文件可以移动到其他位置,并在数据目录中用符号链接替换。格式文件不能。 -
您可以将数据文件和索引文件独立符号链接到不同的目录。
-
要指示正在运行的 MySQL 服务器执行符号链接,请对CREATE TABLE使用
DATA DIRECTORY
和INDEX DIRECTORY
选项。参见第 13.1.18 节“ CREATE TABLE 语句”。或者,如果mysqld没有运行,则可以从命令行使用 ln -s 手动完成符号链接。
Note
DATA DIRECTORY
和INDEX DIRECTORY
选项之一或全部使用的路径可能不包含 MySQL data
目录。错误 32167)
-
myisamchk不会用数据文件或索引文件替换符号链接。它直接在符号链接指向的文件上工作。在数据文件或索引文件所在的目录中创建任何临时文件。 ALTER TABLE,OPTIMIZE TABLE和REPAIR TABLE语句也是如此。
Note
删除使用符号链接的 table 时,符号链接和符号链接指向的文件都。这是一个非常好的理由,不要以
root
os 用户身份运行mysqld或不允许 os 用户具有对 MySQL 数据库目录的写访问权。
-
如果使用ALTER TABLE ...重命名或RENAME TABLE重命名 table,并且没有将 table 移至另一个数据库,则数据库目录中的符号链接将重命名为新名称,并且数据文件和索引文件也将重命名。
-
如果使用ALTER TABLE ...重命名或RENAME TABLE将 table 移动到另一个数据库,则该 table 将移动到另一个数据库目录。如果 table 名更改,则新数据库目录中的符号链接将重命名为新名称,并且数据文件和索引文件也将相应重命名。
-
如果不使用符号链接,请使用--skip-symbolic-links选项启动mysqld,以确保没有人可以使用mysqld来删除或重命名数据目录之外的文件。
不支持这些 table 符号链接操作:
-
ALTER TABLE忽略
DATA DIRECTORY
和INDEX DIRECTORY
table 选项。 -
如前所述,只有数据和索引文件可以是符号链接。
.frm
文件必须绝不能是符号链接。尝试执行此操作(例如,使一个 table 名成为另一 table 名的同义词)会产生错误的结果。假设您在 MySQL 数据目录下有一个数据库db1
,在该数据库中有一个 tabletbl1
,并且在db1
目录中创建了一个指向tbl1
的符号链接tbl2
:
shell> cd /path/to/datadir/db1
shell> ln -s tbl1.frm tbl2.frm
shell> ln -s tbl1.MYD tbl2.MYD
shell> ln -s tbl1.MYI tbl2.MYI
如果一个线程读取db1.tbl1
而另一个线程更新db1.tbl2
则会导致问题:
-
查询缓存被“欺骗了”(无法知道
tbl1
尚未更新,因此它会返回过时的结果)。tbl2
上的ALTER
条语句失败。