Sources for Android SDK

在最新的SDK中,Android SDK Manager已经可以直接下载Sources for Android SDK,并且源码存放的位置在

$ANDROID_SDK_HOME/sources/android-X/这个路径下面。然后在Eclipse中关联就可以。

另外还有一种就是zip包形式的
在$ANDROID_SDK_HOME/platform/android-X/source.properties这个文件中有一个类似https://dl-ssl.google.com/android/repository/repository-5.xml
这样的路径,打开它,里面搜索’sources’字样,会找到sources-14_r01.zip和sources-15_r01.zip

也就是zip包源码的下载地址
(Android 4.0.1) https://dl-ssl.google.com/android/repository/sources-14_r01.zip
(Android 4.0.3) https://dl-ssl.google.com/android/repository/sources-15_r01.zip

但是Google提供的sources-14源码当中还是有些Mock代码,所以建议还是去下载第三方打包的,比较全一点。

老版的打包好的源码还是可以前往http://rgruet.free.fr/public/下载

Enjoy Android
Enjoy OpenSource

写一篇关于家人的文章

爸爸妈妈经历了从农民到个体户再到农民的一个过程,琐碎的文字记录下一些东西

1、我好像就见过一次爸爸妈妈年轻时的照片,记得是他们很多兄弟姊妹一起的。所以貌似不爱拍照是我们家的遗传。

2、记得爸爸妈妈很少有吵架,没什么印象有吵的很凶的时候了。

3、以前我妈比较讨厌狗,后来老爸托表哥从山里面弄来一只很凶的狗,但它很听话,后来我妈也不怎么讨厌狗了,而且那只狗特别怕我妈,再后来那只狗老了,估计神志不清开始咬家里人了,据说就被卖了,后来好像家里再也没有养过狗了。

4、老妈有事没事总喜欢喊老爸,老爸觉得很烦,后来老妈说喊你也烦,我要是去喊别人你更烦,所以还是喊你好了。

5、以前记得老爸开车路上碾死了只鹅还是鸭子什么的,那主人说我这鹅生蛋,蛋孵鹅什么的,值很多钱的,老爸没鸟他,给了他几十块钱。回家后,老妈知道了,来了句,你应该把那鹅拿回来,还可以煮一顿吃了。。。

6、妈妈老跟我说很小的时候,种田的时候家里忙,没人照顾我们,我和我哥哥经常在躺在门口的“GaiYan”(就是门前的类似阶梯或者大门槛附近,那个时候的楼房都大门是凹在里面的)上睡着了。

7、有次去亲戚家,爸爸带着我乘出租车过去,结果到了某个小巷子里面,开车师傅也不知道怎么走了(小地方的街道有很多乱78糟的巷子),就问我爸怎么走,我爸来了句,要是我开车的话就知道怎么走,估计那师傅想这是劫车的吧

8、当然开车也有迷路的时候,据他说在某地上高速,但就是不知道高速路口从哪走,于是叫了个出租车在前面带着他到高速路口,GPS还没有普及的年代迷了路什么的就比较惨啊

9、我爸爸基本不喝酒,某年我妈妈的生日,表姐请我爸爸妈妈到她们家去玩,据说我爸爸喝了点酒,当然回家的时候就毫无疑问的在该转弯的地方没有转弯,直接把车开到了一个“Yan”(就是池塘)里面,据说后来请了个吊车拉上来的

10、家里面找别人借了很多钱,以至于到后面老爸老妈都记不清到底还给人家没有,当然别人没有找我们要,某天老爸突然想起是不是有笔钱没有还给人家,然后妈妈中午就给我打电话,说你记不记得读大学的时候借的几笔钱,还了没?我想了想,记不起来

11、后来爸爸妈妈又开始在农村种田后,有个人就告诉我,你要好好读书,多赚钱,看你爸爸挺着个大肚子(很多年没怎么干农活,长胖了)在地里干活,很辛苦啊

12、我记得貌似是第一次独自乘巴士车出门,爸爸跟那售票员说,帮忙在什么什么路叫他(就是我)下车,其实我那个时候已经很大了

13、农民家庭穷的时候真可以是家里几十块钱都没有

14、哥哥和我小时候经常互相殴打对方,打的妈妈都懒得管了,你们打死一个好了,不过我们长大了都从来不惹事,关系都好,兄弟血缘是永久的

