详细讲解MySQL数据库双机热备的配置方法

MySQL数据库双机热备的配置方法:

◆1.MySQL数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好MySQL数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中。实现MySQL数据库的热备份。

◆2.要想实现双机的热备首先要了解主从数据库服务器的版本的需求。要实现热备MySQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。

◆3.设置主数据库服务器:

·a.首先查看主服务器的版本是否是支持热备的版本。然后查看my.cnf(类 unix)或者my.ini(windows)中mysqld配置块的配置有没有log-bin(记录数据库更改日志),因为MySQL的复制机制是基于 日志的复制机制,所以主服务器一定要支持更改日志才行。然后设置要写入日志的数据库或者不要写入日志的数据库。这样只有您感兴趣的数据库的更改才写入到数 据库的日志中。

server-id=1 //数据库的id这个应该默认是1就不用改动

log-bin=log_name //日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称

binlog-do-db=db_name //记录日志的数据库

binlog-ignore-db=db_name //不记录日志的数据库

以上的如果有多个数据库用","分割开

然后设置同步数据库的用户账号

mysql> GRANT REPLICATION SLAVE ON *.*

-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

4.0.2以前的版本, 因为不支持REPLICATION 要使用下面的语句来实现这个功能

mysql> GRANT FILE ON *.*

-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

设置好主服务器的配置文件后重新启动数据库

·b.锁定现有的数据库并备份现在的数据

锁定数据库

mysql> FLUSH TABLES WITH READ LOCK;

备份数据库有两种办法一种是直接进入到MySQL的data目录然后打包你需要备份数据库的文件夹,第二种是使用mysqldump的方式来备份数据库但是要加上"--master-data " 这个参数,建议使用第一种方法来备份数据库

·c.查看主服务器的状态

mysql> show master status\G;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| mysql-bin.003 | 73 | test | manual,mysql |

+---------------+----------+--------------+------------------+

记录File 和 Position 项目的值,因为以后要用。

·d.然后把数据库的锁定打开

mysql> UNLOCK TABLES;

◆4.设置从服务器

a.首先设置数据库的配置文件

server-id=n //设置数据库id默认主服务器是1可以随便设置但是如果有多台从服务器则不能重复。

master-host=db-master.mycompany.com //主服务器的IP地址或者域名

master-port=3306 //主数据库的端口号

master-user=pertinax //同步数据库的用户

master-password=freitag //同步数据库的密码

master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差

report-host=db-slave.mycompany.com //报告错误的服务器

b.把从主数据库服务器备份出来的数据库导入到从服务器中

c.然后启动从数据库服务器,如果启动的时候没有加上"--skip-slave-start"这个参数则进入MySQL中

mysql> slave stop; //停止slave的服务

d.设置主服务器的各种参数

mysql> CHANGE MASTER TO

-> MASTER_HOST='master_host_name', //主服务器的IP地址

-> MASTER_USER='replication_user_name', //同步数据库的用户

-> MASTER_PASSWORD='replication_password', //同步数据库的密码

-> MASTER_LOG_FILE='recorded_log_file_name', //主服务器二进制日志的文件名(前面要求记住的参数)

-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记住的参数)

e.启动同步数据库的线程

mysql> slave start;

查看数据库的同步情况吧。成功同步!

查看主从服务器的状态

mysql> SHOW PROCESSLIST\G //可以查看mysql的进程看看是否有监听的进程

如果日志太大清除日志的步骤如下:

1.锁定主数据库

mysql> FLUSH TABLES WITH READ LOCK;

2.停掉从数据库的slave

mysql> slave stop;

3.查看主数据库的日志文件名和日志文件的position

show master status;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_do_db | Binlog_ignore_db |

+---------------+----------+--------------+------------------+

| louis-bin.001 | 79 | | mysql |

+---------------+----------+--------------+------------------+

4.解开主数据库的锁

mysql> unlock tables;

5.更新从数据库中主数据库的信息

Changed limits: max_open_files: 2048 max_connections: 1024 table_cache: 507

Changed limits: max_open_files: 2048 max_connections: 1024 table_cache: 507

这个问题怎么解决啊!

在windows下安装Mysql系统日志出现 max_open_files: 2048 max_connections: 510 table_cache: 764 类似错误是因为 max_connections 最大连接数和max_open_filestable_cache 不匹配。适当的降低max_connections 或调整其他两个数值
解决办法在 mysql bin > 中输入
mysql-nt --table_cache=764
mysql-nt --innodb_open_files=2048   即可!!

table_cache和max_connections 在my.ini 里可调

Changed limits:
max_open_files: 2048
max_connections: 1024
table_cache: 507

max_connections=1024

table_cache=500

OK,问题不一定解决,只要MYSQL运行正常就行.

按以上的方法处理后还是有啊!

MySql Query Cache 查询缓存介绍(1)

MySql Query Cache 和 Oracle  Query Cache 是不同的, Oracle Query Cache 是缓存执行计划的,而MySql Query Cache 不缓存执行计划而是整个结果集。缓存整个结果集的好处不言而喻,但由于缓存的是结果集因此Query必须是完全一样的,这样带来的后果就是平均 Hit Rate 命中率一般不会太高。 Query Cache 对于一些小型应用程序或者数据表的数据量不大的情况下效果是最为明显的。

作为一个新的特性,MySql Query Cache 有什么特典和局限呢? 咱一个一个来说:

1、Cache 机制对应用程序是透明的。在应用程序中只是改变查询语句的语义,也能得到缓存中的查询结果集。如果你没有使用 query_cache_wlock_invalidate=ON   来提示MySql 锁表将要进行写操作,那么此时的查询即使表在锁Lock状态下或者预备更新的状态下,仍然可以从缓存中获得结果集;

2、只缓存整个查询结果集,即对子查询,内联视图和部分UNION的查询是不缓存的;

3、缓存机制工作在Packet 级别,第二项的只缓存整个查询结果集就是因为局限于这个机制的原因。由于没有额外的转换和处理,所以保证缓存结果集返回能够非常快;

4、缓存处理在解析查询前进行,保证缓存高性能的一个原因就是查询缓存在执行查询解析前先查找是否已经存在缓存,如果已经存在查询缓存,则直接返回结果集。

5、 查询必须绝对完全同,由于在查找缓存是否存在前不进行查询解析( Query Parser )所以查询并没有经过规范化处理(Normalized),因此缓存查找的过程是按字节顺序进行的 ( Byte by byte )。更具体点说吧:在每次查询时包不同的注释、多余的空格以及大小写不同等等,都不会指向同一个缓存结果集。

6、只有 SELECT 语句被缓存。 插入、删除、更新当然不需要进行缓存了,同时 SHOW 命令和 存储过程 stored procedure (包括存储过程中的SELECT)也不会进入缓存结果集。

7、空格和注释不要出现在查询语句的最前面,当查找缓存时第一个字幕如果不是"S" ,就会停止查询缓存结果集了。第5、6项已经解释过了;

8、不支持预备查询 prepared statement 和 游标 cursors 。 ( ? )

9、或许不支持事务处理。(?)

10、查询结果必须完全一致,才能进入缓存结果集。比如:查询语句中有 UUID , RAND , CONNECTION_ID 等会动态改变查询结果集的函数,都不会进入缓存结果集的;

11、查询缓存失效的粒度级别的是表,当表被修改时,所有与改表相关的缓存立即失效( invalidation )。

12、过长时间的查询缓存容易造成碎片 fragmentation  ,这一点和Windows的磁盘管理的碎片整理类似,长时间查询缓存产生的碎片对执行效率有一定影响。可以把查询缓存碎片看作是是查询缓存可用内存(Qcache_free_memory)的块(Qcache_free_blocks )。FLUSH QUERY CACHE  命令可以削除这种情况。

13、设定适当大小的查询缓存用的内存,由于前面提到的一些原因,一般情况下MySql 的查询缓存机制对内存的需求不可能无限增长,因此设定一个适当的查询缓存内存值是比较经济的做法。可以通过查看 Qcache_free_memory 和 Qcache_lowmem_prunes 的状态来进行适当设置。

14、查询缓存的运行模式,默认情况下开启缓存后MySql 的缓存机制对全局的有效,如果你只想对特定的查询语句使用缓存,可以通过把 query_cache_type  设定为 “DEMAND” 并且在查询语句中加入: SQL_CACHE  来进行,比如:SELECT SQL_CACHE DomoloSeoHelper from domolo where author='tianchunfeng' 。

