个人资料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,结果报如下错误:
SQL*Loader: Release 9.2.0.6.0 - Production on Wed Apr 26 16:31:29 2006

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
*user
CVS服务器的用户名,

*server
CVS服务器的名称或者IP地址

*/home/cvsroot
是你的CVS服务器的CVSROOT目录,根据你的CVS服务器设置做修改或者询问管理员

你可以把设置放到你的shellprofile里(.bash_profile.profile等)这样就不用每次敲一长串命令了

2.5        验证配置成功 

#cvs login,输入密码看时候能成功登录

2.6        初始化repository

cvs    -d /home/cvsroot init

2.7          CVS使用流程
   a checkout 尽当本地没有working copy时使用
   b staus
检查服务器上是否有新版本
   c update
如果有,则用update同步文件
   d 
做你自己的修改,并保证正确
   e update
看是否有人修改了你的文件
   f 
如果有冲突,合并冲突
   g commit
提交你的修改,如果因为又有人提交修改而失败,回到e
   h 
回到b

3         管理内容

3.1        建立REPOSITORY

Su – cvsroot

cvs -d /opt/cvsroot/project1 init

3.2        建立MODEL

Su - cvsroot

cvs -d /opt/cvsroot/project1 import wwm3model vendor_version release_100 

会在project1下建立wwm3model,并且将运行cvs –d的目录内的所有内容作为model的内容。vendor_version release_100是相应的版本

3.3        CHECK OUT

Su – vcsroot

Cvs –d /opt/cvsroot/project1 checkout wwm3model

3.4        权限设置

权限方面可以脱离OS用户权限而独立存在,可以按PROJECT来区分不同用户读写权限

得到密码

cvspasswd yourpass

REPOSITORY下有三个文件(初始并没有这三个文件,需要自己建立)

Passwd ,readers, writers

Passwd 密码文件,内容形如:

info1:zb720xIK.Cmcs:cvsroot

qwer:nxqg.qgAKcMZg:cvsroot

owner:nxqg.qgAKcMZg:cvsroot

wwm5:pUCT2qT6E334U:cvsroot

第一列是要分配给使用者的用户名,第二列是通过cvspasswd加密的密码,第三列是OS CVS用户

       Readers只读用户文件,内容如下:

              info1

qwer

owner

readers文件结构和writers一样,都是由用户名组成的单列,在这里的用户有读的权限

       writers可写用户文件,内容如下

              wwm5

              writers文件结构和readers一样,都是由用户名组成的单列,在这里的用户有读写的权限

3.5        权限深入,按MODULE区分

[root@cvshost CVSROOT]# vi passwd

 

test1:HH9dq1sQ.9TPQ:cvsroot

test2:HH9dq1sQ.9TPQ:userpro7

test3:HH9dq1sQ.9TPQ:news

userpro7cvsroot同组注意,这次没有做readerswriters两文件

[cvsroot@cvshost cvsroot]$ ls -alt /opt/cvsroot/          --repositoryOS权限

drwxr-xr-x  5 cvsroot cvsroot 4096  4? 5 16:33 project7

[cvsroot@cvshost project7]$ ls -alt /opt/cvsroot/project7    ---moduleOS权限

drwxrwxr-x  3 cvsroot cvsroot 4096  4? 5 17:05 userpro7mo

dr-xr-xr-x  4 cvsroot cvsroot 4096  4? 5 17:01 CVSROOT

drwxr-x---  7 cvsroot cvsroot 4096  4? 5 16:43 cvsrootproj7

 

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简介

1          CVS简介

1.1        定义与优点

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 safeTCP/IP环境下使用很困难。对于分布跨越数个城市甚至国家的工作小组来说,只有通过VPN才能够安全的访问source safe数据库。而CVS依靠TCP/IP连接提供服务,所以它天生就是为了在internet上协同工作而设计的。

二是CVS反对对文件上锁的机制。VSS以及其他很多传统版本控制工具要求一个文件只能有一个使用者,它必须先checkout声明编辑文件的独享权力,直到checkin为止。但是对于地理上不限制使用者位置的CVS来说,等待一个用户checkin是一件痛苦的事情,而互相沟通比一个紧密工作的团体更困难。CVS采取多个用户可以同时对一个文件进行编辑,然后commit的方式解决这个问题。假设由于沟通不足出现冲突,使用者必须手工解决冲突之后再进行commit。在这种情况下,冲突的开发者必须努力进行足够的沟通以避免再次冲突。

1.2        repository项目包,module

CVS服务器上,一个源代码仓库被称为一个repository,一个server上通常可以运行多个repository,每个repository都是完全独立的,可以有不同的用户列表和访问规则。在一个repository之下,文件按照module组织,每一个module就相当于一个工程,大致上相当于Source safe里面的project

VSS在你连接上服务器之后,会列出所有的project。但并不是所有的CVS server都会提供module的列表。事实上,哪些module被公开是由管理员控制的。如果你知道一个被隐藏的module的名字,你仍然可以正常的访问这个module

1.3        CVSROOT代码库

CVS依靠运行在服务器上的一个服务程序提供TCP/IP的连接。为了访问一个CVS数据库,你必须知道你所使用的协议,服务器的地址,服务器提供的Repository的名称以及你的用户名和密码。

