Ubuntu下安装Memcache

安装服务器
sudo apt-get install memcached
$ memcached -d -m 50 -p 11211 -u root

参数说明 -m 指定使用多少兆的缓存空间;-p 指定要监听的端口; -u 指定以哪个用户来运行
 

安装php 模块

sudo apt-get install php5-memcache
 

编辑配置文件
$ sudo vim /etc/php5/conf.d/memcache.ini
; uncomment the next line to enable the module

extension=memcache.so
 

[memcache]
memcache.dbpath=”/var/lib/memcache”
memcache.maxreclevel=0
memcache.maxfiles=0
memcache.archivememlim=0
memcache.maxfilesize=0

memcache.maxratio=0
 

在apache中使用 memcache 来作 session 存储,用例子测试一下:

 

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”

使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″ 。

 

用 sessionid 去 memcached 里查询一下:

 

用 memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。

Out of resources when opening file ‘./xxx.MYD’ (Errcode: 24) 解决

前两天数据库出现了这个错误,在网上查找到了解决方法。在解决过程中的一些问 题记录下来。首先出现Out of resources when opening file ‘./xxx.MYD’ (Errcode: 24)错误是因为打开的文件数超过了my.cnf的–open-files-limit。 open-files-limit选项无法在mysql命令行直接修改,必须在my.cnf中设定,最大值是65536。

 

重新启动以后,发现

mysql> show variables like ‘open%’;
+——————+——-+
| Variable_name    | Value |
+——————+——-+
| open_files_limit | 1024  |
+——————+——-+
1 row in set (0.00 sec)

 

并没有改变。赶快查看服务器的打开文件数设定的值(用ulimit -n查看),结果发现果然是1024。在修改服务器设置后,也改成了65536,重启服务还是没有改变。需要重新登录服务器再重启数据库服务就OK了。原来这个值会取数据库和服务器设定的最小值。
 
 

mysql> show variables like ‘open%’;

+——————+——-+

| Variable_name    | Value |

+——————+——-+

| open_files_limit | 65536 |

+——————+——-+


1 row in set (0.00 sec)
 
 
 
 
 

使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。

 

新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。

 

使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)

 

有如下三种修改方式:

 

1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535

 

具体使用哪种,试试哪种有效吧,我在 CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果

 

常用正则表达式

“^\d+$”  //非负整数(正整数 + 0)
“^[0-9]*[1-9][0-9]*$”  //正整数
“^((-\d+)|(0+))$”  //非正整数(负整数 + 0)
“^-[0-9]*[1-9][0-9]*$”  //负整数
“^-?\d+$”    //整数
“^\d+(\.\d+)?$”  //非负浮点数(正浮点数 + 0)
“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数
“^((-\d+(\.\d+)?)|(0+(\.0+)?))$”  //非正浮点数(负浮点数 + 0)
“^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点数

“^(-?\d+)(\.\d+)?$”  //浮点数
“^[A-Za-z]+$”  //由26个英文字母组成的字符串
“^[A-Z]+$”  //由26个英文字母的大写组成的字符串
“^[a-z]+$”  //由26个英文字母的小写组成的字符串
“^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串
“^\w+$”  //由数字、26个英文字母或者下划线组成的字符串
“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”    //email地址
“^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”  //url
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”   //Emil

/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //电话号码
“^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$”   //IP地址

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

元字符及其在正则表达式上下文中的行为:

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。

$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。

* 匹配前面的子表达式零次或多次。

+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。

? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 //OSPHP.COm.CN

{n} n 是一个非负整数,匹配确定的n 次。

{n,} n 是一个非负整数,至少匹配n 次。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。
(pattern) 匹配pattern 并获取这一匹配。

(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

(?!pattern) 负向预查,与(?=pattern)作用相反

x|y 匹配 x 或 y。

[xyz] 字符集合。

[^xyz] 负值字符集合。

[a-z] 字符范围,匹配指定范围内的任意字符。

[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。

\B 匹配非单词边界。

\cx 匹配由x指明的控制字符。

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。

\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 //OSPHP.COM.Cn开源

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

匹配中文字符的正则表达式: [u4e00-u9fa5]

匹配双字节字符(包括汉字在内):[^x00-xff]

匹配空行的正则表达式:n[s| ]*r

匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/

匹配首尾空格的正则表达式:(^s*)|(s*$)

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:onkeyup=”value=value.replace(/[^u4E00-u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^u4E00-u9FA5]/g,”))”

用正则表达式限制只能输入全角字符: onkeyup=”value=value.replace(/[^uFF00-uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^uFF00-uFFFF]/g,”))”

用正则表达式限制只能输入数字:onkeyup=”value=value.replace(/[^d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”

用正则表达式限制只能输入数字和英文:onkeyup=”value=value.replace(/[W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”

=========常用正则式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

sql语句:^(select|drop|delete|create|update|insert).*$

1、非负整数:^\d+$

2、正整数:^[0-9]*[1-9][0-9]*$

3、非正整数:^((-\d+)|(0+))$

4、负整数:^-[0-9]*[1-9][0-9]*$

5、整数:^-?\d+$

6、非负浮点数:^\d+(\.\d+)?$

7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$

9、负浮点数:^(-((正浮点数正则式)))$

10、英文字符串:^[A-Za-z]+$

11、英文大写串:^[A-Z]+$

12、英文小写串:^[a-z]+$

13、英文字符数字串:^[A-Za-z0-9]+$

14、英数字加下划线串:^\w+$

15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //OSPHP.COm.CN

16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\”\”])*$

17、邮政编码:^[1-9]\d{5}$

18、中文:^[\u0391-\uFFE5]+$

19、电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$

20、手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$

21、双字节字符(包括汉字在内):^\x00-\xff

22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)

23、匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/>

24、匹配空行:\n[\s| ]*\r

25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)? //OSPHP.COM.Cn开源

26、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)?

28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)

29、提取信息中的中国手机号码:(86)*0*13\d{9}

30、提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}

31、提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}

32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}

33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+

34、提取信息中的任何数字 :(-?\d*)(\.\d+)?

35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)

36、电话区号:/^0\d{2,3}$/

37、腾讯QQ号:^[1-9]*[1-9][0-9]*$

38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

MySQL Replication的实现原理