上面为你介绍了 Mysql 查询缓存的一些基本特点,那么如何监控Mysql 查询缓存的运行时状态呢?比如监控查询缓存的命中率,调节查询缓存的内存大小等等数据。

可以使用下面的命令:

mysql> show status like ‘Qcache%’;

输出:

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16766912 |
| Qcache_hits             | 3        |
| Qcache_inserts          | 1        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 6        |
| Qcache_queries_in_cache | 1        |
| Qcache_total_blocks     | 4        |
+-------------------------+----------+

MySQL 性能优化(show processlist中出现大量未认证的连接 建立连接缓慢 unauthenticated user)

症状:
MySQL重启后,发现连接非常慢,建立连接后做普通操作还是非常快的,通过Show processlist发现大量unauthenticated user连接

解决办法:
MySQL启动参数增加一个skip-name-resolve,即不启用DNS反响解析

解决过程(推荐学习 :))

1. 同一局域网不同机器上连接MySQL服务器,观察响应速度;(非常慢)
2. 连接建立后做一些简单的操作(非常快 和上面不符,说明不是服务器压力导致的)
3. 通过tcpdump查看连接的时候详细的响应过程(能看到连接的时候和服务器的多次通讯及所耗费的时间)
4. 发现正常响应很快,用户名、密码发送完后很长一段时间服务器才给响应
5. 在服务器上进行同样的连接连接操作,试着分别用IP和机器名去连接看响应速度(看是不是IP解析的时候耗费时间了)
6. 修改/etc/hosts文件,加入服务器、客户端的IP对应(没有作用 :()
7. 增加启动参数skip-name-resolve速度立即加快了(问题解决)

原因:
MySQL的认证实际上是user+host的形式(也就是说user可以相同),所以MySQL在处理新连接时会试着去解析客户端连接的IP(查呀查,查不到就算了,可是时间浪费了啊),启用参数skip-name-resolve后MySQL授权的时候就只能用纯IP的形式了,MySQL在这里处理的有点弱智,通过IP连过来的查什么查,又查不到:)
如果用的localhost连接的话,一旦添加上了上面的参数,将出现拒绝ip访问的错误信息!

Mysql 常见错误集锦!

今天因为mysql服务没打开,mysql不能使用,以前从没出现这种服务没开启的问题。因为以前服务一直都是开的。

一开始以为是权限问题,因为错误提示里有‘localhost’权限的字样,于是狂改,还是一直有问题,网上的类似问题也都试了,都无效。

于是决定卸了,重装,但在千钧一发之际,经一哥们指点,发现是服务没开。我晕死..............................................

看来我的Windows操作也太薄弱了。

这不,搞了一天mysql的错误,于是总结如下:

***************************Mysql 常见错误集锦*********************************

1. Host ’...’ is blocked错误
如果你得到象这样的一个错误:
Host ’hostname’ is blocked because of many connection errors.
Unblock with ’mysqladmin flush-hosts’

这意味着,mysqld已经得到了大量(max_connect_errors)的主机’hostname’的在中途被中断了的连接请求。在max_connect_errors次失败请求后,mysqld认定出错了(象来字一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令mysqladmin flush-hosts
缺省地,mysqld10个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它:
shell> safe_mysqld -O max_connect_errors=10000 &

注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的TCP/IP连接有没有问题。如果你的TCP/IP连接不在运行,增加max_connect_errors变量的值对你也不会有帮助!

2. Too many connections错误
如果在你试土连接MySQL时,你得到错误Too many connections,这意味着已经有max_connections个客户连接了mysqld服务器。
如果你需要比缺省(100)更多的连接,那么你应该重启mysqld,用更大的 max_connections 变量值。
注意,mysqld实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用Process权限的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且使用SHOW PROCESSLIST找出什么可能出错。见7.21 SHOW句法(得到表,列的信息)。
3. Out of memory错误
如果你发出查询并且得到类似于下面的错误:
mysql: Out of memory at line 42, ’malloc.c’
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

注意,错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。
为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这样,你可以使用mysql --quick,它使用mysql_use_result()检索结果集合。这将较少的负担放在了客户端(只是服务器更多)

4.Packet too large错误
当一个MySQL客户或mysqld服务器得到一个比max_allowed_packet个字节长的包,它发出一个Packet too large错误并终止连接。
如果你正在使用mysql客户,你可以通过用mysql --set-variable=max_allowed_packet=8M指定一个更大的缓冲区来启动客户程序。
如果你正在使用不允许你指定最大包大小的其他客户(例如 DBI),你需要在你启动服务器时设置包大小。你可以使用mysqld的命令行选项设置max_allowed_packet为一个更大的尺寸。例如,如果你正期望将一个全长的BLOB存入一张表中,你将需要用--set-variable=max_allowed_packet=24M选项来启动服务器。

5. The table is full错误
这个错误发生在内存临时表变得比tmp_table_size字节大时。为了避免这个问题,你可以使用mysqld-O tmp_table_size=#选项来增加临时表的大小,或在你发出有疑问的查询之前使用SQL选项SQL_BIG_TABLES。见7.25 SET OPTION句法。
你也可以使用--big-tables选项启动mysqld。这与为所有查询使用SQL_BIG_TABLES完全相同。

6. Commands out of sync in client错误
如果你在你的客户代码中得到Commands out of sync; You can’t run this command now,你正在以错误的次序调用客户函数!
这可能发生,例如,如果你正在使用mysql_use_result()并且在你已经调用了mysql_free_result()之前试图执行新查询。如果你在mysql_use_result()mysql_store_result()之间试图执行返回数据的2个查询,它也可能发生。

7. Ignoring user错误
如果你得到下列错误:
Found wrong password for user: ’some_user@some_host’; Ignoring user
这意味着在mysqld启动时或在它再次装载权限表时,它在user表中找到了一个有一个无效口令的条目。结果,条目简单地被权限系统忽略。
可能导致这个问题的原因和修正:
你可能正在运行一个有一个老的user表的新版本mysqld。你可以通过执行mysqlshow mysql user看看口令字段是否少于 16个字符来检查它。如果是这样,你可以通过运行scripts/add_long_password脚本改正这种情况。
用户有一个老式的口令(8个字符长)并且你没使用--old-protocol选项启动mysqld。用一个新口令更新在user表中的用户或用--old-protocol重启mysqld
你没有使用PASSWORD()函数在在user表中指定了一个口令。使用mysql以一个新口令更新在user表中的用户。确保使用PASSWORD()函数:
mysql> update user set password=PASSWORD(’your password’)
where user=’XXX’;

8. Table ’xxx’ doesn’t exist错误
如果你得到错误Table ’xxx’ doesn’t existCan’t find file: ’xxx’ (errno: 2),这意味着在当前数据库中没有名为xxx的表存在。
注意,因为MySQL使用目录和文件存储数据库和表,数据库和表名件是区分大小写的!(在Win32上,数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!)
你可以用SHOW TABLES检查你在当前数据库中有哪个表。见7.21 SHOW句法(得到表、列的信息)。

9. MySQL怎样处理一个溢出的磁盘
当出现一个磁盘溢出的情况时,MySQL做下列事情:
它每分钟检查一次看是否有足够空间写入当前行。如果有足够的空间,它继续好像发生什么事情。
6分钟它将有关磁盘溢出的警告写入日志文件。
为了缓和这个问题,你可以采取下列行动:
继续,你只需释放足够的空闲磁盘空间以便插入所有记录。
放弃线程,你必须发一个mysqladmin kill到线程。在下一次检查磁盘时,线程将被放弃(1分钟内)
注意,其他线程可能正在等待引起磁盘溢出条件的表。如果你有几个锁定的的线程,杀死正在等待磁盘溢出条件的那个线程将允许其他线程继续。

10. 如何从一个文本文件运行SQL命令
一般地,mysql客户被交互性地使用,象这样:
shell> mysql database
然而,也可以把你的SQL命令放在一个文件中并且告诉mysql从该文件读取其输入。要想这样做,创造一个文本文件“text_file”,它包含你想要执行的命令。然后如下那样调用mysql
shell> mysql database < text_file

你也能启动有一个USE db_name语句的文本文件。在这种情况下,在命令行上指定数据库名是不必要的:
shell> mysql < text_file

11. MySQL在哪儿存储临时文件
MySQL使用TMPDIR环境变量的值作为存储临时文件的目录的路径名。如果你没有设置TMPDIRMySQL使用系统缺省值,它通常是“/tmp”“/usr/tmp”。如果包含你的临时文件目录的文件系统太小,你应该编辑safe_mysqld设定TMPDIR指向你有足够空间的一个文件系统!你也可以使用mysqld--tmpdir选项目设置临时目录。
MySQL隐含文件创建所有临时文件。这保证了如果mysqld被终止,临时文件也将被删除。使用隐含文件的缺点是你将看不到一个大的临时文件填满了临时文件目录所在的文件系统。
当排序(ORDER BYGROUP BY)时,MySQL通常使用一个或两个临时文件。最大磁盘空间需求是:
(存储东西的长度 + sizeof (数据库指针))
* 匹配的行数
* 2

sizeof(数据库指针)通常是4,但是在未来对确实很大的表可能增加。
对一些SELECT查询,MySQL也创建临时SQL表。这些没被隐含且有“SQL_*”格式的名字。
ALTER TABLEOPTIMIZE TABLE在原数据库表的同一个目录中创建一张临时表。

12. 怎样保护“/tmp/mysql.sock ”不被删除
如果你有这个问题,事实上任何人可以删除MySQL通讯套接字“/tmp/mysql.sock”,在Unix的大多数版本上,你能通过为其设置stickyt)位来保护你的“/tmp”文件系统。作为root登录并且做下列事情:
shell> chmod +t /tmp

