| 个人资料zhanjie的共享空间照片日志列表 | 帮助 |
|
7月24日 ACCESS导入到ORACLE 昨天去甲方导数据,去之前居然没人知道要导什么,内容是什么,去了一看,ACCESS库,240W条数据,文件有740M, ◆最初建立ODBC,直接用ACCESS 导入到ORACLE。但由于字符集的问题(UTF8)导致导入失败,因为UTF8用3字节存放汉字,而导库过程是由ACCESS按自己的定义自动建立ORACLE表的,如果事先在ORACLE里建立表,然后导入会得到对象已存在的错误。为解决此问题,想在ACCESS中修改字段长度,但是由于数据量过大,导致WIN OS报内存或磁盘空间满的问题,按WIN的提示去修改注册表及释放空间等,皆解决不了问题,而由于数据量较大,浪费了很多时间。 ◆采取第二种方案SQLLDR,用ACCESS打开,然后保存成TXT文件,以逗号分割。打包压缩,FTP到服务器上,运行SQLLDR,结果报如下错误: Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Segmentation fault(coredump)
从头狼处得到解释, fact: Oracle Server - Enterprise Edition 9.2 fact: SQL*Loader fact: AIX-Based Systems symptom: Segmentation Fault (coredump)
symptom: Log file is not written symptom: Stack trace: waitpid sntpreap sslsshandler thread_tsleep
symptom: SQL*Loader fails at the end of load cause: Operating System defect fix:
1. Install the following
fixes specific to AIX version:
a. AIX 4.3.3: IY30151,IY30927 b. AIX 5.1(5L): IY30150 2. and relink SQL*Loader
executable:
a. $ cd $ORACLE_HOME/rdbms b b. $ make -f ins_rdbms.mk isqlldr 由于权属问题,不好对OS操作,所以这个方法也放弃。 ◆采用第三个方案,建立一个ZHS16GBK的数据库,先将ACCESS的数据到入到这个中间库中,然后修改字段长度,再导入到正式库中,成功。实际这个方案早在考虑当中,只是我的本子有两个库都是UTF8的,最后痛下决心,删了一个库,然后建立ZHS16GBK的数据库。 SELECT FOR UPDATE 相关的知识 单位里最大连接数很低,但由于历史原因,居然每个dml操作前都要SELECT FOR UPDATE一下,因此会造成LOCK的问题,写此文仅给一些常用FOR UPDATE的人。
statement: 一个SQL语句。
session: 一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。
transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。
LOCK的基本情况
update, insert ,delete, select ... for update会LOCK相应的ROW 。
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会RELEASE。
SELECT.... FOR UPDATE [OF cols] [NOWAIT];
OF cols
SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];
前面的FOR UPDATE就不说了,讲下OF
transaction A运行
select a.object_name,a.object_id from wwm2 a,wwm3 b
2 where b.status='VALID' and a.object_id=b.object_id 3* for update of a.status 则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.
反一下看看
transaction A运行
select a.object_name,a.object_id from wwm2 a,wwm3 b
2 where b.status='VALID' and a.object_id=b.object_id 3* for update of b.status 则transaction B可以对a表wwm2的相应行进行DML操作,但不能对b表wwm3相应行进行DML操作.
也就是说LOCK的还是行,只是如果不加OF的话会对所有涉及的表LOCK的,加了OF后只会LOCK OF 字句所在的TABLE.
NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified"
另外如下用法也值得推荐,应该酌情考虑使用。
FOR UPDATE WAIT 5
5秒后会提示ORA-30006: resource busy; acquire with WAIT timeout expired
FOR UPDATE NOWAIT SKIP LOCKED; 会提示no rows selected
TABLE LOCKS
LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];
同样也是在transaction结束时才会释放lock。
DEADLOCK
transaction a lock rowA , then transaction b lock rowB
then transaction a tries to lock rowB, and transaction b tries to lock rowA
也就是说两个transaction都相互试图去lock对方已经lock的ROW,都在等待对方释放自己的lock,这样就使死锁。
deadlock也会有600提示。 CVS安装及权限分配2.安装过程
2.1 解压#tar xvf cvsnt-2.5.03.2151-rh9-rpm.tar.tar 2.2 包的安装rpm -ivh cvsnt-2.5.03.2151-1.i386.rpm 2.3 建立Repository目录groupadd cvs useradd -G cvs cvsroot mkdir /home/cvsroot chown -R cvsroot.cvs /home/cvsroot
/etc/xinetd.d/ cvspserver service cvspserver { disable = no socket_type = stream wait = no port =2401 user = root env = HOME = server = /usr/bin/cvs server_args = -f --allow -root=/home/cvshome pserver } 重起#service xinetd restart 使配置生效。 2.4 设置环境变量#vi .bash_profile 加入一行CVSROOT=:pserver:cvsroot@192.168.1.29:/home/cvsroot *pserver是访问方式,口令认证的意思,这是最常用的方式,其他还有gserver,kserver,ext 你可以把设置放到你的shell的profile里(.bash_profile,.profile等)这样就不用每次敲一长串命令了 2.5 验证配置成功#cvs login,输入密码看时候能成功登录 2.6 初始化repositorycvs -d /home/cvsroot init 2.7 CVS使用流程
|
|
userpro7mo |
R |
w |
|
Test1 |
Y |
Y |
|
Test2 |
Y |
Y |
|
Test3 |
Y |
N |
|
cvsrootproj7 |
R |
w |
|
Test1 |
Y |
Y |
|
Test2 |
Y |
N |
|
Test3 |
N |
N |
CVS (Cuncurrent Versions System)是基于TCP/IP协议的版本控制工具。CVS是一个并行版本控制系统,它采用C/S模式,它的复杂度和功能性属于中等,是当今最流行的版本控制系统。它有两个基本的特点:
*保存修改记录:保存了所有文件的修改历史,并可以建立分支
*协作与并行:cvs不推荐使用lock-modify-unlock的串行的工作模式,而采用多人可以并行地修改同一个文件,而在提交时merge conflict;它更适合于大型的工作团体。
使用CVS的好处:
*文件集中管理,大家都可以方便的看到所有人员的最新文件,规范化了文件的管理
*可以查看以前任何的一个版本或修改历史
*可以同时维护多个版本和分支。
和在Windows 开发平台中拥有很大用户群的Visual Source Safe(VSS)相比,CVS主要由两个不同之处。
一是VSS依靠服务器上的一个共享目录提供服务,每一个client必须能够访问这个共享目录。这也就决定了source safe在TCP/IP环境下使用很困难。对于分布跨越数个城市甚至国家的工作小组来说,只有通过VPN才能够安全的访问source safe数据库。而CVS依靠TCP/IP连接提供服务,所以它天生就是为了在internet上协同工作而设计的。
二是CVS反对对文件上锁的机制。VSS以及其他很多传统版本控制工具要求一个文件只能有一个使用者,它必须先checkout声明编辑文件的独享权力,直到checkin为止。但是对于地理上不限制使用者位置的CVS来说,等待一个用户checkin是一件痛苦的事情,而互相沟通比一个紧密工作的团体更困难。CVS采取多个用户可以同时对一个文件进行编辑,然后commit的方式解决这个问题。假设由于沟通不足出现冲突,使用者必须手工解决冲突之后再进行commit。在这种情况下,冲突的开发者必须努力进行足够的沟通以避免再次冲突。
CVS服务器上,一个源代码仓库被称为一个repository,一个server上通常可以运行多个repository,每个repository都是完全独立的,可以有不同的用户列表和访问规则。在一个repository之下,文件按照module组织,每一个module就相当于一个工程,大致上相当于Source safe里面的project。
VSS在你连接上服务器之后,会列出所有的project。但并不是所有的CVS server都会提供module的列表。事实上,哪些module被公开是由管理员控制的。如果你知道一个被隐藏的module的名字,你仍然可以正常的访问这个module。
CVS依靠运行在服务器上的一个服务程序提供TCP/IP的连接。为了访问一个CVS数据库,你必须知道你所使用的协议,服务器的地址,服务器提供的Repository的名称以及你的用户名和密码。
有数种协议可供选择。Unix/Linux机器上的CVS通常使用pserver协议。除此之外,NT机器还支持ntserver协议,它通过主机的NT用户表进行访问控制(但是这是在internet上不可用的方法)。kserver和gserver协议用的比较少,他们依据Kerboses提供额外的安全保护。
你有必要知道CVSROOT这个参数。CVSROOT是一个用":"开始及分隔各个部分的字符串,它包含了协议、用户名、服务器地址和repository名称。对于用户来说,CVSROOT就像URL一样,是访问一个server的途径。
一个典型的CVSROOT=:pserver:cvsroot@192.168.1.29:/home/cvsroot。这里,pserver是协议名称,cvsroot是用户id,192.168.1.29是主机ip, /home/cvsroot是repository的名字。NT主机的repository一般会采取d:/CVSROOT之类的格式。
在windows下使用命令行方式,这个参数可以通过一个环境变量使用。在windows 2000/XP系统中,你可以通过在'My computer'的properties中选择advanced,然后选择'Enviroment Variables'来输入这个环境变量。
为了得到module下面的源代码,你只需要使用checkout指令。和Visual source safe不一样,checkout只是取得文件,而非锁文件。
如果你已经有了本地文件,为了和server保持同步,你需要进行update操作。update会自动把server上的新内容取到本机来,如果你本地文件进行过了改动,它会帮您做合并工作。
checkout 和 update既可以针对一个特定的文件,也可以针对一个目录或者整个module。
如果你对本地代码做了任何修改,或者增加一个文件,删除一个文件,每当你需要把你的改变提交到server上的时候,你就需要做commit动作。假设两个人都在本地修改了同一个文件,那么他们就像在进行一个竞赛,如果你快,那么你赢了。后commit的人将被server拒绝,不得不合并你的修改再次提交。
commit既可以针对一个特定的文件,也可以针对一个目录或者整个module。
Revision是指每一个文件的版本信息。当你第一次增加一个文件到repository的时候,它会有一个初始revision是1.1,以后每次提交,就会增加到1.2,1.3...
在一个branch中的文件,有相对于这个branch的版本号。如果你对文件作了tag,那么你会看到revision变成1.1.1.1的形式。具体的含义我们在branch和tag的时候描述。
Branch是一棵正常生长的代码树中的枝杈。开始的时候,任何一个module都有一个主枝被称为'HEAD'。
一个branch最终要么被合并到主干中去,要么被结束。branch通常用来debug,如果这个bug被fix了,修改bug的代码应该被合并到主枝上去。一个branch也可能经历多次与主枝的合并。
Tag用来进行标示必要的信息。当您进行一次公开发布之前,您有必要对主枝标示"release 1.0"。这样您以后就可以随时回到这个版本。
一次不让发那么多,只好分两次发了
需要设置两个基本点参数 :
WORKAREA_SIZE_POLICY=AUTO,默认就是AUTO,
PGA_AGGREGATE_TARGET总的PGA的大小
注意,9I的shared server连接需要明确设置SORT_AREA_SIZE 和 HASH_AREA_SIZE,也就是说不能用自动管理模式。10G则无此限制。
PGA_AGGREGATE_TARGET是一个上限(理论上的最大值,PL/SQL就很容易超过),ORACLE启动时并不分配那么多,你甚至可以设置大于物理MEM的大小(生产库不要这么做呀,要设置pga_aggregate_target+sga<MEM ,别挑战ORACLE的极限)。一个SESSION可能有多个sort,hash的workarea,每一个workarea最多会用到5%或100M(由两个隐藏参数控制),因此如果预计每个sort,hash的workarea是5M,应该设置PGA_AGGREGATE_TARGET成100M。但是,随着用户的增加或工作量的增大,给每个workarea的容量可能会减少,因为有总量PGA_AGGREGATE_TARGET的限制,比如需要100个workarea,那么每个只能分配到1M。parallel query会用到最多30%(由隐藏参数控制)的PGA_AGGREGATE_TARGET,每一个parallel query的PIECE会分配相应的30%,也就是parallel query可能会用到30M,10个PARALLEL,那么每个用3M。这也就是建议用auto管理的原因,一个系统通常workload,session是随时间变化的,早上可能3个用户,中午可能300个用户,所以用固定sort,hash的参数是不合时宜的.自动管理才可以实现在用户并发少的时候分配更多的内存,在并发多的时候照顾大众,分配少的内存。ORACLE 9.2以后有了PGA advisory
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
pga_aggregate_target big integer 105906176
SQL> show parameter workarea
NAME TYPE VALUE
------------------------------------ ---------------------- ----------
workarea_size_policy string AUTO
1 select name||' '||
2 to_char(decode( unit,
3 'bytes', value/1024/1024,
4 value ),'999,999,999.9')||' '||
5 decode( unit, 'bytes', 'mbytes', unit )
6* from v$pgastat
SQL> /
NAME||''||TO_CHAR(DECODE(UNIT,'BYTES',VALUE/1024/1024,VALUE),'999,999,999.9')||''||DECODE(UNIT,'BYTE
----------------------------------------------------------------------------------------------------
aggregate PGA target parameter 101.0 mbytes
aggregate PGA auto target 74.1 mbytes
global memory bound 5.0 mbytes
total PGA inuse 22.0 mbytes
total PGA allocated 33.2 mbytes
maximum PGA allocated 33.4 mbytes
total freeable PGA memory .0 mbytes
PGA memory freed back to OS .0 mbytes
total PGA used for auto workareas 3.3 mbytes
maximum PGA used for auto workareas 4.8 mbytes
total PGA used for manual workareas .0 mbytes
maximum PGA used for manual workareas 3.6 mbytes
over allocation count .0
bytes processed 1,545.8 mbytes
extra bytes read/written 75.1 mbytes
cache hit percentage 95.4 percent
解释
aggregate PGA auto target 74.1 mbytes,可以使用的PGA,也就是说剩余的PGA
total PGA inuse 22.0 mbytes 现在使用的PGA
over allocation count .0 ORACLE分配的PGA超过pga_aggregate_target 的次数.这个参数可以判断pga_aggregate_target 是否设置的太小.
cache hit percentage 95.4 percent 自从instance启动后的PGA 命中率,如果所有的操作都在MEM中进行没有在TEMP里运行的话应该是100%.
另外还有一个很重要的试图来观察PGA的效率v$sql_workarea_histogram
pga_aggregate_target big integer 1236648591
1 SELECT
2 case when low_optimal_size < 1024*1024
3 then to_char(low_optimal_size/1024,'999999') ||
4 'kb <= PGA < ' ||
5 (HIGH_OPTIMAL_SIZE+1)/1024|| 'kb'
6 else to_char(low_optimal_size/1024/1024,'999999') ||
7 'mb <= PGA < ' ||
8 (high_optimal_size+1)/1024/1024|| 'mb'
9 end ||' '||
10 optimal_executions||' '||
11 onepass_executions||' '||
12 multipasses_executions
13 from v$sql_workarea_histogram
14 where total_executions <> 0
15* order by low_optimal_size
SQL> /
CASEWHENLOW_OPTIMAL_SIZE<1024*1024THENTO_CHAR(LOW_OPTIMAL_SIZE/1024,'999999')||'
--------------------------------------------------------------------------------
16kb <= PGA < 32kb 53646550 0 0
32kb <= PGA < 64kb 26062 0 0
64kb <= PGA < 128kb 20361 0 0
128kb <= PGA < 256kb 893 0 0
256kb <= PGA < 512kb 941 0 0
512kb <= PGA < 1024kb 8331 0 0
1mb <= PGA < 2mb 1836 0 0
2mb <= PGA < 4mb 505 0 0
4mb <= PGA < 8mb 218 4 0
8mb <= PGA < 16mb 294 8 0
16mb <= PGA < 32mb 261 16 0
CASEWHENLOW_OPTIMAL_SIZE<1024*1024THENTO_CHAR(LOW_OPTIMAL_SIZE/1024,'999999')||'
--------------------------------------------------------------------------------
32mb <= PGA < 64mb 51 8 0
64mb <= PGA < 128mb 5 6 2
128mb <= PGA < 256mb 0 6 52
256mb <= PGA < 512mb 0 24 59
512mb <= PGA < 1024mb 1 2 0
按PGA 的workarea去分析. 32mb <= PGA < 64mb 51 8 0 表示workarea在32m-64m 之间的在内存里运行的有51次,8次需要用到一次disk,0次多次用到disk.
128mb <= PGA < 256mb 0 6 52,为什么不用MEM而用DISK呢,因为每一个PGA PIECE最多只能是PGA_AGGREGATE的5%(估计),所以大于这部分的就只能用DISK了.
v$pga_target_advice
1 select
2 trunc(pga_target_for_estimate/1024/1024)
3 pga_target_for_estimate,
4 to_char(pga_target_factor * 100,'999.9') ||'%'
5 pga_target_factor,
6 trunc(bytes_processed/1024/1024) bytes_processed,
7 trunc(estd_extra_bytes_rw/1024/1024) estd_extra_bytes_rw,
8 to_char(estd_pga_cache_hit_percentage,'999') || '%'
9 estd_pga_cache_hit_percentage,
10 estd_overalloc_count
11* from v$pga_target_advice
SQL> /
PGA_TARGET_FOR_ESTIMATE PGA_TARGET_FAC BYTES_PROCESSED ESTD_EXTRA_BYTES_RW
----------------------- -------------- --------------- -------------------
ESTD_PGA_C ESTD_OVERALLOC_COUNT
---------- --------------------
147 12.5% 1074286 211218 84% 44
294 25.0% 1074286 180162 86% 0
589 50.0% 1074286 170085 86% 0
884 75.0% 1074286 168992 86% 0
1179 100.0% 1074286 167579 87% 0
1415 120.0% 1074286 51551 95% 0
1651 140.0% 1074286 51551 95% 0
1886 160.0% 1074286 51380 95% 0
2122 180.0% 1074286 51186 95% 0
2358 200.0% 1074286 51186 95% 0
3538 300.0% 1074286 51186 95% 0
4717 400.0% 1074286 51186 95% 0
7076 600.0% 1074286 51186 95% 0
9434 800.0% 1074286 51186 95% 0
可以看到统计数据表现这个库有很大的问题.现在是1179M, estd_pga_cache_hit_percentage=87%,即便将PGA_TARGET扩大到8倍命中率还是不高95%.(会在以后的文章里修改次问题的)
当你重新设置pga_aggregate_target后这个view的数据会重新开始.
|
|