随着网站的运行MySQL数据库也越来越大,备份问题也日益凸显,使用phpmyadmin导出或导入时可能会因为超时文件过大等原因无法导入或导出。下面VPS侦探说一下几个解决方法:

MySQL数据库导出

方法1:mysqldump命令

执行命令: /usr/local/mysql/bin/mysqldump -u 用户名 -p 数据库名 》 文件名

如果数据库用户名有密码密码,执行后会提示输入密码。如果数据库用户名没有密码,就将命令中的“-p”参数删除。

注意:推荐使用MySQL root帐号进行操作,因为有些数据库可能设置了只能对应的用户进行操作。

方法2:phpmyadmin

phpmyadmin支持将数据库文件直接备份到配置文件指定的目录,默认安装的lnmp使用了修改后的配置,可以将数据库直接备份到/home/wwwroot/phpmyadmin/save/ 下面,然后用户通过http或者ftp等方式下载即可。暂时没有测试过比较大的数据库,lnmp的用户可以测试一下给我反馈。

方法3:第三方软件

如:帝国备份王,专门为MYSQL大数据的备份与导入而设计的稳定高效软件,系统采用分卷备份与导入,理论上可备份任何大小的数据库。据网上的反馈看还是不错的,安装使用方法。

MySQL数据库导入

方法1:mysql命令

执行命令: /usr/local/mysql/bin/mysql -u 用户名 -p 数据库名 <文件名

参数与mysqldump的使用一样。

注意:导入的数据库名需要已经存在。

方法2:phpmyadmin

phpmyadmin可以将位于/home/wwwroot/phpmyadmin/upload/ 导入到指定的数据库里,可以上传数据库备份文件到/home/wwwroot/phpmyadmin/upload/这个目录进行导入。

方法3:第三方软件

如:帝国备份王。详细的帝国备份王安装使用方法

分类: 电脑技巧 标签: 日期:2011-04-17

Mysql的Root密码遗忘了怎么办? Mysql的Root密码遗忘的解决办法
如果忘记了 MySQL 的 root 密码,可以用以下方法重新设置:1. KILL掉系统里的MySQL进程,方法如下:a、点击桌面工具栏打开任务栏管理器。b、从任务管理器的进程中找到mysqld-nt.exe进程,点击右键选择结束进程。
2. 在命令行中输入命令 mysqld-nt --skip-grant-tables 启动MySQL,以不检查权限的方式启动;3. 然后另外开一窗口,用空密码方式使用root用户登录 MySQL;4. 修改root用户的密码;mysql> update mysql.user set password=PASSWORD("新密码") where User="root";mysql> flush privileges;mysql> quit5. 重新启动MySQL,就可以使用新密码登录了。

分类: 电脑技巧 标签: 日期:2011-03-20

information_schema数据库表说明:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

COLLATIONS表:提供了关于各字符集的对照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

KEY_COLUMN_USAGE表:描述了具有约束的键列。

ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

分类: 电脑技巧 标签: 日期:2011-03-10



方法一:
# /etc/init.d/mysql stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit

# /etc/init.d/mysql restart
# mysql -uroot -p
Enter password: <输入新设的密码newpassword>

mysql>
方法二:
直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:
# mysql -udebian-sys-maint -p
Enter password: <输入[client]节的密码>
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit

# mysql -uroot -p
Enter password: <输入新设的密码newpassword>

mysql>
方法三:
这种方法我没有进行过测试,因为我的root用户默认密码已经被我修改过了,那位有空测试一下,把结果告诉我,谢谢!!
# mysql -uroot -p
Enter password: <输入/etc/mysql/debian.cnf文件中[client]节提供的密码>

分类: 电脑技巧 标签: 日期:2011-03-09