要想用好一个系统,理解其实现原理是非常重要的事情,只有理解了其实现原理,我们才能够扬长避短,合理的利用,才能够搭建出最适合我们自己应用环境 的系统,才能够在系统实施之后更好的维护他。MySQL Replication 可以说是在目前 MySQL 数据库的实际应用场景中最为常见的Scale Out 手段了,这里就针对其实现原理做一个简单的分析。
 

  一、 Replication 线程

   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。

 

  要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。

 

  MySQL 复制的基本过程如下:

 

  1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

 

   2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;

 

  3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

 

   4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。

 
 

  实际上,在老版本中,MySQL 的复制实现在 Slave 端并不是由 SQL 线程和 IO 线程这两个线程共同协作而完成的,而是由单独的一个线程来完成所有的工作。但是 MySQL 的工程师们很快发现,这样做存在很大的风险和性能问题,主要如下:

 

   首先,如果通过一个单一的线程来独立实现这个工作的话,就使复制 Master 端的,Binary Log日志,以及解析这些日志,然后再在自身执行的这个过程成为一个串行的过程,性能自然会受到较大的限制,这种架构下的 Replication 的延迟自然就比较长了。

 

  其次,Slave 端的这个复制线程从 Master 端获取 Binary Log 过来之后,需要接着解析这些内容,还原成 Master 端所执行的原始 Query,然后在自身执行。在这个过程中,Master端很可能又已经产生了大量的变化并生成了大量的 Binary Log 信息。如果在这个阶段 Master 端的存储系统出现了无法修复的故障,那么在这个阶段所产生的所有变更都将永远的丢失,无法再找回来。这种潜在风险在Slave 端压力比较大的时候尤其突出,因为如果 Slave 压力比较大,解析日志以及应用这些日志所花费的时间自然就会更长一些,可能丢失的数据也就会更多。

 

   所以,在后期的改造中,新版本的 MySQL 为了尽量减小这个风险,并提高复制的性能,将 Slave 端的复制改为两个线程来完成,也就是前面所提到的 SQL 线程和 IO 线程。最早提出这个改进方案的是Yahoo!的一位工程师“Jeremy Zawodny”。通过这样的改造,这样既在很大程度上解决了性能问题,缩短了异步的延时时间,同时也减少了潜在的数据丢失量。

 

  当然,即使是换成了现在这样两个线程来协作处理之后,同样也还是存在 Slave 数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是存在的。

 

  如果要完全避免这些问题,就只能用 MySQL 的 Cluster 来解决了。不过 MySQL的 Cluster 知道笔者写这部分内容的时候,仍然还是一个内存数 据库的解决方案,也就是需要将所有数据包括索引全部都 Load 到内存中,这样就对内存的要求就非常大的大,对于一般的大众化应用来说可实施性并不是太大。当然,在之前与 MySQL 的 CTO David 交流的时候得知,MySQL 现在正在不断改进其 Cluster 的实现,其中非常大的一个改动就是允许数据不用全部 Load 到内存中,而仅仅只是索引全部 Load 到内存中,我想信在完成该项改造之后的 MySQL Cluster 将会更加受人欢迎,可实施性也会更大。

 
 
 
 

二、Replication 实现级别

  由于MySQL Replication 是基于 Binary Log 实现的,所以Replication 的实现级别实际上是由Binary Log 的存储格式所决定。Binary Log 中记录 Eent 的方式可以是基于一条语句(Statement Level),也可以是基于一条记录(Row level),这可以在 MySQL 的配置参数(—binlog-format)中设定这个格式。

 

  1. Row Level:Binary Log 中会记录成每一行数据被修改的形式,然后在 Slave 端再对相同的数据进行修改。

   优点:在 Row Level 模式下,Binary Log 中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以 Row Level 的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调 用和触发无法被正确复制的问题。

  缺点:Row Level下,所有的执行的语句当记录到 Binary Log 中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:UPDATE group_message SET group_id = 1 where group_id = 2,执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录 Binary Log 日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,Binary Log 日志的量就会很大。尤其是当执行ALTER TABLE 之类的语句的时候,产生的日志量是惊人的。因为MySQL对于 ALTER TABLE 之类的 DDL 变更语句的处理方式是重建整个表的所有数据,也就是说表中的每一条记录都需要变动,那么该表的每一条记录都会被记录到日志中。

 

  2. Statement Level:每一条会修改数据的 Query 都会记录到 Master的 Binary Log 中。Slave在复制的时候 SQL 线程会解析成和原来 Master 端执行过的相同的 Query 来再次执行。

   优点:Statement Level下的优点首先就是解决了Row Level下的缺点,不需要记录每一行数据的变化,减少 Binary Log 日志量,节约了 IO 成本,提高了性能。因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。

  缺 点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信 息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于Mysql现在发展比较快,很多的新功能不 断的加入,使mysql得复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比 如:sleep()函数在有些版本中就不能真确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到 不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。

 

  3. Mixed Level: 从 5.1.8 版本开始,MySQL 提供了除Statement Level和Row Level之外的第三种 Mixed Level,实际上就是前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的 Query 语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。除了MySQL认为通过STATEMENT方式可能造成复制过程中 Master与Slave之间产生不一致数据(如特殊Procedure和Function的使用,UUID()函数的使用等特殊情况)的时候MySQL 会选择ROW的模式来记录变更之外,都会使用STATEMENT模式来记录变更。当然,这里需要排除的特殊情况并不仅仅只有上面所描述的这几种,具体请参 考 MySQL 官方的详细手册。

  老版本的 MySQL 一直都只有基于 Statement 的复制模式,直到5.1.5版本的 MySQL 才开始支持Row Level的复制。从5.0开始,MySQL 的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给 MySQL 的复制又带来了更大的新挑战。另外,看到官方文档说,从5.1.8版本开始,MySQL 开始提供 Mixed Level,新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的Mysql中队Row Level模式也被做了优化,并不是所有的修改都会以Row Level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果 Query 语句确实就是 UPDATE 或者 DELETE 等修改数据的语句,那么还是会记录所有行的变更。

APP STORE 软件商店盈利模式分析

APP  STORE

 

2008年7月,苹果应用软件商店正式上线,在不到一年的时间里,下载量就超过10亿次,应 用总数超过5万个。据预计,该应用商店2009年营收至少将达3.65亿美元。这让众多企业真正感受到了手机应用软件和内容产业巨大的商机。应用软件商店 的火爆也源于手机消费者对于应用软件的需求高涨。3G网络的建设和智能手机的普及使得更多的手机应用成为可能,消费者对应用的需求大大增加。支持丰富应用 的智能手机成为手机市场中的一个亮点,智能手机较强的企业市场份额持续上升。据Informa估计,2009年,智能手机将占据手机市场份额的 13.5%,而到2013年这一比例还有望增加至38%。随着智能手机销量的增长,手机应用软件可能成为一个有很大潜力的市场。2008年,手机应用程序 商店的销售额为10亿美元。据咨询公司JuniperResearch估计,到2014年这一市场将达到250亿美元。苹果应用软件商店的成功进一步推动 了产业链中各类企业对于应用软件商店的投入。(:中国三星经济研究院战略组研究员)

 

苹果对于应用软件商店的成功取决于两个重要因素:开发者和用户规模。只有拥有大量的开发人 员,才能保证丰富的应用供应,从而吸引大量用户。而另一方面,只有存在大批乐于购买应用软件和内容的用户,才能够确保开发者的盈利。事实上,苹果正是从供 应和需求这两个方面奠定了应用软件商店成功的基础。在需求方面,苹果跨时代产品iPod一开始只是个播放设备,为了便于用户下载音乐等内容产品,2001 年苹果与上游内容提供商合作,使iPod用户通过iTunes下载音乐,实现播放设备与内容的完美结合,随后苹果将这一模式扩展至手机领域。2007年4 月,苹果已经售出1亿部iPod,iTunes也已售出25亿首歌曲、5000万部电视节目及逾130万部电影。也正是在2007年,苹果推出首款 iPhone,内含iPod音乐播放功能,iPhone用户也能够通过iTunes获取音乐。可以说,多数iPhone用户正是因为苹果能提供丰富的内容 和应用而选择iPhone,而他们也习惯于通过iTunes来获取这些内容和应用。2008年,苹果开设主要销售游戏、应用软件

 

