本站推荐: 坚韧卓绝之人,必能成就万事
Today | 02/02 | 02/01 | 01/31 | 01/30 | 01/29 | 01/28 | 01/27 | 01/26 | 01/25 | 01/24
 123
 123

  2010-02-03 Wed

22:53 《全家都来赛》上荒唐的一幕 (2490 Bytes) » 木木:木有书读

鼓,国人最熟悉不过的一种打击乐器。古人打仗用鼓,祭祀用鼓,到衙门打官司也要敲一下鼓,办喜事则敲锣打鼓,连和尚庙都有晨钟暮鼓。发展至今,鼓已经成为民乐中最重要的乐器之一。但鼓,不仅仅中国有,也不一定就是中国人发明的,印度人,非洲人,西洋人都有属于他们本民族的鼓。各地的鼓,原理都差不多,但用的材料,制作的程序,敲打的工具、手法,对鼓乐的理解却不尽相同。即便在我国,也分有很多种鼓。

鼓在日本传统音乐中的地位也是非常高的,鼓乐甚至被认为是日本的国乐。虽然有人认为,日本的鼓是从中国传过去的,但并没有什么证据。昨天,在上海东方卫视的《全家都来赛》,一个来自台湾的家庭乐队“太鼓达人”演奏了一段鼓乐,无论是从乐队的名字,还是击鼓的手法,甚至连演出时的衣着,一看便知,他们表演的,不是中国鼓乐,而是日本的“太鼓”。(经常玩游戏应该知道“太鼓达人”。)

然而,这段鼓乐表演却因为现场嘉宾和主持人的爱国情绪再加上本来就有点无知而被误解了。在那个台湾家庭表演结束后,有成员介绍了自己当年去日本学鼓的经历,其中有一句说,最初学习的时候那些日本的同学都看不起我。按说他的介绍已经提示了在场的嘉宾和观众,他学的是日本鼓,可也许是那句话太刺激人了,嘉宾们便开始了少见的莫名其妙的点评。先是一位舞蹈家,说中国的历史有多长,鼓的历史有多长,你们演奏出了中国鼓文化的精髓,而后是一位好男,一脸正气地对表演者说道,我劝你还是回到中国好。当中,主持人还让表演者蒙住眼睛打了一会鼓,说,你打出了中国人的自信。最后,连表演者的母亲似乎也被感染了,热泪盈眶话语哽咽地说了一通,我们华人太鼓如何如何之类的话。全场掌声雷动,结果,那个代表香港的全家着戏装唱广东歌演神雕侠侣的家庭输了。

整个过程看得我目瞪口呆。很荒唐,很悲哀。

 

18:56 纪念诺曼•洛克威尔诞辰 116 周年 (891 Bytes) » Google 黑板报 -- Google 中国的博客网志
    


今天是美国画家诺曼•洛克威尔(Norman Rockwell,1894-1978)诞辰116周年纪念日。洛克威尔是美国20世界早期的重要画家,他的作品记录了20世纪美国的发展与变迁。点击了解更多有关诺曼•洛克威尔
12:56 如何确定被多次truncate后的data object id (18536 Bytes) » Focus on Oracle

今天上午我一个同事误truncate了一个表uplbth,她问我是否可以恢复?

我们先去看一下这个表现在的状况:

SQL> select owner,object_name,object_id,data_object_id from dba_objects where object_name='UPLBTH';

 

OWNER                        OBJECT_NAME      OBJECT_ID DATA_OBJECT_ID

------------------------------ --------------- ---------- --------------

CAIPRA                         UPLBTH               52210          95137

从结果里我们可以看到,这个表的data object id已经比其object id大了太多,极有可能是曾经被多次truncate

后来我问了一下她是否多次truncate过这个表,她说是。然后我对她说,你等我信儿吧。

 

熊哥曾经在"使用ODU恢复Truncate"这篇文章里提到了如何确定被多次truncate后的data object id,我这里用另外一种方式来精确定位我要恢复的data object id

 

利用的原理就是:oracle里有system回滚段,而oracle对数据字典的操作基本上是DML,既然是DML,那就好办了,我们有很大的概率可以成功执行flashback query

 

