【mysql】数据库目录

数据库目录是mysq存放数据文件的地方,包括表文件、数据文档、mysql的服务器选项文件等。对于不同的分发,数据库目录的位置不同。查看数据库目录位置的方法:

[root@localhost com_card]# mysqladmin -uroot -p variables|grep datadir
    Enter password:
    | datadir                         | /var/lib/mysql/                          |

表示mysql服务器的数据库目录是:/var/lib/mysql/

 

 


    不同的分发,数据库目录的默认路径是:

     ◆如果您是在一个源程序分发包中安装 MySQL,典型的缺省位置可能是 /usr/local/var;

     ◆如果在二进制分发包中安装 MySQL,则为 /usr/local/mysql/ data;
     ◆在 RPM 文件中安装,为 /var/lib/mysql。
     ◆对于windwos平台上的分发,其位置时BASEDIRdata

 

 

 

数据库的表示法

由 MySQL 管理的每个数据库都有自己的数据库目录,它们是数据目录的子目录,与所表示的数据库有相同的名称。例如,数据库 my_db 对应于数据库目录 DATADIR/my_db。

这个表示法使得几个数据库级的语句的实现是非常容易的。CREATE DATABASE db_name 使用只允许对 MySQL 服务器用户(服务器运行的UNIX 用户)进行访问的所有权和方式,并在数据目录中创建一个空目录 db_name。这等价于以服务器主机中的服务器用户的身份通过执行下列命令手工创建数据库:

$ mkdir DATADIR/db_name 创建数据库目录
    $ chmod 700 DATADIR/db_name  使它仅对 MySQL 服务器用户可访问

通过空目录表示新数据库的方法与其他数据库系统完全不同,那些数据库系统甚至要为“空”数据库创建许多控制文件或系统文件。

DROP DATABASE 语句也很容易实现。DROP DATABASE db_name 删除数据目录中的 db_name 目录以及其中的所有表文件。这个语句类似于下列命令:

$rm -rf DATADIR/db_name

其区别是,服务器只删除带有表的扩展名的文件。如果已经在该数据库目录中创建了其他的文件,服务器将使它们保持完整,并且不删除该目录本身。

SHOW DATABASE 只不过是对应位于数据目录中的子目录名称的一个列表。有些数据库系统需要保留一个列出所有需要维护的数据库的主表,但是,在 MySQL 中没有这样的结构。由于数据目录结构的简单性,数据库的列表是隐含在该数据目录的内容中的,像主表这样的表可能会引起不必要的开销。

 

 

 

 

数据库表的表示法

数据库中的每个表在数据库目录中都作为三个文件存在:一个格式(描述)文件、一个数据文件和一个索引文件。每个文件的基名是该表名,扩展名指明该文件的类型。扩展名如表5-1所示。数据和索引文件的扩展名指明该表是否使用较老的 ISAM 索引或较新的 MyISAM 索引。

当发布定义一个表结构的 CREATE TABLE tbl_name 语句时,服务器创建 tbl_name.frm 文件,它包含该结构的内部编码。该语句还创建空的数据文件和索引文件,这些文件的初始信息表明没有记录和索引(如果 CREATE TABLE 语句包含索引说明,则该索引文件将反映这些索引)。描述表的文件的所有权和方式被设置为只允许对 MySQL 服务器用户的访问。

当发布 ALTER TABLE 语句时,服务器对 tbl_name.frm 重新编码并修改数据文件和索引文件的内容以反映由该语句表明的结构变化。对于 CREATE 和 DROP INDEX 也是如此,因为服务器认为它们等价于 ALTER TABLE 语句。DROP TABLE 删除代表该表的三个文件。

尽管可以通过删除数据库目录中的对应某个表的三个文件来删除该表,但不能手工创建或更改表。例如,如果 my_db 是当前的数据库,DROP TABLE my_tbl 大致等价于下列命令:

来自于 SHOW TABLES my_db 的输出结果正是 my_db 数据库目录中 .frm 文件基名的一个列表。某些数据库系统维护一个列出了数据库中的所有表的登记。但 MySQL 不这样做,因为没有必要,这个“登记”隐含在了数据目录的结构中。

 

 