15、哥哥很小的时候就会自己做饭吃,我貌似不会。。。

16、貌似记得哥哥小时候写作文不爱用标点符号,于是老师就罚他写个很长的作文,一个标点符号也不许用

17、记得以前会和我哥哥一起去钓龙虾,去挖龙虾,去挖泥鳅

18、记得以前哥哥用生活费省下来的钱去买那种玩具枪,然后我们一起玩(他通常会买两只)

19、以前爸爸妈妈忙的时候让我做顿午饭给他们吃,我做了,妈妈也吃了,后来结论是:吃了你(当然还是我)做的饭,可以减肥。后来我貌似就再也没有接到过做饭这个任务了

20、我貌似小时候也打过很多人,也被很多人打过

21、据我妈说,小时候在沙市某个商场,我骑在爸爸的脖子上,揪着他的耳朵要买那种无线的可以飞起来的遥控飞机,那个年代这个东西很贵啊,所以当然是买不起

22、我小时候其实真不知道赚钱很难,那个时候自己花的少(也不怎么乱花钱),找他们要就给了,长大点了,才知道穷啊,赚钱难啊

23、其实我没有不喜欢我爷爷的,爷爷在我读大学(在外地)的时候去世了,不过我过了一段时间才知道这个事情的

24、以前我们那里的人不怎么喜欢四川人(称他们为川军),后来我去四川读书了,老爸称他们为我的半个老乡

25、2008年四川地震了,有人到家里上门收捐款,我爸说我儿子都是灾民了,谁给我捐点啊。我自己当时给一基金捐了点钱,还好没有捐给红十字会,要是捐给红十字会了现在还不后悔死啊

26、地震那段时间妈妈看着电视里面的新闻觉得很惨,就随口一说,我们来领养一个小孩子吧,我爸爸说,你这么“ZaoYe”(就是很穷的意思),谁让你领养啊,政府不会让你领养的

27、每次回家奶奶都还会来看一下我,问几个同样的问题

28、家里面有时会比较忙,奶奶就比较愁,老爸每次都说,“Laowongga”(老人家)“Ke”(去)弄“Nia”(您)自己的事情“Ke”(去),这种情景都不知道重复了多少年了

29、据说爷爷以前是GMD成员,一些事件发生后,被留在了某钢厂工作,后来可能奶奶自己一个人在家没有人挑水,爷爷就跟奶奶回家了,据说奶奶去找的爷爷【这条真假不知道从哪里考究,听别人讲故事讲的】

30、爸爸妈妈已经都50岁左右了

IO,Network,Protocol等等标记帖

这里都是一些感觉写的好或着写的明白的经典内容

IO
IO – 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
http://blog.csdn.net/historyasamirror/article/details/5778378

HTTP
深入理解HTTP协议(转)
http://www.blogjava.net/zjusuyong/articles/304788.html

TCP
位码即TCP标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)

TCP状态表
CLOSED
LISTEN
SYN RCVD
SYN SENT
ESTABLISHED
FIN WAIT 1
FIN WAIT 2
TIME WAIT (双方均已断开)
CLOSING
CLOSE WAIT (被动关闭)收到对方关闭请求,并且已经确认
LAST ACK (被动关闭)等待最后一个关闭确认

建立连接过程
一般情况是服务端执行LISTEN原语进入LISTEN(被动打开)状态
客户端发出CONNECT命令,创建报文段(带SYN)并发送,进入SYN SENT状态
服务端收到一个SYN报文段,给客户端回应ACK同时发送一个SYN,进入SYN RCVD状态
客户端收到SYN+ACK报文段,并发送三次握手的最后一个ACK报文段,进入ESTABLISHED状态
服务端收到确认的ACK报文段,完成三次握手,进入ESTABLISHED状态

关闭连接过程
客户端执行CLOSE原语,创建报文段(带FIN)并发送,进入FIN WAIT 1状态
服务端收到一个FIN报文段,确认客户端的请求并回发一个ACK报文段,进入CLOSE WAIT状态
客户端收到服务端的确认ACK报文段,转移到FIN WAIT 2状态,此时从客户端到服务器方向的连接已经断开
服务端应用得到通告后,执行CLOSE原语,创建报文段(带FIN)并发送,进入LAST ACK状态
客户端收到FIN报文段并确认,进入TIME WAIT状态,此时双方连接均已经断开
但TCP要等待一个2倍报文最大生存时间(2MSL),确保。。。,到超时时间后,删除记录,进入CLOSED状态
服务端收到最后一个ACK报文段,释放连接,删除记录,进入CLOSED状态