这将保护你的“/tmp”文件系统使得文件仅能由他们的所有者或超级用户(root)删除。
你能执行ls -ld /tmp检查sticky位是否被设置,如果最后一位许可位是t,该位被设置了。

13. Access denied错误
6.6 权限系统如何工作。并且特别要看6.13 引起Access denied错误的原因。

14. 怎样作为一个一般用户运行MySQL
MySQL服务器mysqld能被任何用户启动并运行。为了将mysqld改由Unix用户user_name来运行,你必须做下列事情:
如果它正在运行,停止服务器(使用mysqladmin shutdown)
改变数据库目录和文件以便user_name有权限读和写文件(你可能需要作为Unixroot用户才能做到)
shell> chown -R user_name /path/to/mysql/datadir

如果在MySQL数据目录中的目录或文件是符号链接,你也将需要顺着那些链接并改变他们指向的目录和文件。chown -R不能跟随符号链接。
user_name用户启动服务器,或如果你正在使用MySQL 3.22或以后版本,以Unix root用户启动mysqld并使用--user=user_name选项,mysqld将在接受任何连接之前切换到以Unix user_name用户运行。
如果在系统被重新启动时,你使用mysql.server脚本启动mysqld,你应该编辑mysql.serversu以用户user_name运行mysqld,或使用--user选项调用mysqld。(不改变safe_mysqld是必要的。)
现在,你的mysqld进程应该正在作为Unix用户user_name运行,并运行完好。尽管有一件事情没有变化:权限表的内容。缺省 (就在运行了脚本mysql_install_db安装的权限表后)MySQL用户root是唯一有存取mysql数据库或创建或抛弃数据库权限的用户。除非你改变了那些权限,否则他们仍然保持。当你作为一个Unix用户而不是root登录时,这不应该阻止你作为MySQL root用户来存取MySQL;只要为客户程序指定-u root的选项。
注意通过在命令行上提供-u root,作为root存取MySQL,与作为Unix root用户或其他Unix用户运行MySQL没有关系。MySQL的存取权限和用户名与Unix用户名字是完全分开的。唯一与Unix用户名有关的是,如果当你调用一个客户程序时,你不提供一个-u选项,客户将试图使用你的Unix登录名作为你的MySQL用户名进行连接。
如果你的Unix机器本身不安全,你可能应该至少在存取表中为MySQL root用户放上一个口令。否则,在那台机器上有一个帐号的任何用户能运行mysql -u root db_name并且做他喜欢做的任何事情。

15. 怎样重新设置一个忘记的口令
如果你忘记了MySQLroot用户的口令,你可以用下列过程恢复它。
通过发送一个kill(不是kill -9)mysqld服务器来关闭mysqld服务器。pid 被保存在一个.pid文件中,通常在MySQL数据库目录中:
kill `cat /mysql-data-directory/hostname.pid`

你必须是一个UNIX root用户或运行服务器的相同用户做这个。
使用--skip-grant-tables选项重启mysqld
mysql -h hostname mysql连接mysqld服务器并且用一条GRANT命令改变口令。见7.26 GRANTREVOKE句法。你也可以用mysqladmin -h hostname -u user password ’new password’ 进行。
mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES来装载权限表。

16. 文件许可权限问题
如果你有与文件许可有关的问题,例如,如果当你创建一张表时,mysql发出下列错误消息:
ERROR: Can’t find file: ’path/with/filename.frm’ (Errcode: 13)

那么可能是在mysqld启动时,环境变量UMASK可能设置不正确。缺省的umask值是0660。你可以如下启动safe_mysqld改变其行为:
shell> UMASK=384 # = 600 in octal
shell> export UMASK
shell> /path/to/safe_mysqld &

17. 文件没找到
如果你从MySQL得到ERROR ’...’ not found (errno: 23), Can’t open file: ... (errno: 24)或任何其他有errno 23errno 24的错误,它意味着,你没有为MySQL分配足够的文件描述符。你能使用perror实用程序得到错误号含义是什么的描述:
shell> perror 23
File table overflow
shell> perror 24
Too many open files

这里的问题是mysqld正在试图同时保持打开太多的文件。你也可以告诉mysqld一次不打开那么多的文件,或增加mysqld可得到的文件描述符数量。为了告诉mysqld一次保持打开更少的文件,你可以通过使用safe_mysqld-O table_cache=32选项(缺省值是64)使表缓冲更小。减小max_connections值也将减少打开文件的数量(缺省值是90)
要想改变mysqld可用的文件描述符数量,修改safe_mysqld脚本。脚本中有一条注释了的行ulimit -n 256。你可以删除’#’字符来去掉该行的注释,并且改变数字256改变为mysqld可用的文件描述符的数量。
ulimit能增加文件描述符的数量,但是只能到操作系统强加的限制。如果你需要增加每个进程可用的文件描述符数量的OS限制,参见你的操作系统文档。注意,如果你运行tcsh外壳,ulimit将不工作!当你请求当前限制时,tcsh也将报告不正确的值!在这种情况下,你应该用sh启动safe_mysqld

18. 使用DATE列的问题
一个DATE值的格式是’YYYY-MM-DD’。根据ANSI SQL,不允许其他格式。你应该在UPDATE表达式和SELECT语句的WHERE子句中使用这个格式。例如:
mysql> SELECT * FROM tbl_name WHERE date >= ’1997-05-05’;

为了方便,如果日期用在数字上下文,MySQL自动变换一个日期到一个数字(并且反过来也如此)。当更新时和将一个日期与TIMESTAMPDATEDATETIME列比较的一个WHERE子句中,也是足够灵活以允许一种宽松的字符串格式。(宽松格式意味着任何标点字符用作在部件之间的分割符。例如,’1998-08-15’’1998#08#15’是等价的。)MySQL也能变换不包含分割符的一个字符串(例如 ’19980815’),如果它作为一个日期说得通。特殊日期’0000-00-00’可以作为’0000-00-00’被存储和检索。当通过MyODBC使用一个’0000-00-00’日期时,在MyODBC 2.50.12和以上版本,它将自动被转换为NULL,因为ODBC不能处理这种日期。
因为MySQL实行了上述的变换,下列语句可以工作:
mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES (’19970505’);
mysql> INSERT INTO tbl_name (idate) VALUES (’97-05-05’);
mysql> INSERT INTO tbl_name (idate) VALUES (’1997.05.05’);
mysql> INSERT INTO tbl_name (idate) VALUES (’1997 05 05’);
mysql> INSERT INTO tbl_name (idate) VALUES (’0000-00-00’);

mysql> SELECT idate FROM tbl_name WHERE idate >= ’1997-05-05’;
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= ’19970505’;

然而,下列将不工作:
mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,’19970505’)=0;