等产品的App Store,并与iTunes进行整合,iPhone用户按照以往利用 iTunes购买音乐的方式,就可方便地下载手机内容和应用。从iTunes到App Store,苹果培养了消费者使用应用软件的消费习惯,壮大了消费 群。因此,在开设App Store时,苹果已经拥有了一批高质量的内容和应用的消费群。在充足消费群的拉动下,苹果积极通过多种手段吸引开发者,保证应 用的充足供应。应用软件的开发者除了少数个人爱好者以外,大多数是专业的程序开发商,只有足够大的消费群才能够保证其开发投入得到充分的回报。

 

App Store下载超过10亿,苹果公司从中获利多少?App Store的收入对苹果公司的贡献有多大?

 

经过10亿次下载的里程碑之后,一些人尝试以照美元来估算出这对苹果意味着什么。

 

他们抱着良好的愿望,但他们错过了关键。

 

最新由光速创投合伙人的杰里米刘在周三公布的估算中指出,苹果从花在App Store的每 1美元中拿走30美分,从10个月前商店开张至今苹果已经赚到2000万到4500万美元。刘的计算依据这样的假设:免费程序同付费程序的比例在15:1 至40:1之间,这意味着平均每个程序的价格是2.65美元。

 

苹果公司还征收iPhone开发许可证的许可费用。截至3月17日,已经有50,000个个人和企业开发者在苹果公司注册。个人需缴纳99美元的许可费;企业会员的售价为299美元。假设大多数开发者支付的是99美元,苹果公司就有500万美元的收入。

 

但是,这些一年一次的会员费收入,同样包括一些相关的费用,包括开发SDK的成本(软件开发工具包),以及维持一个庞大免费的指南、参考、教程和示例代码库的费用。 

 

即使有盈余,并且程序销售和开发者许可证能形成苹果公司源源不断的收入,同每季度大量涌入的盈利相比,App Store的收入仍然是细流。大量涌入的盈利来自iPhone手机和iPOD touch的销售,对位于库珀蒂诺的苹果而言,这才是真正重要的。

 

2008财年,仅仅从iPhone手机一项上,苹果公司收入了108亿美元(非基于会计准则计算出来的利润),Piper Jaffray的分析师吉恩芒斯特预计今年iPhone手机将会有130亿美元入账。

 

史蒂夫·乔布斯说,开设App Store的目的仅仅是想保持收支平衡-他有可能真的是这样想的。这些能指数级增加移动设备功用的程序,正在不断带来新的用户。照常,苹果的利润来自于高利润的硬件。

 
 

剖析App store模式之综述篇

3G时代标志着互联从电脑网络时代向网手机网络时代过渡,就其本质而言,真正的意义是使用掌上终端实现无线高速上网,而这个把人们带进了一个日益互动的世界掌上终端,他的名字就叫做3G手机, 这是一个新的时代,它代表着一片新的蓝天,而这片蓝天下的新大陆,正在开展一场新的跑马圈地新运动,在这跑马圈地新运动的时刻,领先意味着占有,跨国巨头 们谁也不愿错过一个时代,不愿错过这个手机网络时代,因为他们深知错过一个时代,对一个企业或国家来说意味着什么,一个国家也好,一个公司也好,都需要更 好地利用市场,驾驭市场潮流。而得到一个时代,对他们来说得到的将是怎么样的辉煌?

 
 

App Store

几个基本概念

狭义3G:以美国的CDMA2000WiMAX、欧洲的WCDMA、中国的TD-CDMA为标准的3G制式,指的是某种具体的技术或者说是标准,是某种手段。广义3G:手机网络时代,他与所采用的具体技术没有关系,只要是实现手机高速上网传输数据资讯(高速移动上网),无论他采用的是何种技术或标准,都属于广义的3G的范畴,它指的是方式,是目的。

 

广义3G:以狭义3G作为手段来实现手机高速无线移动上网。显然,狭义3G是不断在变化之 中,新的技术会对旧的技术进行取代是规律,如同电脑上网一样,ADSL宽带上网、光纤上网等新技术层出不穷,但都属于宽带网的概念。广义3G是不变的:只 要是手持终端高速无线移动上网,都属于广义3G的范畴,但就其本质而言,他们真正的意义是使用手持数据终端无线高速移动上网,代表的是一个时代,一个手机 上网的时代,它的意义有两个,一是用户数量更为巨大,二是用户对网络的使用更为方便——可随时随地的接通互联网实现资讯共享。

 

3G手机的两个要素:一个是他是智能手机――具有开放式的操作系统和数据处理能力;另一个是与高速无线移动宽带网络实现无缝联接。

 

2G手机3G化:现实之中,我们发现了一个这样的事实:2G手机正在概念上3G化,具体表现 在手机需要安装越来越多的第三方软件,手机上网也经开始成为潮流,所以,现在的3G手机虽然没有采用3G的标准进行打造,但是也经具有了已有3G应用的主 要部分, 尽管2G手机在网络方面与3G手机用“量”来衡量还有差别,在本质上没有跨越从量变到质变门坎,仍然有与电脑用“猫”进行拨号上网与宽带上网的 区别,但概念上已经融入3G。通俗地说就是,2G手机也上网,也对大量地网络进行运用,虽然他的带宽在质量上不如3G,但却在尽可能地向3G靠拢。

里程碑:App store模式是由苹果发明、由Google将其升华的一个新模式

苹果的App store――“iPhone的软件应用商店”为第三方软件的提供者提供了方 便而又高效的一个软件销售平台,他降低了人们进入手机软件这个领域的门槛,使得第三方软件的提供者参与其中的积极性空前高涨,适应了手机用户们对个性化软 件的需求,从而使得手机软件业开始进入了一个高速、良性发展的轨道。苹果公司把App store这样的一个商业行为升华到了一个让人效仿的经营模式,可 以说是苹果公司的App store开创了手机软件业发展的新篇章,App store无疑将会成为世界手机软件行业发展史上的一个重要的里程碑,其意义 已远远超越了“iPhone的软件应用商店”的本身。

 

而Google将网络的概念――“开放与服务”引入了App store,使App store升华成为App store模式。

 
 
 

App store模式对于Web的意义

苹果的App store,从严格意义上说,是基于Wap概念而产生的,在苹果的 App store中,人们可以看到Wap那清晰的影子――封闭性,到了Google版的App store――Android Market,由于 Google对网络的理解和其对Android Market的战略期望不同,终于给App store模式带来了Web概念,将App store模式 从Wap App store升华到了Web App store ,这不是一个名称的改变,他意味着从封闭性升华到了开放性,意味着通信向网络的转变, 意味着2G在概念上向3G的转变,正是这个概念上的转变,一个3G应用级杀手诞生了。

 

