条件查询索引是相当有必要的 (MySQL学习)
发布于 2008-08-26 17:41 阅读:20468 评论:0 标签: mysql 索引

    记得一年半前去面试的时候,题目上有问如何优化题目上的数据库,大脑搜索不出任何东西。后来提示可以加索引,才恍然大悟。再过不久,立马为自己的无知而羞愧。

    前几天处理一个旧的程序,发现数据库给出的结果特别慢,查了一下表也不过30万左右数据量。一看数据结构,发现where子句中的字段没有索引,嘿嘿,立马解脱了......

以下是代码片段:

mysql> select count(*) from appeal ;
+----------+
| count(*) |
+----------+
|   317656 |
+----------+
1 row in set (0.00 sec)

mysql> alter table appeal add index (A_Flag);
Query OK, 317656 rows affected (7.95 sec)
Records: 317656  Duplicates: 0  Warnings: 0

    给现有的数据加索引的速度还是可以接受的,这个字段存储的值也就是个个位数的数字,类型是char(2),31万数据花了7.95秒。

展开全文  
收起全文  
MySQL控制流程函数学习 (MySQL学习)
发布于 2008-08-21 00:09 阅读:23718 评论:0 标签: MySQL 流程

    文章内容大量引用手册《12.2. 控制流程函数》。

    坦率的说,我甚至怀疑我即使精通这一节又有什么用?!在sql语句里面使用这个东西的话,貌似这个需求也太复杂了!

    废话不说,学习一下我不知道,甚至闻所未闻的语句:

    1:类似PHP中的switch(){case : ...}语句

    CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

    CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

    在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。

    基本上可以认为是编程语言switch结构一个变体,然后又衍生出又一个变体。前者根据判断给定的值来确定流程走向,后者没有给定的值,而是根据不同的条件来确定流程。

    可以看看手册给出的例子:

   

以下是代码片段:

mysql> SELECT CASE 1 WHEN 1 THEN 'one'
        -> WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'

mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'

mysql> SELECT CASE BINARY 'B'
        -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
        -> NULL

    2:类似PHP的三元表达式

    IF(expr1,expr2,expr3)

    如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

    我们熟悉的三元表达式到mysql中就成这个小样了,原谅它吧,毕竟数据库的根本还是存储数据的。让我们瞧瞧它的小样:

以下是代码片段:

mysql> SELECT IF(1>2,2,3);
        -> 3

mysql> SELECT IF(1<2,'yes ','no');
        -> 'yes'

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

    关于这个类三元表达式的返回值是个有趣的话题:

    “如果expr2 或expr3中只有一个明确是 NULL,则IF() 函数的结果类型为非NULL表达式的结果类型。”这句话不太好懂。 来看看下面这句:

    “expr1 作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值, 那么应该使用比较运算进行检验。 ”还是看看例子比较好理解:

以下是代码片段:

mysql> SELECT IF(0.1,1,0);
        -> 0

mysql> SELECT IF(0.1<>0,1,0);
        -> 1

    在所示的第一个例子中,IF(0.1)的返回值为0,原因是 0.1 被转化为整数值,从而引起一个对 IF(0)的检验。这或许不是你想要的情况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。 又是一个数学上的应用,如果你的数据库是和电子商城相关的,可就要注意了!

    IF() (这一点在其被储存到临时表时很重要 ) 的默认返回值类型按照以下方式计算:

以下是引用片段:

表达式

返回值

expr2 expr3 返回值为一个字符串。

字符串

expr2 expr3 返回值为一个浮点值。

浮点

expr2 expr3 返回值为一个整数。 

整数

    另外:“假如expr2 和expr3 都是字符串,且其中任何一个字符串区分大小写,则返回结果是区分大小写。”

    三元表达式在mysql里面会继续演变:

    3:IFNULL(expr1,expr2)

    假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

    如此看来又是三元表达式的变体了,只不过把三元剪成了二元的。可以理解为第一元同时又作为了第三元。

以下是代码片段:

mysql> SELECT IFNULL(1,0);
        -> 1

mysql> SELECT IFNULL(NULL,10);
        -> 10

mysql> SELECT IFNULL(1/0,10);
        -> 10

mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

    同样 有返回值类型的问题:

    ULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的情况,  或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:

以下是代码片段:

CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;

    在这个例子中,测试列的类型为 CHAR(4)。

    4:NULLIF(expr1,expr2)

     看见了么,NULLIF和上面的IFNULL是孪生兄弟呢。

     如果expr1 = expr2  成立,那么返回值为NULL,否则返回值为 expr1。这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。  

以下是代码片段:

mysql> SELECT NULLIF(1,1);
        -> NULL

mysql> SELECT NULLIF(1,2);
        -> 1

    “注意,如果参数不相等,则 MySQL 两次求得的值为  expr1 。”这句话看得不明白。

    感觉这就乱了,说不定是mysql的开发者为了某个特定的需求胡乱想了一个出来!

    如果用三元表达式来套,就是NULLIF 为 NULL IF :

   

以下是代码片段:

if(exp1 == exp2)

    NULL ;//IF前面的NULL

else

    exp1;

展开全文  
收起全文  
MySQL操作符学习笔记 (MySQL学习)
发布于 2008-08-15 00:06 阅读:44313 评论:1 标签: MySQL 操作符

    发现许多mysql的基础知识掌握不是很牢固,手头一本《SQL必知必会》,就参照它,另外再自己做一些扩展学习吧。

    以下基本来源手册:第12章:函数和操作符。作为笔记而记录吧。