一、什么时候应用系统会从缓存中获取数据?

  数据库从服务器上读取数据时,可以从硬盘的数据文件中获取数据,也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是,在什么样的情况下,系统是从缓存中读取数据,而不是从硬盘的数据文件中读取数据?

  简单的说,数据缓存就是内存中的一块存储区域,其存储了用户的SQL文本以及相关的查询结果。通常情况下,用户下次查询时,如果所使用的SQL文本是相同的,并且自从上次查询后,相关的纪录没有被更新过,此时数据库就直接采用缓存中的内容。从这个原则中,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件。

  一是所采用的SQL文本是相同的。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件),则服务器会从缓存中读取结果,而不需要再去解析和执行SQL语句。这里需要注意的是,这里的SQL文本必须一次不差的完全相同。如果前后两次查询,使用了不同的查询条件。如第一次查询时没有输入Where条件语句。后来发现数据量过多,利用了Where条件了过滤查询的结果。此时即使最后的查询结果是相同的,系统仍然是从数据文件中获取数据,而不是从数据缓存中。再如,Select后面所使用的字段名称也必须是相同的。如果有一个字段名称不同或者前后两次查询所使用的字段数量不同,则系统都会认为是不同的SQL语句,而重新解析并查询。

  二是从数据缓存的角度考虑,大小写是不敏感的。如前后两次查询时,采用的字段名称可能只有大小写的差异。如第一次使用的是大小,第二次使用的是小写,这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。

  三是要满足二次查询之间,数据记录包括表结构都没有被更改过。如果记录所在的标更改了,如增加了一个字段等等,此时使用这个表的所有缓冲数据系统将自动清空。这里需要注意,这里指的更改是一个广义的更改,包括表中任何数据或者结果的改变。举一个简单的例子,第一次查询时用户需要查询2010年的出货数据。查询后有用户在这个表中插入了一条2011年1月份的出货信息。然后又有用户需要查询2010年的出货信息。使用的SQL语句与第一次查询时完全相同。在这种情况下,数据库系统会使用缓存中的数据吗?答案是否定的。因为当中间用户插入一条记录时,系统会自动清空跟这个表相关的所有缓存记录。当第二次查询时,缓存中已经没有这张表对应的缓存信息。此时就需要重新解析并查询。

  四是需要注意,默认字符集对缓存命中率的影响。通常情况下,如果客户端与服务器之间所采用的默认字符集不同,则即使查询语句相同、在两次查询之间记录与表结构也没有被更改,系统仍然认为是不同的查询。对于这一点需要特别的注意,大家比较容易忽视。

  二、提高缓存命中率的建议。

  从上面的条件分析中可以看出,利用缓存中的数据具有比较严格的条件。其实这些条件也是合情合理的。主要是为了保障数据的一致性。对以上这些条件有深入的认识之后,现在数据库管理员需要考虑的是,如何来提高这个缓存的命中率?对此笔者有如下几个建议。

  一是在配置时,客户端与服务器端要使用相同的字符集。如果客户端(或者说第三方工具)与服务器端使用的字符集不同,那么任何情况下都不会使用缓存功能。特别在国内,需要用到中文的字符集。此时特别需要注意,客户端默认字符集要与服务器端的默认字符集相同。注意,这里是相同,而不是兼容。有时候即使采用了不同的字符集,客户端上仍然可以正常显示。这主要是因为有些字符集虽然不相同,但是是相互兼容的。在缓存管理上,需要相同,光兼容还不行。

  二是在客户端上,要固化查询的语句。如现在有财务人员和采购人员同时从系统中查询11月份的出货数据。显然他们岗位职责不同,所需要字段的内容是不同的。此时在客户端出,可以允许用户设置自己所需要的表单格式。但是笔者建议,后台所采用的SQL语句最好是相同的。这里数据会经过三个渠道:后台数据库、客户端、用户。笔者的意识时,后台数据库与客户端之间的交互采用相同的SQL语句。然后客户端与用户之间进行交互时,根据用户定义的格式(包括字段前后的排列、不包括查询条件语句的差异)向用户显示数据。此时由于采用了相同的SQL语句(只是用户对于显示格式的要求不同),从而可以提高应用系统的查询效率。

  三是提高内存中缓存的配置,来提高命中率。一般在服务器启动时,操作系统会跟数据库软件协商缓存空间的大小。当缓存工作不足时,缓存中最旧的缓存记录会被最新的消息所覆盖。可见,如果能够提高缓存空间,就可以提高命中率。这就好像打靶,目标多了,命中的几率也会高许多。不过用户的并发数越多,这个设置的效果会越不明显。

  四是通过分区表可以提高缓存的命中率。在上面的条件分析中,大家可以看到,只要所查询的表中插入了一条记录,系统就会清空缓存记录。现在以查询出货记录为例。出货记录表每天都在更新,而用户在年初时,会经常需要查询上一年的出货记录。此时由于这个表中的数据每个小时都在更新,那么缓存中的信息会不断的被情况。此时缓存的命中率显然不会很高。针对这种情况,笔者建议可以采用分区表。如可以通过系统设置,将2010年的出货记录单独存放在一个出货的分区表中。即每一个年度都使用一张单独的分区表。此时2011年的纪录,就不会影响到2010年的分区表。此时如果用户重复查询2010年的出货信息,只要其使用的SQL语句相同(没有采用不同的查询条件),那么就可以享受缓存机制所带来的效益,提高应用系统的查询效果。。

  三、多个应用对缓存的影响。

  通常情况下,MySQL数据库的缓存是根据服务器内存的大小自动分配的。如果一台服务器上只有一个MySQL应用,那么固然最好。不过在实际工作中,为了降低信息化投资的成本,往往会在同一台服务器上布置多个信息化应用。由于其他信息化应用也需要使用内存的空间作为缓存,那么MySQL数据库中缓存空间就可能变小。如果遇到这种情况下,数据库管理员需要跟系统工程师进行协商,为各种不同的应用根据性能要求的不同,手工设置不同的缓存空间。如此的话,就可以避免同一台服务器上不同信息化应用对缓存的冲突。