STRCMP()是字符串函数,因此它将idate转换为一个字符串并且实施字符串比较。它不将’19970505’转换为一个日期并实施日期比较。
注意,MySQL不检查日期是否正确。如果你存储一个不正确的日期,例如’1998-2-31’,错误的日期将被存储。如果日期不能被变换到任何合理的值,在DATE字段中存储一个0。这主要是一个速度问题并且我们认为检查日期是应用程序的责任,而不服务器。

19. 时区问题
如果你有一个问题,SELECT NOW()GMT时间返回值而不是你的本地时间,你必须设定TZ环境变量为你的当前时区。这应该在服务器运行的环境进行,例如在safe_mysqldmysql.server中。

20. 在搜索中的大小写敏感性
缺省地,MySQL搜索是大小写不敏感的(尽管有一些字符集从来不是忽略大小写的,例如捷克语)。这意味着,如果你用col_name LIKE ’a%’搜寻,你将得到所有以Aa开始的列值。如果你想要使这个搜索大小写敏感,使用象INDEX(col_name, "A")=0检查一个前缀。或如果列值必须确切是"A",使用STRCMP(col_name, "A") = 0
简单的比较操作(>=>= < <=、排序和聚合)是基于每个字符的排序值。有同样排序值的字符(Ee’e)被视为相同的字符!
LIKE比较在每个字符的大写值上进行(E==e 但是E<>’e)。
如果你想要一个列总是被当作大小写敏感的方式,声明它为BINARY。见7.7 CREATE TABLE句法。
如果你使用以所谓的big5编码的中文数据,你要使所有的字符列是BINARY,它可行,是因为big5编码字符的排序顺序基于 ASCII代码的顺序。

21. NULL值问题
NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串’’的一样的东西。不是这样的!例如,下列语句是完全不同的:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是电话号码不知道,而第二个则可意味着她没有电话
SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列返回NULL
mysql> SELECT NULL,1+NULL,CONCAT(’Invisible’,NULL);

如果你想要寻找值是NULL的列,你不能使用=NULL测试。下列语句不返回任何行,因为对任何表达式,expr = NULL是假的:
mysql> SELECT * FROM my_table WHERE phone = NULL;

要想寻找NULL值,你必须使用IS NULL测试。下例显示如何找出NULL电话号码和空的电话号码:
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = "";

MySQL中,就像很多其他的SQL服务器一样,你不能索引可以有NULL值的列。你必须声明这样的列为NOT NULL,而且,你不能插入NULL到索引的列中。当用LOAD DATA INFILE读取数据时,空列用’’更新。如果你想要在一个列中有NULL值,你应该在文本文件中使用N。字面词’NULL’也可以在某些情形下使用。见

22. LOAD DATA INFILE句法。当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。为了有助于NULL的处理,你能使用IS NULLIS NOT NULL运算符和IFNULL()函数。
对某些列类型,NULL值被特殊地处理。如果你将NULL插入表的第一个TIMESTAMP列,则插入当前的日期和时间。如果你将NULL插入一个AUTO_INCREMENT列,则插入顺序中的下一个数字。

23. alias问题
你可以在GROUP BYORDER BY或在HAVING部分中使用别名引用列。别名也可以用来为列取一个更好点的名字:
SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0;
SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0;
SELECT id AS "Customer identity" FROM table_name;

注意,你的 ANSI SQL 不允许你在一个WHERE子句中引用一个别名。这是因为在WHERE代码被执行时,列值还可能没有终结。例如下列查询是不合法:SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id;

WHERE语句被执行以确定哪些行应该包括GROUP BY部分中,而HAVING用来决定应该只用结果集合中的哪些行。

24. 从关联的表中删除行
因为MySQL不支持子选择或在DELETE语句中使用多个表,你应该使用下列方法从2个关联的表中删除行:
在主表中基于某个WHERE条件SELECT行。
在主表中基于相同的条件DELETE行。
DELETE FROM related_table WHERE related_column IN (selected_rows)
如果在related_column查询中的字符的全部数量超过1,048,576(缺省值max_allowed_packet),你应该分成更小的部分并且执行多个DELETE语句。如果related_column是一个索引,你每次只删除100-1000related_column id将可能使得DELETE最快。如果related_column不是一个索引,速度与IN子句中参数的数量无关。

25. 解决没有匹配行的问题
如果你有一个复杂的查询,涉及多个表,但没有返回任何行,你应该使用下列过程查找你的询问有什么不对:
EXPLAIN测试查询并且检查你是否能找出显然是错误的一些东西。见7.22 EXPLAIN句法(得到关于一个SELECT的信息)
仅选择那些在WHERE子句中使用的字段。
一次从查询中删除一个表,直到它返回一些行。如果表很大,对查询使用LIMIT 10是一个好主意。
对应该已经匹配一行的列做一个SELECT,针对从询问中做后被删除的表。
如果你将FLOATDOUBLE列与有小数的数字进行比较,你不能使用=!。这个问题在大多数计算机语言是常见的,因为浮点值不是准确的值。
mysql> SELECT * FROM table_name WHERE float_column=3.5;
->
mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55;

在大多数情况下,将FLOAT改成一个DOUBLE将修正它!
如果你仍然不能发现错误是什么,创建一个最小的可运行mysql test < query.sql的测试来显示你的问题。你可以用mysqldump --quick database tables > query.sql创建一个测试文件,在一个编辑器编辑文件,删除一些插入行(如果有太多这些语句)并且在文件末尾加入你的选择语句。测试你仍然有问题,可以这样做:
shell> mysqladmin create test2
shell> mysql test2 < query.sql

使用mysqlbug的邮寄测试文件到mysql@lists.mysql.com

26. ALTER TABLE有关的问题
如果ALTER TABLE死于这样一个错误:
Error on rename of ’./database/name.frm’ to ’./database/B-a.frm’ (Errcode: 17)

问题可能是MySQL在前一个ALTER TABLE中已经崩溃并且留下了一个名为“A-xxx”“B-xxx”的老的数据库表。在这种情况下,到MySQL数据目录中并删除所有名字以A-B-开始的文件。(你可以把他们移到别的地方而不是删除他们)
ALTER TABLE工作方式是:
以要求的改变创建一个名为“A-xxx”的新表。
从老表把所有行拷贝到“A-xxx”
老表被改名为“B-xxx”
“A-xxx”被改名为你的老表的名字。
“B-xxx”被删除。
如果某些改名操作出错,MySQL试图还原改变。如果出错严重(当然,这不应该发生。)MySQL可能留下了老表为“B-xxx”但是一个简单改名就应该恢复你的数据。

27. 怎样改变一张表中列的顺序
SQL的要点是中抽象应用程序以避免数据存储格式。你应该总是以你想要检索数据的意愿指定顺序。例如:
SELECT col_name1, col_name2, col_name3 FROM tbl_name;

将以col_name1col_name2col_name3的顺序返回列,而:
SELECT col_name1, col_name3, col_name2 FROM tbl_name;

将以col_name1col_name3col_name2的顺序返回列。
在一个应用程序中,你应该决不基于他们的位置使用SELECT * 检索列,因为被返回的列的顺序永远不能保证;对你的数据库的一个简单改变可能导致你的应用程序相当有戏剧性地失败。
不管怎样,如果你想要改变列的顺序,你可以这样做:
以正确的列顺序创建一张新表。
执行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.
删除或改名old_table
ALTER TABLE new_table RENAME old_table

MySQL内存管理、优化、查询缓存区

bulk_insert_buffer_size = n
为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。

key_buffer_size = n
用来存放索引区块的RMA值(默认设置是8M)。

join_buffer_size = n
在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。

max_heap_table_size = n
HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。

max_connections = n
MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。

query_cache_limit = n
允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。

query_cache_size = n
查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。

query_cache_type = 0/1/2
查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,"按需分配"模式,只响应SELECT SQL_CACHE命令。

read_buffer_size = n
为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。

read_rnd_buffer_size = n
类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。

sort_buffer = n
为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序。

table_cache = n
同时打开的数据表的数量(默认设置是64)。

tmp_table_size = n
临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。

Max-allowed-packet = n
客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。

根据status信息对MySQL服务器进行优化

网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。

mysql> show global status;

可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:

mysql> show variables;

一、慢查询

