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;}