==========================================================

    除非在文档编制中对一个函数或操作符另有指定的情况外,一个包含NULL 的表达式通常产生一个NULL 值。

    在默认状态下, 在函数和紧随其后的括号之间不得存在空格。这能帮助  MySQL 分析程序区分一些同函数名相同的函数调用以及表或列。不过,函数自变量周围允许有空格出现。

    可以通过选择--sql-mode=IGNORE_SPACE来打开MySQL服务器的方法使服务器接受函数名后的空格。 个人客户端程序可通过选择mysql_real_connect()的CLIENT_IGNORE_SPACE 实现这一状态。在以上两种情况中, 所有的函数名都成为保留字。请参见5.3.2节,“SQL服务器模式”. 

    MySQL按照以下规则进行数值比较

以下是引用片段:
若有一个或两个参数为 NULL,除非NULL-safe <=> 等算符,则比较运算的结果为NULL。

若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。

若两个参数均为整数,则按照整数进行比较。 

十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。

假如参数中的一个为 TIMESTAMP 或 DATETIME 列,而其它参数均为常数, 则在进行比较前将常数转为 timestamp。这样做的目的是为了使ODBC的进行更加顺利。 注意,这不适合IN()中的参数!为了更加可靠,在进行对比时通常使用完整的 datetime/date/time字符串。

在其它情况下,参数作为浮点数进行比较。  

在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 Latin1,同时对英语也适合)。

为了进行比较,可使用CAST()函数将某个值转为另外一种类型。 使用CONVERT()将字符串值转为不同的字符集

    注意,在将一个字符串列同一个数字进行比较时, MySQL 不能使用列中的索引进行快速查找。假如str_col 是一个编入索引的字符串列,则在以下语句中,索引不能执行查找功能:

以下是代码片段:
SELECT * FROM tbl_name WHERE str_col=1;

    其原因是许多不同的字符串都可被转换为数值 1: '1'、 ' 1'、 '1a'、 ……

    以下记录一些我没见过或不熟悉的操作符:

    IS boolean_value IS NOT boolean_value

    根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。

以下是代码片段:
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
        -> 1, 1, 1
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
        -> 1, 1, 0

    IS NULL IS NOT NULL

    检验一个值是否为 NULL。

以下是代码片段:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
        -> 0, 0, 1
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
        -> 1, 1, 0

    为了能够顺利的使用ODBC 程序工作,在使用IS NULL时,MySQL支持一下额外特性:

    在一个值产生后,立即运行一个以下格式的语句,从而找到最新AUTO_INCREMENT 值的所在行:

以下是代码片段:
SELECT * FROM tbl_name WHERE auto_col IS NULL


    当设置SQL_AUTO_IS_NULL=0时,这项操作无法运行。请参见13.5.3节,“SET语法”。

   对于命名为NOT NULL 的DATE 和DATETIME列,可通过使用如下的 语句找到特定日期 '0000-00-00':

以下是代码片段:
SELECT * FROM tbl_name WHERE date_column IS NULL

    运行这一步需要使用一些 ODBC 应用软件,因为 ODBC本身不支持 一个 '0000-00-00'的时间值。 

    expr BETWEEN min AND max

    假如expr大于或等于 min 且expr 小于或等于max, 则BETWEEN 的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式   (min <= expr AND expr <= max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。 

以下是代码片段:
mysql> SELECT 1 BETWEEN 2 AND 3;
        -> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
        -> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
        -> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
        -> 0


    expr NOT BETWEEN min AND max

    这相当于NOT(expr BETWEEN min AND max)。

    COALESCE(value,...)

    返回值为列表当中的第一个非 NULL值,在没有非NULL 值得情况下返回值为 NULL 。

以下是代码片段:
mysql> SELECT COALESCE(NULL,1);
        -> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
        -> NULL

    GREATEST(value1,value2,...)

    当有2或多个参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同LEAST()相同。

以下是代码片段:
mysql> SELECT GREATEST(2,0);
        -> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0
mysql> SELECT GREATEST('B','A','C');
        -> 'C'


    在没有自变量为NULL的情况下,GREATEST()的返回值为NULL。

    ISNULL(expr)

    如expr 为NULL,那么ISNULL() 的返回值为 1,否则返回值为 0。

以下是代码片段:
mysql> SELECT ISNULL(1+1);
        -> 0
mysql> SELECT ISNULL(1/0);
        -> 1


    使用= 的NULL 值对比通常是错误的。

    ISNULL() 函数同 IS NULL比较操作符具有一些相同的特性。请参见有关IS NULL 的说明。

    INTERVAL(N,N1,N2,N3,...)

    假如N < N1,则返回值为0;假如N < N2 等等,则返回值为1;假如N 为NULL,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn 。其原因是使用了二分查找(极快速)。

以下是代码片段:
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
        -> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
        -> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
        -> 0

    LEAST(value1,value2,...)

    在有两个或多个参数的情况下, 返回值为最小 (最小值) 参数。用一下规则将自变量进行对比:
假如返回值被用在一个 INTEGER 语境中,或是所有参数均为整数值,则将其作为整数值进行比较。

    假如返回值被用在一个 REAL语境中,或所有参数均为实值,则 将其作为实值进行比较。
假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。
在其它情况下,将参数作为区分大小写的字符串进行比较。

    假如任意一个自变量为NULL,则 LEAST()的返回值为NULL 。

以下是代码片段:
mysql> SELECT LEAST(2,0);
        -> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
        -> 3.0
mysql> SELECT LEAST('B','A','C');
        -> 'A'

    注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:  

以下是代码片段:
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);
        -> -9223372036854775808

    发生这种情况的原因是MySQL在整数语境中读取9223372036854775808.0。整数表示法不利于保存数值,因此它包括一个带符号整数。