mysql> show variables like '%slow%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |
| slow_launch_time | 2     |
+------------------+-------+

mysql> show global status like '%slow%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Slow_launch_threads | 0     |
| Slow_queries        | 4148 |
+---------------------+-------+

配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间不宜设置过长,否则意义不大,最好在5秒以内,如果你需要微秒级别的慢查询,可以考虑给MySQL打补丁:http://www.percona.com/docs/wiki/release:start,记得找对应的版本。

打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。

二、连接数

经常会遇见"MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配 置文件中max_connections值过小:

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 256   |
+-----------------+-------+

这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:

mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 245   |
+----------------------+-------+

MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:

Max_used_connections / max_connections  * 100% ≈ 85%

最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

三、Key_buffer_size

key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:

mysql> show variables like 'key_buffer_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| key_buffer_size | 536870912 |
+-----------------+------------+

分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:

mysql> show global status like 'key_read%';
+------------------------+-------------+
| Variable_name          | Value       |
+------------------------+-------------+
| Key_read_requests      | 27813678764 |
| Key_reads              | 6798830     |
+------------------------+-------------+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate = Key_reads / Key_read_requests * 100%

比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT 了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在 0.01%以下的话,key_buffer_size分配的过多,可以适当减少。

MySQL服务器还提供了key_blocks_*参数:

mysql> show global status like 'key_blocks_u%';
+------------------------+-------------+
| Variable_name          | Value       |
+------------------------+-------------+
| Key_blocks_unused      | 0           |
| Key_blocks_used        | 413543      |
+------------------------+-------------+

Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数, 比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:

Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

四、临时表

mysql> show global status like 'created_tmp%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Created_tmp_disk_tables | 21197   |
| Created_tmp_files       | 58      |
| Created_tmp_tables      | 1771587 |
+-------------------------+---------+

每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%,应该相当好了。我们再看一下MySQL服务器对临时表的配置:

mysql> show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 268435456 |
| tmp_table_size      | 536870912 |
+---------------------+-----------+

只有256MB以下的临时表才能全部放内存,超过的就会用到硬盘临时表。

五、Open Table情况

mysql> show global status like 'open%tables%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 919   |
| Opened_tables | 1951  |
+---------------+-------+

Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:

mysql> show variables like 'table_cache';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| table_cache   | 2048  |
+---------------+-------+

比较合适的值为:

Open_tables / Opened_tables  * 100% >= 85%
Open_tables / table_cache * 100% <= 95%

六、进程使用情况

mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 46    |
| Threads_connected | 2     |
| Threads_created   | 570   |
| Threads_running   | 1     |
+-------------------+-------+

如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下 一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话, 表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器 thread_cache_size配置:

mysql> show variables like 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 64    |
+-------------------+-------+

示例中的服务器还是挺健康的。

七、查询缓存(query cache)

mysql> show global status like 'qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 22756     |
| Qcache_free_memory      | 76764704  |
| Qcache_hits             | 213028692 |
| Qcache_inserts          | 208894227 |
| Qcache_lowmem_prunes    | 4010916   |
| Qcache_not_cached       | 13385031  |
| Qcache_queries_in_cache | 43560     |
| Qcache_total_blocks     | 111212    |
+-------------------------+-----------+

MySQL查询缓存变量解释:

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes: 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存 很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。

我们再查询一下服务器关于query_cache的配置:

mysql> show variables like 'query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 2097152   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 203423744 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+

各字段的解释:

query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。

query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。

查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

查询缓存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

八、排序使用情况

mysql> show global status like 'sort%';
+-------------------+------------+
| Variable_name     | Value      |
+-------------------+------------+
| Sort_merge_passes | 29         |
| Sort_range        | 37432840   |
| Sort_rows         | 9178691532 |
| Sort_scan         | 1860569    |
+-------------------+------------+

Sort_merge_passes 包括两步。MySQL 首先会尝试在内存中做排序,使用的内存大小由系统变量 Sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,MySQL 就会把每次在内存中排序的结果存到临时文件中,等 MySQL 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 Sort_merge_passes。实际上,MySQL 会用另一个临时文件来存再次排序的结果,所以通常会看到 Sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size 会减少 Sort_merge_passes 和 创建临时文件的次数。但盲目的增加 Sort_buffer_size 并不一定能提高速度,见 How fast can you sort data with MySQL?(引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html,貌似被墙)

另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值对排序的操作也有一点的好处,参见:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/

九、文件打开数(open_files)

mysql> show global status like 'open_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 1410  |
+---------------+-------+

mysql> show variables like 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 4590  |
+------------------+-------+

比较合适的设置:Open_files / open_files_limit * 100% <= 75%

十、表锁情况

mysql> show global status like 'table_locks%';
+-----------------------+-----------+
| Variable_name         | Value     |
+-----------------------+-----------+
| Table_locks_immediate | 490206328 |
| Table_locks_waited    | 2084912   |
+-----------------------+-----------+

Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器 Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。

十一、表扫描情况

mysql> show global status like 'handler_read%';
+-----------------------+-------------+
| Variable_name         | Value       |
+-----------------------+-------------+
| Handler_read_first    | 5803750     |
| Handler_read_key      | 6049319850  |
| Handler_read_next     | 94440908210 |
| Handler_read_prev     | 34822001724 |
| Handler_read_rnd      | 405482605   |
| Handler_read_rnd_next | 18912877839 |
+-----------------------+-------------+

各字段解释参见http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html,调出服务器完成的查询请求次数:

mysql> show global status like 'com_select';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| Com_select    | 222693559 |
+---------------+-----------+

计算表扫描率:

表扫描率 = Handler_read_rnd_next / Com_select

如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。

后记:

文中提到一些数字都是参考值,了解基本原理就可以,除了MySQL提供的各种status值外,操作系统的一些性能指标也很重要,比如常用的top,iostat等,尤其是iostat,现在的系统瓶颈一般都在磁盘IO上,关于iostat的使用,可以参考:http://www.php-oa.com/2009/02/03/iostat.html

参考资料:

1.http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.htm

2.http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html

3.http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-3.html

4.http://www.day32.com/MySQL/tuning-primer.sh 具体数值主要参考此工具

MFS分布式文件系统架设笔记

什么是MFS文件系统?
Moose File System 是一个具备容错功能的网络分布式文件系统,它将数据分布在网络中的不同服务器上,MooseFS 通过 FUSE 使之看起来就是一个 Unix 的文件系统。
MFS文件系统个人理解: 将分布在各个范围的计算机,将他们未使用的分区统一进行管理使用的一种文件系统.
architecture
MFS文件系统结构:
包含3种角色:
管理服务器managing server (master)
数据存储服务器data servers (chunkservers)
客户机挂载使用client computers

个人理解3种角色作用:
管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝
数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间.
客户端:挂接远程管理服务器上所管理的数据存储服务器,通过fuse内核接口.看起来共享的文件系统和
本地unix文件系统使用一样的效果.

架设过程:

服务器2台
(最少是2台,一台服务器做管理服务器,数据存储服务器,以及客户端3种角色,另外一台计算机做数据存储和客户端)
称第1台计算机为A机,机器上跑3种角色,第2台计算机称B机,跑两种角色.要是你计算机多的话可以只跑1种客户端角色或者数据存储角色,根据具体情况决定.
操作系统:FreeBSD6.x or Freebsd 7.x   minni安装 升级ports树
1.在A机器上安装

/sysutils/fusefs-kmod
./devel/pkg-config

这两个ports包
pkg_info的结果为

b# pkg_info
fusefs-kmod-0.3.9.p1.20080208 Kernel module for fuse
fusefs-libs-2.7.2_1 FUSE allows filesystem implementation in userspace
libiconv-1.9.2_2    A character set conversion library
pkg-config-0.21     A utility to retrieve information about installed libraries
b#

然后在rc.conf中添加

fusefs_enable="YES"

2.在http://www.moosefs.com/index.html下载mfs-1.5.12.tar.gz

#fetch [url]http://www.moosefs.com/files/mfs-1.5.12.tar.gz[/url]
#tar xvzf mfs-1.5.12.tar.gz
#cd mfs-1.5.12
#./configure (这样制作出来的bin文件和sbin文件以及元数据在/usr/local/sbin和/usr/local/bin,配置文件在/usr/local /etc 元数据存放在/usr/local/var/mfs下)  默认不带任何参数编译出来的,可以做数据和管理服务器.
#make && make install 就完成了两种角色服务器的安装