分类: 网页设计 标签: 日期:2011-02-10

1.优化你的MySQL查询缓存

在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。

但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它。在有些处理任务中,我们实际上是可以阻止查询缓存工作的。

// query cache does NOT work    
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");    
   
// query cache works!    
$today = date("Y-m-d");    
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");   
// query cache does NOT work
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); 
// query cache works! 
$today = date("Y-m-d"); 
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

2.用EXPLAIN使你的SELECT查询更加清晰

使用EXPLAIN关键字是另一个MySQL优化技巧,可以让你了解MySQL正在进行什么样的查询操作,这可以帮助你发现瓶颈的所在,并显示出查询或表结构在哪里出了问题。

EXPLAIN查询的结果,可以告诉你那些索引正在被引用,表是如何被扫描和排序的等等。

实现一个SELECT查询(最好是比较复杂的一个,带joins方式的),在里面添加上你的关键词解释,在这里我们可以使用phpMyAdmin,他会告诉你表中的结果。举例来说,假如当我在执行joins时,正忘记往一个索引中添加列,EXPLAIN能帮助我找到问题的所在。

添加索引到group_id field后

3.利用LIMIT 1取得唯一行

有时,当你要查询一张表是,你知道自己只需要看一行。你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句。

在这种情况下,增加一个LIMIT 1会令你的查询更加有效。这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。、

// do I have any users from Alabama?    
// what NOT to do:    
$r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'");    
if (mysql_num_rows($r) > 0) {    
    // ...    
}      
// much better:    
$r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1");    
if (mysql_num_rows($r) > 0) {    
    // ...    
}  

4. 索引中的检索字段

索引不仅是主键或唯一键。如果你想搜索表中的任何列,你应该一直指向索引。

5.保证连接的索引是相同的类型

如果应用程序中包含多个连接查询,你需要确保你链接的列在两边的表上都被索引。这会影响MySQL如何优化内部联接操作。

此外,加入的列,必须是同一类型。例如,你加入一个DECIMAL列,而同时加入另一个表中的int列,MySQL将无法使用其中至少一个指标。即使字符编码必须同为字符串类型。