App store模式将成为3G杀手级应用,或许是最高等级的3G杀手应用

 

毫无疑问,苹果公司的App store模式开创了手机软件业发展的新篇章,App store无疑将会成为手机软件发展史上的一个重要的里程碑,其意义已远远超越了“iPhone软件应用商店”的本身。

 

手机市场在过去一直探索着什么才是最好销售手机软件的方法。在App store模式出现之 前,让一款手机软件流行的最佳途径只能是通过是说服运营商在手机中预装这种软件这个单一的方式进行,这是一种难度非常之大的商务过程。过去,用户很少自己 下载程序到手机上,造成这种现象主要有两个原因,一个是原来的手机大多采用的是封闭式的平台,根本不允许用户自己安装所需要的软件,另一个原因就是,可以 上网的手机数量并不多,并且费用高、网速慢。

 

我们再回过头来研究一下App store模式,发现他主要是基于3G手机这两个基本要素的 应用,第一,他所以能够卖手机软件,是因为手机软件购买者所用的手机是智能手机,可以安装第三方软件,另一个是通过网络进行传播。在此基础之上,才有 App store模式的诞生,可以说,App store模式是3G的一个杀手级应用,而这个模式,是苹果给我们所带来的。

 

App store模式的出现,改变了革原有的手机软件销售模式――从厂商预装转变为自由销 售。减低手机厂商的软件成本――在手机出厂时每增加一款预装软件都意味着软件成本相应增加,App store模式的出现,使得手机也将像个人电脑一样, 在出厂时只装上基础软件,其他个性化的软件由用户自己安装购买。

 

由于软件成本等原因,手机厂商不可能预装众多的软件,由于手机厂商对第三方软件的垄断性,极 大地限制了整个手机行业的发展,App store模式的出现,降低软件制作商的门坎和成本,使得软件制作商可以面向最终用户,之前他们只能面向中间商 ――厂商,由于厂商的成本和爱好的原因,使得整个手机软件行业的发展受到了极大的限制。

 
 
 

App store模式为什么会取得成功?

随着3G在全球范围内的应用和开始普及,在行将到来的手机网络时代里,人们可以通过称为手机 的数字终端享受原来只有在电脑上才能享受的网络服务,随着人们对网络的认识逐渐加深,网络能够给人们提供的服务也就越来越多,网络给人们带来的帮助也就越 来越大。相关的数据表明,智能手机的销售今年呈强劲的上升势头,今年第二季度它占据全球手机市场的19%,比去年同期增长了9%。随着智能手机的日益普 及,智能手机操作系统也越来越受到重视。随着2G手机的3G化,人们对手机个性化的追求对手机软件产生了大量的需求,而具有3G概念的手机又给这种需求成 为了可能实现的现实,随之产生出巨大的一个市场,而App store模式正是一个为这个市场而生的优秀市场模式,也就是说:需求催生了“软件销售和传 播”市场,App store则是为这个需求找到了一个适合的模式。

 

可以预见,App store模式将对整个IT行业的发展趋势产生了重大的影响,其影响主要 表现在几个方面:一个是将改革原有的手机软件销售模式――从厂商预装转变为自由销售,对手机厂商来说,将更加专业化,作为厂商在手机出厂时只需安装基础软 件,而个性化的软件由用户自行选用,使得手机个人电脑化。对于App store平台拥有者来说,他得到了一个渠道,一个行业的制高点,软件制作者来说, 得到了自由发挥的一个舞台,对用户来说,以更低的成本得到了更为性化的服务。

 

App store模式大战中每个参战者想得到的是什么?是什么吸引了这样多的巨头参战?局面将如何演变?

 

我们可以这样来形容App store模式:App store模式是位于3G时代战略要道 上的一座金矿。由于App store模式的重要性与其间所包含的经济利益,将会引发一场App store模式大战,苹果、微软、Google、诺基亚 和中国移动,将是App store模式大战的主力军,在这场App store争夺战中,争夺将分为两个层面进行展开,一个是较低级的层面,如苹果与中 国移动,他们争取的是平台的营利性,通过App store模式来实现直接的营利,即:他们看上的是金矿,对于战略要道只是副产品,占据了战略要道,然后 收些买路钱对他们来说也很不错。另一个层面是高级别的竞争,主要在微软、诺基亚和Google之间展开,他们争夺的对象是手机操作系统的控制权,通过控制 手机操作系统实现对手机走向的控制,形成一个手机操作系统上的事实标准,即:他们看上的是战略要道而非金矿,对他们来说,就算这里没矿藏也无关紧要,只要 占据了交通要道,就可以阻止对手从此路经过,交多少钱买路费也不行,打击对手扩张自己才是重要的。一个是通过App store模式来挣钱,另一个是通过 App store模式来做事,这就是在App store模式中两个竞争层次上的本质区别。

 

App store模式之所以能够成为3G时代交通要道,是因为:通过App store模 式引入众多的第三方软件开发与供应商,通过这些第三方软件开发与供应商提供众多的基于相应手机操作系统的第三方软件,通过众多的第三方软件使得使用相应手 机操作系统的手机用户们轻松地获取他们所需的个性化软件,从而增加使用该手机操作系统对手机用户粘度,第三方软件与操作系统的关系是,第三方软件将对一款 操作系统的成功起重大作用,他们的数量越多,质量越好,则可以为操作系统吸引越多的用户。使其实现该手机操作系统占有率提高的目标,通过提高手机操作系统 的占有率,而App store模式所以成为了争夺手机操作系统大战中的一条战略要道。

 

简单地说,就是通过App store模式――以利诱之――吸引众多的第三方软件开发商―― 通过众多优势的第三方软件,确定一个操作系统的霸主地位(如微软视窗操作系统的例子)――争夺的是对手机操作系统的控制权,通过控制手机操作系统实现对手 机走向的控制,使得自己的手机操作系统成为手机操作系统的事实标准。

 

参战各方的自身优势:苹果最大的优势在于有众多的铁标粉丝,微软则是个人电脑时代手机操作系 统的霸主,对于操作系统有最深的理解,Google则是当今网络之王,对于网络的理解和应用天下独步,诺基亚则是在2G手机时代一家独大,对于手机用户有 着最大的号召力,中国移动则是世界上最大的电信运营商,拥有4.2亿的手机用户,比绝大多数国家一国的人口总数还要多得多。

 

由于战略目的的不同,各巨头们自然对App store模式有不同的理解

 

对苹果来说,App store只是个销售平台,并且苹果也靠这个平台来卖自己的软件,所 以,苹果决不允许其他在这个平台销售的软件冲击苹果自有软件的利益,仅从这一点上,就可以看出苹果对于App store模式是胸无大志,而已经进入 App store模式的Google和正在进入的微软则显得大气得多。

 

Google认为Android Market是一个“开放的内容分发系统,它可以帮助使用 Android操作系统的手机终端用户寻找、购买、下载和安装各种各样的内容。” Android Market可以为用户提供多样化的内容,既有来自各 大媒体公司的内容,也有来自业余开发者的程序,从而消除二者之间的隔阂。Android Market是一个令人兴奋的平台,他是个市场而非商店,按照这 个思路,Google把他称之为“软件销售和传播的中心”。

 