##################下面是在A机上编译出客户机的执行文件#################################

#make clean && ./configure --prefix=/clien --enable-mfsmount && make && make install

即可,在/client目录下就产生了一个mfs的客户端连接软件
2.在B机器上安装

/sysutils/fusefs-kmod
./devel/pkg-config

这两个ports包
pkg_info的结果为

b# pkg_info
fusefs-kmod-0.3.9.p1.20080208 Kernel module for fuse
fusefs-libs-2.7.2_1 FUSE allows filesystem implementation in userspace
libiconv-1.9.2_2    A character set conversion library
pkg-config-0.21     A utility to retrieve information about installed libraries
b#

然后在rc.conf中添加

fusefs_enable="YES"

2.在http://www.moosefs.com/index.html下载mfs-1.5.12.tar.gz

#fetch [url]http://www.moosefs.com/files/mfs-1.5.12.tar.gz[/url]
#tar xvzf mfs-1.5.12.tar.gz
#cd mfs-1.5.12
#./configure --disable-mfsmaster --enable-mfsmount(这样制作出来的二进制文件可以做数据存储服务器和有了mfsmount文件,默认编译是没有mfsmount的).
#make && make install 就完成了数据存储角色服务器和客户端的安装

下面开始配置
A机器上挂载一个空闲的,比较大的分区

#mount /dev/ad1s1 /mnt/mfs
#cd /usr/local/etc
#ls
-rw-r--r--  1 root  wheel  434 Mar 31 11:34 mfschunkserver.cfg
-rw-r--r--  1 root  wheel   36 Mar 31 11:34 mfshdd.cfg
-rw-r--r--  1 root  wheel  425 Mar 31 11:34 mfsmaster.cfg

解释这3个文件的作用
mfsmaster.cfg是管理服务器初始化文件,不需要任何修改既可使用.里面主要就是设置监听端口这些.
我们用默认既可
mfschunkserver.cfg是数据存储文件配置文件.当数据存储和管理服务器不在一起的时候,要修改

# MASTER_HOST = mfsmaster  这个值为管理服务器的ip地址或主机名
# MASTER_PORT = 9420
mfshdd.cfg这个是在mfschunkserver.cfg中制定的文件名,这个文件里面存放本地存储分区路径.
我这里mfshdd.cfg内容就是一行
#cat mfshdd.cfg
/mnt/mfs
#

启动顺序
启动管理服务器 ----->启动数据存储服务器---->挂接管理服务器mfs文件系统

#/usr/local/sbin/mfsmaster start
#netstat -na|grep 942 看是否有两个942* 为listen的端口,若有就开启成功了.
#/usr/local/sbin/mfschunkserver start
#netstat -na|grep 942 查看是不是多了一个9422的端口,若有则开启成功了
也可以使用sockstat -4查看

如果启动不成功,一般情况就是挂载目录权限问题.默认编译的mfs是按nobody权限来的.要修改/mnt/mfs权限为nobody既可.
经过上面两部管理服务器和存储服务器就启动起来了.下面是进行本地挂载和在B机器上挂载
在A机器上 执行

#/client/bin/mfsmount -h A机ip -w /mfs   将管理机ip 挂接到/mfs目录

A机器上就可以使用mfs系统了,挂接点是/mfs

下面是加入B机的数据存储和B机自己使用mfs
B机
#配置挂接空闲的,比较大的分区,然后修改mfshdd.cfg内容为挂接地点.修改mfschunkserver.cfg的MASTER_HOST =值
启动mfschunkserver

#/usr/local/sbin/mfschunkserver start

挂接管理机的mfs文件系统

#/client/bin/mfsmount -h A机ip -w /mfs

我在做MFS试验的时候,田逸给了我些帮助,在这里感谢他。

用vmware做mfs数据存储服务器的时候,虚拟的硬盘一定要大点,最好大于256M的硬盘。否则used永远都是100%

我的生产系统

[ 本帖最后由 zhengwei_zw 于 2009-4-14 15:45 编辑 ]

1.PNG (1018 Bytes) 2009-4-6 20:17

如何查看文件的创建时间?

刚刚去开了一台pc,真实环境!

一步步地做完!验证完成,楼上所言,正确!

当修改文件后,
$ls -Ul file

$stat -s file

中 st_birthtime=number ,需要执行$date -r number ;

比较后,结果一致,得到最初创建文件的时间值!

注:以上命令可能在虚拟机上执行不起作用的.

FreeBSD传真服务器(FreeBSD+HylaFax+Apache+php+Mysql+AvantFax)

http://bbs3.chinaunix.net/thread-1456005-1-1.html

FreeBSD安装选择Minimal+Ports
域名:fax.test.org IP:192.168.1.203 新建用户:vincent 属于wheel组

Handbook
http://cnsnap.cn.freebsd.org/doc ... ndbook/install.html

开启FTP服务

编辑/etc/inetd.conf文件去掉ftp前的注释'#'。

#vi /etc/inetd.conf
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l

启动inetd程序
#/etc/rc.d/inetd start

添加vincent用户,用于FTP登录上传文件
#pw useradd vincent -s /bin/csh -d /home/vincent -m -g wheel -h 0

----------------------------------------------------------------------------

使用wget加快ports软件下载

安装wget程序,加快软件包下载速度。
#cd /usr/ports/net/wget
#make install clean

编辑/etc/make.conf
#vi /etc/make.conf

FETCH_CMD=wget -c -t 1
DISABLE_SIZE=yes

MASTER_SITE_OVERRIDE= \
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/ \
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/

设置使用ftp.tw.freebsd.org为主下载站点,加快Package软件下载,编辑用户目录下的.cshrc文件加入

#vi .cshrc     //编辑完后记得重新登录
setenv PACKAGEROOT      ftp://ftp.tw.freebsd.org

--------------------------------------------------------------------------------------------

HylaFAX    ( WebSite http://www.hylafax.org/ )

HylaFAX是一个基于C/S 架构,企业级的收发传真系统,高效稳固。局域网中只要有一台连接Modem的HylaFAX服务器,就能为局域网所有用户提供传真服务。

软件安装

Package方法安装
#pkg_add -r hylafax

或者

Ports方法安装
#cd /usr/ports/comms/hylafax
#make install clean

软件设置

#faxsetup

Should an entry be added for the FaxMaster to /etc/aliases [yes]?
应该在/etc/aliases中增加一个条FaxMaster记录[yes]? yes

Users to receive fax related mail [root]?
输入接收传真相关信息的Email用户[root]? vincent

Are these ok [yes]?
确认以上信息是否正确[yes]? yes

Country code [1]?
国家代码[1]? 0086

Area code []?
区号[]? 0750

Long distance dialing prefix [1]?
长途拨号前缀 [1]? 0

International dialing prefix [011]?
国际拨号前缀 [001]? 0750

Dial string rules file (relative to /var/spool/hylafax)["etc/dialrules"]?
拨号规则文件( /var/spool/hylafax )["etc/dialrule"]? 按enter默认

Tracing during normal server operation [1]?
追踪正常服务程序[1]? 1

Default tracing during send and receive session [0xfffffffff]?
默认追查在发送和接收 session [0xfffffffff]? 按enter默认

Continuation cover page (relative to /var/spool/hylafax) []?
传真封面页所在目录 ( /var/spool/hylafax )[]? 按enter默认

Timeout when converting PostScript documents (secs) [180]?
转换PostScript文件逾时时间[180]? 180

Maximum number of concurrent jobs to a destination[1]?
一个目的地最大数量的并行工作[1]? 1

Define a group of modems []
定义一组调制解调器[] 按enter默认

Time of day restrictions for outbound jobs ["Any"]?
一天中限制传真外发时间["Any"]? 按enter默认

Pathname of destination controls file (relative to /var/spool/hylafax) []?
控制文件的路径( /var/spool/hylafax )[]? 按enter默认

Timeout before purging a stale UUCP lock file (secs) [30]
超时前清除旧的UUCP锁定文件[30]?30

Max number of pages to permit in an outbound job [0xffffffff]?
允许在出站的最大页数[0xffffffff]? 按enter默认

Syslog facility name for ServerTracing messages [daemon]?
系统日志跟踪记录程序[daemon]? 按enter默认

Are these ok [yes]?
确认以上信息是否正确[yes]? yes

Should I restart the HylaFAX process [yes]?
应该重新启动HylaFAX进程[yes]? yes

You do not appear to have any modem configured for use. Modems are
configured for use with HylaFax with the faxaddmodem command.
Do you want to run faxaddmomdem to configure a modme [yes]?
您似乎没有任何调制解调器配置为使用。调制解调器配置为使用HylaFax与faxaddmodem命令。
你想运行faxaddmomdem配置modme[yes]? yes

Serial port that modem is connected to []?
调制解调器连接到那个串行端口[]? ttyd0    //我的是com1,所以是ttyd0;请根据实际配置。

country code[1]
国家代码[1]? 0086

Area code [415]?
区号[]? 0750

Phone number of fax modem [+1,9999.5555.1212]?
传真的电话号码[+1,9999.5555.1212]? 8607501234567

Local Identifications string (for TS/CIG) ["NothingEtup"]?
本地传真机标识(for TS/CIG) ["NothingEtup"]? FreeBSD.org

Long distance dialing prefix [1]?
长途拨号前缀 [1]? 0

International dialing prefix [011]?
国际拨号前缀 [001]? 0750

Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]?
拨号规则文件( /var/spool/hylafax )["etc/dialrule"]? 按enter默认