有数种协议可供选择。Unix/Linux机器上的CVS通常使用pserver协议。除此之外,NT机器还支持ntserver协议,它通过主机的NT用户表进行访问控制(但是这是在internet上不可用的方法)。kservergserver协议用的比较少,他们依据Kerboses提供额外的安全保护。

你有必要知道CVSROOT这个参数。CVSROOT是一个用":"开始及分隔各个部分的字符串,它包含了协议、用户名、服务器地址和repository名称。对于用户来说,CVSROOT就像URL一样,是访问一个server的途径。

一个典型的CVSROOT=:pserver:cvsroot@192.168.1.29:/home/cvsroot。这里,pserver是协议名称,cvsroot是用户id192.168.1.29是主机ip, /home/cvsrootrepository的名字。NT主机的repository一般会采取d:/CVSROOT之类的格式。

windows下使用命令行方式,这个参数可以通过一个环境变量使用。在windows 2000/XP系统中,你可以通过在'My computer'properties中选择advanced,然后选择'Enviroment Variables'来输入这个环境变量。

1.4        checkout,update

为了得到module下面的源代码,你只需要使用checkout指令。和Visual source safe不一样,checkout只是取得文件,而非锁文件。

如果你已经有了本地文件,为了和server保持同步,你需要进行update操作。update会自动把server上的新内容取到本机来,如果你本地文件进行过了改动,它会帮您做合并工作。

checkout update既可以针对一个特定的文件,也可以针对一个目录或者整个module

1.5        commit

如果你对本地代码做了任何修改,或者增加一个文件,删除一个文件,每当你需要把你的改变提交到server上的时候,你就需要做commit动作。假设两个人都在本地修改了同一个文件,那么他们就像在进行一个竞赛,如果你快,那么你赢了。后commit的人将被server拒绝,不得不合并你的修改再次提交。

commit既可以针对一个特定的文件,也可以针对一个目录或者整个module

1.6        revision

Revision是指每一个文件的版本信息。当你第一次增加一个文件到repository的时候,它会有一个初始revision1.1,以后每次提交,就会增加到1.2,1.3...

在一个branch中的文件,有相对于这个branch的版本号。如果你对文件作了tag,那么你会看到revision变成1.1.1.1的形式。具体的含义我们在branchtag的时候描述。

1.7        branch

Branch是一棵正常生长的代码树中的枝杈。开始的时候,任何一个module都有一个主枝被称为'HEAD'

一个branch最终要么被合并到主干中去,要么被结束。branch通常用来debug,如果这个bugfix了,修改bug的代码应该被合并到主枝上去。一个branch也可能经历多次与主枝的合并。

1.8        tag

Tag用来进行标示必要的信息。当您进行一次公开发布之前,您有必要对主枝标示"release 1.0"。这样您以后就可以随时回到这个版本。

 

2       

一次不让发那么多,只好分两次发了

ORACLE 内存管理 之二 PGA v$pgastat

  • PGA 自动管理

           需要设置两个基本点参数 :

WORKAREA_SIZE_POLICY=AUTO,默认就是AUTO

PGA_AGGREGATE_TARGET总的PGA的大小

           注意,9Ishared server连接需要明确设置SORT_AREA_SIZE HASH_AREA_SIZE,也就是说不能用自动管理模式。10G则无此限制。

           PGA_AGGREGATE_TARGET是一个上限(理论上的最大值,PL/SQL就很容易超过),ORACLE启动时并不分配那么多,你甚至可以设置大于物理MEM的大小(生产库不要这么做呀,要设置pga_aggregate_target+sga<MEM ,别挑战ORACLE的极限)。一个SESSION可能有多个sort,hashworkarea,每一个workarea最多会用到5%100M(由两个隐藏参数控制),因此如果预计每个sort,hashworkarea5M,应该设置PGA_AGGREGATE_TARGET100M。但是,随着用户的增加或工作量的增大,给每个workarea的容量可能会减少,因为有总量PGA_AGGREGATE_TARGET的限制,比如需要100workarea,那么每个只能分配到1Mparallel query会用到最多30%(由隐藏参数控制)PGA_AGGREGATE_TARGET,每一个parallel queryPIECE会分配相应的30%,也就是parallel query可能会用到30M10PARALLEL,那么每个用3M。这也就是建议用auto管理的原因,一个系统通常workload,session是随时间变化的,早上可能3个用户,中午可能300个用户,所以用固定sort,hash的参数是不合时宜的.自动管理才可以实现在用户并发少的时候分配更多的内存,在并发多的时候照顾大众,分配少的内存。ORACLE 9.2以后有了PGA advisory

  • v$pgastat

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%.

ORACLE内存管理 之三 PGA v$sql_workarea_histogram v$pga_target_advice

 

另外还有一个很重要的试图来观察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 表示workarea32m-64m 之间的在内存里运行的有51,8次需要用到一次disk,0次多次用到disk.

128mb <= PGA < 256mb             0               6                52,为什么不用MEM而用DISK,因为每一个PGA PIECE最多只能是PGA_AGGREGATE5%(估计),所以大于这部分的就只能用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的数据会重新开始.