2010-03-12 Fri
在Oracle10g之后,提供了DBMS_ADVANCED_REWRITE包,具有强大的查询重写功能,可以让我们在数据库层面实现很多微妙的调整。假设我们有一个应用,但是现在无法直接修改应用程序的编码,但是又想能够让应用程序的某些SQL产生我们想要的变化,那么就可以使用DBMS_ADVANCED_REWRITE包。
drop table t; create table t as select object_id,object_name from dba_objects; drop table t1; create table t1 as select object_id,object_name from dba_objects where 1=0;
SQL> select count(*) from t;
COUNT(*)
----------
16636
SQL> select count(*) from t1;
COUNT(*)
----------
0
现在我们有表T和T1,表结构相同,但是表T中有1.6万记录,而表T1中没有记录,如果说我们的应用中有一个SQL多次地查询表T的总记录数,占用了大量的CPU和逻辑读,而这样的count记录数又是完全没有用处的,但是我们无法修改应用程序去掉这个SQL,那么我们就可以通过DBMS_ADVANCED_REWRITE包来讲查询表T的SQL转变为查询表T1,这样就大大减少了这条SQL的逻辑读。
首先DBMS_ADVANCED_REWRITE包的执行权限必须显式赋给需要的用户。
CONN sys/password AS SYSDBA
GRANT EXECUTE ON DBMS_ADVANCED_REWRITE TO kamus;
CONN kamus/password
BEGIN
SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
name => 't_rewrite',
source_stmt => 'SELECT count(*) FROM t',
destination_stmt => 'SELECT count(*) FROM t1',
validate => FALSE,
rewrite_mode => 'TEXT_MATCH');
END;
/
然后需要设置会话层面的QUERY_REWRITE_INTEGRITY参数,该参数默认值为ENFORCED,表示只有重写后的SQL输出结果跟原结果完全一样时,查询才会被真正重写,在这里需要修改为TRUSTED。
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
SQL> set autot on
SQL> select count(*) from t;
COUNT(*)
----------
0
Execution Plan
----------------------------------------------------------
Plan hash value: 238181912
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 |
| 1 | VIEW | | 1 | 13 | 2 (0)| 00:00:01 |
| 2 | SORT AGGREGATE | | 1 | | | |
| 3 | TABLE ACCESS FULL| T1 | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
417 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = ENFORCED;
SQL> select count(*) from t;
COUNT(*)
----------
16636
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 22 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| T | 16639 | 22 (0)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
69 consistent gets
0 physical reads
0 redo size
420 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
可以看到在重写之后,执行计划中显示直接去查询表T1,而consistent gets也从查询表T需要的69减少为3。
可以从[USER|ALL|DBA]_REWRITE_EQUIVALENCES视图中获得查询重写的信息。
SQL> select * from user_rewrite_equivalences; OWNER NAME SOURCE_STMT DESTINATION_STMT REWRITE_MO ------ ---------- ------------------------- ------------------------- ---------- KAMUS T_REWRITE SELECT count(*) FROM t SELECT count(*) FROM t1 TEXT_MATCH
DBMS_ADVANCED_REWRITE包也有限制,不可以重写牵涉到SYS用户对象的SQL。
drop table t1; create table t1 as select * from all_tables where 1=0; SQL> BEGIN 2 SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence ( 3 name => 't_rewrite', 4 source_stmt => 'SELECT count(*) FROM all_tables', 5 destination_stmt => 'SELECT count(*) FROM t1', 6 validate => FALSE, 7 rewrite_mode => 'TEXT_MATCH'); 8 END; 9 / BEGIN * ERROR at line 1: ORA-30354: Query rewrite not allowed on SYS relations ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 29 ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 185 ORA-06512: at line 2
在测试中,如果destination_stmt中包含SYS用户对象,是可以成功创建查询重写的,但是在执行SQL的时候却会报ORA-03113错误,后台出现ORA-07445错误,无法正常执行。
SQL> BEGIN
2 SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
3 name => 't_rewrite',
4 source_stmt => 'SELECT count(*) FROM t1',
5 destination_stmt => 'SELECT count(*) FROM all_tables',
6 validate => FALSE,
7 rewrite_mode => 'TEXT_MATCH');
8 END;
9 /
PL/SQL procedure successfully completed.
SQL> select * from user_rewrite_equivalences;
OWNER NAME SOURCE_STMT DESTINATION_STMT REWRITE_MO
------ ---------- ------------------------- ------------------------- ----------
KAMUS T_REWRITE SELECT count(*) FROM t1 SELECT count(*) FROM all_ TEXT_MATCH
tables
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
Session altered.
SQL> select count(*) from t1;
select count(*) from t1
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 8360
Session ID: 135 Serial number: 22在尝试使用SQL Developer用SYSDBA连接数据库时总是报ORA-01017错误。
ORA-01017: invalid username/password; logon denied
实际上用户名密码是正确的,并且在数据库服务器上使用SQL*Plus通过监听连接也是正常的。
C:\Users\Kamus>sqlplus "sys/oracle@orcl11g as sysdba" SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 12:17:01 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production With the Partitioning, OLAP and Real Application Testing options SQL>
真正的问题是因为数据库密码文件缺失了。在windows下,Oracle数据库密码文件是储存在%ORACLE_HOME%\database目录下,命名为PWD%SID%.ora。
密码文件不存在,数据库实例完全可以正常启动,只是在尝试通过监听登陆SYSDBA的时候就会报ORA-01017错误。
那么为什么在本地使用SQL*Plus是正常的,这实际上是一个错觉,因为在Windows中Oracle默认安装以后会在sqlnet.ora文件中设置SQLNET.AUTHENTICATION_SERVICES = (NTS),这表示支持“Windows NT native authentication”方式登陆数据库,也就是属于OSDBA组的Windows用户不用提供密码也可以通过SYSDBA登陆数据库。sqlnet.ora文件位于%ORACLE_HOME%\network\admin目录下。
我们随便使用一个不存在的用户名密码都是可以登录数据库的。
C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba" SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:10:49 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production With the Partitioning, OLAP and Real Application Testing options SQL>
修改SQLNET.AUTHENTICATION_SERVICES参数为NONE之后。
SQLNET.AUTHENTICATION_SERVICES = (NONE)
再次测试用SQL*Plus登陆,报ORA-01031错误,即使提供正确的SYS用户密码也会报同样的错误,因为此时密码文件不存在,不能通过密码文件校验SYS用户密码是否正确,而又不允许通过NTS方式登陆数据库。
C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba" SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:14:07 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name:
重新创建密码文件,保持sqlnet.ora文件中SQLNET.AUTHENTICATION_SERVICES = (NONE)。
orapwd file=D:\oracle\product\11.1.0\db_1\database\PWDorcl11g.ora password=oracle
这样就只能通过正确的SYS用户和密码才可以用SYSDBA登陆数据库了。
C:\Users\Kamus>sqlplus / as sysdba SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:18:32 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: C:\Users\Kamus> C:\Users\Kamus>sqlplus sys/oracle as sysdba SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:18:44 2010 Copyright (c) 1982, 2008, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production With the Partitioning, OLAP and Real Application Testing options SQL>
同样在这种配置下,SQL Developer也可以正常用SYSDBA登陆数据库了。
胡紧紧握住一砣大爷滴手,
大爷亦紧紧握住胡滴手手,
最后
大爷终于说:祝你早日升官!
——据说只在福建当地电视台播出滴片段...
2010-03-11 Thu
图片是网站上很重要的资源,用户发布的产品图片,用户的logo,AV男,兽兽女,犀利哥等等等等,一个稍具规模的网站,图片的数量可能是千万级,这种资源的特点就是文件小,数量大,每个文件在几字节到几K不等,所以针对图片的访问,基本是非常离散的IO,考验的是系统的磁盘并发和CPU处理能力
一般网站,图片都是存放专门的图片服务器,可集中也可以分布式,比如有条件的可以购买昂贵的NAS存储,由主机拖着,以NFS或者HTTP的方式,供前面的应用访问,或者使用多台廉价PC,图片分布打散到每个机器,前台应用解决图片存取和访问策略,以便充分利用所有资源,在应用与图片服务器中间还可能加一层cache,来缓冲前台的访问压力
上面所说的方法,弊端是有很多的
1.文件系统一定是要使用的,为了管理数千万的图片,必须进行目录分层,因为一个目录下不可能存放太多的文件,前期的目录规划要考虑后期的扩展,还有图片分布均匀,这样做下来,往往目录的深度会达到5层甚至7层
2.数据迁移,备份怎么做?高级的NAS存储,有自己的卷复制,但这个粒度太粗,如果要细分到底层或中间层,会有点力不从心,对于这种大数据量的小文件拷贝,PC也是非常吃力
3.每一个图片的访问,基本会做5-7次的目录跳转,转换到磁盘,也可能有10次物理IO了,在并发量上来的时候,磁盘会是个瓶颈,当然,分布式是个方向
这里想到了另外一种方法,利用数据库来存放图片,存储的方式就是现在最流行的key-value
create table mypic
(
key number not null,
pic blob
);
create index ind_picid on mypic(key);
key是图片名称,事先最好统一规划一下,使用number数字来命名,并针对key建立索引
VALUE就是图片内容,用blob来保存
访问一个图片的方式就是:
获取图片名称 数据key
走key上的索引,定位到记录表记录
根据表记录,定位到图片的blob,并读取
这个方法的优点:
1.单个图片的访问路径缩短,数字索引比较小,分区做的好的话可能小到两层,从索引到表,到blob段,大概是4-5跳
并且KEY是区分度非常高的数据类型,在索引每层的横向检索中,不会超过1个数据块,而文件目录结构中,子目录繁多,
要遍历这层的inode后,才知道具体跳转的下层位置
2.备份方式比较灵活,可以基于整个数据库,或者单独的表,数据的迁移,删除,都是基于表级别的,比较直观,方便
3.可以在数据库层面,考虑图片的水平拆分,垂直拆分,分表,分库,都不错
4.数据库的复制技术可以派上用场,读写分离
这里数据库完全是当成一个KEY-VALUE的存储在用,我们可以考虑将一些廉价的PC堆在一起,做成一个picdb的群集,
大致画了一个草图,当然在WEB与picdb间应该还有层cache的,这个方法是YY出来的,可能很多地方不成熟,但SY强身,YY强国,没有想法,哪来的动力?欢迎各位专业人士拍砖