Tracing during normal server operation [1]?
追踪正常服务程序[1]? 1

Tracing during send and receive sessions [11]?
追踪发送和接收 session [11]? 按enter默认

Protection mode for received facsimile [0600]?
收到传真的文件权限[0600]? 0777

Protection mode for session logs [0600]?
记录文件的档案权限[0600]? 0777

Protection mode for ttyd0 [0600]?
端口的访问权限[0600]? 0777

Rings to wait before answering [1]?
响铃几声后,开始接受传真[1]? 2

Modem speaker volume [off]?
Modem的喇叭音量[off]? on

Command line arguments to getty program ["-h %l dx_%s"]?
接收传真的命令行参数["-h %l dx_%s"]? 按enter默认

Pathname of TSI access control list file (relative to /var/spool/hylafax)[""]?
访问控制列表的TSI文件路径( /var/spool/hylafax )[""]? 按enter默认

Pathname of Caller-ID access control list file (relative to /var/spool/hylafax)[""]?
来电Caller-ID访问控制列表文件路径( /var/spool/hylafax )[""]? 按enter默认

Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.pcf]?
标记行字体文件( /var/spool/hylafax ) [etc/lutRS18.pcf]? 按enter默认

Tag line form string ["From %%1|%c|Page %%P of %%T"]?
标记行字符串形式["From %%1|%c|Page %%P of %%T"]? 按enter默认

Time before purging a stale UUCP lock file (secs) [30]?
超时前清除旧的UUCP锁定文件[30]?30

Hold UUCP lockfile during inbound data calls [Yes]?
当传真进来时,保留UUCP 设定文件[Yes]? yes

Hold UUCP lockfile during inbound voice calls [Yes]?
当语音进来时,保留UUCP 设定文件[Yes]? yes

Percent good lines to accept during copy quality checking [95]?
线路好的时候,在什么百份比时进行检查[95]? 95

Max consecutive bad lines to accept during copy quality checking [5]?
线路不好的时候,在什么百份比时进行检查[5]? 5

Max number of pages to accept in a received facsimile [25]?
每次传真进来的最大可接收页数[25]? 25

Syslog faxility name for ServerTracing messages [daemon]?
系统日志跟踪记录程序[daemon]? 按enter默认

Set UID to 0 to manipulate CLOCAL [""]?
设置的UID为0操作CLOCAL[""]? 按enter默认

Use available priority job scheduling mechanism [""]?
使用现有的优先工作调度机制[""]? 按enter默认

Are these ok [yes]?
确认以上信息是否正确[yes]? yes

Probing for best speed to talk to modem:38400
探索最佳速度交谈调制解调器: 38400

How should it be configured [1]?
应如何配置[1]? 1

DTE-DCE flow control scheme [default]?
流量控制方案[default]? 按enter默认

Are these ok [yes]?
确认以上信息是否正确[yes]? yes

Do you want to run faxaddmodem to configure another modem [yes]?
你想运行的另一个faxaddmodem配置调制解调器[yes]? no

Should I run faxmodem for each configured modem [yes]?
应该为每个运行faxmodem配置调制解调器[yes]? yes

Done verifying system setup.
完成核查系统设置。

编辑/etc/ttys 文件 ,查找“ttyd0"字节,修改为下面值(如果没有找,就在最后加上)

#vi /etc/ttys
ttyd0   "/usr/local/sbin/faxgetty"      dialup  on

设置开机HylaFax服务自动运行

#cp /usr/local/etc/rc.d/hylafax.sh.sample /usr/local/etc/rc.d/hylafax.sh

启动HylaFax服务

#/usr/local/etc/rc.d/hylafax.sh start

HylaFax命令

faxstat -s (显示队列中等待发送的传真)
faxstat -d (显示已发送的传真)
faxstat -r (显示已接收的传真)
faxrm number_of_job    (从队列中去删除一个传真)
faxqclean    (清除缓冲池)
faxcron        (显示统计结果)

--------------------------------------------------------------------------------------------