展开全文  
收起全文  
让你的vim显示颜色 (Linux/Unix)
发布于 2008-08-06 23:22 阅读:55319 评论:0 标签: export linux term vim

    使用vim编辑你的程序,如php、c、c++程序,如果没有颜色,相信你会在linux下使用文本编辑程序而感到厌烦。

    这时可更改linux下的终端环境变量TERM,可以使用命令“env”查看TERM的值:

以下是代码片段:
[root@login testing]# env
......
TERM=vt100
......

    更改它的值为“linux”:

以下是代码片段:
[root@login testing]# export TERM=linux

    对于TERM的说法,我也不甚了解。不过你可以man一下看看。对于它可能的值,从网上一篇文章看到可以从这个目录下的文件看到:

以下是引用片段:
/usr/share/terminfo/v/v

    对于“export”,说明如下:

以下是引用片段:

export

语  法:export [-fnp][变量名称]=[变量设置值]

补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。

参  数
 -f  代表[变量名称]中为函数名称。
 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
 -p  列出所有的shell赋予程序的环境变量。


展开全文  
收起全文  
PHP和MySQL的删除空白函数 (MySQL学习)
发布于 2008-08-05 10:41 阅读:24936 评论:0 标签: MySQL PHP trim

    作为黄金搭档,PHP和MySQL都有自己的删除空白函数,而且函数名字也一样:trim(), ltrim(), rtrim()。当然,作为编程语言,PHP删除空白函数更为强大。

    对 ltrim()和rtrim(),从其英语解释来看:

以下是引用片段:
PHP为:Strip whitespace (or other characters)
MySQL为:space characters removed

    显然,PHP还可以有“other characters”,而且PHP的函数还可以用第二个参数自定义要删除的字符。

    对“other characters”,手册解释为:

以下是引用片段:
  • " " (ASCII 32 (0x20)), an ordinary space.
  • "\t" (ASCII 9 (0x09)), a tab.
  • "\n" (ASCII 10 (0x0A)), a new line (line feed).
  • "\r" (ASCII 13 (0x0D)), a carriage return.
  • "\0" (ASCII 0 (0x00)), the NUL-byte.
  • "\x0B" (ASCII 11 (0x0B)), a vertical tab.
  •     不过,MySQL的trim()函数也增加了对其他字符的删除。具体请见下面从手册上摘抄的解释。

    = = = = = = = = = = = = = 方便阅读的分隔线  = = = = = = = = = = = = = = = =

        以下为MySQL的函数解释

        LTRIM(str) 

        Returns the string str with leading space characters removed.

    以下是代码片段:
    mysql> SELECT LTRIM('  barbar');
            -> 'barbar'


        This function is multi-byte safe.

        RTRIM(str)

        Returns the string str with trailing space characters removed.

    以下是代码片段:
    mysql> SELECT RTRIM('barbar   ');
            -> 'barbar'

        This function is multi-byte safe.

        TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)

        Returns the string str with all remstr prefixes or suffixes removed. If none of the specifiers BOTH, LEADING, or TRAILING is given, BOTH is assumed. remstr is optional and, if not specified, spaces are removed.

    以下是代码片段:
    mysql> SELECT TRIM('  bar   ');
            -> 'bar'
    mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
            -> 'barxxx'
    mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
            -> 'bar'
    mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
            -> 'barx'

        This function is multi-byte safe.

        参考:
        php手册
        mysql中英文手册:
        http://dev.mysql.com/doc/refman/5.1/zh/functions.html
        http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_trim

    展开全文  
    收起全文  
    MySQL主从同步关键句 (MySQL学习)
    发布于 2008-08-04 16:31 阅读:35249 评论:0 标签: MySQL 主从同步

        MySQL中文手册把mysql主从同步称为“复制”,感觉翻译的很不好。中文手册主从同步地址是:http://dev.mysql.com/doc/refman/5.1/zh/replication.html

        看资料离不开手册,但每次看手册也很繁琐,现把我认为的一些关键的地方整理出来,方便你我他她。

        一:主从同步原理关键句

        主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

        MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

        每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

        从服务器设置为复制主服务器的数据后,它连接主服务器并等待更新过程。如果主服务器失败,或者从服务器失去与主服务器之间的连接,从服务器保持定期尝试连接,直到它能够继续帧听更新。由--master-connect-retry选项控制重试间隔。 默认为60秒。

        每个从服务器跟踪复制时间。主服务器不知道有多少个从服务器或在某一时刻有哪些被更新了。

        二:主从同步的过程

        MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。

        在前面的描述中,每个从服务器有3个线程(应该是每对主从)。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。

        三:主从同步过程的相关文件

        默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。 默认中继日志索引文件名为host_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay-log和--relay-log-index服务器选项覆盖 默认文件名

        中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。

        从属复制服务器在数据目录中另外创建两个小文件。这些状态文件默认名为主master.info和relay-log.info。它们包含SHOW SLAVE STATUS语句的输出所显示的信息(关于该语句的描述参见13.6.2节,“用于控制从服务器的SQL语句”)。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。

        四:主从同步过程的相关文件和MySQL语句的关系

        由I/O线程更新master.info文件。文件中的行和SHOW SLAVE STATUS显示的列的对应关系为:

    以下是引用片段:
    行 描述
    1 文件中的行号
    2 Master_Log_File
    3 Read_Master_Log_Pos
    4 Master_Host
    5 Master_User
    6 密码(不由SHOW SLAVE STATUS显示)
    7 Master_Port
    8 Connect_Retry
    9 Master_SSL_Allowed
    10 Master_SSL_CA_File
    11 Master_SSL_CA_Path
    12 Master_SSL_Cert
    13 Master_SSL_Cipher
    14 Master_SSL_Key

     
        由SQL线程更新relay-log.info文件。文件中的行和SHOW SLAVE STATUS显示的列的对应关系为:
    以下是引用片段:
    行 描述
    1 Relay_Log_File
    2 Relay_Log_Pos
    3 Relay_Master_Log_File
    4 Exec_Master_Log_Pos

     
        当备份从服务器的数据时,你还应备份这两个小文件以及中继日志文件。它们用来在恢复从服务器的数据后继续进行复制。如果丢失了中继日志但仍然有relay-log.info文件,你可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度。然后可以用Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志。当然,要求二进制日志仍然在主服务器上。

        如果从服务器正复制LOAD DATA INFILE语句,你应也备份该目录内从服务器用于该目的的任何SQL_LOAD-*文件。从服务器需要这些文件继续复制任何中断的LOAD DATA INFILE操作。用--slave-load-tmpdir选项来指定目录的位置。如果未指定, 默认值为tmpdir变量的值。

        五:主从同步起点的说明

        master.info的内容会覆盖命令行或in my.cnf中指定的部分选项。

        如果从服务器启动时master.info文件不存在,选项采用选项文件或命令行中指定的值。首次将服务器作为从服务器启动时,或者已经运行RESET SLAVE然后已经关闭并重启从服务器时会发生。

        如果从服务器启动时master.info文件存在,服务器忽略那些选项。使用master.info文件中发现的值。

        如果你使用与master.info文件中相对应的启动选项的不同的值重启从服务器,启动选项的不同的值不会生效,因为服务器继续使用master.info文件。要想使用启动选项的不同的值,必须删除master.info文件并重启从服务器,或(最好是)在从服务器运行时使用CHANGE MASTER TO语句重新设置值。

        六:如何确保所有从服务器已经处理了中继日志中的所有语句

        在每个从服务器上,发出STOP SLAVE IO_THREAD语句,然后检查SHOW PROCESSLIST语句的输出,直到你看到Has read all relay log。当所有从服务器都执行完这些,它们可以被重新配置为一个新的设置。在被提升为主服务器的从服务器S1上,发出STOP SLAVE和RESET MASTER语句。

        七:如果你确定可以跳过来自主服务器的下一个语句,可以执行下面的语句

    以下是代码片段:
    mysql> SET GLOBAL SQL_slave_SKIP_COUNTER = n;
    mysql> START SLAVE;

        如果来自主服务器的下一个语句不使用AUTO_INCREMENT或LAST_INSERT_ID(),n 值应为1。否则,值应为2。使用AUTO_INCREMENT或LAST_INSERT_ID()的语句使用值2的原因是它们从主服务器的二进制日志中取两个事件。

        七:两个重要的选项:

        1):・ --logs-slave-updates

        这个是在my.cnf文件配置的

        通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用--logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-updates。例如,可能你想要这样设置:

         A -> B -> C

        也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B。

        2):・ --slave-skip-errors=[err_code1,err_code2,... | all]

        这个是在mysql启动时的选项

        通常情况,当出现错误时复制停止,这样给你一个机会手动解决数据中的不一致性问题。该选项告诉从服务器SQL线程当语句返回任何选项值中所列的错误时继续复制。

        如果你不能完全理解为什么发生错误,则不要使用该选项。如果复制设置和客户程序中没有bug,并且MySQL自身也没有bug,应不会发生停止复制的错误。滥用该选项会使从服务器与主服务器不能保存同步,并且你找不到原因。

        对于错误代码,你应使用从服务器错误日志中错误消息提供的编号和SHOW SLAVE STATUS的输出。服务器错误代码列于附录B:错误代码和消息。

        你也可以(但不应)使用不推荐的all值忽略所有错误消息,不考虑所发生的错误。无需而言,如果使用该值,我们不能保证数据的完整性。在这种情况下,如果从服务器的数据与主服务器上的不相近请不要抱怨(或编写bug报告)。已经警告你了。

        例如:

    以下是代码片段:
    --slave-skip-errors=1062,1053
    --slave-skip-errors=all

        八:二个有用的问与答:

        1)Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器?
             A:有多种方法。如果你在某时间点做过主服务器备份并且记录了相应快照的二进制日志名和偏移量(通过SHOW MASTER STATUS命令的输出),采用下面的步骤:

    以下是引用片段:
        1.    确保从服务器分配了一个唯一的服务器ID号。
        2.    在从服务器上执行下面的语句,为每个选项填入适当的值:
                mysql> CHANGE MASTER TO
                        ->     MASTER_HOST='master_host_name',
                        ->     MASTER_USER='master_user_name',
                        ->     MASTER_PASSWORD='master_pass',
                        ->     MASTER_LOG_FILE='recorded_log_file_name',
                        ->     MASTER_LOG_POS=recorded_log_position;
        3.    在从服务器上执行START SLAVE语句。

        如果你没有备份主服务器,这里是一个创建备份的快速程序。所有步骤都应该在主服务器主机上执行。

    以下是引用片段:
    1.    发出该语句:
         mysql> FLUSH TABLES WITH READ LOCK;
    2.    仍然加锁时,执行该命令(或它的变体):
         shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
    3.    发出该语句并且确保记录了以后用到的输出:
         mysql>SHOW MASTER STATUS;
    4.    释放锁:
         mysql> UNLOCK TABLES;

        一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制。要这样做,你可以在主服务器上使用mysqldump --master-data,以后装载SQL转储到到你的从服务器。然而,这比进行二进制复制速度慢。

        不管你使用这两种方法中的那一个,当你有一个快照和记录了日志名与偏移量时,后来根据说明操作。你可以使用相同的快照建立多个从服务器。一旦你拥有主服务器的一个快照,可以等待创建一个从服务器,只要主服务器的二进制日志完整。两个能够等待的时间实际的限制是指在主服务器上保存二进制日志的可用硬盘空间和从服务器同步所用的时间。

        你也可以使用LOAD DATA FROM MASTER。这是一个方便的语句,它传输一个快照到从服务器并且立即调整日志名和偏移量。将来,LOAD DATA FROM MASTER将成为创建从服务器的推荐方法。然而需要注意,它只工作在MyISAM 表上并且可能长时间持有读锁定。它并不象我们希望的那样高效率地执行。如果你有大表,执行FLUSH TABLES WITH READ LOCK语句后,这时首选方法仍然是在主服务器上制作二进制快照。

        2)Q:从服务器需要始终连接到主服务器吗?
             A:不,不需要。从服务器可以宕机或断开连接几个小时甚至几天,重新连接后获得更新信息。例如,你可以在通过拨号的链接上设置主服务器/从服务器关系,其中只是偶尔短时间内进行连接。这意味着,在任何给定时间,从服务器不能保证与主服务器同步除非你执行某些特殊的方法。将来,我们将使用选项来阻塞主服务器直到有一个从服务器同步。

    展开全文  
    收起全文  
    牛顿悼文 (随便说说)
    发布于 2008-07-10 14:59 阅读:20012 评论:0 标签: 爱迪生 爱因斯坦 谎言 牛顿

        看见一个很有意思的文章,可以了解牛顿生平。其中对“站在巨人肩膀”的典故的还原让我想起了另外一件事。

        上学的时候,老师家长们常教育的故事一般都有爱迪生的“天才那就是1%的灵感加上99%的汗水”。80年代的同学们,想想你们教室的两边、走廊上是不是有这样的话?但实际上呢,最关键的后面那半句话被人为的删掉了:“但那1%的灵感是最重要的,甚至比那99%的汗水都要重要”。

        优秀的人总是有自豪感的,比如爱因斯坦说“造成这一切悲剧的主要原因,是因为多数人的道德和智慧,与那极少数真正为人类创造价值的人比起来,是无比低下。”

        不禁为智商平平的我感到惭愧、、、、、、

    ----------------------------- 方便阅读的分割线 -----------------------------

        牛顿悼文原文附后:看了别人的悼文才知道自己有多没才华 转帖牛顿悼文

        3月28号是牛顿的忌日,但是知道的人很少,我们毕竟更关心沈殿霞和张国荣。其实牛顿老师在科学圈里曾经很有权势,被女王封了爵位成了贵族,官至皇家造币局局长兼皇家学会会长。如果阿尔伯特没有辞了以色列总统的话和他有一拼。说他有权势并不仅是官大,主要是贡献大。如果17世纪就有诺贝尔奖的话,牛顿老师至少能连续垄断4届物理学奖(分光计;力学体系的构建;反射望远镜;万有引力),同时为了表彰他在炼金方面的造诣,再奉送他一届化学奖。而且这孙子鼓捣出了流数术,所以菲尔兹数学奖也要给他。要知道,他的这些发现基本都是在26岁以前获得的,30岁以后牛顿就开始玩票了,成天琢磨上帝和炼金,以及怎样把莱布尼茨搞臭,捎带手的把以前的发现整理成书。所以你能想象到他在当时的欧洲是如何的一呼万应,敢跟他叫板的只有莱布尼茨和大主教贝克莱。牛老师死的时候,全英国的名流以给他扶柩为荣,全欧洲的名流蜂拥伦敦。来自法国的傻逼文科生伏尔泰在国葬现场大受刺激,回去就写了首诗,嫉妒之情溢于言表。

        牛顿老师的一生是天才的一生,战斗的一生,也是孤独的一生。一辈子没有朋友,也没有结过婚,很可能到死都是处男,关于牛顿是否处男的问题,由于篇幅过长,我将在另一篇文中论证。当然他肯定不会孤独,因为科学的世界里乐趣无限,快感连连。出乎世俗想象的是,科学其实远比任何娘们儿都风骚,玩科学比玩女人爽得多,得到一个成果所获得的高潮强烈而持久,不仅有快感,更有巨大的自我认同感,远胜于那几秒寒颤之后无边的空虚与落寞。所以陈景润其实是沉溺于美色不能自拔,身体弱架不住高潮过度被爽死了。

        牛顿老师茕茕孑立,形影相吊的原因是多方面的。首先他生性孤傲,自恃高才,瞅谁都是傻逼,当然不会真心跟傻逼交朋友。同时在他眼里人是不分男女的,只有傻逼和巨傻逼两种,所以他对女色没兴趣也就可以理解了。有婚介中心给他介绍过几个名媛,拾掇拾掇都是当王妃的坯子,但一见面就受不了牛顿的牛逼烘烘和不知所云。比如有次相亲,他把姑娘的手指头塞进了烟斗。

        另一方面是外在的,不光他不愿意交朋友,也没有人真正想跟牛顿当朋友,结交他的人都是有目的的。人们对他只有敬畏和仰慕,并不真的喜欢他。这道理其实很浅显,绝大部分人都热衷于跟比自己傻的人待着,很少有人愿意在人精的身边衬托自己的二逼。所以好多人都喜欢小动物和小孩子,就是因为这些东西够傻。不少姑娘一见到小猫小狗小人儿都会迫不及待的搂抱,接踵而至的就是很嗲的说好可爱欧~,听得我阴毛都竖起来了。有时候可爱和憨态可掬的潜台词就是弱智。小猴子也很好玩,喜欢的人就少多了,因为猴子机灵到能戏弄人,那些人没有驾驭猴子的自信。同理,喜欢小孩的都是喜欢他们的单纯与缺心眼,在他们眼里,小孩跟小动物没有本质区别,也都是四条腿走路,露着屁眼随时拉撒。如果遇到一个小天才,3岁就会心算三位数乘法或者知道傻逼二字的正确写法,她们一定会骇破了胆。所以那些喜欢养猫狗的女士们别再标榜自己有爱心了,你们其实比谁都缺德。我从不喜欢猫狗,这是因为我敬畏大自然的生灵而不忍戏弄它们;我也不喜欢小孩,因为我把他们当作一个大写的人而不是小畜生看待。

        大家不喜欢牛顿的另一个原因是他性格暴戾乖张。长年在他身边的人回忆说,牛顿在人前只笑过两回,其中一次还是嘲笑:有人问他,欧几里得的《几何原本》那么老朽,不知道还有什么价值。牛顿闻听放声大笑。而且他人品太差,跟谁都打架。众所周知他从小就有校园暴力的记录,胖子同学不小心踩了他的风车,他抬手就把胖子打哭了,我们的教科书居然说这是他有志气的表现。长大了不以拳脚论高下,他就雇用枪手大骂莱布尼茨,甚至不惜化名亲自去骂,人品至此真是无以复加。莱布尼茨若不是脸皮厚早就跟纳什一样疯了,而且牛顿老师肯定会拍个片子叫《丑陋心灵》继续恶心人家。

        关于牛顿的另一个谎言是他的谦虚,证据就是牛顿老师说过两段著名的话,一段是站在巨人肩膀上,另一段是海边捡石头子。这确实很有迷惑性,我第一次听到后感动的直冒鼻涕泡。但任何话语都是有语境的,巨人肩膀那一句的语境是这样的:胡克其实早就发现了万有引力定律并推导出了正确的公式,但由于数学不好,他只能勉强解释行星绕日的圆周运动,而且他没有认识到支配天体运行的力量其实是普遍存在的,是“万有”的。第谷早在100年前就发现了行星的公转其实是椭圆运动,开普勒甚至提出了行星运动三定律。所以科学界对胡克的成果不太重视。后来数学小狂人牛顿用微积分极其圆满的解决了这个问题并把他提出的力学三条基本定律成功推广到了星系空间,改变了自从亚里士多德以来公认的天地不一的旧观点,被科学界奉为伟大的发现。于是胡克大怒,指责牛顿剽窃了自己的成果。牛顿尖酸刻薄的回敬道:是啊,我他妈还真是站在巨人的肩膀上呢!这本是一句反语,至少不是真的想客气一下。几百年后罗永浩说自己只是站在巨人的肩膀上也是这意思。但后人出于塑造完人的目的,只保留了孤立的原话而去掉了语境,变成了一句彻头彻尾的谦辞。(转帖者注,胡克也就一米五几)

        牛顿老师人品差,不谦虚,没朋友,按现在的说法这是典型的高智商低情商,事业不会成功。但我们也发现,当智商高到一定程度的时候是可以取代情商的。所以那些说自己情商低的所谓天才们,你们没成功只是他妈的还不够聪明而已,怨不着人家情商。要知道牛顿是个遗腹子和早产儿,出生时体重不到5斤,没吃过DHA和 RHA配方的奶粉。亲娘改嫁后跟文盲姥姥度过无聊的童年,没有任何的早期智力开发和学前启蒙,7岁上学以前脑子里空空如也,牛妈妈对他的期望仅仅是认识点字然后回家务农。但是牛顿上中学后已经熟练掌握了拉丁语希腊语西班牙语和英语,然后被推荐进了剑桥,20出头就当了卢卡斯教席的终身教授。

        晚年的牛顿除了升官发财再无其他骄傲之处,而且官迷心窍,没退休一直干到85岁寿终。当然他并没闲着,写了150万字的神学著作,同时一心扑在化学事业上,在家里盖了窑子,拿出年轻时搞物理的劲头玩命试验。但这次他的出发点就错了,总是希望从黄铜和煤渣中提炼出黄金。要知道化学反应只改变分子并不能改变原子,能给原子做变性手术的只能是核反应。他违背了物质不灭的化学定律,所以虾米了。

        最后,说两段悼词。一段是他的墓志铭:伊萨克牛顿爵士,安葬在这里。他以超乎常人的智力,第一个证明了行星的运动与形状;彗星轨道与海洋的潮汐。他孜孜不倦地研究,光线的各种不同的折射角,颜色所产生的种种性质。让人类欢呼,曾经存在过这样一位,伟大的人类之光。另一段是英国诗人写的:自然和自然的规律隐藏在茫茫黑夜之中。上帝说:让牛顿降生吧。于是一片光明。

        不知道为什么,一想到这里,我总是有点感动。

    展开全文  
    收起全文  
    crontab命令的使用介绍及我的体会 (Linux/Unix)
    发布于 2008-07-09 13:21 阅读:202932 评论:3 标签: crontab Linux

        一:前言

        cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。简而言之,如果你想让系统自动在你指定的时间执行某命令,你需要了解crontab这个命令。它不是一个单纯的命令,而是引发一个脚本,具体执行的是这个脚本里面的命令。

        在要判定该服务是否在运行,使用 /sbin/service crond status 命令。
        要启动 cron 服务,使用 /sbin/service crond start 命令。
        要停止该服务,使用 /sbin/service crond stop 命令。
        一般推荐你在引导时启动该服务。

        二:了解 cron 任务

        cron 的主配置文件是 /etc/crontab,它包括下面几行:

    以下是引用片段:
    [root@login mobile]# cat /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/

    # run-parts
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly
    0 3 * * * root /var/cfengine/bin/cfexecd -F

        前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

        值得注意的是:

        1:上面的PATH 变量定义用来执行命令的路径,这么一来,如果你在crontab里执行的命令不再这个路径中,请使用命令的全路径,否则crontab并不会为你去寻找。如php命令,你可能是安装到了你指定的路径,那你应该使用which命令找到php命令的全路径。

        2:MAILTO 变量可能会给你带来麻烦,因为它可能会不断的发信,而使你的磁盘臃肿,使用率达到100%,一般是:/var/spool/clientmqueue/ 这个夹,而且里面的文件及其多,并且都是小文件,使用rm命令会提示你文件太多而无法删除,这时你需要了解“ls | xargs rm -f”这个命令的含义。

        与其日积月累,非常的多,甚至会撑爆整个系统。不如每条命令后面进行重定向处理,这是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。

        三:crontab 相关的文件

        如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

        如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

    以下是引用片段:
    # record the memory usage of the system every monday
                # at 3:30AM in the file /tmp/meminfo
                30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
                # run custom script the first day of every month at 4:10AM
                10 4 1 * * /root/scripts/backup.sh

        四:crontab命令语法

        格式为:

    以下是代码片段:
    crontab [ -e [UserName] | -l [UserName] | -r [UserName] | -v [UserName] | File ]

        解释如下:

    以下是引用片段:
    -e    UserName 编辑用户的 crontab 文件的拷贝,或者,如果一个有效的 UserName 的 crontab 文件不存在则创建一个空的文件进行编辑。当编辑完成后,文件被拷贝到 crontab 目录作为用户的crontab 文件。
    -l    UserName 列出用户的 crontab 文件。
    -r    UserName 从 crontab 目录除去用户的 crontab 文件。
    -v    UserName 列出用户 cron 作业的状态。
    File    以File做为crontab的任务列表文件并载入

        五:crontab文件命令使用格式

        /etc/crontab 文件中的每一行都代表一项任务,它的格式是:

    以下是代码片段:
    minute   hour   day   month   dayofweek   command

        ● minute ― 分钟,从 0 到 59 之间的任何整数
        ● hour ― 小时,从 0 到 23 之间的任何整数
        ● day ― 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)
        ● month ― 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)
        ● dayofweek ― 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)
        ● command ― 要执行的命令(命令可以是 ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)

        在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

        整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

        用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

        正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

        开头为井号(#)的行是注释,不会被处理。

        六:安全性:控制使用 crontab 命令

        /var/adm/cron/cron.allow 和 /var/adm/cron/cron.deny 文件控制哪一个用户可以使用 crontab 命令。root 用户可以创建、编辑或删除这些文件。这些文件的条目是用户登录名称,每个名称占一行。两个文件都不允许空格。如果登录标识和多个的登录名称相关联,这个crontab 命令采用第一个在 /etc/passwd 文件中的登录名称,而不管当前实际使用哪一个登录名称。而且,要允许用户启动 cron 作业,应该使用 chuser 命令将 /etc/security/user 文件中的守护进程属性设置为 TRUE。

        以下关于 cron.allow 文件的一个示例:

    以下是引用片段:
    root
    nick
    dee
    sarah

        如果 cron.allow 文件存在,只有在文件中出现其登录名称的用户可以使用 crontab 命令。root 用户的登录名必须出现在 cron.allow 文件中,如果这个文件存在的话。系统管理员可以明确的停止一个用户,通过使用 crontab 命令,同时在cron.deny 文件中列出用户的登录名。如果只有 cron.deny 文件存在,任一名称没有出现在这个文件中的用户可以使用 crontab 命令。

        如果以下一个条件成立,用户将不能使用 crontab 命令:

        ● cron.allow 文件和 cron.deny 文件不存在(只允许 root 用户)。 
        ● cron.allow 文件存在,但用户的登录名并不列在其中。 
        ● cron.deny 文件存在,并且用户的登录名列在其中。
        ● 如果 cron.allow 和 cron.deny 文件都不存在,只有被 root 用户授权的人可以用 crontab 命令提交一个作业。

        七:用户与crontab文件的关联

        根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

        cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。

        八:示例

        1:拷贝一个名为 mycronjobs 的文件,到 /var/admn/cron/crontabs 目录下,输入以下内容:

    以下是代码片段:
    crontab mycronjobs

        2:将时间以小时的形式把每个小时写到 console 中,输入:

    以下是代码片段:
    0 * * * * echo The hour is `date` 。>/dev/console

        3:要在每个星期一、星期三和星期五的 6:30 a.m. 运行 calendar 命令,输入:

    以下是代码片段:
    30 6 * * 1,3,5 /usr/bin/calendar

        4:要在一年的每一天的 6:30 运行 calendar 命令,输入:

    以下是代码片段:
    30 6 * * * /usr/bin/calendar

        5:要在八月的每天午夜运行一个称为 maintenance 的脚本,输入:

    以下是代码片段:
    0 0 * 8 * /u/harry/bin/maintenance

        6:为命令的标准输入定义文本,输入:

    以下是代码片段:
    0 16 * 12 5 /usr/sbin/wall%HAPPY HOLIDAY!%Remember to turn in your time card.

    在 %(百分号)之后定义 wall 命令的标准输入的文本:

    HAPPY HOLIDAY!
     
    Remember to turn in your time card.

        7:每天早上6点10分

    以下是代码片段:
    10 6 * * * date

        8:每两个小时  

    以下是代码片段:
    0 */2 * * * date (solaris 5.8似乎不支持此种写法)

        9:晚上11点到早上8点之间每两个小时,早上8点

    以下是代码片段:
    0 23-7/2,8 * * * date

        10:每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

    以下是代码片段:
    0 11 4 * mon-wed date

        九:参考和感谢

        本文参考、大多抄袭了以下文章,特此感谢。

    以下是引用片段:
    Linux crontab-自动化的任务:http://www.eygle.com/digest/2006/01/hwoto_linux_crontab.html

    crontab 命令:http://study.chyangwa.com/IT/AIX/aixcmds1/crontab.htm

    Crontab 笔记:http://www.dbanotes.net/techmemo/crontab_tips.html

    展开全文  
    收起全文  
    发现我是个懒得写blog的人 (随便说说)
    发布于 2008-07-07 22:40 阅读:70081 评论:0 标签: 生活 学习

        发现,我是个懒得写blog的人。

        发现,网站的流量越来越少了,原因是搜索引擎来的流量少了,那为什么从搜索引擎来的流量少了呢,是因为我最近更新的blog文章少了,那为什么我最近更新的blog文章少了呢,是因为工作时间长了,让我没激情了?有可能。

        尽管在不断的学习积累,但感觉还是不够,也许是给自己的压力不够大,或是惰性来了。

        觉得应该再把时间抓紧点。解决一下效率问题,再做点为未来有必要做的事。

    展开全文  
    收起全文  
    MySQL server has gone away问题及其解决 (MySQL学习)
    发布于 2008-06-16 20:06 阅读:27602 评论:1 标签: away MySQL

        初看这个提示,你可能会发笑,这个mysql的提示真是人性化呢。很快你就会笑不出来了,因为,问题是需要用来解决的。

        看上去,应该是两次mysql操作之间的时间太长了,导致mysql连接自动关闭了。可是根据经验,对同一批数据,此前程序也这么写过,两次操作的时间也同样很长。更何况,同事也同时在操作这个库,间隔的时间比我的更长。

        看了mysql服务器端的wait_timeout和max_allowed_packet的值,绝对的长和大!如下:

    以下是代码片段:
    mysql> show variables like 'wait_timeout';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | wait_timeout  | 28800 |
    +---------------+-------+
    1 row in set (0.00 sec)

    mysql> show variables like 'max_allowed_packet';
    +--------------------+---------+
    | Variable_name      | Value   |
    +--------------------+---------+
    | max_allowed_packet | 1048576 |
    +--------------------+---------+
    1 row in set (0.00 sec)

       看着这些数据,感觉可以判断出服务器端应该是没有问题的,但是总得用实验说话,编写如下程序:

    以下是代码片段:
    $link = mysql_connect('...', '...', '...');
    mysql_select_db("...", $link);

    echo "Start !\n";

    sleep(30);

    echo "End !\n";

    mysql_close($link);
    ?>

        执行之后,到mysql服务器端show processlist;发现一超过20秒,就没有其连接了。然而再到另一台服务器上执行,却无此问题。top命令了一下,发现两台服务器的空闲内存的确差异很大。而上面又说明了,同事和我在同一服务器上对这个库进行操作却无此问题,真令人诧异。

        而后又发现,我程序有个bug,有一数字变量本意是存储sql语句的记录,然而并没有考虑这个数组在执行时间好几个小时之后的大小会成为天文数字。莫非这个地方有问题?

       既然暂时可以排除服务器的问题,只好从我的程序入手了。

       mysql_ping()是个好东西,但用得也不是很爽。手册中“If it has gone down, an automatic reconnection is attempted. ”。但是,发现它并没有automatic reconnection。

       于是只好,先判断mysql_ping()的返回值,如果false,则mysql_close()本次连接,然后mysql_connect()。

        如果是在类里面实现的话,建议加上mysql_connect()第四的参数为true。这样在实例化的时候避免资源符号只有一个。

        参考资料:

    以下是引用片段:
    MySQL: 诡异的MySQL server has gone away及其解决
    http://www.jimmydong.com/blog/post/1/123

    MySQL server has gone away
    http://hi.baidu.com/thinkinginlamp/blog/item/8512ad4b6f2e96f482025cf7.html

    B.1.2.9. MySQL server has gone away
    http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

    MySQL server has gone away 解决办法
    http://yytcpt.blueidea.com/archives/2007/4280.shtml

    mysql_ping
    http://cn2.php.net/mysql_ping

    展开全文  
    收起全文