MySQL数据库磁盘优化(2)
作者:佚名 来源:IT168.com 发布时间:2008-11-24 17:29:00
在MySQL 4.0以前,除非特别小心否则不要链接数据表。有一个问题是,当在一个符号链接表上执行 ALTER TABLE, REPAIR TABLE, 或 OPTIMIZE TABLE 时,符号链接就会被删除然后替换成原来的文件。这是因为执行这些语句时,需要在数据库目录下创建临时文件,然后在操作完成后把临时文件替换到原来的文件中去。
最好不要在不能很好支持 realpath() 调用的操作系统上链接数据表(不过至少Linux和Solaris支持 realpath())。执行 SHOW VARIABLES LIKE 'have_symlink' 语句来检查你的系统是否支持符号链接。
在MySQL 4.0,MyISAM 表完全支持符号链接。而其他表类型如果也做符号链接的话,则很可能在执行语句前会碰到一些奇怪的问题。
MySQL 4.0中的 MyISAM 表符号链接以如下方式工作:
在数据目录下,总是有表定义文件,以及数据文件,以及索引文件。数据和索引文件可以被移动到任何处然后用符号链接代替,但是表定义文件不可以。
可以分别把数据和索引文件链接到不同目录下。
在 mysqld 没有运行时可以用命令行 ln -s 手工完成符号链接。如果用SQL,可以在 CREATE TABLE 时使用选项 DATA DIRECTORY 和 INDEX DIRECTORY 告诉服务器使用符号链接。详情请看"14.2.6 CREATE TABLE Syntax"。
myisamchk 不会替换符号链接的数据或索引文件。它直接在符号链接指向的文件上操作。任何临时文件都创建在数据或索引文件所在的目录下。
当删除一个符号链接的表后,链接表及其指向的表都会被删除。这就是为什么不能以 root 身份运行 mysqld 的原因,同样地,不要允许用户有权写MySQL数据库目录。
如果用 ALTER TABLE ... RENAME 语句重命名一个表且没有把它移动到其他数据库下,那么在数据库目录下的文件就被改名了,相应地,它指向的数据或索引文件也改名了。
如果用 ALTER TABLE ... RENAME 语句把表移动到其他数据库下,则这个表就移动到其他数据库目录下。旧的链接及其所指向的文件都被删掉。换言之,新的表就不再被符号链接了。
如果没有使用符号链接,那么就给 mysqld 增加选项 --skip-symbolic-links
确保无人能删除或重命名数据文件目录以外的文件。
在MySQL 4.0.15以前, SHOW CREATE TABLE 语句不会报告一个表是否有符号链接。mysqldump 也一样,它是用 SHOW CREATE TABLE 来产生 CREATE TABLE 语句的。
表符号链接操作还不支持:
ALTER TABLE 操作会忽略 DATA DIRECTORY 和 INDEX DIRECTORY 表选项。
BACKUP TABLE 和 RESTORE TABLE 也没考虑符号链接。
`.frm` 文件肯定不能被符号链接(在前面提到,索引及数据文件可以被符号链接)。企图这么做(比如用同义)的话就会导致一些错误。假设有在数据库目录下有一个数据库 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 时就有问题了:
查询缓存就会被愚弄了(它认为 tbl1 没有被更新,因此返回out-of-data结果)。
在 tbl2 上执行 ALTER 语句也会失败。
1.3 在 Windows 上符号链接数据库
从MySQL 3.23.16开始,Windows上支持用 -DUSE_SYMDIR 选项编译 mysqld-max 和 mysql-max-nt 服务器。这就可以通过符号链接把一个数据库放在其他磁盘上。这跟在Unix上做符号链接相似,只是设置过程不大一样而已。
从MySQL 4.0开始,默认支持符号链接。如果不需要,用 skip-symbolic-links 选项关闭它。
[mysqld]
skip-symbolic-links
在MySQL 4.0以前,默认不支持符号链接。想要支持它,就要在 `my.cnf' 或 `my.ini' 文件中增加如下内容:
[mysqld]
symbolic-links
在Windows上,在MySQL数据文件目录下创建一个包含目标目录路径的文件来做符号链接。这个文件的名字叫 `db_name.sym`,db_name 是数据库的名字。
假设MySQL数据文件目录是 `C:\mysql\data',现在想要把数据库 foo 放在 `D:\data\foo` 目录下。按以下方法设置:
确认 `D:\data\foo` 目录存在,如果有必要就创建它。如果在数据文件目录下已经存在一个数据库目录名为 `foo`,那么就把它移动到下 `D:\data`。否则,符号链接就不生效。移动数据库的时候最好不要运行服务器,以避免可能出现的问题。
创建一个文件 `C:\mysql\data\foo.sym`,它的内容是路径 D:\data\foo\。
之后,数据库 foo 下的所有表都会创建到`D:\data\foo` 下。注意,如果在MySQL数据文件目录下已经存在该数据库目录,那么就不会使用符号链接了。
猜你喜欢
- 到了今天,数据库已经成了网站的灵魂,可以说,没有对数据进行集中管理就算不上是一个真正的网站。而ASP加数据库,更成了主流中的主流,网站里的用
- <%@ Language=VBScript %><%Option Explicit %><%Dim strUR
- <!--模板--> <table width="100%" borde
- 今天主要向大家讲述的是优化SQL Server数据库的实际操作经验的总结,同时也有对其优化的实际操作中出现的一些问题的描述,以及对SQL S
- 如何用表单的方式推送请求的信息?具体见下:<html><head><title>答复用户信息
- 如何 在Access中选择指定日期前的记录?我知道,在Access中不能使用DateDiff,那么我们怎样才能选择指定日期前的若干记录呢?虽
- 前一段时间碰到这样的的问题,Ajax从后台得到的中文信息怎么都是空。后来到网上搜资料,大多是以下这样。用AJAX来GET回一个页面时,RES
- 注意,在改变数值之前锁定应用,确保一段时间里只有一个客户执行该语句。<SCRIPT LANGUAGE="VBScr
- 不知道工商银行帐号是否是这样的格式, 如果错了请大家见谅!<script language="javascript"
- 一般用 createProcessingInstruction 方法创建处理指令指定参数为 "xml","ve
- 显示一个字符串的前几个字符,asp中我们一般使用left(str,n)来获取。left有个不足就是处理汉字和英文字符是一样的,没有区分开,这
- 1. 用Dreamweaver 4.0轻松设计会自动弹性调整的网页 首先需要保证的是你的页面内容采用了表格的格式,然后打开你要编辑的页面,按
- 淘宝商城的 detail 页面“产品详情”部分是商家自定义区块,曾出现这样一个问题:推荐:css行高:line-height属性详解 <
- 在许多网页中,当鼠标移到一张图片上时,又弹出另一张图片,做这种广告条,要用到Macromedia DreamWeaver中的Lay
- 在制作表单的时候,我们往往用CSS来重新定义表单元素(如输入框、按钮等)的样式,以便看起来更加美观。而表单中的很多不同元素(如输入框、提交按
- asp日期转换星座函数,参数是日期型function astro(birth)astro=""if
- 随着网站访问量的加大,每次从数据库读取都是以效率作为代价的,很多用ACCESS作数据库的更会深有体会,静态页加在搜索时,也会被优先考虑。互联
- 似乎讨论分页的人很少,难道大家都沉迷于limit m,n?在有索引的情况下,limit m,n速度足够,可是在复杂条件搜索时,where s
- (1)Flush的内容至少要有256字节经过反复的测试,我得出一个结论。就是flush的内容至少要有256字节。也就是只有编译产生了至少25
- SQL Server 2008的一些新特点及独到之处:设置和安装SQL Server 2008的设置和安装也有所改进。配置数据和引擎位已经分