AvantFAX (WebSite http://www.avantfax.com )

AvantFAX是一种Web应用管理传真的HylaFAX 服务器。
AvantFAX允许用户在任何平台上,来查看和发送传真,而无需安装特殊的软件。它还允许管理员管理用户,他们的权限,传真线,传真类等
AvantFAX可以从本地网络,并通过互联网远程使用标准的网络设备

安装说明: http://www.avantfax.com/install.php

安装AvantFAX之前要先安装以下软件:

HylaFAX 4.4 or HylaFAX EE 3
PHP 5
PHP PEAR 5 including MDB2_driver_mysql, Mail and Mail_Mime
PECL FileInfo
PHP mbstring - for improved UTF-8 sorting support (optional)
PHP MySQL 5
MySQL server 4.1.12 or better (see Important Notes below)
Apache
ImageMagick
ghostscript
libtiff
netpbm-progs
libungif
sudo
sendmail/postfix/exim/qmail or use an external SMTP server
cups/lpr and psutils
expect

-----------------------------------------
apache

Package方法安装
#pkg_add -r apache22

或者

Ports方法安装
#cd /usr/ports/www/apache22
#make install clean

-----------------------------------------
mysql51-server

Package方法安装
#pkg_add -r mysql51-server

或者

Ports方法安装

#cd /usr/ports/databases/mysql51-server
#make install clean

-----------------------------------------
PHP5

Ports方法安装
#cd /usr/ports/lang/php5
#make install clean
//安装时记得选上第三项“APACHE Build Apache module"支持

-----------------------------------------
PHP5-session

Package方法安装
#pkg_add -r php5-session

或者

Ports方法安装
#cd /usr/ports/www/php5-session
#make install clean

-----------------------------------------
php5-mysql

Package方法安装
#pkg_add -r php5-mysql

或者

Ports方法安装
#cd /usr/ports/databases/php5-mysql
#make install clean

-----------------------------------------
pear-DB

Package方法安装
#pkg_add -r pear-DB

或者

Ports方法安装
#cd /usr/ports/databases/pear-DB
#make install clean

-----------------------------------------
pear-MDB2_Driver_mysql

Ports方法安装
#cd /usr/ports/databases/pear-MDB2_Driver_mysql
#make install clean

-----------------------------------------
pear-Auth

Package方法安装
#pkg_add -r pear-Auth

或者

Ports方法安装
#cd /usr/ports/security/pear-Auth
#make install clean

-----------------------------------------
pear-Auth_SASL

Package方法安装
#pkg_add -r pear-Auth_SASL

或者

Ports方法安装
#cd /usr/ports/security/pear-Auth_SASL
#make install clean

-----------------------------------------
pear-Net_SMTP

Package方法安装
#pkg_add -r pear-Net_SMTP

或者

Ports方法安装
#cd /usr/ports/net/pear-Net_SMTP
#make install clean

-----------------------------------------
pear-Mail

Package方法安装
#pkg_add -r pear-Mail

或者

Ports方法安装
#cd /usr/ports/mail/pear-Mail
#make install clean

-----------------------------------------
pear-Mail_Mime

Package方法安装
#pkg_add -r pear-Mail_Mime

或者

Ports方法安装
#cd /usr/ports/mail/pear-Mail_Mime
#make install clean

-----------------------------------------
pear-Mail_mimeDecode

Package方法安装
#pkg_add -r pear-Mail_mimeDecode

或者

Ports方法安装
#cd /usr/ports/mail/pear-Mail_mimeDecode
#make install clean

-----------------------------------------
pear-PHP_Compat

Package方法安装
#pkg_add -r pear-PHP_Compat

或者

Ports方法安装
#cd /usr/ports/devel/pear-PHP_Compat
#make install clean

-----------------------------------------
pear-HTML_Common

Ports方法安装
#cd /usr/ports/devel/pear-HTML_Common
#make install clean

-----------------------------------------
pear-HTML_QuickForm

Package方法安装
#pkg_add -r pear-HTML_QuickForm

或者

Ports方法安装
#cd /usr/ports/devel/pear-HTML_QuickForm
#make install clean

-----------------------------------------
pecl-fileinfo

Package方法安装
#pkg_add -r pecl-fileinfo

或者

Ports方法安装
#cd /usr/ports/sysutils/pecl-fileinfo
#make install clean

-----------------------------------------
php5-mbstring

Package方法安装
#pkg_add -r php5-mbstring

或者

Ports方法安装
#cd /usr/ports/converters/php5-mbstring
#make install clean

-----------------------------------------
ImageMagick

Package方法安装
#pkg_add -r ImageMagick

或者

Ports方法安装
#cd /usr/ports/graphics/ImageMagick
#make install clean

-----------------------------------------
smarty

Package方法安装
#pkg_add -r smarty

或者

Ports方法安装
#cd /usr/ports/www/smarty
#make install clean

-----------------------------------------
netpbm

Package方法安装
#pkg_add -r netpbm

或者

Ports方法安装
#cd /usr/ports/graphics/netpbm
#make install clean

-----------------------------------------
libungif

Package方法安装
#pkg_add -r libungif

或者

Ports方法安装
#cd /usr/ports/graphics/libungif
#make install clean

-----------------------------------------
sudo

Package方法安装
#pkg_add -r sudo

或者

Ports方法安装
#cd /usr/ports/security/sudo
#make install clean

-----------------------------------------
cups

Package方法安装
#pkg_add -r cups

或者

Ports方法安装
#cd /usr/ports/print/cups
#make install clean

-----------------------------------------
psutils-a4

Package方法安装
#pkg_add -r psutils-a4

或者

Ports方法安装
#cd /usr/ports/print/psutils-a4
#make install clean

-----------------------------------------
expect

Package方法安装
#pkg_add -r expect

或者

Ports方法安装
#cd /usr/ports/lang/expect
#make install clean

-----------------------------------------------------------------------------------------

软件下载:http://www.avantfax.com/download.php

将下载到的软件包通过FTP上传到服务器的vincent目录下,解压:
#cd /home/vincent
#gunzip avantfax-3.1.6.tgz.gz
#tar zxvf avantfax-3.1.6.tgz

移动avantfax Web目录:
#cd avantfax-3.1.6
#mv avantfax /usr/local/www/
#chmod -R 777 /usr/local/www/avantfax/tmp /usr/local/www/avantfax/faxes
#chown -R www:www /usr/local/www/avantfax//includes/templates

# ln -s /usr/local/www/avantfax/includes/faxrcvd.php /var/spool/hylafax/bin/faxrcvd.php
# ln -s /usr/local/www/avantfax/includes/dynconf.php /var/spool/hylafax/bin/dynconf.php
# ln -s /usr/local/www/avantfax/includes/notify.php /var/spool/hylafax/bin/notify.php

编辑config.ttyd0 //我的是外置modem,连接电脑com1,所以是ttyd0
# vi /var/spool/hylafax/etc/config.ttyd0

//添加
#
## AvantFAX configuration
#
FaxrcvdCmd:     bin/faxrcvd.php
DynamicConfig:  bin/dynconf.php
UseJobTSI:      true

-------------------------------------
编辑config
# vi /var/spool/hylafax/etc/config

//添加
#
## AvantFAX configuration
#
NotifyCmd:      bin/notify.php

--------------------------------------
备份/替换faxcover程序
#mv /usr/local/bin/faxcover /usr/local/bin/faxcover.old
#ln -s /usr/local/www/avantfax/includes/faxcover.php /usr/local/bin/faxcover

设置HylaFax用户支持Avantfax
#/usr/local/sbin/faxadduser -a pwd www
#/usr/local/sbin/faxdeluser localhost
#/usr/local/sbin/faxdeluser 127.0.0.1
#echo 127.0.0.1 >> /var/spool/hylafax/etc/hosts.hfaxd

编辑Avantfax设置文件
#cd /usr/local/www/avantfax/includes
#cp local_config-example.php local_config.php
#vi local_config.php

$BINARYDIR                      = '/usr/bin';
//修改为:
$BINARYDIR                      = '/usr/local/bin';

$HYLAFAX_PREFIX                = '/usr';
//修改为:
$HYLAFAX_PREFIX                = '/usr/local';

$WWWUSER                        = 'apache';
//修改为:
$WWWUSER                        = 'www';

$dft_config_lang            = 'en';
//修改为:
$dft_config_lang             = 'zh';

-------------------------------------------------------
编辑hfaxd.conf
#vi /usr/local/lib/fax/hfaxd.conf

#JobFmt:                "%-3j %3i %1a %6.6o %-12.12e %5P %5D %7z %.25s"
//修改为:
JobFmt:         "%-3j %3i %1a %15o %40M %-12.12e %5P %5D %7z %.25s"

-------------------------------------------------------
软件启动设置:
#vi /etc/rc.conf
//添加
apache22_enable="YES"
mysql_enable="YES"

-------------------------------------------------------
apache22设置

#vi /usr/local/etc/apache22/httpd.conf

DirectoryIndex index.html
//修改为:
DirectoryIndex index.html index.php

//添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

-------------------------------------------------------
新建fax.conf
#vi /usr/local/etc/apache22/Includes/fax.conf

//添加
NameVirtualHost *:80
<VirtualHost *:80>
ServerName fax.test.org
DocumentRoot /usr/local/www/avantfax/

<Directory "/usr/local/www">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

</VirtualHost>

--------------------------------------------------------
PHP程序连接
#ln-s /usr/local/bin/php /usr/bin/php

启动apache
#/usr/local/etc/rc.d/apapche start

--------------------------------------------------------
avantfax数据导入

启动mysql
#/usr/local/etc/rc.d/mysql start

导入数据
#cd /home/vincent/avantfax-3.1.6
#mysql -uroot < create_user.sql
#mysql -uavantfax -pd58fe49 avantfax < create_tables.sql

--------------------------------------------------------
编辑/etc/crontab
# vi /etc/crontab

//添加
# runs once an hour to update the phone book
0 * * * * root /usr/local/www/avantfax/includes/phb.php
# runs once a day to remove old files
0 0 * * * root /usr/local/www/avantfax/includes/avantfaxcron.php -t 2

---------------------------------------------------------
编辑/usr/local/etc/sudoers
#vi /usr/local/etc/sudoers

//添加
#Defaults    requiretty
www ALL = NOPASSWD: /sbin/reboot, /sbin/halt, /usr/local/sbin/faxdeluser, /usr/local/sbin/faxadduser -u * -p * *

---------------------------------------------------------
打开浏览器(IE/firefox/opera),打上下面的网址:
http://192.168.1.203/admin/
username: admin
password: password

新建 "传真分类" ---> 新建 "Modem" ---> 新建 “用户”
到此,服务器基本上可以使用了。

Good luck!

---------------------------------------------------------
参考资料:
《FreeBSD+Hylafax+frogfax配置FAX服務器》
http://www.extmail.org/forum/viewthread.php?tid=5498

《Centos 5.2 + HylaFAX + Apache + MySQL + PHP + AvantFAX + HylaFAX-Clinet》
http://bbs.chinaunix.net/viewthread.php?tid=1232431

[ 本帖最后由 tdls 于 2009-5-20 00:08 编辑 ]

2009-5-18 01:24
下载次数: 31
avantfax.rar (8.29 KB)