微软则直言不讳,鲍尔默说:微软目前正专注于研究智能手机市场,因为微软软件是智能手机的主 要操作软件之一,他表示,今年全球手机销量将达1.25亿部,5年内将达到10亿部。鲍尔默称:“今天的智能手机市场非常像1983年的个人电脑市场。” 这里预示着第三方软件将对一款操作系统的成功起重大作用,他们的数量越多,质量越好,则可以为操作系统吸引越多的用户,而Sky market则是作为推 广微软手机操作系统第三方软件的好地方。鲍尔默还说:智能手机的未来取决于向广泛的硬件厂商提供移动操作系统。而目前只有微软的 Windows Mobile、Linux和Sybian等操作系统能够满足这个需求。鲍尔默的核心观点是:硬件和操作系统软件的分离,让微软控制了计算 机市场。由于微软的这种正确的做法,使得微软成为个人电脑时代的软件之王。

 

对于把控制手机操作系统平台作为自己三大战略目标之一的诺基亚来说,诺基亚对建立一个属于自 己的由第三方软件制作与销售者们参与的平台可以说是期待已久,在App store模式出现之前就一直在打造一个这样的一个平台,然而这个平台概念不清, 并且发生了“数字签名”事件,让众多的第三方软件商望而却步,严重地阻碍了其各项应用的发展。

 

中国移动对一个属于自己平台的渴望可以说是到了极点,相对其他巨头而言,中国移动并没有属于自己的产品,为此,中国移动曾经不计血本推出了已经可以说是以失败告终的“飞信”,为的就是得到一个自己的平台,通过这个平台来实现其他的利润增值。

 
 
 

参战各方的关系

可以预见,“软件销售和传播的中心”之战将围绕着四个公司展开,一个是手机帝国诺基亚(虽然 目前还没有关于诺基亚要介入“软件销售和传播的中心”的消息),一个是网络之王Google、一个是软件霸主微软,还有一个就是屡屡有惊人创新的苹果公 司,在这场未来的3G制高点的争夺战中,“软件销售和传播的中心”的名称或许因人而异,手法上从细分的角度来说也不尽相同,但是,在总体模式上只有一个 “提供平台,以利诱之,吸引群多的商家以形成WEB2.0众人参与之势,从而形成一个新的长尾”。在App store模式之战中,四大高手争夺的不是软 件,而是软件的销售渠道,通过这个渠道的入场券来推广自己的手机操作系统,其战略目的是让自己的操作系统成为主流。通过控制手机的操作系统,达到控制3G 网络时代的最终目的。

 

这将是一场世纪争取战,目前的强弱地位依次是诺基亚、微软、Google和苹果,其中诺基亚 是一家独大,占有率市高达60%,微软在其余三者之中稍稍领先一步。所以,对于微软、Google和苹果来说,他们应该是盟军,他们的共同敌人是手机帝国 诺基亚,从理论上说,无论是从网络趋向3G,还是由手机趋向3G,并无优劣之分,但从用户的使用习惯来看,对于手机,认可诺基亚的用户远远大于认可微软、 Google和苹果三家之和,而在3G网络时代,3G用户大部分将来自于原来的手机用户,而具有3G概念的2G手机用户,更是诺基亚的天下,Google 的与Nokia的战略非常相似,两者都对网络应用及基于位置、地图的服务投入巨资。

 

在2G手机时代,无论是手机还是手机操作系统,诺基亚都是当之无愧的老大,所以,虽然竞争尚 未开始,诺基亚已然是当然的霸主,而对于想在3G时代当上老大的微软、Google和苹果来说,诺基亚无疑是他们的共同敌人,而中国移动,由于他本身没有 自己的操作系统,其战略目的也只是建立一个属于自己的平台来为他其他的增值服务作铺垫,并且他必须是建立在与其他操作系统的合作之上――这个是中国移动版 App store模式的基础,所以,中国移动在App store模式大战中是其他公司的共同友军,由于中国移动与各操作系统均无利益冲突,这使得其可 尽收鱼人之利。

MySQL主从同步、读写分离配置步骤、问题解决笔记

根据要求配置MySQL主从备份、读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记;

现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用。
 
为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致;
 
环境
192.168.0.1 (Master)
192.168.0.2 (Slave)
 
MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1
 
 

1、登录Master服务器,修改my.cnf,添加如下内容;
server-id = 1   //数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
log-bin=mysql-bin   //启用二进制日志;
binlog-do-db=data //需要同步的二进制数据库名;
binlog-ignore-db=mysql   //不同步的二进制数据库名;这个同步后听说很麻烦,我没有同步;
log-bin=/var/log/mysql/updatelog //设定生成的log文件名;
log-slave-updates //把更新的记录写到二进制文件中;

slave-skip-errors //跳过错误,继续执行复制;
 
 

2、建立复制所要使用的用户;

mysql>grant replication slave on *.* to test@192.168.0.2 identified by ‘********’
 
 

3、重启mysql;
/usr/bin/mysqladmin -uroot shutdown;

/usr/bin/mysql_safe &
 
 

4、现在备份Master上的数据
锁定后我直接tar.gz data这个库文件;
mysql>FLUSH TABLES WITH READ LOCK;
cd /var/lib/mysql
tar data.tar.gz data
接着直接执行了远程scp;

 
 

5、登录Slave数据库服务器,修改my.cnf;
server-id= 3   //2已经被用在另一个服务器上了,如果以后要再加Slave号接着往后数就OK了;
log-bin=mysql-bin
master-host=   192.168.0.1
master-user =   test
master-password =   ******
master-port= 3306
master-connect-retry=60   //如果发现主服务器断线,重新连接的时间差;
replicate-ignore-db=mysql //不需要备份的数据库;
replicate-do-db=data //需要备份的数据库
log-slave-update
slave-skip-errors

6、解压刚才从Master scp过来的文件,此处不用改权限、属主,默认没有改变,可以根据实际情况进行修改;
 
 

7、上述完成后,可以启动slave了;查看slave状态;
mysql>slave start;
mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.1
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: updatelog.000001
Read_Master_Log_Pos: 106
Relay_Log_File: onlinevc-relay-bin.000013
Relay_Log_Pos: 1069
Relay_Master_Log_File: updatelog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: data
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 1681
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)

ERROR:
No query specified

8、查看Master上面的状态;
mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| updatelog.000012 |    15016 | data         | mysql            |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
由此可见两者的File、Position存在问题,所要要去Slave上设置对应主库的Master_Log_File、Read_Master_Log_Pos;执行如下语句;
mysql>slave stop;
mysql>CHANGE MASTER TO MASTER_HOST=’192.168.0.1′,MASTER_USER=’test’, MASTER_PASSWORD=’******’,MASTER_LOG_FILE=’updatelog.000012′,MASTER_LOG_POS=15016;
确保 Slave_IO_Running: Yes 、Slave_SQL_Running: Yes都要为YES才能证明Slave的I/O和SQL进行正常。