回到刚才的例子,我首先从dba_objects里知道了uplbthlast_ddl_time2010-2-3 10:18:57;接着,我们直接执行flashback query来确定在执行truncate操作的那个时间点之前uplbthdata object id

SQL> select  owner,object_name,object_id,data_object_id from dba_objects as of timestamp to_timestamp('2010-02-03 10:18:00','YYYY-MM-DD HH24:MI:SS') where object_name='UPLBTH';

 

OWNER                          OBJECT_NAME      OBJECT_ID DATA_OBJECT_ID

------------------------------ --------------- ---------- --------------

CAIPRA                         UPLBTH               52210          77675

 

可以看到,当时的data object id77675,精确的确定了data object id后,剩下的事情就都交给ODU好了:

ODU> unload table caipra.uplbth object 77675

 

Unloading table: UPLBTH,object ID: 52210

Unloading segment,storage(Obj#=52210 DataObj#=77675 TS#=16 File#=15 Block#=18828 Cluster=0)

1888 rows unloaded

 

可以看到,我们成功恢复出来了1880条数据。

注意,这里你用logmnr在缺省情况下是挖不出来data object id的,朋友们可以自己试一下。
12:31 PostgreSQL备份 (7322 Bytes) » NinGoo.net

Author:NinGoo posted on NinGoo.net

PostgreSQL也支持逻辑备库和物理备份两种方式。物理备份可以和Oracle一样实现联机热备份,并且同样也需要将数据库设置为归档模式。

逻辑备份

PostgreSQL提供了pg_dump/pg_dumpall两个程序可以用来将数据dump成文本文件,实现数据的逻辑备份。使用不同的参数,可以将数据dump成PostgreSQL专用的数据格式(生成copy语句)或者标准SQL语句(生成insert语句)格式。恢复只需要简单的使用psql将文件执行一遍即可。另外也可以使用pg_restore工具来恢复数据。

利用pg_dump备份test数据库(只有一张test表),包括重建表的DDL语句,授权语句等所有信息,生成copy格式的文件:

$ ./pg_dump test
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: test; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE test (
    i integer
);
ALTER TABLE public.test OWNER TO postgres;
--
-- Data for Name: test; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY test (i) FROM stdin;
1
2
\.
--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--
REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;
--
-- PostgreSQL database dump complete
--

利用pg_dump备份test库,只保存数据,insert语句格式:

[postgres@dbconsole bin]$ ./pg_dump --inserts -a test
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
--
-- Data for Name: test; Type: TABLE DATA; Schema: public; Owner: postgres
--
INSERT INTO test VALUES (1);
INSERT INTO test VALUES (2);
--
-- PostgreSQL database dump complete
--

物理备份

和Oracle一样,物理备份可以分为冷备份和热备份。冷备份就是将数据库实例关闭,然后直接复制data目录的所有文件,恢复时只需要将文件copy到data目录,无须利用日志(WAL–Write-Ahead Logging)进行恢复。而热备份,则需要利用日志将数据库恢复到一致状态,因此需要先将数据库置于归档模式。

PostgreSQL归档模式使用参数archive_mode控制,这是一个静态参数,修改postgresql.conf文件,加入如下参数,然后重启生效:

archive_mode = on
archive_command = 'cp "%p" /u01/postgresql/arch/"%f"'
archive_timeout = 600
postgres=# show archive_mode;
 archive_mode
--------------
 on
(1 row)

由于postgresql没有归档进程,因此归档是通过外部命令(OS)完成的,archive_command用于指定该外部命令,具体格式请参考文档。如果是linux归档到本地,使用cp即可,如果是到远程,则可以使用scp或者rsync。archive_timeout强制N秒以后进行一次归档,这个和Oracle的archive_lag_target参数的作用一样。当然也可以手工进行日志切换:

postgres=# select pg_switch_xlog();
 pg_switch_xlog
----------------
 0/7000000
(1 row)

热备份前,需要先将数据库置于备份状态,这一点和Oracle的手工也备份也是一样的。该命令会导致一次checkpoint,可能在业务高峰期会带来一些压力和风险,因此备份还是需要安排在业务低谷期间执行比较稳妥。

postgres=# select pg_start_backup('test_backup');
 pg_start_backup
-----------------
 0/8000020
(1 row)

然后在os层面将data目录进行复制备份。完成后,再取消备份状态,该命令同时会执行一次日志切换,并进行归档,以保证热备份期间的日志都已经归档,保证恢复数据库到一致状态的所有日志都能从归档中找到:

postgres=# select pg_stop_backup();
 pg_stop_backup
----------------
 0/8000088
(1 row)

备份完成后,可以在归档目录找到一个记录了本次备份信息的文件:

$ more 000000010000000000000008.00000020.backup
START WAL LOCATION: 0/8000020 (file 000000010000000000000008)
STOP WAL LOCATION: 0/8000088 (file 000000010000000000000008)
CHECKPOINT LOCATION: 0/8000020
START TIME: 2010-02-03 12:24:57 CST
LABEL: test_backup
STOP TIME: 2010-02-03 12:24:59 CST

PostgreSQL官方并没有提供和Oracle的rman一样的备份工具,不过因为PostgreSQL是开源的数据库,因此也有一个开源的工具pg_rman可以使用,从命令行来看功能已经非常强大,暂时还没有测试,有兴趣的可以研究一下。

pg_rman [ OPTIONS ] { init | backup | restore | show [ DATE | timeline ] |
 validate [ DATE ] | delete DATE }

Related Articles

PermLink: http://www.ningoo.net/html/2010/postgresql_backup.html

Add Comments(0) | Follow NinGoo@Twitter | Google Reader

10:32 详解MyISAM Key Cache(后篇) (1584 Bytes) » DBA@Taobao
p { text-indent:28px; } 在前两篇(前篇、中篇)中,分别介绍了Key Cache的基本原理(LRU和Midpoint Insertion Strategy)。最后,将介绍一些相关的参数、状态参数和命令。 Key Cache的配置很灵活,可以针对全局配置,还可以针对某个单独数据表分配Key Cache的大小;如果一个数据表某部分的索引块被访问的非常频繁(较之其他索引块),那么可以配置Midpoint Insertion Strategy达到最大的利用率(参考)。 1. 如何配置Key Cache的大小 #配置文件my.cnf key_buffer_size=50*1024*1024 另外,Key Cache的大小可以动态的改变 2. 给数据表划分单独的Key Cache 例如:划分一块128K的Key buffer空间,指定数据表t1的Key cache放在里面。最后演示了如何删除这个特定的Key buffer空间。 SET GLOBAL hot_cache.key_buffer_size=128*1024; CACHE INDEX t1 IN hot_cache; SET GLOBAL hot_cache.key_buffer_size=0; 3. 预先载入某些数据表的索引 LOAD INDEX INTO CACHE t1, t2 4. 关于Key Cache的使用情况观察 Flush现象 mysql> show status like "key%"; +------------------------+----------+ | Variable_name ...

10:32 详解MyISAM Key Cache(前篇) (2762 Bytes) » DBA@Taobao
p { text-indent:28px; } 本文将分为前、中、后三篇,分别介绍MyISAM Key Cache的一般机制、Mid-point strategy、状态、参数和命令。 “Cache为王”,无所不在。为了最小化磁盘I/O,MyISAM将最频繁访问的索引块(“index block”)都放在内存中,这样的内存缓冲区我们称之为Key Cache,它的大小可以通过参数key_buffer_size来控制。在MyISAM的索引文件中(MYI),连续的单元(contiguous unit)组成一个Block,Index block的大小等于该BTree索引节点的大小。Key Cache就是以Block为单位的。 1. MyISAM如何使用Key Cache 当MySQL请求(读或写)MyISAM索引文件中某个Index Block时,首先会看Key Cache队列中是否已经缓存了对应block。如果有,就直接在Key Cache队列中进行读写了,不再需要请求磁盘。如果是写请求,那么Key Cache中的对应Block就会被标记为Dirty(和磁盘不一致)。在MyISAM在Key Cache成功请求(读写)某个Block后,会将该Block放到Key Cache队列的头部。 如果Key Cache中没有待请求(读或写)的Block,MyISAM会向磁盘请求对应的Block,并将其放到Key Cache的队列头部。队列如果满了,会将队列尾部的Block删除,该Block如果是Dirty的,会将其Flush到磁盘上。我们看到MyISAM维护了一个LRU(Least Recently Used)的Key Cache队列。队列中的Dirty Block会在Block被踢出队列时Flush到磁盘上。 2. 图解 下图展示了访问Index Block的过程:(黑色部分为磁盘中的Index文件) 3. 并发访问 Key Cache中的index Block是可以被并发访问的(Shared access ),下面是一些规则: 多个没有更新操作的session可以并发同一个block buffer 多个session同时访问某一个block buffer,如果某个session是update操作,则优先访问 多个session如果都需要进行block replacement,是可以并发操作。(从index file中读取block更新到key cache,但是key cache已满,需要删除一些block buffer的操作叫做block replacement)   4. 补充说明 Key cache中的Block大小可能和索引文件中的Index Block大小不同,可能是大于、小于、等于中的任何一种,但是一般都是成倍数关系的。Key Cache的block大小由参数Key_cache_block_size控制。 (未完待续)

10:32 详解MyISAM Key Cache(中篇) (2656 Bytes) » DBA@Taobao
p { text-indent:28px; } 在前篇中介绍了Key Cache的基本机制,并且介绍了Key Cache的LRU算法。作为对LRU算法的改进,MyISAM还提供了另一个缓存算法:“Midpoint Insertion Strategy”。本文将重点介绍该算法的原理和配置。 1. 相关参数 该策略涉及的参数有:key_cache_division_limit、key_cache_age_threshold 2. 原理介绍 (1) 该策略将前面的LRU队列(LRU Chain)分成两部分,hot sub-chain和warm sub-chain。并根据参数key_cache_division_limit划分,总保持warm sub-chain在这个百分比以上。默认情况key_cache_division_limit是100,所以默认时候只有warm sub-chain,即LRU Chain。 (注:Multiple Key cache情况,每个key cache都有对应的key_cache_division_limit值) (2) 在warm sub-chain中的某个block如果被访问(Access)次数超过某个值时候,就将该block放到hot sub-chain的底部。 (3) 在hot sub-chain中的block会随着每一次的hit调整位置,hit越多,越接近底部。在顶部停留时间过长就会被降级到warm sub-chain中,而且是warm sub-chain的顶部(很可能很快就会被移出key cache)。 (4) Hot sub-chain中的顶部的block停留时间超过一个阈值后就会被降级到warm sub-chain。这个阈值由参数key_cache_age_threshold决定。具体的计算方法是:设N为key cache中的block个数,如果在最近的(N*key_cache_age_threshold/100)次访问中,key cache顶部的block仍然没有被访问到,那么就会被移到warm sub-chain的顶部。 (5) 默认情况key_cache_division_limit = 100,这时只有只有一个Chain,所以不使用该策略。即退化的Midpoint Insertion Strategy是LRU算法。 3. 如何使用Midpoint Insertion Strategy 我们可以通过配置key_cache_division_limit、key_cache_age_threshold的值来控制。参数key_cache_division_limit控制了Key Cache Chain中warm sub-chain的百分比,如果你的Index Block中明显有30%是非常Hot(较之其他的Block更加被常常访问),那么你可以设置你的warm sub-chain长度为70%,剩余30%作为hot sub-chain。参数key_cache_age_threshold定义了warm sub-chain中的block被移除的机制(参照前文介绍)。 (未完待续)

10:32 淘宝网2010年校园招聘启航 (2782 Bytes) » DBA@Taobao
最近收到不少应届生朋友的咨询,也有不少心急的简历发到了我的邮箱。今天从HR得到消息,淘宝网2010年校园招聘马上要开始了,招聘网站已经正式对外开放。有意向应聘淘宝网的应届生,可以通过此网站关注招聘的职位等信息。简历也请通过该平台递交即可。 淘宝网2010年校园招聘,点此进入。 同时全国各大学宣讲时间也已经确定,第一场将于9.21从浙江大学开始。具体时间安排如下: 浙江大学 2009-9-21 浙大永谦学生活动中心小剧场 18:00--21:30 西安交通大学 2009-9-25 西交大就业中心一楼大厅 18:00--20:30 西北工业大学 2009-9-26 长安校区教学西楼A100(新校区大报告厅) 9:00--12:00 南京大学 2009-9-25 南大科技馆一楼报告厅 18:00--20:30 东南大学 2009-9-26 教学楼1#楼211或311 9:00--12:00 上海交通大学 2009-10-10 闵行区陈瑞球楼报告厅 18:00--20:30 清华大学 2009-10-10 待定 14:00--17:00 北京邮电大学 2009-10-12 教3楼339 9:00--12:00 中国科技大学 2009-10-13 西区学生活动中心学术报告厅 14:00--17:00 大连理工大学 2009-10-19 研究生教育大楼报告厅 14:00--17:00 四川大学 2009-10-19 老校区-就业中心201 15:00--18:00 电子科技大学 2009-10-20 清水河学生活动中心2楼圆厅 9:00--12:00 东北大学 2009-10-23 学生活动中心大厅 14:00--17:00 华南理工大学 2009-10-26 南校区A4-204报告厅 14:00--17:00 中山大学 2009-10-27 南校区熊德龙2楼报告厅 9:00--12:00 武汉大学 2009-10-26 人文馆主厅 14:00--17:00 华中科技大学 2009-10-27 大学生活动中心305教室 9:00--12:00 哈尔滨工业大学 2009-10-27 待定 14:00--17:00 复旦大学 待定 待定 14:00--17:00 杭州电子科技大学 2009-11-3 待定 待定 浙江工业大学 2009-11-10 待定 待定

10:32 如何配置MySQL SemiSyncReplication (1751 Bytes) » DBA@Taobao
SemiSyncReplication是Google提供的一个MySQL patch,作用在于保证至少有一个slave完成了数据同步。 安装的过程很简单,但是要找对路。这里提供一个传送门,看完就会编译安装了: http://www.realzyy.com/?p=178 SemiSyncReplication需要的MySQL源码包为mysql-5.0.37.tar.gz;需要的patch为mysql-5.0.37_semisync.patch。其他的patch可以不打,但是如果选择mysql-5.0.37-patches来打补丁的话,那么记得要再打上http://www.realzyy.com/?p=178最后提到的那个小补丁。 配置也很简单,主要是三个参数: master: rpl_semi_sync_enabled = 1 #configures a master to use semi-sync replication. rpl_semi_sync_timeout = 10000000 #the timeout in milliseconds for the master. slave: rpl_semi_sync_slave_enabled = 1 #configures a slave to use semi-sync replication. The IO thread must be restarted for this to take effect. 要特别注意rpl_semi_sync_timeout这个参数,官网推荐的设置10太短了。我测试了一下,将slave上的replication线程停掉,master上面执行更新操作并不会出现明显的block现象。如果想让master和slave时时刻刻保证一致,那么rpl_semi_sync_timeout就需要设置得很大,至少在DBA能察觉异常之前,不允许master单方面进行更新操作。

10:32 又一个核心系统改造取得阶段性成果 (2007 Bytes) » DBA@Taobao
从淘宝诞生的第一天起,XX系统就一直存在着,它是电子商务体系的重要组成部份。随着淘宝交易量的上涨,XX系统数据量暴涨,访问量也直接上升。数据库层面主要体现两方面的问题:第一、单表的数据量巨大,表与索引占的存储空间达到T级;第二、数据库存储IOPS高。 为了解决以上问题,我们启动了XX系统改造项目,这次系统改造会进行数据的水平拆分,改造的难点在于,这是一张典型的多维度表,如何拆?下面是一些目标: 新架构是一个可扩展的架构,并且易于理解 新的数据底层架构要较好的满足现有的上层的业务需求 数据迁移要比较容易的迁移到新的数据表内 底层架构变动对上层业务代码的影响要小,分布式数据层TDDL需要对上层屏蔽底层数据存储的复杂度 新的底层架构要减少对数据的历史迁移,数据仓库ETL的影响 设计方案出来后,由于较好的回答以上提到的各方面的问题,得到了开发,架构,公司管理层的支持,我们就着手开始改造项目了。 经过一个多月的项目开发,测试,前天XX系统改造项目一期正式发布,整个发布的过程比较顺利,数据库内拆表完成,加上其它的一些优化改进,数据库系统各项指标大幅下降,取得了不错的阶段性成果。下面附上几张性能变化图: 数据库物理读指标直接下降了50%,这个主要得受益于表,索引的减小与重构,字段的优化 ...

10:32 Oracle索引abc (1682 Bytes) » DBA@Taobao
在这篇文章里,给大家简单介绍一下本人对Oracle索引的理解,如有不妥的地方,请不吝指教。 本文只讲最最平常最最简单的索引,就是以create index ix on tx(a,b,c);形式创建的索引,而不讲位图索引、反向键索引、倒序索引、基于函数的索引等等。其实呢,只要是基于B树的索引,不管是在Oracle, Mysql,还是其它数据库中,原理应当都是一样的。 索引最重要的一个性质应该就是有序,索引中的每一项,是从左到右,从小到大,以严格的顺序排列好的。 下面的讨论都以上面的索引ix(a,b,c)为例。 把这棵索引的叶子节点画到纸上,大概是这样的: a1 a2 a3 ...... an b1 b2 b3 ...... bn c1 c2 c3 ...... cn 上面这个3×n的矩阵,每一列代表了一条记录,同时这一列记录,也对应了表里的唯一一条记录。当然,在Oracle里,对于non-unique索引,需要补上rowid,才是真正唯一的。上面的索引相当于create unique index ix on tx(a,b,c,rowid); 我们把这个细节忽略掉。 把每一列看作一个向量,vi = (ai, bi, ci), 有序的含义就是: vi < vj iff i < j; vi < vj这么定义: (ai < aj) or (ai = aj and bi < bj) or (ai = aj ...

10:32 LVS & MySQL NDB Cluster (2262 Bytes) » DBA@Taobao
章文嵩博士(LVS开源项目创始人)进入淘宝好几个月了,今天是他第一次讲解LVS的实现原理。作为DBA的一员,终于近距离膜拜了大牛。 讲解的内容就不具体介绍了,在LVS官方网站上面可以找到。PPT的内容和网站上基本上一样,只是讲解人是章博士本人。我在这整理一下自己的理解,不对请大家指正。 ^_^ 组成LVS最重要的部分有三个:请求分发服务器、处理服务器、共享存储。 典型的Web集群并不需要共享存储,只有请求分发服务器和处理服务器,如下图所示: 如果完成请求需要基于数据,那么共享存储就是LVS必须的组件了。LVS邮件服务器集群如下所示: 目前能应用于LVS的MySQL集群只能是NDB Cluster,因为MySQL众多的存储引擎中,只有NDB Cluster实现了共享存储的功能。 在NDB Cluster中,SQL Node相当于处理服务器,Data Node相当于共享存储。LVS可以让应用程序的开发更加简单,开发人员并不需要知道执行SQL的数据库服务器到底是哪一个,但是可以获得自己想要的数据。而NDB Cluster提供的数据拆分和扩容功能,保证了数据库的可扩展性。 美中不足的是,NDB Cluster的性能实在太差。即使LVS负载均衡做得很好很强大,NDB Cluster也会成为瓶颈。 根据我的观察发现,LVS的架构非常适用于CPU-bound的应用场景。虽然共享存储的引入使得LVS能够支持有状态的连接,但是LVS并不适用于IO-bound的应用。因为不管负载如何均衡,最终瓶颈在于共享存储之上。而共享存储如何拓展,LVS并不关心。也许只有NDB Cluster提升了IO性能之后,LVS才能真正在MySQL方面应用起来。 非常感谢章博士的分享,NDB Cluster终于让我觉得不那么鸡肋了。

10:32 InnoDB线程并发检查机制 (2794 Bytes) » DBA@Taobao
InnoDB在接受MySQL线程调用时,有一个并发线程的检查机制,通过innodb_thread_concurrency参数进行控制。如果参数设置大于0,则表示检查机制开启,允许进入的线程数就是参数的值。等于0则禁用并发检查。 在新的MySQL线程调用Innodb接口前,Innodb会检查已经接受的请求线程数,如已经超过innodb_thread_concurrency设置的限制,则该请求线程会等待innodb_thread_sleep_delay微秒后尝试重新请求,如果第二次请求还是无法获得,则该线程会进入线程队列休眠。重试两次的机制是为了减少CPU的上下文切换的次数,以降低CPU消耗,这和Oracle中latch的spin机制是同样的道理。如果请求被Innodb接受,则会获得一个次数为innodb_concurrency_tickets(默认500次)的通行证,在次数用完之前,该线程重新请求时无须再进行前面所说innodb_thread_concurrency的检查。 上述检查逻辑在源码storage/innobase/srv/srv0srv.c(Innodb很多参数都可以在该文件中找到定义)的srv_conc_enter_innodb函数中,有兴趣的可以仔细阅读一下,代码比较浅显,不难理解。另外,如果是一个已经持有lock的线程,则通过调用srv_conc_force_enter_innodb函数可以无视该检查,这是为了避免线程长时间持有锁影响性能,且可能增加死锁的机率。除此之外,slave线程也是有无视检查直接通行的权限。 简单思考一下上述机制,可以得出一个初步的推论:在数据库并发请求较小的情况下,从性能上来说禁用检查机制应该是更好的,毕竟执行检查机制本身也需要加锁(Mutex)。当并发线程很高的情况下,则开启检查机制对性能更有利。至于具体innodb_thread_concurrency设置为多少,可能就需要在不同的条件下实际的做一下测试了,不同的硬件环境,不同的MySQL版本和Innodb版本,应该都会有一些区别。 源代码中对于innodb_thread_concurrency参数的注释如下: /* The following controls how many threads we let inside InnoDB concurrently: threads waiting for locks are not counted into the number because otherwise we could get a deadlock. MySQL creates a thread for each user session, and semaphore contention and convoy problems can occur withput this restriction. Value 10 should be good if ...

10:32 DML中where子句的rownum锁问题 (1064 Bytes) » DBA@Taobao
开发DBA周会中,丁原提出的问题: DML语句中where子句中添加rownum alter session set nls_language=american; SQL> create table test as select 1 as id from dba_objects where rownum < 10; n  把表中的数据块dump出来 SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) as file#,   2                  dbms_rowid.rowid_block_number(rowid) as block#   3    from test;        FILE#     BLOCK# ---------- ----------          4        988   SQL> alter system dump datafile 4 block 988; System altered. n  查看trace文件,其中的部分数据如下: Block header dump:  ...

08:58 止痛片和阿司匹林的副作用 (727 Bytes) » Julia----瞬间与记忆在此过渡。。。。。。
 
前晚凌晨两点剧烈地饿醒,起来吃炒蘑菇;五点再次剧烈地饥饿,起来做饭吃;
 
吃完饭后就确认不是饿,是痛,很想很想吐,又懒得吐,只好死忍,拿了盖小咪的水勺放在枕头边上,准备了半天才睡着了。
 
第二天上班的路上胃痛的我两眼发黑,不堪回首是怎样挪回公司的。
 
昨晚凌晨两点又如此,起床煮鸡蛋吃,吃完就开始更难受,一直躺到快天亮...此刻好困好困。
 
真是治好这里伤那里,锻炼身体是关键,这周末一定要去健身房!
 
 
03:02 芝麻开门,河蟹关门 (258 Bytes) » 我呸
表哥新博客:
http://www.buxulianxiang.com/

翻鸟一嘴
到底虾米素河蟹之源?
“陈晓卿”还素“土摩托”?
...

  2010-02-02 Tue

17:02 处理 » 我呸
12:49 THE RECORD IN THE OCM LIST » OracleDBA Blog---三少个人涂鸦地!
10:12 招聘中级ORACLE DBA ,工作地点杭州 » OracleDBA Blog---三少个人涂鸦地!
10:02 早说嘛 » 我呸
00:02 听取专家意见 » 我呸

  2010-02-01 Mon

23:27 瑜伽--慢慢进步 » Julia----瞬间与记忆在此过渡。。。。。。
22:29 Oracle Exadata 技术浅析 » DBA notes
20:59 “谷歌春运地图”重装上阵,回家过年更方便! » Google 黑板报 -- Google 中国的博客网志
17:27 美满的周末,如果不是生病的话 » Julia----瞬间与记忆在此过渡。。。。。。
16:57 Oracle 8i/9i中的执行计划稳定性 » Alibaba DBA Team

  2010-01-31 Sun