listener静态注册与动态注册

今天有人问我关于listener静态与动态注册的问题,翻出来很早以前写的一篇文章,关于ORACLE_SID,db_name,instance_name,service_names以及listener动态注册和静态注册的简单说明。

ORACLE_SID
环境变量,用来标识共享内存段,也可以说是实例的名称,同一台机器,相同的ORACLE_HOME,不能使用相同的ORACLE_SID,因为不能创建相同的共享内存段,
INSTANCE_NAME
初始化参数,用于listener动态注册,和环境变量ORACLE_SID无关,两者可以不一致。
SERVICE_NAMES
初始化参数,用于listerer动态注册,可以设定多个值,service_names可以为同一个instance指定多个服务名称。
DB_NAME
初始化参数,同时记录在control file,data file,redo file的header中,初始化参数设置必须与控制文件相同。

listener 动态注册:PMON进程自动将数据库的信息注册到listener中,或者使用alter system register显示注册,要求listener必须使用1521端口,使用动态注册将不需要在listener.ora中指定SID_LIST。如果指 定了instance_name,service_names参数,动态注册将使用这两个参数,如果没有指定service_name,那么将使用 db_domain+db_name作为service_name进行动态注册。
listener status看到如下内容:
Service “test” has 2 instance(s).
Instance “test”, status UNKNOWN, has 1 handler(s) for this service…(静态注册)
Instance “test”, status READY, has 1 handler(s) for this service…(动态注册)
如果指定了多个service_names,将会看到多个service指向同一个instance,如下:
Service “jackytest1″ has 1 instance(s).
Instance “aaa”, status READY, has 1 handler(s) for this service…
Service “jackytest2″ has 1 instance(s).
Instance “aaa”, status READY, has 1 handler(s) for this service…

listener静态注册:在listener中显示指定SID_LIST,静态注册中global_dbname的作用就如同动态注册中的service_names,用于为同一个instance设置多个别名
比如
(SID_DESC =
(GLOBAL_DBNAME = test1)
(ORACLE_HOME = /opt/oracle/products/9.2.0)
(SID_NAME = test1)
)
(SID_DESC =
(GLOBAL_DBNAME = xxxyyy)
(ORACLE_HOME = /opt/oracle/products/9.2.0)
(SID_NAME = test1)
)
这样就为test1这个instance设置了两个service_name,分别是test1和xxxyyy
Service “test1″ has 1 instance(s).
Instance “test1″, status UNKNOWN, has 1 handler(s) for this service…
Service “xxxyyy” has 1 instance(s).
Instance “test1″, status UNKNOWN, has 1 handler(s) for this service…

tnsnames.ora的设置
可 以使用service_name或者sid连接数据库,分别对应listener中的service和instance,这里要注意的是:如果 ORACLE_SID和INSTANCE_NAME不同,那么动态注册使用的是instance_name,而静态注册使用的是ORACLE_SID的 值,也就是真正的实例名称。

–EOF–

《MySQL性能优化与架构设计》- 新书推介

【内容简介】

本书以 MySQL 数据库的基础及维护为切入点,重点介绍了 MySQL 数据库应用系统的性能调优,以及高可用可扩展的架构设计。

全 书共分3篇,基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的备份恢复知识。性能优化篇从影响 MySQL 数据库应用系统性能的因素开始,针对性地对各个影响因素进行调优分析。如 MySQL Schema 设计的技巧,Query 语句的性能优化方式方法及MySQL Server中SQL层和存储引擎层的优化思路。同时还分析了 MySQL 数据库中主要存储引擎的锁定机制。架构设计篇则主要以设计一个高可用可扩展的分布式企业级数据库集群环境为目标,分析介绍了通过 MySQL 实现这一目标的多种架构方式。主要包括可扩展和高可用两部分内容,可扩展部分包括设计原则、Replication 的利用、数据切分、如何使用 Cache 和 Search,以及 NDB Cluster等内容。高可用则主要包括 Dual Master、DRBD、NDB Cluster,以及系统监控等方面。

【作者介绍】

