存档

‘Oracle’ 分类的存档,文章数:14

今天下午用手工写create database命令的方式创建了一个测试库demo,执行了catalog.sql,catproc.sql,pupbld.sql这三个脚本后,也用orapwd工具创建了密码文件:

orapwd file=e:\oracle\db_1\database\orapwdemo.ora password=db entries=10

因为那台机器上原本有一个oracle实例在跑,所以就没有改listener.ora文件的内容。

在测试库demo的本机上连接实例demo的时候,没有问题。

set oracle_sid=demo

sqlplus /nolog

conn / as sysdba

能够连上!

C:\Documents and Settings\Administrator>set oracle_sid=demo
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 8月 10 17:28:21 2010
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
SQL> conn / as sysdba
已连接。
SQL> show parameter db_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      demo

 

但是在远程电脑上,用system用户可以连接,用sys连接的时候报错:

SQL> conn sys/db@demo178 as sysdba
ERROR:
ORA-01031: insufficient privileges

解决办法:

下面的语法在oracle 10.2.0.1上面成功执行完成。在windows-xp和ubuntu上都成功创建了数据库实例。

CREATE DATABASE demo
  MAXDATAFILES 500
  MAXINSTANCES 10
  MAXLOGFILES 32
  NOARCHIVELOG
  DATAFILE
       'E:\ORACLE\ORADATA\DEMO\SYSTEM01.DBF'
       SIZE 300M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
  SYSAUX DATAFILE 'E:\ORACLE\ORADATA\DEMO\SYSAUX01.DBF'
       SIZE 300M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE 'E:\ORACLE\ORADATA\DEMO\TEMP01.DBF' SIZE 100M 
       AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  UNDO TABLESPACE "UNDOTBS1"
       DATAFILE 'E:\ORACLE\ORADATA\DEMO\UNDOTBS01.DBF' SIZE 200M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  DEFAULT TABLESPACE USERS
       DATAFILE 'E:\ORACLE\ORADATA\DEMO\USERS01.DBF' SIZE 100M 
  LOGFILE
  GROUP 1 ('E:\ORACLE\ORADATA\DEMO\REDO01.LOG') SIZE 50M,
  GROUP 2 ('E:\ORACLE\ORADATA\DEMO\REDO02.LOG') SIZE 50M,
  GROUP 3 ('E:\ORACLE\ORADATA\DEMO\REDO03.LOG') SIZE 50M
  CHARACTER SET ZHS16GBK
  NATIONAL CHARACTER SET AL16UTF16;

手工创建完数据库后,要执行创建数据字典的sql文件。

在sqlplus中执行:

sql> @$ORACLE_HOME/rdbms/admin/catalog.sql;

sql> @$ORACLE_HOME/rdbms/admin/catproc.sql

sql> @$ORACLE_HOME/sqlplus/admin/pupbld.sql;

生成密码文件

在目录$ORACLE_HOME/dbs下面必须有密码文件,才能使得远程用户以sys连接数据库。oracle10g中的密码文件名称格式为:pwd$oracle_sid.ora

用命令工具生成:

orapwd file=$ORACLE_HOME/dbs/pwd$ORACLE_SID.ora password=test123 entries=10

这样就在目录$ORACLE_HOME/dbs下面生成了密码文件:pwd$ORACLE_SID.ora,密码为:test123,允许最多10个用户以sys连接。

 

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字: oracle10g create database command line 命令行创建数据库

                              no-gui windows linux
————————————————————————————————————

 

手动创建数据库的时候报ORA-02778错误。ORA-02778: Name given for the log directory is invalid

原因是 :$ORACLE_BASE/admin/$ORACLE_SID里面的一些目录没有创建好,比如:bdump,cdump,pfile,udump

另外:oracle 10G的log_archive_format 参数不能随便改,否则会启动不了数据库.

会报以下错误:ORA-32004: obsolete and/or deprecated parameter(s) specified
ORA-19905: log_archive_format must contain %s, %t and %r

解决办法 :修改后以pfile方式进去,创建spfile.

创建表空间

create tablespace dultest datafile 'e:\oracle\oradata\orcl\dultest.dbf'
size 100m autoextend on next 100m maxsize unlimited
default storage(

                        initial 20M

                        next 20M

                        minextents 1

                        maxextents unlimited

                        pctincrease 0

);