9、解锁主库表;
UNLOCK TABLES;
到此主从MySQL服务器配置完成,测试结果如下;
mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| updatelog.000012 |   717039 | data | mysql            |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.1
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: updatelog.000012
Read_Master_Log_Pos: 717039
Relay_Log_File: onlinevc-relay-bin.000013
Relay_Log_Pos: 1222
Relay_Master_Log_File: updatelog.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: data
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 717039
Relay_Log_Space: 1834
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)

ERROR:
No query specified
####################################   如下是MySQL数据库读写分离操作步骤 ##########################################
此处使用MySQL自己(Mysql-proxy)的代理实现数据库的读写分离;
所需要安装包如下;
1、check-0.9.8
2、glib-2.18.4
3、libevent-2.0.6-rc
4、lua-5.1.4
      wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
5、pkg-config-0.23
6、mysql-5.0.56
7、mysql-proxy-0.8.0
      http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.0.tar.gz

别的安装包地址当时没有记下载地址,不过大部分都在这个网站上找的;http://sourceforge.net/
&&&&&&&&&& 安装开始 &&&&&&&&
1、tar -zxvf check-0.8.4.tar.gz
    cd check-0.8.4
    ./configure
    make
    make install
2、tar -zxvf glib-2.18.4.tar.gz   //系统rpm包可能版本低出现了问题3;
    ./configure
    make
    make install
3、tar -zxvf libevent-2.0.6-rc.tar.gz
    cd libevent-2.0.6-rc
    ./configure –prefix=/usr/local/libevent
     make && make install
4、tar -zxvf lua-5.1.4.tar.gz
    INSTALL_TOP= /usr/local/lua    //    为了把lua安装到/var/lib/lua下,故要修改其下的Makefile;
或者直接执行:sed -i ‘s#INSTALL_TOP= /usr/local#INSTALL_TOP= /usr/local/lua#’ Makefile
root@testmysql [/software/lua-5.1.4]# make
Please do
   make PLATFORM
where PLATFORM is one of these:
   aix ansi bsd freebsd generic linux macosx mingw posix solaris
See INSTALL for complete instructions.
这处是要你选择服务器所使用的平台;
执行:make linux //此处执行后出现了错误,解决办法在下面问题解决区1处,此处先跳过;
再执行:make install
设置环境变量:
    export LUA_CFLAGS=”-I/usr/local/lua/include” LUA_LIBS=”-L/usr/local/lua/lib -llua -ldl” LDFLAGS=”-L/usr/local/libevent/lib -lm”
    export CPPFLAGS=”-I/usr/local/libevent/include”
    export CFLAGS=”-I/usr/local/libevent/include”

5、tar -zxvf pkg-config-0.23.tar.gz
    cd pkg-config-0.23
    ./configure
    make
    make install
安装完之后要执行:cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc      //原因见下面的问题解决区2处;
6、安装MySQL客户端;
因为此服务器系统是默认安装了MySQL,没有安装客户端,我又装了client、devel如下所示已安装的rpm包;
   root@testmysql [/software/lua-5.1.4]# rpm -qa | grep MySQL
MySQL-client-5.1.48-0.glibc23
MySQL-bench-5.0.91-0.glibc23
MySQL-test-5.1.48-0.glibc23
MySQL-shared-5.1.48-0.glibc23
MySQL-server-5.1.48-0.glibc23
MySQL-devel-5.1.48-0.glibc23
此后的Mysql-proxy时总是一直报错,编译不过去,无奈之下用源码包客户端;(此时的rpm包都没有卸载,直接执行了下面的安装)//此处问题见问题解决区4处;
    tar zxvf mysql-5.0.56.tar.gz     //此处我直接使用了mysql的5.0.56的源码包;
    cd mysql-5.0.56
    ./configure –prefix=/usr/local/mysql –without-server
    make && make install

7、tar xvf mysql-proxy-0.8.0.tar.gz
    cd mysql-proxy-0.8.0
    ./configure –prefix=/usr/local/mysql-proxy –with-mysql=/usr/local/mysql –with-lua    //问题解决处4有介绍;
    Make && Make install

8、在/var/lib/bin创建mysql-proxy.sh,内容如下;
     #!/bin/bash
     LUA_PATH=”/usr/local/mysql-proxy/lib/mysql-proxy/lua/?.lua” /usr/local/mysql-proxy/bin/mysql-proxy –proxy-backend-addresses=192.168.0.1:3306 –proxy-read-only-backend-addresses=192.168.0.2:3306 –proxy-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/rw-splitting.lua >> /var/log/mysql-proxy.log &
     然后加上可执行权限;
     chmod a+x /var/lib/bin/mysql-proxy.sh
     执行:/var/lib/bin/mysql-proxy.sh 启动服务;

9、验证是否开户了:4040、4041;
    root@testmysql [/usr/local/bin]# netstat -an | grep 404*
    tcp        0      0 0.0.0.0:4040                0.0.0.0:*                   LISTEN     
    tcp        0      0 0.0.0.0:4041                0.0.0.0:*                   LISTEN  
10、测试读写分离,此步略过,所有配置已经完成。

&&&&&&&&&&&&&&&&&&&&&&&&&&&   问题解决区   &&&&&&&&&&&&&&&&&&&&&&&&&&&&
1、在安装的第四步执行make linux时报错如下:
root@testmysql [/software/lua-5.1.4]# make linux
cd src && make linux
make[1]: Entering directory /software/lua-5.1.4/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
make[2]: Entering directory
/software/lua-5.1.4/src’
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lapi.o lapi.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lcode.o lcode.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldebug.o ldebug.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldo.o ldo.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldump.o ldump.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lfunc.o lfunc.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lgc.o lgc.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o llex.o llex.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lmem.o lmem.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lobject.o lobject.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lopcodes.o lopcodes.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lparser.o lparser.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstate.o lstate.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstring.o lstring.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltable.o ltable.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltm.o ltm.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lundump.o lundump.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lvm.o lvm.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lzio.o lzio.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lauxlib.o lauxlib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lbaselib.o lbaselib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ldblib.o ldblib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o liolib.o liolib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lmathlib.o lmathlib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o loslib.o loslib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o ltablib.o ltablib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lstrlib.o lstrlib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o loadlib.o loadlib.c
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o
ranlib liblua.a
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lua.o lua.c
In file included from lua.h:16,
                 from lua.c:15:
luaconf.h:275:31: error: readline/readline.h: No such file or directory
luaconf.h:276:30: error: readline/history.h: No such file or directory
lua.c: In function 鈥榩ushline鈥?
lua.c:182: warning: implicit declaration of function 鈥榬eadline鈥?
                                                                    lua.c:182: warning: assignment makes pointer from integer without a cast
lua.c: In function 鈥榣oadline鈥?
lua.c:210: warning: implicit declaration of function 鈥榓dd_history鈥?
                                                                       make[2]: *** [lua.o] Error 1
make[2]: Leaving directory /software/lua-5.1.4/src'
make[1]: *** [linux] Error 2
make[1]: Leaving directory
/software/lua-5.1.4/src’
make: *** [linux] Error 2