白天上班晚上带孩子,真的好累哦
盖小咪太调皮了,数都数不清怎样调皮法
决定尽快送他去幼儿园改造,蒙台梳利,钢琴,英语,绘画!
快点!把盖小咪变成一个斯斯文文的孩子行不行?
好累啊,救命啊!
今天有个兄弟要删除不想用的temporary tablespace,,我大概整理了下面几点意见..
create temporary tablespace tempyyy tempfile 'path_to_tempfile_yyy' size xxx; alter user zzz temporary tablespace tempyyy; alter database default temporary tablespace tempyyy;
select username,temporary_tablespace from dba_users where temporary_tablespace = 'tempxxx';
select username,session_num,tablespace from v$sort_usage where tablespace = 'tempxxx';
alter database tempfile 'tempfilexxx' drop;
drop tablespace tempxxx;
No related posts.

《无耻混蛋》海报
不光是中国,全世界一年到头其实也没几部好电影。对影迷来说,要想少花冤枉钱而能看到好电影,比较保险的办法就是根据各大电影节的获奖名单去买影碟。
今年的奥斯卡前几天揭晓了,我去影碟店买了五盘片子,分别是获得最佳影片的《拆弹部队》、获最佳男主角奖的《狂野的心》,获最佳外语片的阿根廷电影《他们眼中的秘密》,还有二部是获得最佳电影提名的片子,昆汀·塔伦蒂诺导演的《无耻混蛋(Inglourious Basterds)》及法国电影《预言者A Prophet》,后者曾获2009年戛纳电影节评委会大奖。
《拆弹部队》讲的是三个在伊拉克执行拆弹任务的美国大兵,是一部美国式的主旋律电影,一方面通过战争树立高大的美国式英雄形象,一方面又暗示观众“我们”在反思战争,这个套路和以往的好莱坞战争片没什么大的区别。我不大喜欢《拆弹部队》,但电影中有些场面还是很好看的。
《狂野的心》则是一部生活类的主旋律电影。讲一名老歌星在遇到一位单身母亲后,因为爱情和孩子而决定改邪归正的故事。这部电影值得一赞的,不只是最佳男主演,还有电影中的乡村音乐。
阿根廷电影《他们眼中的秘密》,我还没来得及看,比较期待。我以前曾看过几部阿根廷电影,影响比较深的是,南美人拍电影和他们写小说一样,很注重情绪和叙事的技巧,观众容易获得基于阅读本身带来的快感。
《无耻混蛋(Inglourious Basterds)》也有翻译成《无良杂牌军》的,讲二战期间,一帮有罪的家伙,应该都算是美国人吧,得到指示可以到欧洲战场上去“戴罪立功”,最后,这帮喜欢割头皮,用球棒抽敌人脑袋,给人脸上刺字的家伙居然把希特勒给杀了,二战因为他们而结束。毫无疑问,这是一部非主流电影,一部有明显昆汀风格的电影,暴力,血腥,荒诞,无厘头式的幽默,另类的叙事方式中看不见清晰的电影主题,一如昆汀本人那张怪异的脸,我们永远不知道他在想什么。
我不知道如果中国导演拍了一部片子,然后说希特勒是给人在电影院里杀掉的,我们会如何评价?
这就是看外国电影的好处,很少有中国的影评家会在批评外国电影的时候去考虑故事是否真实,逻辑是否严密等等,因为我们不知道外国人到底是怎样的,反正只要是外国的,那就“一切皆有可能。”
《预言者A Prophet》讲述了这样一种可能,一名带有阿拉伯血统的少年人在监狱中成长为法国的黑帮老大。
这是我自《肖申克的救赎》以来,看到的最好的一部关于监狱题材的电影。虽然导演并不认为他拍的是一部监狱片,而是一部道德电影。
导演雅克·欧迪亚说,这部电影的名字是他从鲍勃·迪伦的歌词中获得的灵感,“我们总是在不知不觉中为什么人提供什么服务”。而我们都知道,在阿拉伯人的字典里,“预言者(先知)”是安拉派到世界的使者。从这个角度讲,这也是一部关于宗教的电影。但说实话,我更希望看到阿拉伯人拍的关于阿拉伯人在西方的电影,遗憾而又无奈的是,这样的电影少之又少,我好象从来没看过。

