2010-03-11 Thu
今天有个兄弟要删除不想用的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)
)
)
至此手动建立数据库完成,客户端可以连接上来使用了。
2010-03-10 Wed
从今天开始, SQLULDR2可以从标准输入设备接受复杂的SQL语句了. 如下所示, SQL是人工输入的, 而最后一行的反斜杆用来表示输入结束.
D:\>sqluldr2 scott/tiger file=- sql=-
select
*
from tab
/
DBOBJECTS,TABLE,
BLOB,TABLE,
SPACE_DAILY,TABLE,
SQLULDR2_LOG,TABLE,
TRADE_MONTHLY_SUMMARY,TABLE,
TRADE_DATA,TABLE,
这个可以省去创建SQL文件的步骤, 更重要的是在Linux的Shell或Perl脚本中调用SQLULDR2, 并传入复杂的SQL时, 也不需要创建SQL文件了, 而且很容易使用Shell或Perl中的变量, 进行替换生成动态的SQL. 例如, 我们经常会见到如下脚本.
sqlplus -s "/ as sysdba" << EOF
select
*
from tab;
exit
EOF
现在SQLULDR2也可以这样用了, 在Linux的Shell或Perl脚本中同样使用.
sqluldr2 sys file=- sql=- << EOF
select
*
from tab
EOF
使用这个功能, 可以使嵌入SQLULDR2的批脚本更具有通用性, 方便移值到不同的平台.
Relative Posts:
以下是数据仓库相关的岗位描述:
点击流系统开发工程师:
工作职责:
负责alipay.com网站点击流分析系统建设,能够独立完成系统的设计和开发
职位要求:
计算机及相关专业本科毕业
三年以上C/C++/JAVA开发经验、熟悉Linux环境及Shell编程
对互联网点击流系统有一定的的了解,熟悉网站日志收集和分析原理,有点击流产品开发经验者优先
熟练掌握两种或以上关系型数据库系统,对分布式计算服务有一定的编程开发经验
良好的沟通能力和团队精神,具备一定的创新意识
数据仓库ETL开发工程师:
工作职责
数据仓库项目规划、设计与程序开发
数据仓库相关的应用系统的数据处理及模型建设,完成ETL过程的设计与实现
职位要求
计算机相关专业本科及以上毕业
熟悉ORACLE、DB2、TERADATA等任一种主流关系型数据库,三年以上数据库开发及实施经验(OCP等相关证书优先)
熟悉数据仓库的模型开发过程及主流的ETL工具和OLAP展现工具,能够独立承担ETL开发任务
了解面向对象的程序设计方法,能够熟练运用一门编程语言进行程序开发
良好的沟通能力和团队精神,具备一定的创新意识
高级JAVA开发工程师
工作职责
负责内部数据服务平台和系统的建设,完成代码的设计和开发
Review及评审设计过程,指导工程师进行程序开发
职位要求
计算机及相关专业本科毕业
精通面向对象设计方法,三年以上Java语言开发经验 和J2EE项上目经验
精通J2EE及其设计模式、熟悉Linux、HTML、UML
熟悉数据库的编程开发,对主流关系型数据库有深入的了解和开发经验
良好的沟通能力和团队意识,具备一定的创新意识
JAVA开发工程师
工作职责
负责内部数据服务平台和系统的建设,完成代码的设计和开发
职位要求
计算机及相关专业本科毕业
精通面向对象设计方法,至少两年以上J2EE项目开发经验;
熟悉J2EE设计模式,精通Java及Web的开发和应用;
熟悉数据库的编程开发,对主流关系型数据库有一定的的了解和开发经验
良好的沟通能力和团队精神,具备一定的创新意识
数据仓库需求分析师:
工作职责:
负责管理和分析来自用户和公司内部的业务数据需求,完成需求分析说明书
根据需求规划和设计数据仓库解决方案或产品,推动数据服务化建设
职位要求:
熟悉互联网或软件产品整体项目实现过程,包括从业务调研、需求分析到产品发布
了解数据仓库项目实践过程,对数据具备一定的业务敏感度
有参与过大型项目或应用系统建设的经验,具有2年以上产品或项目的管理经验
熟练掌握设计模式和UML建模知识者优先
较强的沟通能力和团队精神
高级数据仓库展现工程师:
工作职责:
负责各类数据业务报表的设计和开发实现
根据需求规划和设计数据展现解决方案
参与数据仓库相关的项目实施
职位要求:
熟悉主流的关系型数据库系统(ORACLE/DB2等),三年或以上数据仓库开发或实施经验
熟悉数据仓库的OLAP分析工具,对BIEE、MicroStrategy、Businese Object等任一种有熟练的掌握
熟悉数据仓库的建模型及分析过程,对电信、银行、大型网站、零售业有一定的经验者优先
较强的沟通能力和责任心,具备一定的创新意识虽然存储级别有一定的安全防范,但是如果遇到数据损失、坏块、文件损坏等问题,将无法应对。
SQL> select sum(bytes)/1024/1024/1024/1024 TB from v$datafile;当然我们有一些折中的手段可以采用,比如备份数据结构,系统表空间等,在故障时快速回复核心业务。同时,如果是常规的错误,可以通过一系列的内部手段进行强制恢复,当然是以损失一部分数据为代价的。
TB
----------
1.39508572
探讨一下,哪些数据库是无备份的?无备份大家是如何应对故障的?
相关文章|Related Articles
- HDS Truecopy实现原理及项目的选择
- DBA警示录:存储故障的处理应当谨慎
- Oracle 10g 之HIGH Water MARK 数据统计
- 关于HDS的高端存储设备USPV
- NetApp FAS200系列 Fas250到货
评论数量(5)|Add Comments
本文网址:http://www.eygle.com/archives/2010/03/h2recovery_nobackup.html
2010-03-09 Tue
有些时候,系统中会出现部分SQL语句, 由于数据分布的原因, 无法正常使用索引,,基本的情形在前面翻译的Jonathan Lewis的文章中已经有所涉及.
下面是一个简单的Hack clustering_factor的方法(注意: 尽量不要使用,只有在正常分析表无法解决问题的时候, 又很难通过使用SPM或者SQL Profile的时候才可以考虑一试).
这样做会有以下几个弊端:
- 1. 这么做的结果可能导致后续的维护有困难,,因为你的后任可能根本不知道你这么处理了.
- 2. hack 系统的信息, 不是一种好的处理方式..:-)
下面是一个基本的处理过程
explain plan for
select column_list
from table_name m
where m.column_name = ‘Y’
and m.column_name2 in ( :1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 );
explain plan for
select /*+ index(m)*/column_list
from table_name m
where m.column_name = ‘Y’
and m.column_name2 in ( :1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 );
select clustering_factor from dba_indexes where index_name = ‘INDEX_NAME’;
select blocks from dba_segments where segment_name = ‘INDEX_NAME’;
DBMS_STATS.SET_INDEX_STATS (ownname =>’OWNER’,indname => ‘INDEX_NAME’,clstfct => 100);
No related posts.
有时候为了测试方便,需要建立一个和源库一样的数据库来操作,这时候一个简单的做法是直接克隆,通过配置参数文件和直接复制数据文件来快速建立一个新的库,本文演示了基于10g版本ASM存储下的一个操作过程。
源库SID:erptest 目标库SID:erpoptm
第一步,首先获取源库的参数文件
SQL> CREATE PFILE='/tmp/init_temp.ora' from spfile;
File created.
参照以上文件建立一个目标库的参数文件initerpoptm.ora如下:
erptest.__db_cache_size=1828716544
erptest.__java_pool_size=16777216
erptest.__large_pool_size=16777216
erptest.__shared_pool_size=268435456
erptest.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/erpoptm/adump'
*.background_dump_dest='/u01/app/oracle/admin/erpoptm/bdump'
*.compatible='10.2.0.1.0'
*.control_files='+DGOPTM/erpoptm/control01.ctl','+DGOPTM/erpoptm/control02.ctl','+DGOPTM/erpoptm/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/erpoptm/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='erptest'
*.db_recovery_file_dest='+DGOPTM'
*.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='UNDOTBS2'
*.user_dump_dest='/u01/app/oracle/admin/erpoptm/udump'
改动的内容都是各种文件的路径,注意这里的db_name不要修改,否则无法mount数据库,因为db_name要和数据文件头记录的db_name一致。
第二步,建立对应的日志、跟踪等文件的路径
[oracle@erpdevdb tmp]$ cd /u01/app/oracle/admin/
[oracle@erpdevdb admin]$ mkdir erpoptm
[oracle@erpdevdb admin]$ cd erpoptm
[oracle@erpdevdb erpoptm]$ ll
total 0
[oracle@erpdevdb erpoptm]$ mkdir adump
[oracle@erpdevdb erpoptm]$ mkdir bdump
[oracle@erpdevdb erpoptm]$ mkdir udump
[oracle@erpdevdb erpoptm]$ mkdir cdump
[oracle@erpdevdb erpoptm]$ ll
total 32
drwxr-xr-x 2 oracle oinstall 4096 Mar 8 11:45 adump
drwxr-xr-x 2 oracle oinstall 4096 Mar 8 11:45 bdump
drwxr-xr-x 2 oracle oinstall 4096 Mar 8 11:45 cdump
drwxr-xr-x 2 oracle oinstall 4096 Mar 8 11:45 udump
第三步,获取源库的控制文件内容并修改
SQL> alter database backup controlfile to trace;
Database altered.
在udump目录下查看生成的trace文件,找到建立控制文件的部分脚本并修改如下:
CREATE CONTROLFILE REUSE DATABASE "ERPTEST" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 29200
LOGFILE
GROUP 1 '+DGOPTM/erpoptm/redo01.log' SIZE 50M,
GROUP 2 '+DGOPTM/erpoptm/redo02.log' SIZE 50M,
GROUP 3 '+DGOPTM/erpoptm/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'+DGOPTM/erpoptm/system01.dbf',
'+DGOPTM/erpoptm/undotbs01.dbf',
'+DGOPTM/erpoptm/sysaux01.dbf',
'+DGOPTM/erpoptm/users01.dbf',
'+DGOPTM/erpoptm/datafile/erp_ht.268',
'+DGOPTM/erpoptm/datafile/erp_ht.269',
'+DGOPTM/erpoptm/datafile/erp_index.270',
'+DGOPTM/erpoptm/datafile/erp_wl.271',
'+DGOPTM/erpoptm/datafile/erp.272',
'+DGOPTM/erpoptm/datafile/erp_sp.273',
'+DGOPTM/erpoptm/datafile/erp_cw.274',
'+DGOPTM/erpoptm/datafile/erp_zj.275',
'+DGOPTM/erpoptm/datafile/erp_xm.276',
'+DGOPTM/erpoptm/datafile/erp_ht.277'
CHARACTER SET ZHS16GBK
第四步,拷贝源库的数据文件到目标库的对应路径:
先要为目标库建立好ASM磁盘组,建立的详细步骤可参考这篇文章:
[root@erpdevdb ~]# oracleasm createdisk VOL5 /dev/sda10
Writing disk header: done
Instantiating disk: done[oracle@erpdevdb ~]$ export ORACLE_SID=+ASM
SQL> create diskgroup DGOPTM external redundancy disk 'ORCL:VOL5';
Diskgroup created.
[oracle@erpdevdb ~]$ asmcmd
ASMCMD> ls
DGDEV/
DGOPTM/
DGPAPER/
DGSTUDY/
DGTEST/
ASMCMD> cd DGOPTM/ASMCMD> mkdir ERPOPTM/
然后在源库的实例中用DBMS_FILE_TRANSFER.COPY_FILE包拷贝文件:
SQL> create directory DGFROM as '+DGTEST/ERPTEST/DATAFILE';
Directory created.
SQL> create directory DGTO as '+DGOPTM/ERPOPTM/DATAFILE';
Directory created.
执行以下命令拷贝数据文件:
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.268.711907283','DGTO','erp_ht.268');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.269.711907397','DGTO','erp_ht.269');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.277.711972029','DGTO','erp_ht.277');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_index.270.711907487','DGTO','erp_index.270');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_wl.271.711907545','DGTO','erp_wl.271');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp.272.711907565','DGTO','erp.272');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_sp.273.711907695','DGTO','erp_sp.273');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_cw.274.711907757','DGTO','erp_cw.274');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_xm.276.711907831','DGTO','erp_xm.276');
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_zj.275.711907801','DGTO','erp_zj.275');
要注意的是,这里的目标文件名不能带有ASM自身生成的那一串数字,否则会报错如下:
ORA-19504: failed to create file
"+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801"
ORA-17502: ksfdcre:4 Failed to create file
+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801
ORA-15046: ASM file name '+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801' is not
in single-file creation form
ORA-06512: at "SYS.DBMS_FILE_TRANSFER", line 84
ORA-06512: at "SYS.DBMS_FILE_TRANSFER", line 193
ORA-06512: at line 1
这是因为这串数字是ASM用来进行标识的信息,文档Doc ID: Note:452158.1中有说明。老杨的一篇文章描述了类似的问题。
然后再拷贝system等表空间和redo等文件:
SQL> drop directory DGFROM;
Directory dropped.
SQL> create directory DGFROM as '+DGTEST/ERPTEST';
Directory created.
SQL> drop directory DGTO;
Directory dropped.
SQL> create directory DGTO as '+DGOPTM/ERPOPTM';
Directory created.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo01.log','DGTO','redo01.log');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo02.log','DGTO','redo02.log');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo03.log','DGTO','redo03.log');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','system01.dbf','DGTO','system01.dbf');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','undotbs01.dbf','DGTO','undotbs01.dbf');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','sysaux01.dbf','DGTO','sysaux01.dbf');
PL/SQL procedure successfully completed.
SQL> exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','users01.dbf','DGTO','users01.dbf');
PL/SQL procedure successfully completed.
需要注意的是,copy过来的文件并不是文件存储的实际路径,而是按原有的路径组织的,新的文件名只是一个alias而已:
ASMCMD> cd ERPOPTM/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N DATAFILE/
N control01.ctl => +DGOPTM/ERPTEST/CONTROLFILE/Current.273.713177855
N control02.ctl => +DGOPTM/ERPTEST/CONTROLFILE/Current.274.713177855
N control03.ctl => +DGOPTM/ERPTEST/CONTROLFILE/Current.275.713177855
N redo01.log => +DGOPTM/ERPTEST/ONLINELOG/group_0.266.713120427
N redo02.log => +DGOPTM/ERPTEST/ONLINELOG/group_0.267.713120435
N redo03.log => +DGOPTM/ERPTEST/ONLINELOG/group_0.268.713120441
N sysaux01.dbf => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.271.713120497
N system01.dbf => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.269.713120449
N undotbs01.dbf => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.270.713120467
N users01.dbf => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.272.713120509ASMCMD> cd DATAFILE/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N erp.272 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.261.713119325
N erp_cw.274 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.263.713119613
N erp_ht.268 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.257.713118643
N erp_ht.269 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.256.713118843
N erp_ht.277 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.258.713119001
N erp_index.270 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.259.713119135
N erp_sp.273 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.262.713119553
N erp_wl.271 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.260.713119275
N erp_xm.276 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.264.713119665
N erp_zj.275 => +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.265.713119693
至此文件拷贝完成。
第五步,建立密码文件
[oracle@erpdevdb dbs]$ orapwd file=/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/orapwerpoptm password=erpoptm entries=5
第六步,启动数据库
先启动到nomount状态,这时会用到参数文件:
[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 8 14:01:08 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
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
SQL>
SQL> alter database mount
2 /
alter database mount
*
ERROR at line 1:
ORA-00205: error in identifying control file, check alert log for more info
oracle会先找spfile,然后找pfile,找若没有参数文件,则会报错:
[oracle@erpdevdb dbs]$ export ORACLE_SID=erpoptm
[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 8 14:00:10 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup nomount
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/initerpoptm.ora'
mount时会找控制文件,没有则会出现如上所示的错误,可以在nomount阶段来建立控制文件,先关闭源库,然后在目标库启动到nomount阶段来建立控制文件:
SQL> CREATE CONTROLFILE REUSE DATABASE "ERPTEST" NORESETLOGS NOARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 29200
7 LOGFILE
8 GROUP 1 '+DGOPTM/erpoptm/redo01.log' SIZE 50M,
9 GROUP 2 '+DGOPTM/erpoptm/redo02.log' SIZE 50M,
10 GROUP 3 '+DGOPTM/erpoptm/redo03.log' SIZE 50M
11 -- STANDBY LOGFILE
12 DATAFILE
13 '+DGOPTM/erpoptm/system01.dbf',
14 '+DGOPTM/erpoptm/undotbs01.dbf',
15 '+DGOPTM/erpoptm/sysaux01.dbf',
16 '+DGOPTM/erpoptm/users01.dbf',
17 '+DGOPTM/erpoptm/datafile/erp_ht.268',
18 '+DGOPTM/erpoptm/datafile/erp_ht.269',
19 '+DGOPTM/erpoptm/datafile/erp_index.270',
20 '+DGOPTM/erpoptm/datafile/erp_wl.271',
21 '+DGOPTM/erpoptm/datafile/erp.272',
22 '+DGOPTM/erpoptm/datafile/erp_sp.273',
23 '+DGOPTM/erpoptm/datafile/erp_cw.274',
24 '+DGOPTM/erpoptm/datafile/erp_zj.275',
25 '+DGOPTM/erpoptm/datafile/erp_xm.276',
26 '+DGOPTM/erpoptm/datafile/erp_ht.277'
27 CHARACTER SET ZHS16GBK
28 /Control file created.
为什么要先关闭源库呢,这是因为二者有相同的db_name,oracle通过一个lk开头的文件来在运行阶段lock某个库,如果不关闭会在alert日志中看到以下错误:
Tue Mar 9 08:53:20 2010
sculkget: failed to lock /u01/app/oracle/oracle/product/10.2.0/db_1/dbs/lkERPTEST exclusive
sculkget: lock held by PID: 29747
Tue Mar 9 08:53:21 2010
ORA-09968: unable to lock file
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 29747
Tue Mar 9 08:53:21 2010
Errors in file /u01/app/oracle/admin/erpoptm/udump/erpoptm_ora_26143.trc:
ORA-01158: database already mounted
由于现在在同一个主机上有两个相同db_name的数据库,那么如何能同时启动呢,这需要指定参数db_unique_ name来区分开来,这个参数在standby环境也是必须设置的。
修改源库的db_unique_name如下:
SQL> alter system set db_unique_name=erptest scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.SQL> startup
ORACLE instance started.
回到正题,在创建控制文件的过程中会验证数据文件是否存在,如果不存在则报以下错误:
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '+DGOPTM/erpoptm/system01.dbf'
ORA-17503: ksfdopn:2 Failed to open file +DGOPTM/erpoptm/system01.dbf
ORA-15173: entry 'system01.dbf' does not exist in directory 'erpoptm'
也会检查参数文件中的db_name和数据文件头的db_name是否相同,否则报以下错误:
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01161: database name ERPTEST in file header does not match given name of
ERPOPTM
ORA-01110: data file 1: '+DGOPTM/erpoptm/system01.dbf'
接着打开数据库:
SQL> alter database open
2 /
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '+DGOPTM/erpoptm/system01.dbf'
这说明需要介质恢复,可以一个一个数据文件的来recover,也可以直接recover database:
SQL> recover database;
Media recovery complete.
SQL> alter database open;Database altered.
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string erptest
SQL> show parameter instance_nameNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string erpoptm
注意这种情况下启动的数据库会做实例恢复,因为redo和数据文件等都是copy过来的。这样就建立了一个db_name为erptest,而instance_name和SID为erpoptm的数据库。
然后要马上建立临时表空间:
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DGOPTM/erpoptm/temp01.dbf' SIZE 8192M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
Tablespace altered.
但是事情并没有结束,很快就发些这个新搭建的库会很快死掉,alert日志记录了如下的信息:
Tue Mar 9 10:11:24 2010
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:
ORA-00600: internal error code, arguments: [504], [0x06000AD18], [1], [0], [ksv instance], [0], [0], [0x0DCFCE590]
Tue Mar 9 10:11:26 2010
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:
ORA-00600: internal error code, arguments: [504], [0x06000AD18], [1], [0], [ksv instance], [0], [0], [0x0DCFCE590]
Tue Mar 9 10:11:26 2010
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:
ORA-00600: internal error code, arguments: [4193], [2887], [2890], [], [], [], [], []
碰到很多4193的600错误,这种一般和undo有关,重建一下undo即可:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1SQL> create undo tablespace undotbs2 datafile '+DGOPTM/ERPOPTM/undotbs2.dbf' size 1024m;
Tablespace created.
SQL> alter system set undo_tablespace=undotbs2;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
再修改一下参数文件initerpoptm.ora,修改这里的undo:
*.undo_tablespace='UNDOTBS2'
重新启动数据库,设置db_unique_name和spfile:
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
SQL>
SQL> create spfile from pfile;File created.
SQL> shutdown immediate
SQL> startup
ORACLE instance started.
Database mounted.
Database opened.
SQL> show parameter spfileNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/oracle/product
/10.2.0/db_1/dbs/spfileerpoptm
.ora
SQL> alter system set db_unique_name=erpoptm scope=spfile;System altered.
SQL> shutdown immediate
SQL> startup
SQL>
SQL> show parameter db_nameNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string erptest
SQL>
SQL>
SQL>
SQL> show parameter instance_name;NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string erpoptm
SQL>
SQL>
SQL>
SQL> show parameter db_unique_nameNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string ERPOPTM
可以看到spfile默认会放到dbs目录下。至此这个数据库应该是可用了,当然还要配置一下网络监听等服务:
[oracle@erpdevdb admin]$ vi tnsnames.ora
ERPOPTM =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = erpdevdb)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = erpoptm)
)
)[oracle@erpdevdb admin]$ lsnrctl
LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:start stop status
services version reload
save_config trace spawn
change_password quit exit
set* show*LSNRCTL> reload
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
The command completed successfully[oracle@erpdevdb admin]$ vi /etc/oratab
erpoptm:/u01/app/oracle/oracle/product/10.2.0/db_1:Y
“感谢你爹你妈没问题,首先还是要感谢国家。”
如果这话不是于再清说的,而是丁俊辉对周洋说的,甚至都不一定要是丁俊辉,而就是一普通老百姓说的,都不会引起任何争议。如果周洋只是因为他爸妈生了他就能夺得奥运冠军,那就让他爸妈再生个奥运冠军看看。在我们这里,运动员几乎都是国家培养的,而所谓国家的培养,其实都是用老百姓的钱培养的。要周洋谢谢国家的实质就是要他谢谢其他老百姓,谢谢人民,而不是只谢自己的父母。所以,如果于再清说,“感谢你爹你妈没问题,首先还是要感谢纳税人,”这话就漂亮了。问题的关键是,我们的官员大多没有这样的概念,也不愿意有这样的想法,因为一旦把国家和纳税人联系在一起,也就意味着他们和运动员一样,也是纳税人培养的,也要谢谢老百姓。而说“国家”二个字,不但避免了这个问题,而且显得很抽象,很大气,甚至还很爱国。
“你究竟是代表老百姓说话,还是代表党说话?”
如果这话不是河南某官员对记者说的,而是记者反过来责问某官员的,那就犀利了。也不一定要是记者,任何一位普通老百姓说出这样的话,都会引起我们的共鸣。问题就出在,说这话的,同样是一名官员。而官员们说出这样的话,其实也不奇怪,因为这确实很符合当下的官话逻辑,在我党的官话系统里,党和老百姓确实是两个不同的团体,否则也就不会有这样的话,“我们的党员干部应该经常听取老百姓的呼声”“我们的党员干部应该经常到老百姓中间走走。”如果我们的党员和老百姓真属同一团体,真代表了老百姓,那就不可能说要听取老百姓的呼声,因为你的话就是老百姓的话,也不存在说要去老百姓中间走走的讲法,因为你就是老百姓。有趣的是,后面两句话说了这么多年,并没有引起任何争议,大家都觉得很对。所以,如果河南那官员能换一种方式和记者说,“你究竟是代表老百姓说话呢,还是代表代表老百姓的党说话?”这话就真高级了,即便有错,那也是语文没学好,口齿不清,而不是政治上的错误。






