2008年10月11日星期六

Mysql Replication(MySQL主从复制)介绍

一、简介Mysql Replication(MySQL主从复制)
Mysql Replication(MySQL主从复制)是MySQL数据库使用率非常高的一种技术,它使用某个数据库服务器为主,然后在其他数据库服务器上进行复制,后面复制的数据库也称从数据库。MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。在设置链式复制服务器时,从服务器本身也可以充当主服务器,如:a->b->c,b对于a来说是从服务器,但是它又是c的主服务器。Mysql Replication(MySQL主从复制)主要用于:
1.使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新;
2.解决数据库读需求很高的情况:Mysql复制架构绝大部分都是使用一个主服务器(Master)带一个或者多个从服务器(Slave)的架构模式,这样可以适用于读压力比较大的应用,这样的架构里面只要master和slave的压力不是太大(尤其是slave端压力)的话,异步复制的延时一般都可以容忍的。
尤其是自slave端的复制方式改成两个进程处理之后,更是减小了slave端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用,只需要通过廉价的pc server来扩展slave的数量,将读压力分散到多台slave的机器上面,即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。这个架构方案的实施也会比较廉价同时易于扩展。
甚至还可以使用第三方软件来专门将MySQL的读写进行分离。这类软件有:MySQL ProxyAmoeba
二、Mysql Replication(MySQL主从复制)的原理:
1、复制进程Mysql的复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在Master(IO进程)上。
要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。复制的基本过程如下:
1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
实际上在老版本的Mysql的复制实现在Slave端并不是两个进程完成的,而是由一个进程完成。但是后来发现这样做存在较大的风险和性能问题,主要如下:
首先,一个进程就使复制bin-log日志和解析日志并在自身执行的过程成为一个串行的过程,性能受到了一定的限制,异步复制的延迟也会比较长。另外,Slave端从Master端获取bin-log过来之后,需要接着解析日志内容,然后在自身执行。在这个过程中,Master端可能又产生了大量变化并声称了大量的日志。如果在这个阶段Master端的存储出现了无法修复的错误,那么在这个阶段所产生的所有变更都将永远无法找回。如果在Slave端的压力比较大的时候,这个过程的时间可能会比较长。
所以,后面版本的Mysql为了解决这个风险并提高复制的性能,将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。
当然,即使是换成了现在这样两个线程处理以后,同样也还是存在slave数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事物中,这些问题都是会存在的。
如果要完全避免这些问题,就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案,需要将所有数据都load到内存中,这样就对内存的要求就非常大了,对于一般的应用来说可实施性不是太大。
2、复制实现级别Mysql的复制可以是基于一条语句(Statement level),也可以是基于一条记录(Row level),可以在Mysql的配置参数中设定这个复制级别,不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。
Row Level:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
缺点:row level下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update product set owner_member_id = ‘b’ where owner_member_id = ‘a’,执行之后,日志中记录的不是这条update语句所对应额事件(mysql以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候,产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。
Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能。因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。
另外就是,由于Mysql现在发展比较快,很多的新功能不断的加入,使mysql得复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能真确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。从官方文档中看到,之前的Mysql一直都只有基于statement的复制模式,直到5.1.5版本的Mysql才开始支持row level的复制。
从5.0开始,Mysql的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给Mysql的复制又带来了更大的新挑战。
另外,从5.1.8版本开始,Mysql提供了除Statement Level和Row Level之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在Mixed模式下,Mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
3、复制常用架构
一个Master带多个slave的架构实施非常简单,多个slave和单个slave的实施并没有太大区别。在Master端并不care有多少个slave连上了master端,只要有slave进程通过了连接认证,向他请求binlog信息,他就会按照连接上来的io进程的要求,读取自己的binlog信息,返回给slave的IO进程。对于slave的配置细节,在Mysql的官方文档上面已经说的很清楚了,甚至介绍了多种实现slave的配置方法。
Mysql不支持一个Slave instance从属于多个Master的架构。就是说,一个slave instance只能接受一个master的同步源,听说有patch可以改进这样的功能,但没有实践过。Mysql AB之所以不实现这样的功能,主要是考虑到冲突解决的问题。
Mysql也可以搭建成dual master模式,也就是说两个Mysql instance互为对方的Master,也同时为对方的Slave。
不过一般这种架构也是只有一端提供服务,避免冲突问题。因为即使在两边执行的修改有先后顺序,由于复制的异步实现机制,同样会导致即使在晚做的修改也可能会被早做的修改所覆盖,就像如下情形:时间点 Mysql A Mysql B1 更新x表y记录为102 更新x表y记录为203 获取到A日志并应用,更新x表的y记录为10(不符合期望)4 获取B日志更新x表y记录为20(符合期望)这样,不仅在B库上面的数据不是用户所期望的结果,A和B两边的数据也出现了不一致的情况。除非能将写操作根据某种条件固定分开在A和B两端,保证不会交叉写入,才能够避免上面的问题。
三、一些相关的扩展和管理脚本
Google的SemiSyncReplication扩展
MySQL Community Replication Monitoring System
Maatkit的管理脚本MySQL Master-Master Replication Manager (Google Code)
MySQL Replication Manager (Google Code)
四、参考文档
官方文档--第6章:MySQL中的复制官方文档--Chapter 15. Replication
MySQL Replication(复制)基本原理--Sky.Jian
五、其他参考
Mysql Proxy简介
MySQL Community Replication Monitoring System
Mysql 管理工具集 maatkit

2008年10月10日星期五

SHELL水平测试OVERVIEW篇部分答案


原题目地址:http://bbs.chinaunix.net/viewthread.php?tid=476260

[ SHELL 水平测试 ][ OVERVIEW 篇 ]

1. 有很多种 shell, 你熟悉几种? 各个 shell 的 home page 在那里?

请参考:



UNIX shells

Bourne shell (sh)

Almquist shell (ash)

Debian Almquist shell (dash)

Bourne-Again shell (bash)

Friendly interactive shell (fish)

Korn shell (ksh)


TENEX C shell (tcsh)

Es shell (es)

esh (Unix) Easy Shell

rc shell (rc) - shell for Plan 9 and Unix

runscript The initial shell interpreter used to process startup scripts in Gentoo

scsh (Scheme Shell)

Stand-alone Shell (sash)

Z shell (zsh)







2. 为什么说 zsh 是目前为止功能最为强大的 shell.

请参考:




3. 为什么说 pdksh 功能较弱?

请参考:



4. ksh88 与 ksh93 有何区别?

请参考:







5. 为什么 shell 编程最好用 ksh?

它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性。


6. 你的系统都有哪些 shell? 版本是多少?

(1)Bourne Shell是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。  

(2)C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。  

(3)Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。  

(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。


7. 你知道 POSIX 吗?最新版本是多少?和你的 shell 有什么关系?

POSIX是IEEE为要在各种UNIX操作系统上运行的软件而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003

,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由Richard Stallman应

IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统界面)的

缩写,而X则表明其对Unix API的传承。

Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。

微软的Windows NT至少部分实现了POSIX兼容。


POSIX在源代码级别上定义了一组最小的Unix(类Unix)操作系统接口。




8. /sbin/sh 和 /bin/sh 有何区别?

/sbin/sh and /usr/bin/sh shells 都是 Bourne shells.

/sbin/sh is statically linked

/usr/bin/sh is dynamically linked.

/bin/sh /bin目录是到/usr/bin的链接



9. 你分析过 1000 行以上的 shell 程序吗?



10. 各种 shell 的变量名长度有何限制?

请参考:



11. 各种 shell 的 array size 有何限制?

请参考:


12. FIFO 比 co-process 有什么优点?

FIFO is an acronym for First In, First Out



It copys one specified file to multiple "unique"(filter those different pathnames which in fact point to the same

physical path) paths with parallelism in bash. In contrast to sequential copy processes, it performs well under

multiprocessor systems.

The efficiency of Co-process is normally determined by three factors:

1.Whether CPU bound or not

2.Whether scientific data processing or not

3.Whether I/O or not




13. (..) 产生的 subshell 与调用另一个脚本产生的 subshell 有何不同?

执行shell script与subshell

两种方法:

唤起新shell再执行shell scripts

在目前shell执行shell scripts

唤起另一个shell来执行的scripts在scripts档头最前面前要加

#! /bin/sh

第一种方法是在shell script 文字档前指出shell scripts解读的程式在那(也就是 我们的shell)然后把文字档的执行权限打开,照一般执行可执行档方式执行或者叫 一个shell来解释文字档test.sh。

$ test.sh

$ /bin/sh test.sh

$ ( . test.sh; )

$ exec test.sh


第二种方法是用命令''.''或者source执行。

$ . test.sh

$ source test.sh

$ { test.sh; }

$ eval '. test.sh'


差别在於一些设定只有在这个shell下的才算数,而唤起另一个shell就是另一个 不相干的世界, 也就是用第一种方法执行的script中变数的设定,不会影响到原来的shell变数。 这个相当重要。ksh没有source这个命令,所以最好不要用source。 中括号( )表示用另一个subshell大括号,{ }表示用目前shell。例如

$ ( VAR='testvar'; )

$ echo $VAR


$ { VAR='testvar'; }

$ echo $VAR

testvar


只有{ }内的VAR中的值被设定。其中用 . 的方法要很小心, 不要在script裡面用

$ . test.sh arg1 arg2


因為arg1 arg2会继承呼叫这个script的arg1 arg2来,用 . 的方式最好是要执行 的script只是一团script library不带参数。 另外如果 . test.sh执行,test.sh离开时,呼叫. test.sh的shell也跟著离开。




shell何时在子shell中执行命令?

A: 在此我们主要讨论Bourne shell及其兼容shell。在许多情况下shell会在子shell中执行命令:

1.(...)结构

小括号内的命令会在一个子shell环境中执行,命令执行的结果不会影响当前的shell环境。需要注意是此时变量$$会显示当前shell的进程id,而不是子shell的进程id。

参考:

{...;}结构中的命令在当前shell中执行,(内部)命令执行的结果会影响当前的shell环境。


14. shell 中的函数可以递归吗?设计时要注意什么?

Bash 中的递归函数



15. 如何用 subshell 产生的多个值改变多个 shell 中的变量?

怎样把子shell中的变量传回父shell?如(echo "$a") read b不能工作,如何找到一个替代方案?下面给出一些可能的方案:

a.使用临时文件

...

#in subshell

a=100

echo "$a">tmpfile

...

#in parent

read b

b.使用命名管道

mkfifo pipef

(...

echo "$a" > pipef

...)

read b

c.使用coprocess(ksh)

( echo "$a" &)

read -p b



d.使用命令替换

b=`echo "$a"`



e.使用eval命令

eval `echo "b=$a"`



f.使用here document

read b <`echo "$a"`

END



g.使用here string(bash/pdksh)

read b <<<`echo "$a"`



16. File pattern 与 regular expression 有什么不同?


17. shell 中含有大量文档.不想在每行之前用 # 注释.有那两种方法可以实现?

方法一:

:<<BLOCK

shell

BLOCK

方法二:


if then fi 结构来屏蔽


27. cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

cmd >a 2>a

undefined
把文件描述符2重定向到a,即把错误输出存到file中

cmd >a 2>&1

undefined
把标准错误重定向到标准输出,再重定向到a,即stderr和stdout都被输出到file中

以下题目暂无答案


Cacti的Mysql模板

Cacti是一款非常强大的系统监视工具,同样强大的还有它的可扩展性,在它的论坛里有上百种的各种设备、软件、服务的监视模板被发表、分享。这里给大家介绍一款专门用于查看Mysql各种状态的模板:mysql-cacti-templates ,它是Google Code的一个项目。

地址:http://code.google.com/p/mysql-cacti-templates/

监视图片的演示:http://www.xaprb.com/blog/2008/05/25/screenshots-of-improved-mysql-cacti-templates/

安装方式:

1.准备工作:下载和解压

2.在Mysql中创建有SUPER权限的用户,并设定密码和赋予相应的登录位置;

3.将ss_get_mysql_stats.php 放到 cacti/scripts/ 文件夹中;

4.在Cacti中导入cacti_host_template_x_db_server_ht.xml,再添加Mysql相关的图表即可。

注意:如需要监视多个Mysql服务器的话,尽量将每个的帐号及密码保持一直,否则需要自己需改模板。

一些MySQL Patches介绍

MySQL是一款用户数量巨大的数据库软件,虽然官方也在不停的升级、发布新的版本,但是有些很好用的功能却始终无法得见,于是就有一些公司、组织或个人就将他们自己的一些成果分享出来了,这里面影响特别大的就是Google了。
Google Code里面有一个google-mysql-tools项目,里面提供了一些MySQL的工具,以及提供了对MySQL 4和 MySQL 5做了大量功能扩展后的补丁。
其中对MySQL4系列的功能扩展详情请见:http://code.google.com/p/google-mysql-tools/wiki/Mysql4Patches
其中对MySQL5系列的功能扩展详情请见:http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patches
整个项目的地址:http://code.google.com/p/google-mysql-tools/
ebay对MySQL做的扩展
地址:http://code.google.com/p/mysql-heap-dynamic-rows/
另外,还有一个专门从事MySQL的Team,其中包括了《High Performance MySQL Second Edition》的作者,他们在google和其他组织发布的补丁包上进行进一步的扩展MySQL。
他们的官方网址是:http://www.percona.com/
发布补丁的地址:http://www.percona.com/percona-lab.html
还可以参考:http://www.mysqlperformanceblog.com/mysql-patches/

2008年9月29日星期一

Mysql Proxy简介

Mysql Proxy是Mysql公司在2007年6月推出的一款Mysql配套的软件。
Mysql Proxy运行于程序和数据库之间,可以将所有发给数据库的请求经过她的处理后转发给事先设定的数据库。它可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:
负载平衡和故障转移处理
查询分析和日志
SQL宏(SQL macros)
查询重写(query rewriting)
执行相关命令
读写分离
比较特别的是Mysql Proxy的脚本语言是Lua。
下载页面:http://dev.mysql.com/downloads/mysql-proxy/index.html
文档页面:http://dev.mysql.com/doc/refman/5.1/en/mysql-proxy.html
项目页面:http://forge.mysql.com/wiki/MySQL_Proxy
一个全是Mysql Proxy内容的blog:http://jan.kneschke.de/

2008年9月13日星期六

Mysql DBA tools--monolith

Monolith是一款类似于MySQL Enterprise Monitor的开源工具,使用PHP技术,在很大程度上可以作为替代的MySQL Enterprise Monitor的低成本解决方案。

官方地址:http://sourceforge.net/projects/monolith-mysql


MySQL Enterprise Monitor官方网址:http://www.mysql.com/products/enterprise/monitor.html


2008年9月12日星期五

Mysql集群安装脚本ndbinstaller

安装Mysql集群会稍微复杂一些,但是现在已经有一个很好安装脚本ndbinstaller。这个脚本提供了各种情况的安装,如:本地安装管理节点、本地数据节点、远程数据节点等。唯一需要注意的是此脚本安装的版本比最新官方的版本略低,而且不可通用,如脚本支持5.1.24那你下载的5.1.26是不能正常安装的。
地址:http://www.jimdowling.info/ndbinstaller-trac
下载:wget http://www.jimdowling.info/ndbinstaller/trunk/ndbinstaller.sh
SVN地址:svn co http://www.jimdowling.info/ndbinstaller/trunk/ ndbinstaller

2008年9月11日星期四

2008年9月10日星期三

Configuring Apache for Maximum Performance[转载]

点此阅读原文:原文地址


Apache is an open-source HTTP server implementation. It is the most popular web server on the Internet. The December 2005 Web Server Survey conducted by Netcraft [1] shows that about 70% of the web sites on Internet are using Apache.


1. Apache server performance


Apache server performance can be improved by adding additional hardware resources such as RAM, faster CPU etc. But, most of the time, the same result can be achieved by custom configuration of the server. This article looks into getting maximum performance out of Apache with the existing hardware resources, specifically on the Linux systems. Of course, it is assumed that there is enough hardware resources, especially enough RAM that the server isn't swapping frequently. First two sections look into various Compile-Time and Run-Time configuration options. Run-Time section assumes that Apache is compiled with prefork MPM. HTTP compression and caching is discussed next. Finally, using separate servers for serving static and dynamic contents are being discussed. Basic knowledge of compiling and configuring Apache, and Linux are assumed.


2 Compile-Time Configuration Options


2.1 Load only the required modules:


The Apache HTTP Server is a modular program where the administrator can choose the functionality to include in the server by selecting a set of modules [2]. The modules can be either statically compiled to the httpd binary or else can be compiled as Dynamic Shared Objects (DSOs). DSO modules can be either compiled when the server is built or else can use the apxs utility to compile and add at a later date. The module mod_so must be statically compiled into the Apache core to enable DSO support.


Run apache with only the required modules. This reduces the memory footprint and hence the server performance. Statically compiling modules will save RAM that's used for supporting dynamically loaded modules, but one has to recompile Apache whenever a module is to be added or dropped. This is where the DSO mechanism comes handy. Once the mod_so module is statically compiled, any other module can be added or dropped using the LoadModule command in httpd.conf file - of course, you will have to compile the modules using apxs if it wasn't compiled when the server was built.


2.2 Choose appropriate MPM:


Apache server ships with a selection of Multi-Processing Modules (MPMs) which are responsible for binding to network ports on the machine, accepting requests, and dispatching children to handle the requests [3]. Only one MPM can be loaded into the server at any time.


Choosing an MPM depends on various factors such as whether the OS supports threads, how much memory is available, scalability versus stability, whether non-thread-safe third-party modules are used, etc.. Linux systems can choose to use a threaded MPM like worker or a non-threaded MPM like prefork:


Worker MPM uses multiple child processes. It's multi-threaded within each child and each thread handles a single connection. Worker is fast and highly scalable and the memory footprint is comparatively low. It's well suited for multiple processors. On the other hand, worker is less tolerant to faulty modules and faulty threads can affect all the threads in a child process.


Prefork MPM uses multiple child processes, each child handles one connection at a time. Prefork is well suited for single or double CPU systems, speed is comparable to that of worker and it's highly tolerant to faulty modules and crashing children. But the memory usage is high, more traffic leads to more memory usage.


2008年9月9日星期二

How To Repair MySQL Replication [转载]

原文点此阅读:原文地址


其实文中的方法很简单,就是先确定复制出问题后,再利用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = number 语句来修复一下。


如果同步系统的一些状态参数有变化或长时间未同步后再次同步等情况,请参考我的这篇文章:Mysql Replication Tip


Version 1.0

Author: Falko Timme <ft [at] falkotimme [dot] com>

Last edited 05/29/2008


If you have set up MySQL replication, you probably know this problem: sometimes there are invalid MySQL queries which cause the replication to not work anymore. In this short guide I explain how you can repair the replication on the MySQL slave without the need to set it up from scratch again.


I do not issue any guarantee that this will work for you!



1 Identifying The Problem


To find out whether replication is/is not working and what has caused to stop it, you can take a look at the logs. On Debian, for example, MySQL logs to /var/log/syslog:


grep mysql /var/log/syslog


server1:/home/admin# grep mysql /var/log/syslog

May 29 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Slave: Error 'Table 'mydb.taggregate_temp_1212047760' doesn't exist' on query. Default database: 'mydb'. Query: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate

May 29 09:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views

May 29 09:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146

May 29 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.001079' position 203015142

server1:/home/admin#


You can see what query caused the error, and at what log position the replication stopped.


To verify that the replication is really not working, log in to MySQL:


mysql -u root -p


On the MySQL shell, run:


mysql> SHOW SLAVE STATUS \G


If one of Slave_IO_Running or Slave_SQL_Running is set to No, then the replication is broken:


Mysql 管理工具集 maatkit

Maatkit是Mysql的一个高级管理工具集。
官方网站:http://www.maatkit.org/
文档地址:http://maatkit.sourceforge.net/doc/maatkit.html
Google Code 页面:http://code.google.com/p/maatkit/
下载地址:wget http://www.maatkit.org/get/script_name script_name 见下面的列表
SVN地址:http://maatkit.googlecode.com/svn/trunk
其中debian有maatkit的deb包了,地址:http://packages.debian.org/search?keywords=maatkit
Debian下安装deb包也极为方便,先安装 libterm-readkey-perl ( apt-get install libterm-readkey-perl ),再安装maatkit即可( dpkg -i maatkit.deb )。
Maatkit包含以下主要工具:
1、mk-table-checksum 检查主从表是否一致及有效的工具
2、mk-table-sync 使表一致的工具,不必重载从表而能够保证一致
3、mk-visual-explain exlpain解释工具
4、mk-heartbeat 主从同步的监视工具,能够给出从落后于主多少
5、mk-parallel-dump 多线程的mysqldump工具
6、mk-parallel-restore 多线程的表回复工具
7、mk-query-profiler 查询检测分析工具
8、mk-deadlock-logger 死锁的记录工具,支持innodb
9、mk-duplicate-key-checker key侦测工具
10、mk-show-grants 权限管理显示工具
11、mk-slave-restart slave的检测和重启工具
12、mk-slave-delay slave delay replication 的工具
13、mk-slave-prefetch This tool implements Paul Tuckfield’s famous “oracle” algorithm to read ahead of the slave SQL thread in the relay logs, rewriting queries as SELECT and executing them to warm the slave’s caches. This can help an I/O-bound slave SQL thread run faster under some conditions, because it doesn’t have to wait for as much I/O to complete.

2008年9月8日星期一

Mysql优化工具--MySQLTuner

最近发现一个优化Mysql时可以使用的小工具--MySQLTuner,这个工具是一个prel写的脚本,运行后会给出当前mysql的各种参数,对进一步优化起到很好的指示。

官方网站:http://rackerhacker.com/

官方wiki:http://wiki.mysqltuner.com/MySQLTuner

下载地址:http://mysqltuner.com/mysqltuner.pl

SVN: svn co http://tools.assembla.com/svn/mysqltuner/


运行的结果:


server1:~# ./mysqltuner.pl



>> MySQLTuner 0.9.8 - Major Hayden <major@mhtx.net>

>> Bug reports, feature requests, and downloads at http://mysqltuner.com/

>> Run with '--help' for additional options and output filtering

Please enter your MySQL administrative login:
<-- root

Please enter your MySQL administrative password: <-- yourrootsqlpassword



-------- General Statistics --------------------------------------------------

[--] Skipped version check for MySQLTuner script

[!!] Your MySQL version 4.1.11-Debian_etch1-log is EOL software! Upgrade soon!

[OK] Operating on 32-bit architecture with less than 2GB RAM



-------- Storage Engine Statistics -------------------------------------------

[--] Status: +Archive -BDB -Federated +InnoDB +ISAM -NDBCluster

[--] Data in MyISAM tables: 301M (Tables: 2074)

[--] Data in HEAP tables: 379K (Tables: 9)

[!!] InnoDB is enabled but isn't being used

[!!] ISAM is enabled but isn't being used

[!!] Total fragmented tables: 215



-------- Performance Metrics -------------------------------------------------

[--] Up for: 12d 18h 33m 30s (1B q [1K qps], 185K conn, TX: 3B, RX: 377M)

[--] Reads / Writes: 78% / 22%

[--] Total buffers: 2.6M per thread and 58.0M global

[OK] Maximum possible memory usage: 320.5M (20% of installed RAM)

[OK] Slow queries: 0% (17/1B)

[OK] Highest usage of available connections: 32% (32/100)

[OK] Key buffer size / total MyISAM indexes: 16.0M/72.3M

[OK] Key buffer hit rate: 99.9%

[OK] Query cache efficiency: 99.9%

[!!] Query cache prunes per day: 47549

[OK] Sorts requiring temporary tables: 0%

[!!] Temporary tables created on disk: 28%

[OK] Thread cache hit rate: 99%

[!!] Table cache hit rate: 0%

[OK] Open file limit used: 12%

[OK] Table locks acquired immediately: 99%

[!!] Connections aborted: 20%



-------- Recommendations -----------------------------------------------------

General recommendations:

Add skip-innodb to MySQL configuration to disable InnoDB

Add skip-isam to MySQL configuration to disable ISAM

Run OPTIMIZE TABLE to defragment tables for better performance

Enable the slow query log to troubleshoot bad queries

When making adjustments, make tmp_table_size/max_heap_table_size equal

Reduce your SELECT DISTINCT queries without LIMIT clauses

Increase table_cache gradually to avoid file descriptor limits

Your applications are not closing MySQL connections properly

Variables to adjust:

query_cache_size (> 16M)

tmp_table_size (> 32M)

max_heap_table_size (> 16M)

table_cache (> 64)



2008年8月29日星期五

《大实话》唱词

说天亲,天可不算亲,天有日月和星辰。日月穿梭催人老,带走世上多少的人。

说地亲,地也不算亲,地长万物似黄金。争名夺利有多少载,看罢新坟看旧坟。

说爹妈亲,爹妈可不算亲,爹妈不能永生存。满堂的儿女留也留不住,一捧黄土雨泪纷纷。

说儿子亲,不算个亲,人留后代草留根。八抬大轿把媳妇娶,儿子送给老丈人。

说亲戚亲,亲戚可不算亲,你有我富才算亲。有朝一日这日子过穷了,富者不登穷家的门。

说朋友亲,朋友可不算亲,朋友本是路遇的人。人心不足这蛇吞象,朋友翻脸就是仇人。

说哥们儿亲,哥们儿可不算亲,吵吵闹闹要把家分。兄如豺狼弟似猛虎,弟兄翻脸狠上家翻坟。

说丈夫亲,丈夫可不算亲,背着妻子外边找情人。沾花惹草得下了病,回家之后还得闹离婚。

说媳妇亲,媳妇可不算亲,背着丈夫外边找情人。她跟那个小白脸子俩人闷得儿蜜,全忘了张文顺的那么点子恩。

说小蜜亲,小蜜可不算亲,你拿出金银财宝她献了身。有朝马死黄金尽,她归置东西进了那张文顺的门。

要说亲,观众们亲,观众演员心连着心。曾记得早年间有那么句古话,没有君子不养艺人。

昨日里趟风冒雪来到塞北,今日里下江南桃杏争春。

我劝诸位,酒色财气君莫占,吃喝嫖赌也莫沾身,没事儿就把那相声大会进,听两段相声就散散心。

抱拳拱手尊列位,愿各位 ——招财进宝,日进斗金。


给我比较有印象的有三个版本:两个和张文顺老先生的全本,以及和于谦老师的删节版。


其中,和张老先生的两个版本是最具有观赏性的,特别是有个版本里由于张老先生的不断打岔,导致郭老师唱错,场面尤其搞笑。

2008年8月20日星期三

《劝善歌》歌词

首先是郭老师20080203封箱演出上的《劝善歌》唱段,歌词如下:


混沌初分实在难学(xiáo),谁知地多厚天有多末样儿地高~啊,日月穿梭催人老,有生命把力劳(利捞),难免死生路一条,八个字【民间俗称生辰八字】造就命也该着~啊;

树大根深要扎稳牢,人受教条你就那个武艺高~啊,井掏三遍吃甜水,劝明公你们忍为高,千万别把这个小人学,小人他过河就拆桥啊。

君王有道乐逍遥,十万里的江山扎得稳牢啊,文官能忍戴纱帽,武将忍穿蟒袍,吃粮当兵也得忍着啊,似这样的江山怎么样儿不安牢。

庄稼人能忍起早贪黑呀,土房子抹(bàn)泥防备那个雨来摧呀,地要是薄了多加点尿(料),鬓星星,戴月辉,耕种锄刨忙几回,到秋来收粮合家喜双眉。

读书人能忍铁砚磨穿,砚干墨透费尽了辛艰,赞登登萤火把书看,书中有古先贤,待等得平步青云犹如上了天啦。

买卖人能忍和气生财呀,不论这个贫富一个样儿看待呀,买卖卖的熟主到啊,站柜台笑颜开,休要发困莫要发呆啊,似你这个买卖怎么能够不发财呀。

走过了三川六水大海大江哦,看惯了灯红酒绿世态炎凉,争什么多来论的什么少,充好汉你逞刚强,金银财宝梦黄粱,倒不如德云社你(来听郭德纲)开心笑一场啊,愿诸位你们招财进宝,喜气洋洋啊~!

参考地址:
http://v.youku.com/v_show/id_cj00XMTgyNDYxNDg=.html


然后是于浩,于老师的《公道老爷劝善》唱段的唱词:


混沌呀初分实在难晓啊,谁知道地厚天有多么样儿的高哇,日月穿梭催人老喂,为争名把力劳,难免死生路一条哇,八字里造就命也该着;

树大根深长得稳牢啊,人守这个教条武艺高,井掏三遍吃甜水耶,劝明公你就忍为高,千万别把这个小人学啊,小人过河他就拆桥;

买卖人能忍和气生财啊,不论这个穷富一个样儿看待呀,买卖都是守住道喂,上柜台你就笑颜开,莫要发困那休发呆,这样的买卖怎么能不发财;

庄稼人能忍起早贪黑呀,土房子抹泥防备那个雨来摧呀,地要是薄了多加粪呢,要勤锄,耪几回,别让那荒草把苗儿围,您要是懒了怨的我们谁?

街坊邻居也得忍之啊,孩子们打架各管各的,亲戚没有邻居好喂,远亲戚不如近邻居,孩子们打架是常有的呀,为孩子你护犊子万万使不得;

君王能忍乐也逍遥啊,十万里的江山坐的那个稳牢啊,文职官能忍加俸禄喂,武将忍你就穿蟒袍,当兵吃粮也得忍着哦,月月官饷来把上级官来熬;

走过了三山四水大河大江啊,看惯了灯红酒绿世态炎凉啊,争的什么多来论的什么少喂,争好汉你就逞刚强,金银财宝梦黄粱啊,不如到和平影院把相声来欣赏啊~

祝大家合家欢乐,喜气洋洋啊~

参考地址:
http://www.tudou.com/programs/view/puunJI-4_XA/


以上两段都是我反复听唱段后校正过的,个别地方是自己猜测的,如有问题请留言。


两段唱词里面的不同之处:


1.郭老师的独有关于读书人的,于老师独有关于邻居的内容;


2.关于庄稼人后半段的不同;


3.在个别的词或词序不同;


4.郭老师的个别发音不符合现在的普通话发音,于老师的就号多了(个人认为两者各有特色)。

2008年8月17日星期日

CSS选择器及其优先级之一 --影响网页显示的各种因素

在一个网页中,最终展示给我们所看到的画面,其实是由很多因素决定的,包括:



CSS



在目前内容和样式分离为主流的前提下,页面绝大部分的显示属性由CSS来决定,但是一个网页引入CSS的方法有多种,



内联引用 (Inline Styles)



内联引用就是把CSS样式直接加到需要作用的HTML标签中。内联定义也就是在对象的标记内直接使用style属性定义样式,是最简单的样式调用方法,可灵巧地把样式应用到各标签对象中,使用简单、显示直观。但无法完全发挥出样式表“表现与内容分离”的优势,所以在设计过程中并不常用。


如:


<p style="font-size: 18px">18px的文字</p>


<p style="font-size: 12px">12px的文字</p>


如果要修改字体大小的话就要分别修改了。对于上面的例子来说只需要修改两处,分别修改也不会花费多少时间。但是大型的网站或复杂的网页来说,成百上千个的属性是不可能去手动修改的。所以此方法绝对不推荐。


此方式也与直接使用HTML的样式表现标签及属性有相似的地方。



定义内部样式块对象 (Embedding a Style Block)



此方式是使用style标签直接把CSS文件中的内容加载到HTML文档内部,一般放置于<head> <tilte>CSS</title> </head>结构的</head>前。


:


<head>


<tilte>CSS</title>


<style type="text/css">


p { color: red }


</style>


</head>


styletype属性设置为”text/css”,是允许不支持这类型的浏览器忽略样式表单,帮助这类浏览器过滤掉CSS代码,避免在浏览器里直接以源代码的方式显示这个样式表。



链入外部样式表文件 (Linking to a Style Sheet)



此种方式是W3C推荐的方式,真正做到了内容和样式分离。


要建立单独的外部样式表文件(后缀名为.css),使用<link>标签引入外部css文件,<link>标签放置位置与<style>标签位置一致。


如:


<head>


<tilte>CSS</title>


<link rel="stylesheet" type="text/css" href="/style.css" media="screen" />


</head>



联合使用样式表(@import 导入函数)



使用@import联合样式表的方法和链接外部样式表的方法一致,也是在HTML文档的<head></head>标记之间插入;但这种方式可以在链接外部样式表的同时,针对该网页的具体情况,做出别的网页不需要的样式规则,更有优势。


<head>


<tilte>CSS</title>


<style type="text/css">@import url(/style.css);</style>


</head>


需要注意的是:


·联合法输入样式表必须以@import开头,结尾”;”结束;


·如果同时输入的多个样式表产生冲突时,则按照第一个输入的样式表有效处理;


·如果输入的样式表和网页中的样式(内联引用)规则产生冲突时,则使用外部的样式表。



HTML



HTML中还保留有一部分表现样式的标签及属性,如:


<font size="+3" color="#003366">CSS</font>


<p align="center">CSS</p>


此方式与CSS内联方式一样不被推荐使用。



浏览器设置



浏览器设置可以分为浏览器默认设置和用户定义两部分;



浏览器默认



各个浏览器对同一网页的同一元素会有不同的默认样式,比如:IEFireFox默认的显示字体,页边距、段间距、标题样式、列表样式、元素居中、超链接样式、鼠标样式、图片链接样式等。


详细的区别可以参考:浏览器默认样式 http://www.tansea.cn/article.asp?id=94



用户定义



还有部分样式用户可以自定义,比如:网页显示的字体种类、字体大小,甚至使用自定义的样式表等来显示网页。

2008年8月16日星期六

CSS选择器及其优先级之二--CSS选择器介绍


CSS选择器介绍



下表总结了CSS1CSS2.1中出现的选择器。描述中英文是W3C CSS Selectors标准中的描述,是为了在中文没有解释清楚或有歧义的情况下进行进一步了解的参考。


CSS版本一栏介绍了此选择器第一次出现在那个CSS版本中。CSS是向下兼容的。














































































































































选择器类型

匹配语法

示例

描述

CSS版本

通配选择器


Universal Selector

*

*{margin:0;}


*.p{paddving:0;}

选定文档目录树(DOM)中的所有类型的单一对象


any element

2

类型选择器


Type Selectors

E

td { width:120px; }

以文档语言对象类型作为选择符


an element of type E

1

属性选择器


Attribute Selectors

E[attr]

p[title] { color: blue; }

选择具有attr属性的E


an E element with a "attr" attribute

2

E[attr=value]

span[class=nav] { color: red; }

选择具有attr属性且属性值等于valueE


an E element whose "attr" attribute value is exactly equal to "value"

2

E[attr~=value]

div[speed="fast"][dorun="no"] { color: red; }

选择具有attr属性且属性值为一用空格分隔的字词列表,其中一个等于valueE。这里的value不能包含空格


an E element whose "attr" attribute value is a list of space-separated values, one of which is exactly equal to "value"

2

E[attr|=value]

a[rel~="copyright"] { color:black; }

选择具有attr属性且属性值为一用连字符分隔的字词列表,由value开始的E


E element whose "attr" attribute has a hyphen-separated list of values beginning (from the left) with "value"

2

包含选择器


Descendant Selectors

E F

ul li {font-size:14px; }

选择所有被E包含的F


an F element descendant of an E element

1

子对象选择器


Child Selectors

E>F

div>p{color:#ccc;}

选择所有作为E子对象的F


an F element child of an E element

1

ID选择器


ID Selectors

#myid

# myid { width:120px;}

以文档目录树(DOM)中作为对象的唯一标识符的ID作为选择符。


an E element with ID equal to "myid".

1

类选择器


Class Selectors

E.class

.class{ font-size:14px;}

HTML中可以使用此种选择符。其效果等同于E[class~=className]


an E element whose class is "class" (the document language specifies how class is determined).

1

临近表兄弟选择器


Adjacent sibling combinator

E + F

div+p{font-size:18px;}

选择紧接E的对象F


an F element immediately preceded by an E element

2

Structural pseudo-classes

E F:first-child

div p:first-child{font-size:9px;}

设置对象E的第一个子对象F的样式表属性。


an E element, first child of its parent

2

链接伪类


The link pseudo-classes

E:link


E:visited

a:link {color: #ccc; }


a:visited {color: #999; }

设置a对象在未被访问前的样式表属性。


设置a对象在其链接地址已被访问过时的样式表属性。


默认值由浏览器决定。


对于无href属性(特性)的a对象,此伪类不发生作用。


an E element being the source anchor of a hyperlink of which the target is not yet visited (:link) or already visited (:visited)

1

The user action pseudo-classes

E:active

E:hover

E:focus

a:active{font-size:9px;}


a:hover{color: #ccc; }


a:focus { font-size: 14px; }

设置对象在被用户激活(在鼠标点击与释放之间发生的事件)时的样式表属性。


设置对象在其鼠标悬停时的样式表属性。


设置对象在成为输入焦点(该对象的onfocus事件发生)时的样式表属性。


an E element during certain user actions

1 and 2

The :lang() pseudo-class

E:lang(fr)

blockquote:lang(fr) { quotes: '?' ' ?' }


//使用法语显示由quotes属性指定的法语的嵌套标记

设置对象使用特殊语言的内容样式表属性。


an element of type E in language "fr" (the document language specifies how language is determined)

2

The ::first-line pseudo-element

E::first-line

div:first-line {font-size:16px; }

设置对象内的第一行的样式表属性。


此伪对象仅作用于块对象。内联对象要使用该伪对象,必须先设定对象的heightwidth属性,或者设定position属性为absolute,或者设定display属性为block


如果未强制指定对象的width属性, 首行的内容长度可能不是固定的。


the first formatted line of an E element

1

The ::first-letter pseudo-element

E::first-letter

p a:first-letter { color: green }

设置对象内的第一个字符的样式表属性。


此伪对象仅作用于块对象。内联对象要使用该伪对象,必须先设定对象的heightwidth属性,或者设定position属性为absolute,或者设定display属性为block


在此伪类中配合使用font-size属性和float属性可以制作首字下沉效果。


the first formatted letter of an E element

1

The ::before pseudo-element

E::before

em:before { content: url("ding.wav") }

用来和content属性一起使用,设置在对象前(依据对象树的逻辑结构)发生的内容


generated content before an E element

2

The ::after pseudo-element

E::after

table:after { content: END OF TABLE }

用来和content属性一起使用,设置在对象后(依据对象树的逻辑结构)发生的内容。


generated content after an E element

2



另:


选择器分组Grouping   EFG 将同样的定义应用于多个选择符,可以将选择符以逗号分隔的方式并为组。


P,div,span{color:#ddd;}

2008年7月24日星期四

在VMware Workstation上成功安装Mac OS之二--安装过程篇

上篇已经介绍了,虚拟机硬件的设置,这篇将为大家展示Mac OS在VM上的安装过程。



1.点击虚拟机的绿箭头就可以启动虚拟机了,Mac的镜像文件在建立虚拟机时就已经放入虚拟机的光驱,所以等待就好;



2.在这个界面,可以输入启动参数-v,这样可以进入字符启动界面,可以直接了解启动的步骤,万一不成功的话,也可迅速知道卡在那个步骤;





3.一切顺利的话就进入安装的界面了(不好意思,iATKOS_2.0i安装时忘了截前面的图,用iATKOS_4i的图顶一下,两者这些步骤一样的):









4.一路Continue/Agree到达选择安装磁盘的界面后,点击页面上方的”Utilities”里面的“Disk”,出现下面的界面:




5.点击左侧列表的”20GB Vmware,…”,右侧出现新的菜单,点击第二项“Erase”,选择希望格式化硬盘的格式和卷标后,点页面下方的“Erase…”按钮,等待,完成后点击页面上方的“Disk Utility“选择推出磁盘工具:



6.退出后,刚才的安装界面就出现了Mac OS可以安装的磁盘了,点击那个磁盘,进入安装选项界面,由于是虚拟机,所以就不需要选什么了,直接点”Install“,开始安装:




7.点击”Install“后,安装程序会自动检查磁盘,我忘了自己检查没有,最好检查一下吧,然后就是正式安装了,正式安装时需要狂读写硬盘,所以最好不要同时开启多个程序,而且有段时间机子会很卡:





8.一直等啊等啊,我大概等了20分钟左右,终于结束,进入系统设置(以下的图片都是iATKOS_2.0i安装时图了),按照自己的实际情况设置即可:















9.至此Mac OS安装就算完成了,剩下的就是在系统内安装汉化包,安装软件等。







最后祝大家都安装顺利,一起迈入Mac OS的世界!