表空间仅有一个数据文件,数据文件初始大小为100m,以后增长幅度为100m,不限制上限。表空间dultest内的对象的默认的空间分配信息为:对象初始大小为20m,后续空间增长幅度为20m。

 

通过系统视图查看表空间的信息:

SQL> set linesize 2000
SQL> col tablespace_name  format a16
SQL> col datafile_name format a40
SQL> select ts.ts#,ts.name tablespace_name,file#, df.name datafile_name,block_size,blocks,bytes,status,enabled
  2  from v$tablespace ts,v$datafile df
  3  where ts.ts# = df.ts# and ts.name='DULTEST';
       TS# TABLESPACE_NAME       FILE# DATAFILE_NAME                            BLOCK_SIZE     BLOCKS      BYTES STATUS  ENABLED
---------- ---------------- ---------- ---------------------------------------- ---------- ---------- ---------- ------- ----------
         8 DULTEST                   6 E:\ORACLE\ORADATA\ORCL\DULTEST.DBF             8192      25600  209715200 ONLINE  READ WRITE
SQL>

 

删除表空间及其表空间内所有的对象

drop tablespace dultest including contents and datafiles;

转自:http://space.itpub.net/?uid-7656893-action-viewspace-itemid-664954

第一步:计算整个Block Header的大小
  
    数据块头部所需要的空间大小由以下公式计算:
  
    Space after headers (hsize) = DB_BLOCK_SIZE - KCBH - UB4 - KTBBH - ((INITRANS - 1) * KTBIT) - KDBH
  
    其中的一些参数说明如下:
  
    DB_BLOCK_SIZE:数据库的block大小,可以查询V$PARAMETER视图中获得。
  
    KCBH、UB4、KTBBH、KTBIT、KDBH都是常量,这些定义的大小可以从V$TYPE_SIZE视图中获得。
  
    INITRANS是分配给表的初始化事务的数量,可以从USER_TABLES表中的INI_TRANS字段中获得。
  
    第二步:计算每个数据块可用的数据空间
   
    每个数据块为数据保留的空间是由PCTFREE参数所指定的,因此计算公式如下:
  
    Available data space (availspace) = CEIL(hsize * (1 - PCTFREE/100))
  
    – KDBT
  
    其中的一些参数说明如下:
  
    CEIL是取大于或者等于N的最小整数。
  
    PCTFREE是在表中预留出来用于UPDATE操作的空间,可以从USER_TABLES表中的PCT_FREE字段中获得。
  
    KDBT是常量,定义的大小可以从V$TYPE_SIZE视图中获得。如果你找不到KDBT的定义大小,用UB4定义的大小代替也可以。
  
    第三步:计算每行所用的空间大小
   
    计算每行所使用的空间大小是需要多步计算完成的。
  
    首先计算列的大小,包括字节的长度:
  
    Column size including byte length = column size + (1, if column size < 250, else 3)
  
    对于列的大小,既可以利用经验来判断其大小,也可以使用语句来计算每列的大小:
  
    Select avg(vsize(colname)) from table_name;
  
    接着,计算行的大小:
  
    Rowsize = row header (3 * UB1) + sum of column sizes including length bytes
  
    最后,计算每行所用的空间大小:
  
    Space used per row (rowspace) = MAX(UB1 * 3 + UB4 + SB2, rowsize) + SB2
  
    UB1、UB4、SB2都是常量,定义的大小可以从V$TYPE_SIZE视图中获得。
  
    当每行所占用的空间超过了一个数据块可用的空间的大小,但是仍然小于每个数据块保留给UPDATE操作的空间大小(例如,PCTFREE=0),每行记录将仍然被存储在它们自己的block块中。
  
    当每行的空间大小超过了每个数据块可用的空间,并且没有任何保留给UPDATE操作的空间可用了,此时,这行记录将被链接到另外一个block或者更多,因此,这个时候的存储的负载会比较高。
  
    第四步:计算在一个block中可以容纳最多的记录数量
   
    可以使用下面的公式来计算一个数据block中可以容纳的记录的数量:

Number of rows in block = FLOOR(availspace / rowspace)
  
    FLOOR是取小于N的最大整数。
  
    这个过程只是提供一个大致的估算一个表的大小,而不是精确的去计算的。在大致的估算出一个表的大小之后,我们可以利用这个信息来判定在创建表的时候究竟使 用多大的INITIAL这个存储参数。当表被创建后开始使用了,空间的需求往往是大于我们通过计算得出的估计值。

在oracle中显示分页很简单, 利用两次rownum就实现了。

下面的语句用来返回DBA_OBJECTS表中类型为TABLE的所有记录中的第100行至第200行。

select * from
( select rownum rnm, a.* from ( select OBJECT_NAME from DBA_OBJECTS where object_type='TABLE' ) a
    where rownum <= 200 )
where rnm > 100

执行结果为:

SQL> select * from
  2  ( select rownum rnm, a.* from ( select OBJECT_NAME from DBA_OBJECTS where object_type='TABLE' ) a
  3      where rownum <= 200 )
  4  where rnm > 100
  5  ;
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       101 HISTGRM$
       102 HIST_HEAD$
       103 DUAL
       104 PARTOBJ$
       105 PARTCOL$
       106 TABPART$
       107 INDPART$
       108 SUBPARTCOL$
       109 TABSUBPART$
       110 INDSUBPART$
       111 TABCOMPART$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       112 INDCOMPART$
       113 PARTLOB$
       114 LOBFRAG$
       115 LOBCOMPPART$
       116 DEFSUBPART$
       117 DEFSUBPARTLOB$
       118 SYSTEM_PRIVILEGE_MAP
       119 TABLE_PRIVILEGE_MAP
       120 STMT_AUDIT_OPTION_MAP
       121 RESOURCE_MAP
       122 USER_ASTATUS_MAP
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       123 EXPACT$
       124 NOEXP$
       125 PROCEDUREJAVA$
       126 PROCEDUREC$
       127 PROCEDUREPLSQL$
       128 RESULT$
       129 KOTTD$
       130 KOTTB$
       131 KOTAD$
       132 KOTMD$
       133 KOTTBX$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       134 KOTADX$
       135 KOPM$
       136 VTABLE$
       137 ATEMPTAB$
       138 LIBRARY$
       139 USER_HISTORY$
       140 MIGRATE$
       141 ICOLDEP$
       142 OPERATOR$
       143 OPBINDING$
       144 OPANCILLARY$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       145 OPARG$
       146 INDTYPES$
       147 INDOP$
       148 INDARRAYTYPE$
       149 SECOBJ$
       150 ASSOCIATION$
       151 USTATS$
       152 JAVASNM$
       153 SUM$
       154 SUMDETAIL$
       155 SUMINLINE$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       156 SUMKEY$
       157 SUMAGG$
       158 SUMJOIN$
       159 SUMDEP$
       160 SUMPRED$
       161 SUMQB$
       162 DIM$
       163 DIMLEVEL$
       164 DIMLEVELKEY$
       165 DIMJOINKEY$
       166 DIMATTR$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       167 HIER$
       168 HIERLEVEL$
       169 RLS$
       170 RLS_SC$
       171 RLS_GRP$
       172 RLS_CTX$
       173 CONTEXT$
       174 RULESET$
       175 INDPART_PARAM$
       176 OL$
       177 OL$HINTS
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       178 OL$NODES
       179 SQL$
       180 SQL$TEXT
       181 SQLPROF$
       182 SQLPROF$DESC
       183 SQLPROF$ATTR
       184 EXPPKGOBJ$
       185 EXPPKGACT$
       186 EXPDEPOBJ$
       187 EXPDEPACT$
       188 MON_MODS$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       189 MON_MODS_ALL$
       190 METAVIEW$
       191 METAFILTER$
       192 METAXSL$
       193 METAXSLPARAM$
       194 METASTYLESHEET
       195 METASCRIPT$
       196 METASCRIPTFILTER$
       197 METANAMETRANS$
       198 METAPATHMAP$
       199 EXTERNAL_TAB$
       RNM OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------
       200 EXTERNAL_LOCATION$
已选择100行。
SQL>

 

总结:在oracle中利用rownum产生伪列真的是太方便了, 尤其利用派生表再加上伪列可以写出很复杂的sql语句来。

比ASE和IQ的实现方式强N倍。 哎,可叹的sybase啊。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:oracle 分页 rownum
————————————————————————————————-