当前位置: 首页 > 文档资料 > MySQL 中文手册 >

7.6. 磁盘事宜

优质
小牛编辑
129浏览
2023-12-01
7.6.1. 使用符号链接

·磁盘搜索是巨大的性能瓶颈。当数据量变得非常大以致于缓存性能变得不可能有效时,该问题变得更加明显。对于大数据库,其中你或多或少地随机访问数据,你可以确信对读取操作需要至少一次硬盘搜索,写操作需要多次硬盘搜索。要想使该问题最小化,应使用搜索次数较少的磁盘。

·通过链接文件到不同的磁盘或对硬盘分段来增加可用磁盘锭数量(因此降低搜索成本):

o使用符号链接

这说明,对于MyISAM表,你符号链接索引文件和/或数据文件,从它们数据目录内的通常位置到另一个硬盘(也可以被条纹化)。这将使搜索和读次数达到最好,假定硬盘不再为其它目的使用。参见7.6.1节,“使用符号链接”。

o分条

分条意味着你有许多磁盘,将第1个块放到第1个硬盘,第2个块放到第2个磁盘,并且第N块在(N mod number_of_disks)磁盘上等等。这意味着如果正常数据大小小于分条大小(或完全匹配),能够得到最佳性能。分条完全取决于操作系统和分条大小,因此用不同的条纹大小对应用程序进行基准测试。参见7.1.5节,“使用自己的基准”。

分条的不同速度完全依赖于参数。依赖于怎样设置条纹参数和硬盘数量,可以根据不同数量级别得到不同的标准。你必须进行选择以便优化随机或顺序存取。

·为了高可靠性你可能想使用RAID 0+1(条纹加镜像),但在这种情况下,需要2*N块磁盘来保持N个磁盘的数据。如果你肯为它花钱,这可能是最好的选项。然而,你可能还必须投资一部分资金到卷管理软件中以便有效地管理它。

·一个较好的选择是根据数据类型的重要性程度改变RAID级别。例如,保存可以在RAID 0硬盘上重新生成的不太重要的数据,但保存 真正重要数据(例如主机信息和日志)到RAID 0+1或RAID N硬盘。如果你有许多写操作,RAID N可能会存在问题,因为需要时间来更新校验位。

·在Linux上,通过配置磁盘接口时使用hdparm,你可以获得更多的性能。(在一般负载下达到100%并不困难。)下面的hdparm选项 应该非常适用于MySQL,并且可能适用于许多其它应用程序:

     hdparm -m 16 -d 1

请注意,当使用该命令时,性能和可靠性依赖于硬件,因此我们强烈建议,使用hdparm后,完全测试你的系统。为获取更多详细信息,请查阅hdparm手册帮助页。如果hdparm使用的不好,会导致文件系统破坏,因此试验之前请做好每个备份!

·也可以设置数据库使用的文件系统参数:

如果不需要知道文件最后一次访问的时间(这对数据库服务器并没有实际的用途),可以用-o noatime选项安装文件系统。这将跳过对文件系统中的节点的最后一次访问时间的更新,从而能够避免一些硬盘搜索。

在许多操作系统中,用-o async选项安装,可以将文件系统设置为异步更新。如果电脑相当稳定,这应该给予你更高的性能而不需要牺牲太多的可靠性。(该标志是Linux中默认开启。)

7.6.1. 使用符号链接

7.6.1.1. 在Unix上使用针对数据库的符号链接
7.6.1.2. 在Unix平台上使用表的符号链接
7.6.1.3. 在Windows平台上使用关于数据库的符号链接

你可以将表和数据库从数据库目录移动到其它的位置并且用指向新位置的符号链接进行替换。你可能需要这样作,例如,移动数据库到一个有更多空闲空间的文件系统中或通过将表分散到不同的磁盘上以增加系统的访问速度。

推荐的方法值需要将数据库通过符号链接指到不同的磁盘。符号链接表仅作为是最后的办法。

7.6.1.1. 在Unix上使用针对数据库的符号链接

在Unix中,符号链接一个数据库的方法是,首先在一些有空闲空间的硬盘上创建一个目录,然后从MySQL数据目录中创建它的一个符号链接。

shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir

MySQL不支持链接一个目录到多个数据库。用一个符号链接替换一个数据库目录,只要你不在数据库之间制作符号链接。假定你有一个数据库db1在MySQL数据目录下,然后生成一个符号链接db2指向 db1:

shell> cd /path/to/datadir
shell> ln -s db1 db2