http://www.cs.berkeley.edu/~kfall/EE122/lec23/sld001.htm
Three-way handshake
– A ——> Seq k, SYN ——> B
– A <--- Seq j, ACK k + 1, SYN + ACK <--- B - A ----> Seq k + 1, ACK j + 1, ACK —->

Four-way handshake
– A —- Seq k, ACK j + 1, FIN + ACK —-> B
– A <--- Seq j, ACK k + 1, ACK <--- B - ... sometime later ... - A <--- Seq j, ACK k + 1, FIN + ACK <--- B - A ---> Seq k, ACK j + 1, ACK —>

Wireshark真实抓包数据
三次握手

33	44.679312	192.168.1.102	58.215.40.94	TCP	53902 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=3199582 TSER=0 WS=6
34	44.761376	58.215.40.94	192.168.1.102	TCP	smtp > 53902 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1440 TSV=1575891196 TSER=3199582 WS=7
35	44.761442	192.168.1.102	58.215.40.94	TCP	53902 > smtp [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=3199602 TSER=1575891196

四次分手

181	279.133008	192.168.1.102	58.215.40.94	TCP	59658 > smtp [ACK] Seq=7 Ack=93 Win=5888 Len=0 TSV=3258195 TSER=1576125611
182	279.133545	58.215.40.94	192.168.1.102	TCP	smtp > 59658 [FIN, ACK] Seq=93 Ack=7 Win=5888 Len=0 TSV=1576125611 TSER=3258186
183	279.133630	192.168.1.102	58.215.40.94	TCP	59658 > smtp [FIN, ACK] Seq=7 Ack=94 Win=5888 Len=0 TSV=3258195 TSER=1576125611
186	279.264675	58.215.40.94	192.168.1.102	TCP	smtp > 59658 [ACK] Seq=94 Ack=8 Win=5888 Len=0 TSV=1576125739 TSER=3258195

http://blog.chinaunix.net/space.php?uid=20587912&do=blog&cuid=2201855
http://wenku.baidu.com/view/2fd4a6d126fff705cc170af3.html
OSI 7层协议
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层

TCP 4层协议
网络接口层(ARP,RARP…)
网间层(ICMP,IP)
传输层(TCP,UDP)
应用层(SMTP,HTTP,FTP,DNS)

也说说自主研发

废话文章一篇
不知道从什么时候开始,我听到“自主研发”这四个字心理就开始哆嗦,可能跟自己的经历和整个社会风气有关。
不是“自主研发”的都不好意思跟别人打招呼,有部分人过分吹嘘了这个词。
自主研发就是高技术,高质量吗,我觉得不一定是,至少从我在的软件行业来看。这个行业确实需要很多高手,需要很多高新技术,甚至可以说它推动了地球的发展,但是也不是样样都要自主研发,这样就是在浪费生命。
目前来说技术基本掌握在一些大公司中,它们有这庞大的业务,有着足够的资金,有着充足的人员,为了解决目前遇到的一些问题,他们对原有的东西进行改进,或者完全开发出新的东西,这是可以理解的,也是正确的一条路。
但是目前国内更多的是一些小公司,处理一般性的业务,很多东西都是别人“发明”过千百遍的,它们还要从头来做个,这就没有必要了。
我觉得碰到合适的东西,拿来就用是正确的(遵循相关协议),用的时候理解原理,特别现在软件方面很多开源(http://en.wikipedia.org/wiki/Open-source_software)的产品或者组件,当对它熟悉了,知道它的缺陷了,我们再来结合自己的实际情况进行修改或者开发,这样既简化了初期的开发成本,又可以给我们后期更进一步的开发打好基础。
而且更糟糕的是目前很多所谓“自主研发”的东西,BUG累累,让后面的人改都不知道怎么改,因为它前期就没有一个统一的思想,只是一直在补丁,能让它运行,这不论对公司还是对开发人员来说都是一个巨大的悲剧,因为这种做法或者说不可阻挡的趋势只能导致后面全盘放弃。
所以不要“自主研发”也是不错的事情,比如你能用别人给的积木搭成自己想要的城堡也是一件创新和骄傲的事情。
当然搭建城堡其中也有自主创新的地方,总之摆脱无意义和力不从心以及挣面子的“自主研发”才是正道。。。

也说说被面试吧(偏向技术线路的)

也许有些人跟我一样,在毫无规矩的小公司做着开发工作,并且也想着哪天也能成为技术牛人。
但一般情况下这种想法可能只有自己陪自己来进行,因为别人都忙着工作,没有时间来跟你讨论什么技术问题,也基本没有条件来研究相关东西。
你要做的就是快速的实现一个功能,快速的把BUG搞定,而且这样一来你每天都还挺忙。
所以基本技术东西都是平时业余学习或者一部份少有的工作积累,并且你可能一直都还在努力的找一份自己想做的工作或者觉得自豪的工作。

当然有一天会让你有些意外,比如你投过的一份简历忽然对方给你来电话了,而且给你电话的人还是你耳熟能详的牛人或者干脆就是你崇拜已久的人物。

这个时候我想你接到这个电话,你应该心跳加速了吧,压力瞬间就上来了吧,对你越是重要的人或者事你越会在意,但往往也越会紧张。
简单的寒暄几句之后就进入所谓的“电面”,聊些常规话题,聊聊你对哪些感兴趣或者对哪些擅长。
面试官基本会根据你的情况问问稍微具体但也很基本的细节,但是往往在这个时候你就有可能回答的不好,面试完毕之后你回想一下,会反问自己,刚才都瞎说了些什么啊,结果是可想而知的,机会即刻就消失了。如果你回答的都很好,说明你技术能力和心理素质都很好。

对于这种情况自己需要做到几点:
1、基础知识要经常回顾,可能你一看就懂,可能你再看的时候也懂,但是就是看不到的时候就忘记了,模糊了
一些常用的,重要的方法名,变量名,含义,基本算法都要记得,因为你如果都说个大概,别人很可能就认为你只是粗略的了解过
2、多思考,一件事情这样做了几遍了,一个方法这样写了几遍了,就需要想想为什么要这样
3、回答别人的问题的时候要严肃,要尽量都回答,实在不知道的就说不知道,如果你有能力说不定还可以和面试官讨论一番
因为别人和你基本都是第一次交流,如果你太随意或者让别人感觉很随意,那么你这次就不妙了,所以要认真,别人只听得到你说的,其他的基本对你都不知晓
4、自己对自己的目标要专一,比如你今后想从事什么方向的工作,太泛的话,别人也就不知道该不该要你了
这点特别是在小公司待着的人特别重要,因为你平时的工作可能很泛,什么都懂点,不清楚自己究竟想要做什么,能做什么
5、常规问题要一直在自己记忆里清晰,比如为什么要换工作,你已经经历过的工作对自己有什么启发,自己有什么感悟
6、面试官对你的建议要记住,虽然有可能这次失败了,但是他的建议会让你下次再遇到想要的工作机会时获得成功
7、要让面试官真诚的感觉到你想要这份工作,你适合这份工作,这个就是沟通交流技巧了

如果这几点都做的很好,第一步应该还是比较好跨出去的

面试题之多线程数组求和

想换工作的,平时还是要做些面试题,因为冷不丁的被面一下,会感觉突然,当然结果也是很糟糕。
这是一道老题目“一个非常非常大的int类型数组,用多线程计算和。假设数组长度M线程数量N”。
思想是分而治之,跟快速排序MapReduce思想有些类似。

这里是一个实现的一个简单版本,根据有多少线程,然后把数组分为多少段,因为求和的过程都是读取数组元素,涉及不到锁等等。
所以只要段划分正确,计算就是简单的事情了。

有空再来用Future实现一个版本

MySQL主从复制基本实验

最近这一两个月业余时间基本都在看MySQL的书,看明白了一些,又忘了一些,哈哈,总的来说没有什么很大的收获
今天无聊了,弄个Replication(http://dev.mysql.com/doc/refman/5.1/en/replication.html)来玩玩
MySQL的Replication可以用在很多地方,比如平衡负载,备份等等
主要它复制的时候是一个异步的过程(有没有将随机读写变成顺序读写这个值得研究,对于大多数磁盘来说,顺序读写可能更快些),可以从某些程度上来说提高性能,当然生成Binary-log也是有代价的,不过会换来更多的好处(在网络传输影响很小的情况下),比如读写分离将读压力分出去了,比如多机备份

也有很多人写类似的文章和书籍,我也就记录个实践的过程

我这里实践所有的环境都是Linux 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 19:00:26 UTC 2011 i686 GNU/Linux,两个数据库,一个5.1.57-log作为Master,一个5.5.8作为Slave,都装在一台机器上,启用不同的配置和端口
目的就想在Master插入一条数据,在Slave也能看到,性能以及安全的配置都没有考虑

看官方配置说明的时候就需要弄清楚哪些是在Master上配的,哪些是在Slave上配的

因为我的Slave是5.5,以前的版本,比如5.1中可用的
master-user = repl
master-password = repl
master-port = 3307
这些配置文件参数在5.5的Slave就不能用了,如果你不小心配置了这些参数,MySQL服务器将无法正常启动
看下MySQL日志你应该会发现类似于这样的提示(unknown variable ‘master-host=‘)
2121 110809 22:53:21 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
2122 110809 22:53:21 [Note] Plugin ‘FEDERATED’ is disabled.
2123 InnoDB: The InnoDB memory heap is disabled
2124 InnoDB: Mutexes and rw_locks use InnoDB’s own implementation
2125 InnoDB: Compressed tables use zlib 1.2.3
2126 110809 22:53:21 InnoDB: Using Linux native AIO
2127 110809 22:53:21 InnoDB: Initializing buffer pool, size = 128.0M
2128 110809 22:53:21 InnoDB: Completed initialization of buffer pool
2129 110809 22:53:21 InnoDB: highest supported file format is Barracuda.
2130 110809 22:53:21 InnoDB: 1.1.4 started; log sequence number 42505789
2131 110809 22:53:21 [ERROR] /usr/local/mysql/bin/mysqld: unknown variable ‘master-host=127.0.0.1′
2132 110809 22:53:21 [ERROR] Aborting
2133
2134 110809 22:53:21 InnoDB: Starting shutdown…
2135 110809 22:53:22 InnoDB: Shutdown completed; log sequence number 42505789
2136 110809 22:53:22 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete
2137
2138 110809 22:53:22 mysqld_safe mysqld from pid file /usr/local/mysql/data/KNIGHT.pid ended

那么在5.5的Slave中我是先配置了这几个参数
replicate-do-db = replication
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
有意的指定和排除了一些库参与同步
之后启动Slave,然后通过change master to master_host=’127.0.0.1′, master_port=3307, master_user=’repl’, master_password=’repl’, master_log_file=’master-cutoe-binlog.000001′, master_log_pos=600, master_connect_retry=10;
slave start;
来实现Slave的开始复制

Master配置文件主要参数如下:
server-id = 1
log-bin = master-cutoe-binlog
binlog_format = mixed
sync_binlog = 1
innodb_flush_log_at_trx_commit = 2

Slave配置文件主要参数如下:
server-id = 2
replicate-do-db = replication
replicate-ignore-db = mysql
replicate-ignore-db = information_schema

如果配置都对了的话,先起Master,再起Slave
在Master和Slave中创建好需要复制的库和表,比如
create database replication;
create table user(id int primary key auto_increment, name varchar(20), age smallint);
(让复制自动在Slave中创建和Master一样的表在这里我没有尝试,有空可以试试)
还要在Master中创建一个Slave用来访问Master的用户
CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’; –为什么不能指定该用户只对单独的库具有复制权限,目前不清楚原因
然后在Master中mysql> show master status;
在Slave中通过change master to,slave start开启复制
并mysql> show slave status \G
就应该会看到Slave_IO_State: Waiting for master to send event
这个时候再在Master中执行个Insert语句,如果没有错误的话,应该可以在Slave的相应表中看到刚刚你在Master插入的一样的数据
基本可以通过mysql> show slave status \G查看到复制过程中发生的所有情况,例如错误信息

如果Slave复制失败,你可以根据错误信息进行修正,然后执行
mysql> slave stop;
mysql> slave start;
就可以把原来应该复制过来的数据都复制过来

别忘了一个很简单的命令也是要常用的
mysql> show processlist \G

Good Luck & Good Night…

MySQL临时表用法

MySQL目前还不支持动态游标(可能这个名词用在这里不准确),但很多时候我们需要这样的一个功能(http://bugs.mysql.com/bug.php?id=17153)
比如在存储过程中根据传入的参数动态查询出数据,然后遍历数据,这个时候我们当然想动态的构建出这个游标出来

人民大众就开始想尽办法来实现类似的功能,比如下面的创建一个临时表来完成

mysql> CREATE TEMPORARY TABLE tmp_data (uid int(11) NOT NULL) ENGINE=MEMORY DEFAULT CHARSET=utf8;

注意这里为了提高速度用的是MEMORY引擎,当然它有一些限制行的东西,比如表的大小限制,某些类型的字段不能保存
可以根据自己的情况来抉择
更多信息可以参考http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html
还有一些参考意义的测评也可以借鉴,比如http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

这里还给它增加了个索引
mysql> ALTER TABLE tmp_data ADD INDEX idx_uid (uid);
mysql> SHOW INDEX FROM tmp_data;

当然用完之后记得清理表,简单的方法就是
mysql> DROP TEMPORARY TABLE tmp_data;

临时表在不同连接之间是不可见的,但是在多线程的环境中,这个还是应该值得注意

还有更多的问题值得研究,比如create和drop临时表不会产生事务提交
但直接DROP TABLE tmp_data;也会删除临时表,但是会提交前面打开事务

临时表和正式表重名机制等等

另外,其实在MySQL内部它也大量使用了临时表,当然对程序员来说都是透明的,你不用关心它什么时候用,数据是放在内存还是放在硬盘上的
想看的话可以通过explain查看

有关MySQL奇技淫巧

有关MySQL奇技淫巧(一般都是Linux下试过的,其它平台自行尝试)

0、学会查看MySQL错误日志
日志名一般为HOST_NAME.err,在里面说不定很容易找到你想要的东西

1、开启MySQL General Query Log
想查看MySQL执行了哪些SQL语句?
那么就开启这个日志吧
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html
可以通过启动mysqld加入相关参数或者动态开启

当然最方便的还是动态开启(不用重启数据库,貌似对MySQL版本有要求)
中文参考:http://www.taobaodba.com/html/477_动态开启mysql-general-log.html

mysql> set global log_output = file;
mysql> set global general_log_file=’/home/guohai/dev/x/topics/mysql/sql.log’;
mysql> set global general_log=on;

还有个要求就是MySQL对该日志文件有读写权限,我把它的own和group全改成跟MySQL对应的了,要不然报错

关闭只需要
mysql> set global general_log=off;

2、innotop使用
去http://code.google.com/p/innotop/下载最新版的安装包,这里用的是innotop-1.8.0
按照安装说明安装好,更详细的安装说明可以参见http://crazytoon.com/2008/05/21/mysql-how-do-you-install-innotop-to-monitor-innodb-in-real-time/
可能innotop版本不一样,自己稍微变通下
第一次运行innotop的时候会叫你输入一些配置信息,比如数据库链接信息
这个你可以在~/.innotop/innotop.conf中修改
guohai@KNIGHT:~/.innotop$ tree
.
|– innotop.conf
`– plugins

1 directory, 1 file

man innotop是永远不能少的
另外可以参见http://5iwww.blog.51cto.com/856039/570669
http://blog.csdn.net/qiuyepiaoling/archive/2010/11/29/6042379.aspx

3、mysql命令的一些有用参数选项
生产环境中手工操作数据库是个技术活
有些参数可以方便我们获取需要的数据,或者节省我们的时间
一些明显的信息提示或许可以帮助我们减少出错的概率
比如
mysql>prompt \h:\u@\d>
PROMPT set to ‘\h:\u@\d>’
localhost:root@hpm>
这样你就明显的看到,你是在哪台机器,用户是什么,操作的数据库是什么

MySQL Command Line Pager
mysql>\P more
mysql>\P less
mysql>\P

下面是别人总结出来有用的
http://www.developer.com/db/10-command-line-timesavers-for-mysql-tasks.html
http://www.ningoo.net/html/2008/mysql_cmdline_html_xml_prompt.html
自己也可以查看手册找到一些有用的信息

4、create table log_20110630 like log_template;
like子句会复制表结构,包括索引等,不包括权限

create table log_20110701 as select * from log_20110630;
复制数据,不包括索引