简朝阳,毕业于南京工业大学管理科学与工程学院,管理学学士。擅长MySQL & Oracle数据库应用系统的性能调优与高可用可扩展架构设计,有一定的对Java 和C语言基础。目前就职于阿里巴巴(中国)网络技术有限公司,曾参与过公司多个核心数据库应用系统的设计与实施,目前主要负责 MySQL 数据库应用系统的架构设计与相关维护工作。活跃于 iMySQLer 数据库论坛(http://imysqler.com) 和 MySQL 邮件组(mysqler@googlegroups.com, http://groups.google.com/group/mysqler)

–EOF–

本书的作者是我的同事,2006年大学毕业后来到Alibaba DBA team,还记得当时DBA没有招聘应届毕业生的计划,但是在校园招聘中,他被评估为“潜力无限”的增值股,所以被破格录用。而我(一个刚刚上路的菜鸟DBA)是他的导师。事实证明,当时的招聘人员的眼光是犀利的,正如他的名字朝阳一样,他成长的速度超过了我们所有人的期望。从最初的Oracle DBA转型到MySQL方向后,迅速成为MySQL领域内的专家。

在这本书之前,中文版的MySQL图书要不是译作,要不就是官方文档的简单翻译,几乎没有自己的思想。而这本书则完全不同,首先它不是一本MySQL的入门书,也不是用命令堆砌的参考书,而是一本深入介绍MySQL原理的故事书。作者通过大量实际的案例,讲述了MySQL数据库优化原理,以及架构设计方面的内容,这些内容都是在实际工作中不断积累的宝贵财富,在其他任何文档中都找不到。

作者从一个应届毕业生到数据库大师,只花了三年时间,在这个过程中,我见证了他的成长,也从他的导师变成了学生(我也开始学MySQL啦)。在他的成长轨迹中,我看到了信念,坚持,行动和态度。对于每一个想成为DBA的年轻人来说,现在就像朝阳那样开始吧。

我们,依然在路上……

幸福在哪里

本来不想写什么的,因为担心会被跨省抓捕,但是当互联网变成了局域网,twitter,flickr……被屏蔽,甚至Google reader中订阅的很多blog都无法正常显示,我已经出离愤怒了:fuck off!

我们衣食无忧,每天看CCTV的电视节目,上全世界最大的局域网,沐浴在GFW的阳光下,幸福得象一只河蟹。他们说我们是这个国家的主人,只是我们不再关心这个国家,也不再追求事实的真相。

其实,我们一无所有。

–EOF–

“黑夜给了我黑色的眼睛,我却用它来寻找光明”。-顾城

招聘数据仓库DBA

招聘数据仓库DBA(Oracle)一名,要求具备管理大型数据仓库的经验,工作地点:杭州。要求:

1.精通数据仓库数据库的性能优化。

2.熟悉RAC,ASM,10g,11g。

3.具备管理大型存储的经验。

4.必要的AIX和LINUX知识。

BTW:数据仓库的DBA还会接触到Greenplum数据库,还有我们自己搞的山寨存储系统。

有意向请发邮件到:freezr@gmail.com,并附上你的简历,我收到邮件后一般都会回复。招聘流程是:电话面试,公司笔试/面试,HR确认。

顺便说一句,MySQL DBA还在招聘中。

–EOF–

Oracle Logical Standby SQL Apply Architecture

这篇文章的本意不是讨论logical standby,而是源于一个问题的讨论。最近,我们在做redo解析工具,目前redo已经解析得差不多了,现在需要把解析出的SQL应用的目标数据库中。我们知道,数据库在同一时刻,有很多事务在并发执行,而事务与事务之间是有相关性的。通过解析redo,我们实际上得到的是一个数据变化的“流”(或者可以看作一个SQL队列)。如果我们要保持在目标数据库上事务的顺序与主库完全一致,最简单的方法是用一个单一进程按照事务提交的顺序进行处理,假设有3个事务,commit的时间顺序为:T1,T2,T3,我们在解析redo的时候,如果没有发现commit,我们不会将SQL应用到目标数据库,当发现T1事务commit时,这时把T1事务的所有SQL全部应用并提交,然后是T2和T3。这种方法保证了事务提交的顺序与主库完全一致,而不用分析事务之间的相关性。但是这个方法的性能很差,由于只有单进程处理,而且只有在发现commit时,才能提交这个事务的所有SQL,如果T1事务很大,会堵塞T2和T3事务。看来这个方法行不通,我们先看看别人是怎么考虑这个问题的。

如何实现并行的SQL Apply系统?其实最关键的问题是分析事务之间的相关性,我们看看Oracle logical standby是如何实现的。

Reader:读取归档日志。

Preparer:将block change转换为LCR(logical change records),存放在shared pool的LCR cache中。

Builder:将LCR按照事务分组。

Analyzer:分析事务相关性。

Coordinator:为Applier分配事务。

Applier:应用LCR,commit。

从这张图,我们看到只有Preparer和Applier是并行的,其他都是单一进程处理。事务通过Preparer分析后,暂存在SGA的LCR cache中,通过Analyzer分析事务相关性,就可以把相关的事务分配给同一个Applier来应用,而不相关的事务就可以并行执行。

事务在应用时被分成两类:小事务和大事务,小事务在commit时一次执行,而大事务则被分成很多的Transaction Chunks,分批应用。这样做一是为了节省LCR cache,另外可以减少大事务在commit时等待的时间。

在SQL Apply的时候,也提出了检查点的概念。如果一个事务长时间不提交,而SQL Apply意外中止,那么要重新读取之前的archived redo log以获取这些信息,这是代价很高的,所以Oracle每隔一段时间会checkpoint这些未提交的事务,并记录SCN,如果这些事务最终回滚,则SQL Apply会将他们删除。

通过DBMS_LOGSTDBY.APPLY_SET(’PRESERVE_COMMIT_ORDER’)可以设置事务执行的顺序,设置为true,则所有事务的提交顺序都与主库一致,设置为false,则只保证相关的事务的一致性。如果logical standby需要运行报表系统,对事务的一致性要求很高,需要设置为true。如果不要求事务的时间一致性,设置为false,性能会更好。

Oracle并没有详细介绍其内部实现细节,我们也无从得知,但是大致的原理应该大家都差不多。很明显,这套方案对于我们来说,尤其是分析事务的相关性和并发事务的分配,实现有些困难,毕竟我们还不是那么专业。所以我们实现了一个简单的方案,不分析事务的相关性,利用多个连接模拟SQL并发应用。还是刚才的例子,如果有T1,T2,T3三个事务并发执行,则我们通过三个并发连接根据SQL的执行时间顺序来处理,由于有多个进程同时处理,则不会出现大事务堵塞的情况,而且可以保证事务提交的时间一致性。但是在这个方案中,在同一时刻还是只有一个进程在处理,从宏观上看还是一个串行的系统,性能肯定要比完全并行的差一些。

从这个具体的问题跳开来看,其实解决问题的思路在很多地方都是相通的。这也是我一直倡导的从点到面,逆向思考的学习方法。学习知识,也许一开始我们关注的是某个命令,到后来我们关注其实现的原理,通过逆向思考的过程,理解其设计原理并不断得到启发,最终达到一通百通,无招胜有招的境界。

–EOF–

调整执行计划的三种方法

当我们碰到SQL的执行计划不正确的情况,可能会有几个选择:第一,通过调整统计信息来改变执行计划;第二,通过在SQL上加hint改变执行计划。但是某些情况下,系统中的SQL不能修改,调整统计信息也不能解决问题(分析统计信息也是一个风险比较大的操作,因为可能会影响到很多相关的SQL),这时我们就要用到一些调整或固化执行计划的方法,下面简要介绍以下三种方法:stored outline(9i),SQL profile(10g)和SQL plan baseline(11g)。

其实这三种方法从本质上说都差不多,Oracle根据SQL语句计算一个signature,用来标识这个SQL,然后为这个SQL施加一系列hint,以达到调整或固化执行计划的目的,并将其存入数据字典中。在SQL执行时,首先根据SQL的signature去数据字典中寻找对应的SQL,如果存在的话,则优化器会根据记录的hint来调整执行计划。

1.stored outline

stored outline是Oracle 9i中提供的调整执行计划的方法。这里有一个小技巧:如果在生产环境中,我们不能通过调整统计信息让SQL生成正确的执行计划,这样就没有办法生成正确的outline,这时我们可以在SQL上添加hint,强制SQL走到正确的执行计划上,然后生成outline,由于此时SQL text发生了变化导致signature变化,需要直接修改outline的字典表ol$hints,交换两个hint的OL_NAME字段,用此方法来产生SQL的stored outline.

2.SQL profile

Oracle 10g提出了SQL Tuning Advisor这个工具,其核心是Automatic Tuning Optimizer,它是Query Optimizer的一个扩展,我们都知道在SQL真实执行时,为了性能的考虑,优化器并不会分析所有可能的执行计划,而ATO则专门为了优化SQL而产生,其主要功能就是分析SQL语句,并给出一些提高性能的建议。

Oracle提供了一个包:dbms_sqltune,我们可以用这个包创建一个tuning task,通过Tuning Optimizer对SQL进行分析后,就可以产生一个SQL profile,用户可以选择接受这个profile,则SQL的执行计划会受到影响。SQL profile是影响SQL执行计划的一系列信息的集合,可能包括环境(参数)设置,统计信息,优化器估算的信息,hint等等。

我们可以看到相比stored outline,Oracle提供了dbms_sqltune这个包,通过Automatic Tuning Optimizer自动产生SQL profile,并且report_tuning_task可以为用户提供详细的报告,而且SQL profile中包含的信息也更多。但是SQL profile只能通过Oracle自动产生,没有办法“人工”创建。

3.SQL plan baseline

Oracle 11g推出了SQL plan baseline,最大的特点就是为SQL的执行计划加入了版本的概念,并且当执行计划发生变化时,允许用户对其进行控制,对于OLTP系统来说,这是个非常重要的特性。

首先系统需要收集SQL plan baseline,可以通过参数打开系统自动收集,Oracle提供了一个包,dbms_spm,也可以通过这个包从library cache中获取。每当SQL产生新的执行计划时,Oracle都会将其记录下来,但是这个执行计划并不会马上生效。每个SQL用SQL_ID标识,SQL plan baseline中包含这个SQL的若干个执行计划,SQL plan baseline用SQL_handle标识,每个PLAN都有plan_name和plan_hash_value。

如果某个SQL有很多plan,我们要选择哪一个plan?Oracle提供了Evolving SQL plan baseline的功能,通过evolve_sql_plan_baseline这个函数,可以对不同的plan进行比较,其实就是让优化器直接执行SQL的不同plan,以此来选择最优的plan,并且可以给出详细的报告。

SQL plan baseline同样提供了人为调整执行计划的方法,通过hint或者调整统计信息,得到SQL的执行计划,然后通过load_plans_from_cursor_cache函数,将这个plan装载到SQL plan baseline中。

通过SQL plan baseline我们就可以控制SQL的执行计划,当执行计划发生变化时,并不会马上生效,而是等待用户确认,这样大大降低了系统的风险。用户可以通过alter_sql_plan_baseline更改当前生效的plan。

BTW:Oracle 11g提供了很多非常nice的功能,SQL plan baseline也算是其中一个吧。

本文中的大部分内容来自于TOP这本书,并融入了我的理解。限于篇幅,不能详细介绍这三个功能,有兴趣可以参考Oracle的文档,也可以发邮件来Ask Jacky。

–EOF–

Michael一周岁

Michael一周岁了,昨天爸爸妈妈带他去了动物园,晚上全家为宝宝开了一个生日party。

爸爸和妈妈希望宝宝永远健康快乐,快快长大!

动物园 生日party 生日蛋糕

–EOF–

我的汽车观和Dream Car

关于如何选车这个话题,这是我的一位同事写的一篇文章。

一、文化篇
当前的主流有欧系、日系、美系三大阵营。其中欧系车以德系为主,辅以法国、意大利、英国、瑞典等分支派系。各有各的特点和风格,简述如下:

欧系车:

德国车代表了业界顶尖的造车工艺和科技,双B(BMW, Benz)、奥迪、大众、保时捷。除了大众,大都价格昂贵,非一般工薪所能企及。德国车总的来说,车身硬朗,结实,舍得用料,重视安全和科技含量,强调驾驶乐趣。但配置低,价格高,小毛病较日系车为多。

法国车以雷诺、雪铁龙、标致为代表,国内的雷诺不多,雪铁龙和标致已合为PSA集团,实为一家。法国车设计风格比较出位,浪漫,大胆,不拘一格。但工艺、技术、品牌等和德国车相去甚远,虽然也继承了一些欧系车硬朗的传统,但总的来说,除了外观设计,其他方面缺乏个性。当然,法国第一神车布加迪.威龙除外。

意大利盛产超跑,法拉利、兰博基尼、玛莎拉蒂,都是dream car。超跑离我们太遥远,和南汽分手后的菲亚特虽贴近老百姓,但菲亚特实在是不争气,在中国没造出一款好车来,不说也罢。

英国车成了没落的贵族,除了血统和品牌还在,都已落入人手。劳斯莱斯被宝马收了,宾利归了大众,路虎和捷豹居然成了印度车。英国车用料奢靡,质量一般,保有量少,维护成本高,发迹之前可不考虑。

瑞典的沃尔沃现为福特旗下,安全是其卖点,其他乏善可陈。萨博则属于快破产的通用,卖的是驾驶乐趣,但性价比不高,内饰粗糙,属极小众车型。

日系车:

总的来说,日系车性价比高,省油,配置高,做工精细,设计新潮,质量好,小毛病少。但很多国产的日系车喜欢偷工减料,做表面功夫,所以车身单薄、安全性差常为人诟病。日系车能在全球势如破竹,自有其过人之处。很多人选来选去还是选了日本车,为什么?性价比就是硬道理。

丰田已取代通用,稳居第一。丰田成本控制出色,性价比高,其最大的特点就是“中庸”,即没有特点就是丰田的特点,也许不能让所有人都喜欢,最起码大部分人都不讨厌。

尼桑(或日产)重视技术,早有“丰田的销售,尼桑的技术”一说。相比丰田,尼桑的价值取向有点不一样,就是对运动和技术的追求。这就是为何尼桑孜孜不倦的搞能干掉911 turbo的超跑GTR,而丰田就不乐意干这种低附加值的事情。

本田的设计是很有特点的,人性化,外观酷,内饰炫,实用,省油。但国内厂商偷工减料的恶习让人不敢恭维,断裂的雅阁、变成铁饼的飞度、两厢变一厢的CRV。。。

马自达秉承Zoom Zoom的造车理念,是日系车中的另类。硬朗的悬挂,犀利的转向,出色的过弯,对运动性的追求不遗余力,这点超过了大多数的欧系车。但车身单薄、车漆软还是日系车的通病,且发动机动力较弱有违其运动的本质——当然,这是国产化的必然结果。

三菱在中国比较失败,Lancer和Galant尤其是后者都卖的很不好。这和市场策略有关,不代表三菱不好,帕杰罗就是很经典的越野车,还有Lancer EVO更是经典中的经典,但过于暴力,且价格昂贵。

斯巴鲁的水平对置发动机和全时四驱是其法宝,运动诉求贯彻更加彻底,进口中国的车型也毫无保留,如经典的翼豹WRX STI。森林人在国内的销量不错,是一款各方面综合素质都不错的SUV。

顺便提一下韩系车,汽车发展史上不是主流,没有地位,但比美国车日子好过。靠抄袭模仿日本车起家,但很快也形成了了自己的风格。有日本车的优点,也有日本车的缺点,但缺乏个性。

美系车:

美国车已经日薄西山,但毕竟家大业大,收购兼并了众多厂家。美国人喜欢豪华,气派、舒适、大排量。但传统的美国车燃油经济性差,发动机技术落后,悬架软,缺乏驾驶乐趣等缺点直接导致其走向衰落。美国三大汽车家族体系和分支太庞大,不一一赘述。

市面上常见的销量不错的美系车,都是经过改良的。如福克斯整体上来看就是欧系风格,但内饰糙还是美国特色;别克凯越的原型车其实是韩国大宇的Nubira,韩系风格,比较契合东方人的价值取向;赛欧则是从德国欧宝的Corsa演变而来;福特的新蒙迪欧也采用了经济性和动力更好的马自达发动机。所以,美国车也在尽量与时俱进,也不乏很多可圈可点的车型。

二、进阶篇

1. 发动机

发动机是汽车的心脏,最重要的部件。购车者必须要了解参数有:

排量:排量就是发动机所有汽缸的工作容积之和,可作为区别汽车等级的重要标识,比如说1.6,就是1.6升,3.0就是3升;

汽缸数:常见的为4缸、6缸,更多的有8、12甚至16缸。汽缸排列方式一般为直列、V置、水平对置等,具体特点不再详述;

功率和扭矩:这是发动机最重要的两个指标。功率在中国的单位为KW(千瓦),某些国家使用PS(匹),1PS=0.746KW。功率好理解,即发动机的额定输出效能。扭矩的单位是N/M(牛/米),是发动机从曲轴端输出的力矩。

通俗点讲,功率决定了车子的极速,而扭矩决定了加速的快慢。在衡量发动机效率或优劣时,常用升功率来计算,如BMW 330发动机排量为3.0升,功率为190KW,扭矩为300NM,升功率则为190/3.0 = 63.3KW/L,这款发动机效率非常高,一般的车型通常在50左右,而本田S2000的发动机多年前就已达到了93KW/L。

发动机工况图:表示动机的特性,在哪些转速区间可输出最大扭矩。驾驶者掌握了其特性,就可以掌握合适的换挡时机,以获得最佳的加速体验。

涡轮增压(Turbo):涡轮增压发动机油耗低,功率和扭矩大,但平顺性不如普通自然吸气发动机,保养成本和故障率都略高。

总结:

发动机的选择最为重要。如市区代步,不追求极速和加速感受,可选择经济实惠的小排量,如小于1.6L还有购置税的减免;如追求驾驶乐趣,常跑高速,尽可能选择2.0以上排量,可以在各个速度区间获得较好的加速体验。

应尽可能避免选择技术陈旧低效率的发动机,如新宝来、速腾、帕萨特的2.0L那款,铸铁材质且不说,还是2气门,升功率只有44kw。

2. 变速箱

手动变速箱

手动变速箱重量轻,传动效率高,维护成本低,省油,有驾驶乐趣;但油离配合不好容易熄火,换档时机掌握不好容易导致发动机积碳或油耗增加;如遇堵车,频繁的起步会让驾驶者对手动档深恶痛绝。

自动变速箱

普通自动档

大部分车型使用普通自动档,从4速到8速不等。自动变速箱省心省力,容易驾驶,只需操控方向和油门即可;但其自重增加,传动效率低,油耗增加,无驾驶乐趣。对于少数初学者尤其是女性驾驶者,尤其要注意的是,千万不要误把油门当刹车,极度危险。

一般来说,档位越多,传动齿比越密,加速越平顺,油耗表现更好。在选车时,尽量避免选择只有4速的自动变速箱,至少要选5-AT。大众1.4的小Polo都装配了6速Tiptronic手自一体变速箱,相比之下,很多日系车太不厚道,刚上市的丰田RAV4,20多万的车价,居然还是4-AT。

CVT

CVT为无级变速,和普通自动变速箱不同的是,没有采用普通的齿轮传动,而是靠一个锥形的钢带传动,通过传动轮的直径可变来实现速比的变化。优点是无换档冲击,驾驶平顺,省油(相对自动档);但不适大扭矩的传递,容易打滑,且更加丧失了驾驶乐趣。多用于家庭型轿车,以舒适为主,在大马力的车型上极少采用。

双离合(DCT)

双离合综合了手动和自动的优势,换档速度极快,传动效率高,省油,在很多德系车上已经开始配备,如大众的DSG,宝马的SMG等。但价格昂贵,经济型车少有配备。目前国产迈腾是配备双离合的最便宜车型,年中将推出的6代Golf 1.4T+DSG也非常值得期待。其实双离合并非什么新技术,早在专业赛车上使用,近几年将其成本降低并民用化而已。

此外,手自一体变速器本质上还是自动档,可以一定范围内手动控制档位,但电脑还是会干预自动升降档位或断油保护,仅仅为乏味的自动档增加少许驾驶乐趣而已。

总结:

如选手动,一般都是5-MT,6-MT更好,但配备的车型不多;如选自动,则尽可能选择5-AT及以上的自动变速箱,最好有手动模式,如大众的Tiptronic 6-AT则比较经典;如在意驾驶的平顺感受,CVT也是不错的选择,如尼桑的轩逸和天籁。

3. 驱动方式

有两驱和四驱之分,两驱又分前驱和后驱。

一般车型以前驱为主,强调运动的车型和大型豪华车多使用后驱。普通驾驶过程中,无明显差异,激烈过弯时前驱容易转向不足,后驱则容易转向过度,四驱则比较均衡,稳定性好。

另外,在湿滑路面尤其是冰雪天,前驱相比后驱行使稳定性更好,后驱很容易甩尾,四驱最好。轿车采用四驱的不多,经典的有奥迪的Quattro,斯巴鲁的全系列车型,Acura的TL等。

如无明显偏好和特殊路况需求,如用来漂移或越野,则前驱足矣。

4. 制动及安全系统

ABS,EBD,ESP

如果ABS,EBD都没有的话,就不要出来混了,详细的原理和特点不讲了,大家可以Google一下。ESP(不同厂家名称有别)为车身稳定系统,一般在中级车上出现,尽量选择此装备,可以在失控的边缘拉你一把。但再好的安全装备都无法突破物理的极限,只是辅助性的被动安全措施。

碟刹和鼓刹

为降低成本,一般经济型轿车使用前碟后鼓,也有采用四轮碟刹的,如早期版本的Polo。鼓刹技术由来已久,成熟,成本低,制动力大,常用于大型货车。但散热不好,热衰减明显,响应慢;碟刹散热好,响应快,改装空间大,和ABS配合好,多用于轻型车辆。所以尽可能选择4轮都是碟刹的制动系统。

制动距离

100KM/h的时速到刹停,如果距离在40米左右是比较靠谱的数据。但厂商一般不会公布这个数字,除非以此为卖点,可以做到37米左右。

总结:

事关安全的装备,性命攸关,千万不能含糊。日系车往往在这些看不到的地方降低成本,往往在花哨的装备上下功夫。补充一点,安全驾驶最重要的就是养成好的驾驶习惯,练就过硬的驾驶技能,积累各种路况的行车经验。另外,安全带永远是最好的防护措施,比8个气囊更管用。

根据自己的经验,在8~40万区间,可推荐几款:

Polo、标致206/207 1.6(手动)、本田思域、本田锋范、福克斯(手动)、标致307(手动)、速腾1.8TSI、斯柯达明锐1.8TSI、丰田花冠、马6、马3 2.0(手动)、迈腾、锐志、BMW 325
(注:标注手动的车型,因其自动变速箱款为4-AT,故不做推荐AT)

作者背景:我们部门的老大,18年驾龄,曾驾车型逾百,追求速度和操控,热爱长途奔袭。

–EOF–

我的汽车观和Dream car

爱车爱老婆的男人是好男人,Jacky也算一个吧。每天上爱卡论坛也是我的一大爱好,虽然没啥钱,折腾不起什么好车,每天开着我的206心情也挺舒畅的,但是自从有了Michael后,觉得车有点太小了,而且1.4的发动机动力太弱。

我的下一部车是什么?可以肯定的是一定不是日本车或者韩国车, 美国车几乎不可能,国产车的可能性也不大,选择欧系的可能性比较大,但是应该不会选择标志,看看206拉皮的207,还有老掉牙的307,其实法系车还是很有特色的,但是都让神龙给毁了,要不就是加个屁股,要不就是拉皮升级。为家人考虑,选择一辆SUV或者MPV是比较适合的,谁让我是顾家的好男人呢。看来看去,选择大众的可能性比较大,GOLF 6,Touran,Tiguan都是我喜欢的。大众的TSI的发动机不错,虽然在国产后去掉了机械增压,只保留了涡轮增压,但是在国产的发动机中还是非常优秀的一款。至于是选择MT还是AT,如果不考虑LP驾驶的问题,我还是会选择MT,因为在我的印象中,只有驾驶手动车才是真正的驾驶,而且手动变速箱几乎不需要维护,简单可靠。不可否认的是在拥堵的城市中开手动车确实有些累。所以如果你仅仅是城市代步,那AT要轻松很多。要纠正的一个观点是:手自一体变速器,只是在自动变速器上加入了“手动”档位的概念,本质还是自动变速箱,并不是AT+MT。大众的DSG双离合变速器,是最新的技术,动力反应直接,换挡迅速,不过价格估计比较高。如果不考虑价格,我会选择2.0T+DSG+四驱版本的Tiguan.

关于我的dream car,还是比较现实的,象法拉利这种超跑我都没敢想。如果有钱了,我一定会买一辆宝马,别说我俗,没有梦想的男人不是好男人,宝马不是暴发户的专利,DBA也可以开宝马(wanghai同学就开宝马),5系7系不考虑,宝马的精髓在3系,3系怎么也要到330吧,最好是敞篷的,此车适合我和LP出去兜风。越野车,我喜欢JEEP牧马人(曾经很冲动的想要买一辆怯懦机2500),可惜现在克莱斯勒就快要倒闭了,jeep也是前途未卜,此车用来和朋友们出去疯玩。SUV,选大众的Touareg,比宝马X5或者奥迪Q7低调,越野性能出色,安全性能好,此车用来跑长途旅游。再买一辆Mini Clubman S敞篷版,运动版本带涡轮增压的发动机,男人的大玩具,此车用来游西湖,吸引MM眼球,而且停车方便。最后选一辆上班专用车,Golf 6 GTI,把GTI三个字母抠掉,换成0.8,低调,还可以扮猪吃老虎。

这就是我,一个热爱技术也热爱生活的DBA。回到现实努力工作吧,为了梦想,拼了!

关于undo和consistent read

上周,同事作了一个关于undo internal的技术分享,发现我对这些技术细节都忘得七七八八了,这也证明我当初并没有真正理解其中的原理,今天又重温了一下,发现还是有一些问题没有想清楚。

这里我尽量用简单的语言描述其实现原理,内容涉及到itl,undo,cleanout,consistent read,ORA-1555等内容。

1.一致读产生的一般性原理:

构造一致读的过程实际上是一个递归的过程,用data block+undo构造出一个CR block,如果发现这个CR block还不够旧,就继续用这个CR block+undo来构造,直到构造出的小于query scn的CR block或者报1555错误。data block如何找到相应的undo,就要用到ITL,因为在构造CR block的过程中,不仅仅回滚了data block中的数据,ITL也同时回滚了(因为在undo entries中不仅仅包含数据的before image,也包括ITL的before image),这样不管要构造多少次,只要UNDO信息没有被覆盖掉,都可以通过block上的ITL找到相应的undo。

2.undo segment header上的control SCN

这个SCN是这个undo segment中的任意一个slot被覆盖时,这个slot的上一个事务的提交scn,就是这个undo segment可以回滚的最小SCN,如果查询的scn小于control scn,那么Oracle将直接返回1555,因为回滚也必然是失败的。这个control SCN的另外一个重要用途是,在delay cleanout时,如果对应的slot被覆盖,则用这个control SCN作为upper bound SCN作为事务的commit SCN,因为用这个SCN是安全的。

3.undo entries chain

我们把undo block中具体的undo信息称为undo entries,由于一个事务可能包含很多操作,在回滚时必须从最后一个entries向前回滚。首先我们通过undo segment header上的事务表找到undo block的地址,在这个undo block中记录了最后一个undo entries的位置(偏移量),每个undo entries中又记录了上一个的地址,这样就形成了一个undo entries chain。

4.undo segment header

回滚段头的主要结构是事务表,事务号是由undo segment number+slot number+sequence组成,当slot重用时,sequence number会增加一,用来唯一的标识一个事务。通过事务表可以找到最后最后一个undo entries所在的undo block。

我这里有几个疑问:

1.从一些资料上看到undo segment header上有一致性读,什么情况下undo segment header上需要一致性读?作用是什么?

2.在我的测试中,就算slot被重用,但是undo entries是不会被覆盖的。但是当slot被覆盖后,进入这些undo entries的入口没有了,这些undo entries会在什么情况下被使用?难道是flashback?

3.data block中的ITL中不仅记录了undo block的地址,还记录了undo entries的位置。是否可以通过undo segment header中的事务表就直接找到相应的undo记录吗?因为有可能slot已经被覆盖,通过事务表无法找到undo entries的入口。

–EOF–

Ask Jacky

最近感觉没有什么动力,Blog也不知道写点什么。试着开一个ask jacky的栏目,大家可以问我各种问题,我来回答,如果我也不知道,那我就再问问身边的牛人,顺便也是个学习的过程。

与其说是“问”,不如说是大家一起讨论有关DBA的话题,可以是有关于数据库,架构,主机,存储,数据中心等技术问题,也可以和我探讨DBA职业生涯,打听DBA小道消息,甚至有关摄影,汽车,电影等海阔天空的话题。但请不要问有关个人隐私和公司机密方面的问题。

我也没什么影响力,有人问就问,没人问就拉倒。我的email:freezr@gmail.com

友情提醒:对于有价值的问题,我可能会选择发表在我的blog上。

–EOF–