Skip to main content

2.使用符号链接

可以将数据库或表从数据库目录移动到其他位置,并用指向新位置的符号链接替换它们。 例如,可能希望将数据库移动到具有更多可用空间的文件系统,或者通过将表分散到不同的磁盘来提高系统速度。

对于 InnoDB 表,请使用 CREATE TABLE 语句的 DATA DIRECTORY 子句而不是符号链接。

建议的方法是将整个数据库目录符号链接到不同的磁盘。 符号链接 MyISAM 表仅作为最后的手段。

要确定数据目录的位置,请使用以下语句:

SHOW VARIABLES LIKE 'datadir';

在 Unix 上使用数据库的符号链接

在 Unix 上,使用以下过程对数据库进行符号链接:

  1. 使用 CREATE DATABASE 创建数据库:

    CREATE DATABASE mydb1;

    使用 CREATE DATABASE 在 MySQL 数据目录中创建数据库,并允许服务器使用有关数据库目录的信息更新数据字典。

  2. 停止服务器以确保在移动新数据库时不会发生任何活动。

  3. 将数据库目录移动到有可用空间的某个磁盘。 例如,使用 tar 或 mv。 如果使用复制而不是移动数据库目录的方法,请在复制后删除原始数据库目录。

  4. 在数据目录中创建到移动的数据库目录的软链接:

    $> ln -s /path/to/mydb1 /path/to/datadir

    该命令在数据目录中创建一个名为 mydb1 的符号链接。

  5. 重新启动服务器。

在 Unix 上使用 MyISAM 表的符号链接

注意:

此处描述的符号链接支持以及 --symbolic-links控制它的选项已被弃用;预计这些将在 MySQL 的未来版本中删除。此外,该选项默认处于禁用状态。

仅 MyISAM 表完全支持符号链接。 对于其他存储引擎的表使用的文件,如果尝试使用符号链接,可能会遇到奇怪的问题。

不要在没有完全可操作的 realpath() 调用的系统上对表进行符号链接。 (Linux 和 Solaris 支持 realpath())。 要确定系统是否支持符号链接,请使用以下语句检查 have_symlink 系统变量的值:

SHOW VARIABLES LIKE 'have_symlink';

MyISAM 表的符号链接的处理工作如下:

  • 在数据目录中,始终包含数据 (.MYD) 文件和索引 (.MYI) 文件。 数据文件和索引文件可以移动到其他地方,并通过符号链接在数据目录中替换。

  • 可以将数据文件和索引文件独立地符号链接到不同的目录。

  • 要指示正在运行的 MySQL 服务器执行符号链接,请使用 DATA DIRECTORY 和 INDEX DIRECTORY 选项来创建表。 或者,如果 mysqld 未运行,则可以使用命令行中的 ln -s 手动完成符号链接。

  • myisamchk 不会用数据文件或索引文件替换符号链接。 它直接作用于符号链接指向的文件。 所有临时文件都会在数据文件或索引文件所在的目录中创建。 对于 ALTER TABLE、OPTIMIZE TABLE 和 REPAIR TABLE 语句也是如此。

    当删除使用符号链接的表时,符号链接和符号链接指向的文件都会被删除。 这是不要以 root 操作系统用户身份运行 mysqld 或允许操作系统用户对 MySQL 数据库目录具有写入权限的一个极好的理由。

  • 如果使用 ALTER TABLE ... RENAME 或 RENAME TABLE 重命名表,并且不将该表移动到另一个数据库,则数据库目录中的符号链接将重命名为新名称,并且数据文件和索引文件也会相应地重命名。

  • 如果使用 ALTER TABLE ... RENAME 或 RENAME TABLE 将表移动到另一个数据库,则该表将移动到另一个数据库目录。 如果表名称更改,新数据库目录中的符号链接将重命名为新名称,数据文件和索引文件也会相应重命名。

  • 如果不使用符号链接,请使用 --skip-symbolic-links 选项启动 mysqld,以确保没有人可以使用 mysqld 删除或重命名数据目录之外的文件。

    不支持这些表符号链接操作:

  • ALTER TABLE 忽略 DATA DIRECTORY 和 INDEX DIRECTORY 表选项。

在 Windows 上使用数据库的符号链接

在 Windows 上,符号链接可用于数据库目录。 可以通过设置指向数据库目录的符号链接来将数据库目录放置在不同的位置(例如,不同的磁盘上)。 尽管设置链接的过程有所不同,但 Windows 上数据库符号链接的使用与 Unix 上的使用类似。

假设要将名为 mydb 的数据库的数据库目录放置在 D:\data\mydb 中。 为此,请在 MySQL 数据目录中创建一个指向 D:\data\mydb 的符号链接。 但是,在创建符号链接之前,请确保 D:\data\mydb 目录存在,如有必要,请创建它。 如果数据目录中已有名为 mydb 的数据库目录,请将其移至 D:\data。 否则,符号链接无效。 为了避免出现问题,请确保在移动数据库目录时服务器未运行。

在 Windows 上,可以使用 mklink 命令创建符号链接。 该命令需要管理权限。

  1. 确保所需的数据库路径存在。 对于本示例,我们使用 D:\data\mydb 和名为 mydb 的数据库。

  2. 如果数据库尚不存在,请在 mysql 客户端中发出 CREATE DATABASE mydb 来创建它。

  3. 停止 MySQL 服务。

  4. 使用 Windows 资源管理器或命令行,将目录 mydb 从数据目录移动到 D:\data,替换同名目录。

  5. 如果尚未使用命令提示符,请打开它,并将位置更改为数据目录,如下所示:

    C:\> cd \path\to\datadir

    如果 MySQL 安装在默认位置,可以使用以下命令:

    C:\> cd C:\ProgramData\MySQL\MySQL Server 8.3\Data
  6. 在数据目录中,创建一个名为 mydb 的符号链接,该链接指向数据库目录的位置:

    C:\> mklink /d mydb D:\data\mydb
  7. 启动MySQL服务。

此后,在数据库 mydb 中创建的所有表都将在 D:\data\mydb 中创建。

或者,在 MySQL 支持的任何版本的 Windows 上,可以通过在包含目标目录路径的数据目录中创建 .sym 文件来创建指向 MySQL 数据库的符号链接。 该文件应命名为 db_name.sym,其中 db_name 是数据库名称。

默认情况下启用对 Windows 上使用 .sym 文件的数据库符号链接的支持。 如果不需要 .sym 文件符号链接,可以通过使用 --skip-symbolic-links 选项启动 mysqld 来禁用对它们的支持。 要确定的系统是否支持 .sym 文件符号链接,请使用以下语句检查 have_symlink 系统变量的值:

SHOW VARIABLES LIKE 'have_symlink';

要创建 .sym 文件符号链接,请使用以下过程:

  1. 将位置更改为数据目录:

    C:\> cd \path\to\datadir
  2. 在数据目录中,创建一个名为 mydb.sym 的文本文件,其中包含以下路径名:D:\data\mydb\

此后,在数据库 mydb 中创建的所有表都将在 D:\data\mydb 中创建。

新数据库和表的路径名应该是绝对路径名。 如果指定相对路径,则该位置相对于 mydb.sym 文件。