《预言者》海报
Oracle除了用DBCA可以建库外,也可以手动来建立数据库,手动建库能够更了解数据库的一些启动过程和运作机制,对深入学习oracle 很有帮助,本文演示了10g下手动建库的流程和可能碰到的问题。
第一步:建立参数文件,这个文件可以从其他地方已有的数据库复制过来修改,也可以从init.ora的基础上修改,主要内容如下:
*.audit_file_dest='/u01/app/oracle/admin/erpwh/adump'
*.background_dump_dest='/u01/app/oracle/admin/erpwh/bdump'
*.compatible='10.2.0.1.0'
*.control_files='+DGWH/erpwh/control01.ctl','+DGWH/erpwh/control02.ctl','+DGWH/erpwh/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/erpwh/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='erpwh'
*.db_recovery_file_dest='+DGWH'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=erpoptmXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=1073741824
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2147483648
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/erpwh/udump'
可以看到参数文件主要是指定了数据库名、跟踪文件的位置、控制文件的位置、数据块大小、内存参数等。Linux 系统中,该文件位置应在$ORACLE_HOME/dbs目录下。
第二步:建立密码文件,该文件用于sysdba远程管理登录,这里的密码可以和建立数据库脚本理的sys密码不同,如果是远程以sysdba身份登录则需要使用这里的密码。密码文件和参数文件在相同的目录下:
[oracle@erpdevdb dbs]$ orapwd file=/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/orapwerpwh password=erpwh entries=5
第三步:建立跟踪、日志等文件的路径:
[oracle@erpdevdb dbs]$ cd /u01/app/oracle/admin/
[oracle@erpdevdb admin]$ mkdir erpwh
[oracle@erpdevdb admin]$ cd erpwh
[oracle@erpdevdb erpwh]$ ll
total 0
[oracle@erpdevdb erpwh]$ mkdir adump bdump udump cdump
[oracle@erpdevdb erpwh]$ ll
total 32
drwxr-xr-x 2 oracle oinstall 4096 Mar 10 15:16 adump
drwxr-xr-x 2 oracle oinstall 4096 Mar 10 15:16 bdump
drwxr-xr-x 2 oracle oinstall 4096 Mar 10 15:16 cdump
drwxr-xr-x 2 oracle oinstall 4096 Mar 10 15:16 udump
第四步:启动数据库到nomount状态:
[oracle@erpdevdb dbs]$ export ORACLE_SID=erpwh
[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 10 15:18:09 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup nomount
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
如果出现以上错误,是操作系统参数设置的内存不够,参见这篇文章修改即可:
[root@erpdevdb ~]# vi /etc/sysctl.conf
kernel.shmall = 4718592
或者调小参数文件里的内存参数也可以,取决于系统资源情况。
SQL> startup nomount
ORACLE instance started.Total System Global Area 2147483648 bytes
Fixed Size 2022144 bytes
Variable Size 486540544 bytes
Database Buffers 1644167168 bytes
Redo Buffers 14753792 bytes
第五步,运行建立数据库的脚本
CREATE DATABASE erpwh
USER SYS IDENTIFIED BY sys
USER SYSTEM IDENTIFIED BY sys
LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,
GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,
GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M
MAXLOGFILES 16
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 2
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE
DEFAULT TEMPORARY TABLESPACE temptbs1
TEMPFILE '+DGWH/erpwh/temp01.dbf'
SIZE 2048M REUSE
UNDO TABLESPACE undotbs1
DATAFILE '+DGWH/erpwh/undotbs01.dbf'
SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
脚本主要是指定sys和system的密码,redo文件,字符集,数据文件,临时表空间和回滚段等信息。
但有时候在建库脚本里指定默认表空间DEFAULT TABLESPACE erp会报错:
SQL> CREATE DATABASE erpwh
2 USER SYS IDENTIFIED BY sys
3 USER SYSTEM IDENTIFIED BY sys
4 LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,
5 GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,
6 GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M
7 MAXLOGFILES 16
8 MAXLOGMEMBERS 5
9 MAXDATAFILES 100
10 MAXINSTANCES 8
11 MAXLOGHISTORY 29200
12 CHARACTER SET ZHS16GBK
13 NATIONAL CHARACTER SET AL16UTF16
14 DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE
15 EXTENT MANAGEMENT LOCAL
16 SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE
17 DEFAULT TABLESPACE erp
18 DEFAULT TEMPORARY TABLESPACE temptbs1
19 TEMPFILE '+DGWH/erpwh/temp01.dbf'
20 SIZE 2048M REUSE
21 UNDO TABLESPACE undotbs1
22 DATAFILE '+DGWH/erpwh/undotbs01.dbf'
23 SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
CREATE DATABASE erpwh
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
这种情况一般是建库脚本哪里写的不对,需要检查。从asm存储来看各种数据文件都建立了,但是数据库并没有创建成功,这时把已经建立的数据文件删掉,并删除建库脚本理的默认表空间这行就可以了:
SQL> CREATE DATABASE erpwh
2 USER SYS IDENTIFIED BY sys
3 USER SYSTEM IDENTIFIED BY sys
4 LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,
5 GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,
6 GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M
7 MAXLOGFILES 16
8 MAXLOGMEMBERS 5
9 MAXDATAFILES 100
10 MAXINSTANCES 8
11 MAXLOGHISTORY 2
12 CHARACTER SET ZHS16GBK
13 NATIONAL CHARACTER SET AL16UTF16
14 DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE
15 EXTENT MANAGEMENT LOCAL
16 SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE
17 DEFAULT TEMPORARY TABLESPACE temptbs1
18 TEMPFILE '+DGWH/erpwh/temp01.dbf'
19 SIZE 2048M REUSE
20 UNDO TABLESPACE undotbs1
21 DATAFILE '+DGWH/erpwh/undotbs01.dbf'
22 SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;Database created.
第六步,建立其他表空间和数据字典:
SQL> create tablespace erp datafile '+DGWH' size 30720m;
Tablespace created.
SQL> @?/rdbms/admin/catalog.sql
......
PL/SQL procedure successfully completed.
SQL> @?/rdbms/admin/catproc.sql
......
PL/SQL procedure successfully completed.
第七步,建立spfile:
SQL> create spfile='+DGWH/ERPWH/spfileerpwh.ora' from pfile;
File created.
要注意的是,Oracle下次启动的时候不不会默认使用这种方式建立的spfile,
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
不指定spfile路径的时候就可以了:
SQL> create spfile from pfile;
File created.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.Total System Global Area 2147483648 bytes
Fixed Size 2022144 bytes
Variable Size 486540544 bytes
Database Buffers 1644167168 bytes
Redo Buffers 14753792 bytes
Database mounted.
Database opened.
SQL> show parameter spfileNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/oracle/product
/10.2.0/db_1/dbs/spfileerpwh.o
ra
第八步,建立用户
SQL> create user erp identified by erp default tablespace ERP temporary tablespace temptbs1 profile DEFAULT;
User created.
SQL> grant dba to erp;
Grant succeeded.
SQL> connect erp/erp
Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
出现这个错误提示并不会影响数据库的使用,手动建库一般会有这个警告出现。 PRODUCT_USER_PROFILE是SYSTEM用户的一个表,存储客户端程序执行命令方面的限制信息,可以根据提示用system用户执行脚本来消除:
SQL> connect system/sys
Connected.
SQL>
SQL> @$ORACLE_HOME/sqlplus/admin/pupbld.sql.......
SQL> connect erp/erp
Connected.
SQL>
SQL>
SQL> show user
USER is "ERP"
第九步,配置网络服务:
[oracle@erpdevdb admin]$ vi tnsnames.ora
ERPWH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = erpdevdb)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = erpwh)
)
)
至此手动建立数据库完成,客户端可以连接上来使用了。