MySQL的状态文件

除数据库目录外,MySQL 数据目录还包含许多状态文件。表10-3 概括介绍了这些文件。大多数状态文件的缺省名称从服务器主机名字中生成,在此表中表示为 HOSTNAME。

服务器在启动时将它的进程 ID(PID )写入 PID 文件,并在关闭时删除该文件。PID 文件是一种方法,用这种方法,其他的进程可以找到该服务器。例如,如果您在系统关闭时运行 mysql.server 脚本来关闭 MySQL 服务器,则该脚本将检查 PID 文件以确定它需要哪个进程来发送一个终止信号。

错误日志由 safe_mysqld 产生,作为服务器标准错误输出结果的重定向,它包含服务器写入 stderr 的所有消息。这意味着仅当通过调用 safe_mysqld 启动服务器时,错误日志才存在(总之,这是启动服务器的首选方法,因为,如果由于一个错误使错误日志存在,则 safe_mysqld将重新启动服务器)。
常规日志和更新日志是可选的,可以用 --log 和 --log-update 服务器选项开启需要的日志类型。

常规进程提供有关服务器运作的常规信息:谁从哪里进行了连接,以及他们发布了什么查询。更新日志也提供查询信息,但仅仅是修改过的数据库内容的查询信息。更新日志的内容是一些 SQL 语句,这些语句可以通过将它们输入到 mysql 客户机程序来运行。如果出现崩溃且必须转到备份文件时,更新日志将是有用的,因为您能够通过将更新日志输入到服务器来重复这些自崩溃以来所完成的更新操作。这将使得数据库恢复到崩溃发生时所处的状态上。

下面是一个实例,它是作为一个短客户机会话的结果出现在常规日志中的信息中的,这个会话在 test 数据库中从mytest.pet复制一个表,并插入一行到该表中,然后删除该表:

注意第二行是一个错误的语句,但是也被记录下来。 
    
常规日志包含日期和时间、服务器线程 ID、事件类型以及特定事件信息的列。
同一个会话出现在如下的更新日志中:

use test;
create table mytest select * from mytest.pet;
insert into mytest set name='tom',owner='jerry',species='cat',sex='f',birth='2000-01-01';
drop table mytest;

更新纪录中没有记录错误的语句,因此对于恢复被破坏的数据库内容非常有意义。
  
对于更新日志,日志的扩展格式是可用的,即使是用 --log - long - format 选项。扩展的日志提供有关谁何时发布查询的信息。当然,这将使用更多的磁盘空间,但是,如果您不将更新日志的内容与常规日志中的连接事件相联系就想知道谁正在做什么的话,扩展日志或许是可用的。

确保日志文件的安全且不被用户任意读取是个好注意。常规日志和更新日志都包含有诸如口令这样的敏感信息,这是因为它们包含了查询的文本。下面是您不想让任何人都能读取的日志项,因为它显示了 root 用户的口令:

010206 23:30:02       4 Query      update mysql.user set password=password("peking77.") where User="root"

有关检查可设置数据目录许可权的信息,数据目录安全的简短指令由下列命令组成:

$ chmod 700 DATADIR

以拥有该数据目录的 UNIX 用户身份来运行此命令。还要确保服务器以该用户身份运行,否则此命令不仅将其他用户排斥在该数据目录之外(您想要的),还将阻止服务器访问您的数据库(您不要的)。

状态文件出现在数据目录的最高级,就像数据库目录一样,因此您可能会想到那些文件的名字是否会相互混淆或者被误认为是数据库名(例如,当服务器正在执行 SHOW DATABASE 语句时)。答案是:不会的。状态和日志信息存储在文件中,而数据库是目录,因此可执行程序可以将它们与一个简单的 stat() 调用相区别(是服务器告诉它们怎样区分的)。如果您正在监视数据目录,则可以通过使用 ls -l 将状态文件从数据库目录中区分开来,并且检查该模式信息的第一个字符以查看它是‘-’还是‘d’:

您还可以通过查看名字而简单地告之:所有状态文件名都包含一个句点,但是数据库目录名没有句点(句点不是数据库名的合法字符)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值