对于db1中的任何表tbl_a,在db2也出现并且还是表tbl_a。如果一个客户更新db1.tbl_a并且另一个客户更新db2.tbl_a,可能会出现问题。

然而,如果你真的需要这样做,可以通过改变源文件mysys/my_symlink.c来实现,在该文件中你应查找下面的语句:

if (!(MyFlags & MY_RESOLVE_LINK) ||

(!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))

将该语句修改为:

if (1)

请注意,对于所有的Windows服务器,默认启用符号链接支持。

7.6.1.2. 在Unix平台上使用表的符号链接

你不应在没有完全可操作的realpath()调用的系统中对表进行符号链接。(Linux和Solaris支持realpath())。可以通过发出一个SHOW VARIABLES LIKE 'have_symlink'语句,检查系统是否支持符号链接。

只有MyISAM表完全支持符号链接。对于其它表类型,如果试图在操作系统中的文件上用前面的任何语句使用符号链接,可能会出现奇怪的问题。

对于MyISAM表的符号链接的处理如下:

·在数据目录指,一定会有表定义文件、数据文件和索引文件。数据文件和索引文件可以移到别处和在数据目录中符号链接替代。表定义文件不能进行符号链接替换。

·可以分别通过符号链接将数据文件和索引文件指到不同的目录。

·如果mysqld没有运行,符号链接可以从服务器命令行使用ln -s手动完成。同样,通过使用DATA DIRECTORY和INDEX DIRECTORY选项创建表,你可以指示运行的MySQL服务器执行符号链接。参见13.1.5节,“CREATE TABLE语法”。

·myisamchk不用数据文件或索引文件替换符号链接。它直接工作在符号链接指向的文件。任何临时文件创建在数据文件或索引文件所处的目录中。

·注释:当你删掉一个表时,如果该表使用了符号链接,符号链接和该符号链接指向的文件都被删除掉。这就是你不应以系统root用户运行mysqld或允许系统用户对MySQL数据库目录有写访问权限的原因。

·如果你用ALTER TABLE ... RENAME重命名一个表并且不将表移到另一个数据库,数据库目录中的符号链接被重新命名为一个新名字并且数据文件和索引文件也相应地重新命名。

·如果你用ALTER TABLE ... RENAME移动一个表到另一个数据库,表移动到另一个数据库目录。旧的符号链接和其所指向的文件被删除。换句话说,新表不再被链接。

·如果不使用符号链接,你应对mysqld使用--skip-symbolic-links选项以确保没有人能够使用mysqld来删除或重新命名数据目录之外的文件。

表符号链接还不支持以下操作:

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

·BACKUP TABLE 和RESTORE TABLE不考虑符号链接。

·.frm文件必须绝不能是一个符号链接(如前面所述,只有数据和索引文件可以是符号链接)。如果试图这样做(例如,生成符号链接)会产生不正确的结果。假定你在MySQL数据目录下有一个数据库db1,该数据库有一个表tbl1,并且在db1目录中你制作了一个符号链接tbl2指向tbl1:

·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会发生问题:

o 查询缓存将变为“傻瓜” (它没有办法知道tbl1是否被更新,因此它返回过时的结果)。

o tbl2上的ALTER语句也会失败。

7.6.1.3. 在Windows平台上使用关于数据库的符号链接

Windows的mysqld-max和mysql-max-nt服务器使用-DUSE_SYMDIR选项编译成。允许你放置数据库目录到一个不同的硬盘,通过设置一个符号链接指向它。这类似于Unix中的符号链接,尽管设置链接的过程不同。

符号链接默认为启用。如果你不需要,使用skip-symbolic-links选项来禁用它:

[mysqld]

skip-symbolic-links

在Windows中,通过在数据目录中创建一个文件,该文件包含目标目录的路径,你可以为MySQL数据库创建一个符号链接。该文件应该被命名为db_name.sym,其中db_name是数据库名。

假定MySQ数据目录是C:\mysql\data并且你想要数据库foo放置在D:\data\foo。设置一个符号链接如下所示:

1. 确保D:\data\foo目录存在,如果必要创建它。如果你在数据目录内有一个命名为foo的数据库目录,你应移动它到D:\data目录。否则,符号链接无效。为避免出现问题,当你移动数据库目录时服务器不应该运行。

2. 创建一个文本文件C:\mysql\data\foo.sym,该本文文件包含路径名D:\data\foo\。

此后,数据库foo创建的所有表将创建在D:\data\foo文件中。请注意,如果在MySQL数据目录中存在同名的数据库目录,不能使用符号链接。

这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。