// looking for companies in my state    
$r = mysql_query("SELECT company_name FROM users   
    LEFT JOIN companies ON (users.state = companies.state)   
    WHERE users.id = $user_id");    
// both state columns should be indexed    
// and they both should be the same type and character encoding    
// or MySQL might do full table scans

6.不要使用BY RAND()命令

这是一个令很多新手程序员会掉进去的陷阱。你可能不知不觉中制造了一个可怕的平静。这个陷阱在你是用BY RAND()命令时就开始创建了。

如果您真的需要随机显示你的结果,有很多更好的途径去实现。诚然这需要写更多的代码,但是能避免性能瓶颈的出现。问题在于,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后给你仅仅返回一行。

// what NOT to do:    
$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");    
// much better:    
$r = mysql_query("SELECT count(*) FROM user");    
$d = mysql_fetch_row($r);    
$rand = mt_rand(0,$d[0] - 1);    
$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");   

7.尽量避免SELECT *命令

从表中读取越多的数据,查询会变得更慢。他增加了磁盘需要操作的时间,还是在数据库服务器与WEB服务器是独立分开的情况下。你将会经历非常漫长的网络延迟,仅仅是因为数据不必要的在服务器之间传输。

始终指定你需要的列,这是一个非常良好的习惯。

// not preferred    
$r = mysql_query("SELECT * FROM user WHERE user_id = 1");    
$d = mysql_fetch_assoc($r);    
echo "Welcome {$d['username']}";    
// better:    
$r = mysql_query("SELECT username FROM user WHERE user_id = 1");    
$d = mysql_fetch_assoc($r);    
echo "Welcome {$d['username']}";     
// the differences are more significant with bigger result sets  

8.从PROCEDURE ANALYSE()中获得建议

PROCEDURE ANALYSE()可让MySQL的柱结构分析和表中的实际数据来给你一些建议。如果你的表中已经存在实际数据了,能为你的重大决策服务。

9.准备好的语句

准备好的语句,可以从性能优化和安全两方面对大家有所帮助。

准备好的语句在过滤已经绑定的变量默认情况下,能给应用程序以有效的保护,防止SQL注入攻击。当然你也可以手动过滤,不过由于大多数程序员健忘的性格,很难达到效果。

// create a prepared statement    
if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {     
    // bind parameters    
    $stmt->bind_param("s", $state);     
    // execute    
    $stmt->execute();     
    // bind result variables    
    $stmt->bind_result($username);      
   // fetch value    
    $stmt->fetch();     
    printf("%s is from %s\n", $username, $state);      
    $stmt->close();    
}  

10.将IP地址存储为无符号整型

许多程序员在创建一个VARCHAR(15)时并没有意识到他们可以将IP地址以整数形式来存储。当你有一个INT类型时,你只占用4个字节的空间,这是一个固定大小的领域。

你必须确定你所操作的列是一个UNSIGNED INT类型的,因为IP地址将使用32位unsigned integer。

$r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

分类: 电脑技巧 标签: 日期:2011-02-05

debian需要安装libaio

apt-get install libaio1

然后输入命令

shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
这里我用的这句:scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
shell> chown -R root .
shell> chown -R mysql data
shell> cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf # Option

这里需要修改innodb设置
shell> bin/mysqld_safe --user=mysql &
shell> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server # Optional

这里设置

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

最后开机自启动

update-rc.d mysql.server defaults

分类: 电脑硬件 标签:, 日期:2011-01-23

MySQL左连接查询是联合查询中的一种方式,就是说把两个相关的表通过这种方式联合在一起查询,从而更加方便调用数据,避免多层循环嵌套。

左连接查询所用关键字 left join
,书面解释如下:

左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
下面我解释一下,也就是说左链接查询的返回结果既包含了left join关键字左边表的全部资料,同时也包含了与左表匹配的右表中的符合条件的资源。 简单的说就是以左表为中心,连带右表中的符合条件的资源。

Sql语句的写法:

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

相信大家看完之后一定很晕把,没关系,我解释一下大家就都明白了,看似复杂,其实条理很清楚。它的意思是:


select a.a , a.b

a.a 就是a表中的a字段的意思。


Select与from之间放的就是a表 b表中的相关要查询的字段。


from a LEFT OUT JOIN b
就是 从以a表为主左链接上右表b ,
匹配条件是 a表的a字段等于b表的c字段。

通过这几点解释相信大家也都明白百分之八十了,下面我们通过实例的演示再给大家说一下:

首先建立两个表

表pic
用于存放图片名字的表

CREATE TABLE `image`.`pic` (

`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`pname` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

) ENGINE = InnoDB

表二 用于存放图片评论的

CREATE TABLE `image`.`comment` (

`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`pid` INT( 10 ) NOT NULL ,
`content` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

) ENGINE = InnoDB

下面我要联合查询这两个表通过一条sql语句,注意以前咱们查询两个表肯定是先写一个表的sql然后在根据条件循环查询另一个表,现在不用了,通过这种查询,把返回结果放到一个数组中,

Sql语句写法:select
pic.*,comment.*
from
pic left join comment
on
pic.id=comment.pid

代码如下:
$conn = mysql_connect("localhost","root","");
if(!$conn){
die('连接MySQL数据库失败: ' . mysql_error());
}

mysql_select_db('image');

$sql="select
pic.*,comment.*
from
pic left join comment
on
pic.id=comment.pid";
$re=mysql_query($sql);
while($re1=mysql_fetch_array($re))
{
$arr[]=$re1;
}
print_r($arr);

打印结果如下:

Array
(
[0] => Array
(
[0] => 1
[id] => 1
[1] => aaaaaaaaa
[pname] => aaaaaaaaa
[2] => 1
[3] => 1
[pid] => 1
[4] => ccccccc
[content] => ccccccc
)
[1] => Array
(
[0] => 2
[id] => 2
[1] => bbbbbbbbbbb
[pname] => bbbbbbbbbbb
[2] => 2
[3] => 2
[pid] => 2
[4] => vvvvvvv
[content] => vvvvvvv
)
)
Ok

分类: 网页设计 标签: 日期:2011-01-03

甲骨文公司宣布 MySQL5.5 正式发行!

现在,包括默认的 InnoDB 存储引擎,MySQL5.5 提供显着的性能和可扩展性的改进,以在运行最新的在多CPU和多核心硬件和操作系统时,提供最佳化性能和可扩展性。

这个在线网络研讨会将介绍MySQL 5.5 性能精进所带来的的更好的基准测试数据。随着收购Sun,甲骨文不断投资改善MySQL以使MySQL成为更好的MySQL。请加入我们,了解我们从MySQL数据库本身到整个MySQL的产品系列的开发,管理和监视工具上有什么具体成就。

分类: 网络感想 标签: 日期:2010-12-30

配置MySQL服务器是一个丰富而复杂的工作。在本文中,我只能肤浅的说一下各种选项。可以使用的MySQL配置文件共有5个。

·/etc/my.cnf是默认的MySQL配置文件。应该对这个文件配置修改。它是为学习目的而设计的。

·my-small.cnf是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。

·my-medium.cnf是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。

·my-large.cnf是为专用于一个SQL数据库的计算机而设计的。由于它可以为该数据库使用多达512MB的内存,所以在这种类型的系统上将需要至少1GB的RAM,以便它能够同时处理操作系统与数据库应用程序。

·my-huge.cnf是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。

这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增加,数据库的性能可能会发生变化。

我将逐个的说明这些配置文件。如果用户决定使用my-*.cnf文件之一,将首先需要把这个文件复制到/etc/my.cnf文件上。

由于这些原因,用户应该仔细观察数据库系统的性能。如果发现问题,可能需要增加更多的RAM,或者把数据库迁移到一个含有附加资源(比如多个CPU)的系统上。

提示:数据库变得非常大。把一个SQL数据库目录配置在一个专用分区上可能更有道理。虽然一个不断增长的数据库可能会占满整个分区,但它至少不会吞掉RHEL运行所必需的磁盘空间。

/etc/my.cnf文件

默认是/etc/my.cnf文件。它包含6条命令,并且这6条命令被组织在3个配置段中。这些配置段与Samba配置文件中的配置段相似,并且含有功能组名称和相关的命令。本文将逐行的说明这个文件的默认版本。如果用户进行了任何修改,将需要确保MySQL启动脚本(即/etc/rc.d /init.d/mysqld)中的命令一致。

[mysqld]

在这个配置段之内,将会看到与MySQL守护进程相关的命令。

datadir=/var/lib/mysql

MySQL服务器把数据库存储在由datadir变量所定义的目录中。

Socket=/var/lib/mysql/mysql.sock

MySQL套接字把数据库程序局部的或通过网络连接到MySQL客户。

提示:MySQL被配置成使用InnoDB存储器引擎。如果用户在自己的系统上还没有一个InnoDB数据库,将需要给[mysqld]配置段添加skip-innodb语句。

[mysql.server]

在这个配置段之内,将会看到MySQL服务器守护进程有关的命令。这个配置段的较早期版本被命名为[mysql_server]。如果使用 MySQL4.X或MySQL4.X以上版本,将必须把这个配置段标题改成[mysql_server]。当启动MySQL服务时,它使用这个配置段中的选项。

user=mysql

与MySQL服务相关联的标准用户名是mysql。它应该是/etc/passwd文件的一部分;如果在这个文件中没有发现它,用户可能还没有安装Red Hat Enterprise Linux mysql-server RPM程序包。

basedir=/var/lib

这表示MySQL数据库的顶级目录。它充当MySQL系统上的一个根目录;这个数据库中的其它目录都是相对于这个目录。

[safe_mysqld]

这个配置段包含MySQL启动脚本所引用的命令。如果使用MySQL4.X或4.X以上版本,必须把这个配置段改成[mysqld_safe]。

err-log=/var/log/mysqld.log

这是MySQL所关联的错误被发送到的这个文件。如果使用MySQL4.X或4.X以上版本,必须使用log-error指令替换这条命令。

pid-file=/var/run/mysqld/mysqld.pid

最后,pid-file指令定义MySQL服务器在运作期间的进程标识符(PID)。如果MySQL服务器当前没有运行,这个文件应该不存在。

提示:用户可以配置与用户特定相关的MySQL配置文件;为此,只需给指定用户主目录中的.my.cnf隐含文件添加所选的配置命令即可。

my-samll-cnf

在本文中,将说明my-small-cnf配置文本中的所有命令。当回顾其它MySQL样本配置文件时,将参考本文所解释的各条命令和指令的含义。先从下面这个配置段开始分析该文件中的有效命令和指令:

[client]

这个配置把指令传递给与MySQL服务器相关的客户。

port=3306

MySQL所相关的标准TCP/IP端口是3306。如果需要修改这个端口号(可以增强安全),必须确保用于MySQL客户与服务器的所有相应配置文件中均修改这个号。

socket=/var/lib/mysql/mysql.sock

正像默认的/etc/my.cnf文件中所定义的那样,这是控制MySQL客户与服务器间通信的标准套接字文件。

[mysqld]

当启动MySQL服务器时,它由[mysqld]配置段中所定义的命令来控制。

port=3306

socket=/var/lib/mysql/mysql.sock

当然,与同一个MySQL数据库相关的客户与服务器需要使用相同的TCP/IP端口和套接字。

skip-locking

多个客户可能会访问同一个数据库,因此这防止外部客户锁定MySQL服务器。这个skip-locking命令是MySQL4.X或4.X以上版本中的skip-external-locking命令。

一般来说,如果正在使用MySQL4.X或4.X上以版本,这个set-variable指令没有必要带有这个列表中的这些命令。

set-variable=key_buffer=16k

这个缓冲区确实很小;如果一个数据库在一个文本文件中包含不止几百行数据,它将会超载这个缓冲区的容量。这个数据库可能不会超载一个文本文件地址簿的容量。如果这不只是一个供个人使用的数据库,这个限额很快就会被达到。假使那样的话,可能需要考虑与其它配置文件之一相关的那些限额。

set-variable=max_allowed_packet=1M

当然,与一个数据库相关的信息会增加到超出实际数据。在默认的情况下,如果该信息在一个服务器上超过1MB以上,MySQL将会产生一条错误信息。

set-variable=thread_stack=64k

这条指令限定用于每个数据库线程的栈大小。默认设置足以满足大多数应用。

set-variable=table_cache=4

用户可以限定一个数据库中打开表的数量;越小的限额(默认值是64)适合越小规模的数据库。

set-variable=sort_buffer=64k

在处理一个数据库时,用户可能需要内存中附加的缓冲区空间。

set-variable=net_buffer_length=2k

正如net_buffer_length指令所定义的,MySQL服务器还给传入的请求保留了空间。

server-id=1

一般来说,如果有一个MySQL主服务器,应该把它的server-id设置成1;应该把MySQL从属服务器的server-id设置成2;

[mysqldump]

用户可以在不同类型的SQL数据库之间传输数据,这由[mysqldump]配置段中的命令来控制。

quick

quick选项支持较大数据库的转储。

set-variable=max_allowed_packet=16M

当然,用来传输数据库表到其它数据库的max_allowed_packet大于客户与服务器之间的简单通信所使用的信息包。

[mysql]

no-auto-rehash

这个配置段设置启动MySQL服务的条件;在这种情况下,no-auto-rehash确保这个服务启动得比较快。

[isamchk]

[myisamchk]

像SQL这样的关系数据库用所谓的Indexed Sequential Access Method(索引顺序存取方法,简称ISAM)来处理。这两个配置段中的命令是相同的;这些命令与检查并修复数据库表的同名命令有关。

set-variable=key_buffer=8M

set-variable=sort_buffer=8M

在前面谈及MySQL服务器时,用户己经见过这些变量。它们在这里都比较大,以便支持数据库的较快速检查与修复。

[mysqlhotcopy]

interactive-timeout

正如[mysqlhotcopy]配置段所指定的,在一个数据库复制操作期间,连接会挂起。在默认情况下,interactive-timeout变量把一个数据传输的最大时间量设置为28800秒(8个小时)。

my-medium.cnf文件

与中等数据库相关的MySQL配置文件含有和my-small-cnf配置文件中一样的有效配置段。在[mysqld]配置段中,下面这些命令支持较大规模的服务器数据库:

set-variable=key_buffer=16M

set-variable=table_cache=64

set-variable=sort_buffer=512K

set-variable=net_buffer_length=8K

log-bin

一般来说,这个配置段中的命令支持服务器上的较大高速缓存与缓冲区长度。应该看到两条新命令。

set-variable=myisam_sort_buffer_size=8M

log-bin

myisam_sort_buffer_size命令允许MySQL索引数据库,第二条命令支持二进制日志记录方法。

[isamchk]

[myisamchk]

当然,这两个配置段中的缓冲区比用于数据库传输的缓冲区大,这个文件包含下面这些命令;它们发送消息到服务器和接收来自服务器的消息。

set-variable=read_buffer=2M

set-variable=write_buffer=2M

my-large.cnf文件

与较大型数据库相关的MySQL配置文件含有和my-samll-cnf配置文件中一样的有效配置段。在本文中,将比较my-large-cnf与my-medium-cnf样本文件中的各条命令。在[mysqld]配置段中,下面这些命令支持较大型的服务器数据库:

set-variable=key_buffer=256M

set-variable=table_cache=256

set-variable=sort_buffer=1M

set-variable=myisam_sort_buffer_size=64M

set-variable=net_buffer_length=8K

这个配置段中有3条附加的命令。record_buffer命令保存对一个数据库中不同表的扫描结果。thread_cache命令对多请求有用;空闲线程被高速缓存起来,进而允许新的搜索操作采用己有的线程。只要这防止搜索操作启动新的服务器进程,这就能减轻系统上的负荷。

set-variable=record_buffer=1M

set-variable=thread_cache=8

set-variable=thread_concurrency=8

thread_concurrency变量限定同时运行的线程数量。my-large.cnf样本文件建议用户应该把这个数量限定于本计算机上CPU数量的两倍;这个特定设置相当于4个CPU。

my-huge.cnf文件

my-huge.cnf文件含有和my-large.cnf配置文件中一样的命令。当然,分配给大多数指令的值比较大并适合较大型的数据库。

分类: 电脑技巧 标签:, 日期:2010-12-18