解决方法:yum install libtermcap-devel
          yum install ncurses-devel                                 
          yum install libevent-devel                                   
          yum install readline-devel
  
2、安装MySQL-proxy时报错:
checking for LUA… configure: error: Package requirements (lua5.1 >= 5.1) were not met:

No package ‘lua5.1’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables LUA_CFLAGS
and LUA_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
解决办法:
cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc

3、安装MySQL-proxy时报错:
checking for GLIB… configure: error: Package requirements (glib-2.0 >= 2.16.0) were not met:

No package ‘glib-2.0’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GLIB_CFLAGS
and GLIB_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
解决办法:
   1、查看系统已经安装glib的rpm包;
    glibc-2.5-49.el5_5.4
    glibc-headers-2.5-49.el5_5.4
    glib2-2.12.3-4.el5_3.1
    glibc-common-2.5-49.el5_5.4
    glibc-devel-2.5-49.el5_5.4
   2、下载安装glib-2.18.4.tar.gz

4、刚开始使用系统里rpm所指定的mysq_config时,mysql-proxy安装报错,信息如下;
    configure: error: mysql_config not exists or not executable, use $ ./configure –with-mysql=/path/to/mysql_config
    看到帮助安装文档里要求如下:
    –with-mysql[=PATH]     Include MySQL support. PATH is the path to ‘mysql_config’。
解决办法就是:安装包中的第6步。

NTFS最大文件尺寸

Windows XP Professional支持FAT16、FAT32和NTFS文件系统。因为NTFS不仅具有FAT16和FAT32的所有基本功能,而且还有一些高级 的存储功能,例如压缩、增强的安全性以及更大的分区和文件尺寸,所以它是我们在Windows XP Professional中推荐使用的文件系统。
 

下面是NTFS具有的一些功能:

  • 文件加密功能允许你保护文件免受未授权的访问。
  • 可以为文件夹和单个文件设置访问权限。
  • 在遇到电源故障或其他系统问题时磁盘活动恢复日志能帮你快速恢复信息。
  • 磁盘配额功能允许你监视和控制单个用户的可用磁盘空间。

更好的可伸缩性允许你使用更大的卷。NTFS卷的最大容量比FAT卷大很多。而且,随着卷容量的不断增加,NTFS卷的性能也不会像FAT卷那样迅速降低。

 

如果你是进行Windows XP Professional干净安装,我们推荐使用NTFS格式。如果是升级一台只有NTFS文件系统的计算机,你应该在Windows XP Professional下继续使用NTFS。

 

Windows XP Professional支持Windows 95、Windows 98或Windows Me的现有文件系统,包括FAT16和FAT32文件系统。如果你要升级原本使用FAT16或FAT32文件系统的计算机,不妨考虑重新格式化分区或将分 区转换为NTFS。你可以在安装时将FAT卷转换为NTFS,然而一旦你选择了这么做,就不能卸载Windows XP Professional并还原到原来的操作系统了。

 

注意:压缩的Windows 98卷不能升级,若要升级到Windows XP Professional需先解压。

 

如果你计划在同一台计算机上安装Windows XP Professional和另一个操作系统,你需要一种能被机器上所有操作系统访问的文件系统。例如说,如果计算机中使用Windows 95和Windows XP Professional操作系统,你应该在Windows 95需要访问的硬盘分区上使用FAT格式。但是如果计算机使用Windows NT 4.0和Windows XP Professional,你可以在分区上使用FAT、FAT32或者NTFS,因为这两种操作系统都支持这些文件系统格式。但是,在运行Windows NT 4.0的时候,您可能无法使用Windows XP Professional所包含的一些新的NTFS特性。

 

注意:只有在Windows NT、Windows 2000或Windows XP Professional下,你才可以访问NTFS卷。

 
 

表四列出了每种文件系统的大小和域限制。

表四 NTFS和FAT文件系统的比较
比较项 NTFS FAT16 FAT32
操作系统兼容性 一 台运行Windows 2000或Windows XP Professional的机器可以访问NTFS分区上的文件。一台运行Windows NT 4.0(SP4或更高版本) 的机器可以访问该分区上的文件,但一些NTFS功能,例如磁盘配额就不可用了。其他操作系统不能访问。 MSDOS、Windows的所有版本、Windows NT、Windows XP Professional、OS/2都可以访问。 只有在Windows 95 OSR2、Windows 98、Windows Me、Windows 2000以及Windows XP Professional下可以访问。
卷大小 推荐最小卷容量大约是10MB。

推荐实际最大卷容量是2TB。

您也可以使用更大的容量。

不能在软盘上使用。

卷最大为4GB。不能在软盘上使用。 卷大小从512MB到2TB。

在Windows XP Professional下,一个FAT32卷最大只能被格式化到32GB。

不能在软盘上使用。

文件大小 最大文件尺寸是16TB减去64KB(244减去64KB)。 最大文件尺寸为4GB。 最大文件尺寸为4GB。
每卷文件数 4,294,967,295 (232减1个文件)。 65,536 (216 个文件)。 大约4,194,304 (222个文件)。

如果你还想在你的系统中使用 MS-DOS ,你需要另一个格式化成FAT的分区,用作MS-DOS操作系统的本地文件系统。MS-DOS不能分辨NTFS或FAT32分区上的数据。

 

注意:为了格式化当前系统分区,你必须使用一种你计算机上运行的所有操作系统都能识别的文件系统。你最多能有四个初始分区,但只有一个基本分区能启动所有的操作系统。

 
 

什么是卷
 

卷,就是一种逻辑硬盘。这么说你可能很容易就想到分区,一个分区就可以构成一个逻辑硬盘。但是卷与分区最大的不同就是卷可以跨越物理硬盘。
 

动态磁盘的5种卷:

1、简单卷:构成单个物理磁盘空间的卷。它可以由磁盘上的单个区域或同一磁盘上连接在一起的多个区域组成,可以在同一磁盘内扩展简单卷。
 

2、跨区卷:简单卷也可以扩展到其它的物理磁盘,这样由多个物理磁盘的空间组成的卷就称为跨区卷。简单卷和跨区卷都不属于RAID范畴。
 

3、带区卷:以带区形式在两个或多个物理磁盘上存储数据的卷。带区卷上的数据被交替、平均(以带区形式)地分配给这些磁盘,带区卷是所有 Windows 2000 可用的卷中性能最佳的,但它不提供容错。如果带区卷上的任何一个磁盘数据损坏或磁盘故障,则整个卷上的数据都将丢失。带区卷可以看作硬件RAID中的 RAID0。
 

4、镜像卷:在两个物理磁盘上复制数据的容错卷。它通过使用卷的副本(镜像)复制该卷中的信息来提供数据冗余,镜像总位于另一个磁盘上。如果其中一个物理 磁盘出现故障,则该故障磁盘上的数据将不可用,但是系统可以使用未受影响的磁盘继续操作。镜像卷可以看作硬件RAID中的 RAID1。
 

5、RAID-5卷:具有数据和奇偶校验的容错卷,有时分布于三个或更多的物理磁盘,奇偶校验用于在阵列失效后重建数据。如果物理磁盘的某一部分失败,您 可以用余下的数据和奇偶校验信息重新创建磁盘上失败的那一部分上的数据。类似硬件RAID中的RAID5,在硬件IDE RAID中,RAID5是很少见的,通常在SCSI RAID卡和高档IDE RAID卡中才能提供,普通IDE RAID卡仅提供RAID0、RAID1和RAID0+1。
 
 

卷(也称逻辑卷)是Windows 2000的一种磁盘管理方式,目的是把硬盘空间从物理硬盘的管理方式中跳出来,进行更方便的统一管理分配。比如我们有一个8GB的硬盘和一个20GB的硬 盘,想要分成一个12GB和一个16GB的两个逻辑盘,用物理分区的方式就没法做到,但用卷来管理就可以做到。
 
每个卷可以看作一个逻辑盘,可以是一个物理硬盘的逻辑盘,也就是我们直接看到的D盘、E盘这些盘符,也可以是两个硬盘或两个硬盘的部分空间组成的RAID 0或RAID 1阵列,或更多硬盘组成其他RAID 5阵列,但表面看来(比如在“我的电脑”或“资源管理器”中)都是一个本地磁盘。卷主要有基本磁盘上的基本卷和动态磁盘上的动态卷,基本卷包括存放操作系 统和操作系统支持文件的引导卷(也就是安装Windows 2000的卷)和存放加载Windows 2000所需专用硬件文件的系统卷(通常为C盘),引导卷和系统卷可以是同一个卷。动态卷包括简单卷、跨区卷、带区卷、镜像卷和RAID 5卷。
 

(2)操作步骤

以系统管理员(通常默认为Administrator)或系统管理组成员身份登录,依次打开“我的电脑”→“控制面板”→“管理工具”→“计算机管理”→ “存储”→“磁盘管理(本地)”(也可以在“开始”→“运行”中执行compmgmt.msc /s直接打开它)。屏幕上半部分显示的是卷的详细情况,下半部分显示物理磁盘状态,在这一部分的左边显示物理磁盘的两种类型。图中的磁盘0、1、2、3都 是物理磁盘,并且现在都是基本磁盘,所以至少要把其中两个升级为动态磁盘,下面把磁盘1和磁盘2升级到动态磁盘并创建一个带区卷(如图1)。
 
步骤一:首先备份重要数据,因为一旦升级到动态磁盘,Windows 2000以外的操作系统将不能访问动态磁盘,创建带区卷后原来的数据也将全部丢失。
 

步骤二:创建动态磁盘。在磁盘1或磁盘2上单击鼠标右键,选择“升级到动态磁盘(U)”,出现对话框后在磁盘1和磁盘2前面打钩并确定,几秒钟后升级完成,此时在“磁盘管理”中磁盘1和磁盘2已变成动态磁盘。

海量数据搜索算法优化-存储、查询、排序算法

海量数据库的应用,如国家的人口管理系统,户籍档案管理系统,在这样的海量数据库应用中,数据库的存储设计和结构优化(如索引优化)、数据库的查询优化及分页算法尤为重要!

随着互联网的日益普及,海量信息的增长,网格运算的到来,海量数据存储产品和海量数据存储技术方案的需求更为市场所需。

同时,实际的海量数据处理,更是涉及很多细节,包括海量数据存储(物理存储、逻辑存储、海量数据库的备份)、数据采集、海量数据查询(海量数据分页、海量数据排序)、海量数据安全和管理等。
 

Continue reading “海量数据搜索算法优化-存储、查询、排序算法”

Crontab格式详解

今天搞一个流程化的脚本,中间需要用到crontab的插入。。。这里记一下其配置文件的地点,方便网友,确实不好找。。。(如果你不想crontab -e的话)

/var/spool/cron/root

其中root是用户名,需要时把自己的用户名替换root即可,此文件与crontab -e 为同源。

 

Linux crontab 命令格式与详细例子

基本格式 :
*
  *  *  *  *  command
分  时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

 

名称 : crontab

使用权限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。

crontab文件的格式:M H D m d cmd.

M: 分钟(0-59)。

H:小时(0-23)。

D:天(1-31)。

m: 月(1-12)。

d: 一星期内的天(0~6,0为星期天)。

cmd要运行的程序,程序被送入sh执行,这个shell只有 USER,HOME,SHELL这三个环境变量

说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定

user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设

定自己的时程表。

参数 :

crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数

来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

crontab -r : 删除目前的时程表

crontab -l : 列出目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab。

时程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执

行的程序。

f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推

f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

例子 :

#每天早上7点执行一次 /bin/ls :

0 7 * * * /bin/ls

12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :

0 17 * * 1-5 mail -s “hi” alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo “haha”

20 0-23/2 * * * echo “haha”

注意 :

当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是 你不希望收到这样的信,请在每一行空一格之

后加上 > /dev/null 2>&1 即可

例子2 :

#每天早上6点10分

10 6 * * * date

#每两个小时

0 */2 * * * date

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

0 23-7/2,8 * * * date

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

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date

范例

$crontab -l 列出用户目前的crontab.

 

 

 

激活Ubuntu的root账号,使用Winscp提高管理效率

Ubuntu是目前大家用的比较多的一种Linux发行版,其root账号的默认禁用是大大提高了系统的安全性,有效的降低了管理员误操作的概率。

 

我的Winscp情结
我原来从CentOS系统用起,已经习惯了直接用root登录,通过在Windows下的Winscp软件来管理配置系统。使用Winscp编辑Linux下的文件(尤其是配置文件),就像在资源管理器中修改本地文件一样,方便和高效。

 

但Ubuntu的root账号默认被禁用后,就有个让我这个不太习惯“sudo”命令的固执者,有些使用习惯上的别扭了,先不说很多命令总是忘记加 sudo,最重要的是我习惯了使用Winscp编辑Linux配置文件,但很多Linux下的配置文件都是root用户权限,用普通用户通过Winscp 登录后,编辑文件总是遇到权限不够的错误提示。

 

这个原因一直让我无法接受使用Ubuntu,但目前Linux市场中Ubuntu的占有率越来越高,身边的朋友也大多成为了她的Fans。时代的要求,我必须“与时俱进”啊~

 

下面通过激活/禁用Ubuntu的root账号,让我们也可以灵活的使用root账号通过Winscp来编辑管理Ubuntu。

 
 

激活/禁用Ubuntu的root账号方法:

  1. 激活root账号:
    其实就是为root账号加上密码而已:
    用安装时设置的账号登录控制台后执行:
    #sudo passwd root
    输入两边root密码即可激活root账号的登录啦!~
  2. 禁用root账号:
    #sudo passwd -l root
 

高效的Winscp
瞧~Ubuntu的root账号也是可以灵活控制使用的哦。呵呵,快快开始使用Winscp编辑配置Ubuntu吧,我相信我推荐的这个方法,你一定会爱上她的。嘻嘻
BTW:Winscp若你觉得只能在Windows下使用(这是她的不足),你也可以用Filezilla,她是在Windows和Linux都有相应版本的哦(但个人觉得没有winscp在编辑文件时好用)。个人喜好,请随意选用。