umount误操作引发数据库宕机

在开发数据库上,执行完其它测试工作后,随手执行命令卸载光盘,图省事,执行了下述命令:
[root@OEL511gR2 ~]# umount -all
然后,然后,就导致了一则不大不小的数据库宕机!!!
因为,我的开发库文件系统信息如下:
[root@OEL511gR2 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext3 9.7G 7.9G 1.3G 87% /
tmpfs tmpfs 502M 0 [...]

如何从逻辑备份的dumpfile文件里获取头部详细信息?

在上一篇日志里,我们了解了 如何从逻辑备份的dumpfile文件里获取DDL脚本? 在本篇里,我们参照 MetaLink文档【ID 462488.1】来了解如何从dumpfile里获取更为详细的头部信息。
所有的dumpfile文件都是包含大小为4KB的头部数据区,该区域记录dumpfile文件的详细信息。从Oracle 10.2.0.1.0开始,可以调用系统包DBMS_DATAPUMP.GET_DUMPFILE_INFO来获取dumpfile的头部信息。
1   参照 MetaLink文档【ID 462488.1】我们可以创建一个SHOW_DUMPFILE_INFO存储过程,通过调用该过程可以获取dumpfile的详细信息,该过程的源代码如下:

CONNECT sys/manager as sysdba;

CREATE PROCEDURE show_dumpfile_info(
p_dir  VARCHAR2 DEFAULT ’DATA_PUMP_DIR’,
p_file VARCHAR2 DEFAULT ’EXPDAT.DMP’)
AS
– p_dir         = directory object where dumpfile can be found
– p_file        = simple filename of export dumpfile (case-sensitive)
v_separator   VARCHAR2(80) := ’————————————–’ ||
‘————————————–’;
v_path        all_directories.directory_path%type := ’?';
v_filetype    NUMBER;                 – 0=unknown 1=expdp 2=exp
v_fileversion VARCHAR2(15);           – 0.1=10gR1 1.1=10gR2 2.1=11g
v_info_table  sys.ku$_dumpfile_info;  – PL/SQL table with file info
type valtype  IS VARRAY(22) OF VARCHAR2(2048);
var_values    valtype := valtype();
no_file_found EXCEPTION;
PRAGMA        exception_init(no_file_found, -39211);

BEGIN

– Show generic info:
– ==================

dbms_output.put_line(v_separator);
dbms_output.put_line(’Purpose..: Obtain details about export ’ ||
‘dumpfile.        Version: 19-MAR-2008′);
dbms_output.put_line(’Required.: RDBMS version: 10.2.0.1.0 or higher’);
dbms_output.put_line(’.          ’ ||
‘Export dumpfile version: 7.3.4.0.0 or higher’);
dbms_output.put_line(’.          ’ ||
‘Export Data Pump dumpfile version: 10.1.0.1.0 or higher’);
dbms_output.put_line(’Usage….: ’ ||
‘execute show_dumfile_info(”DIRECTORY”, ”DUMPFILE”);’);
dbms_output.put_line(’Example..: ’ ||
‘exec show_dumfile_info(”MY_DIR”, ”expdp_s.dmp”)’);
dbms_output.put_line(v_separator);
dbms_output.put_line(’Filename.: ’ || p_file);
dbms_output.put_line(’Directory: ’ || p_dir);

– Retrieve Export dumpfile details:
– =================================

SELECT directory_path INTO v_path FROM all_directories
WHERE directory_name = p_dir
OR directory_name = UPPER(p_dir);

dbms_datapump.get_dumpfile_info(
filename   => p_file,       directory => UPPER(p_dir),
info_table => v_info_table, filetype  => v_filetype);

var_values.EXTEND(22);
FOR i in 1 .. 22 LOOP
BEGIN
SELECT value INTO var_values(i) FROM TABLE(v_info_table)
WHERE item_code = i;
EXCEPTION WHEN OTHERS THEN var_values(i) := ”;
END;
END LOOP;

– Show dumpfile details:
– ======================
– For Oracle10g Release 2 and higher:
–    dbms_datapump.KU$_DFHDR_FILE_VERSION        CONSTANT NUMBER := 1;
–    dbms_datapump.KU$_DFHDR_MASTER_PRESENT      CONSTANT NUMBER := 2;
–    dbms_datapump.KU$_DFHDR_GUID                CONSTANT NUMBER := 3;
–    dbms_datapump.KU$_DFHDR_FILE_NUMBER         CONSTANT NUMBER := 4;
–    dbms_datapump.KU$_DFHDR_CHARSET_ID          CONSTANT NUMBER := 5;
–    dbms_datapump.KU$_DFHDR_CREATION_DATE       CONSTANT NUMBER := 6;
–    dbms_datapump.KU$_DFHDR_FLAGS               CONSTANT NUMBER := 7;
–    dbms_datapump.KU$_DFHDR_JOB_NAME            CONSTANT NUMBER := 8;
–    dbms_datapump.KU$_DFHDR_PLATFORM            CONSTANT NUMBER := 9;
–    dbms_datapump.KU$_DFHDR_INSTANCE            CONSTANT NUMBER := 10;
–    dbms_datapump.KU$_DFHDR_LANGUAGE            CONSTANT NUMBER := 11;
–    dbms_datapump.KU$_DFHDR_BLOCKSIZE           CONSTANT NUMBER := 12;
–    dbms_datapump.KU$_DFHDR_DIRPATH             CONSTANT NUMBER := 13;
–    dbms_datapump.KU$_DFHDR_METADATA_COMPRESSED CONSTANT NUMBER := 14;
–    dbms_datapump.KU$_DFHDR_DB_VERSION          CONSTANT NUMBER := 15;
– For Oracle11gR1:
–    dbms_datapump.KU$_DFHDR_MASTER_PIECE_COUNT  CONSTANT NUMBER := 16;
–    dbms_datapump.KU$_DFHDR_MASTER_PIECE_NUMBER CONSTANT NUMBER := 17;
–    dbms_datapump.KU$_DFHDR_DATA_COMPRESSED     CONSTANT NUMBER := 18;
–    dbms_datapump.KU$_DFHDR_METADATA_ENCRYPTED  CONSTANT NUMBER := 19;
–    dbms_datapump.KU$_DFHDR_DATA_ENCRYPTED      CONSTANT NUMBER := 20;
– For Oracle11gR2:
–    dbms_datapump.KU$_DFHDR_COLUMNS_ENCRYPTED   CONSTANT NUMBER := 21;
–    dbms_datapump.KU$_DFHDR_ENCPWD_MODE         CONSTANT NUMBER := 22;

– For Oracle10gR2: KU$_DFHDR_MAX_ITEM_CODE       CONSTANT NUMBER := 15;
– For Oracle11gR1: KU$_DFHDR_MAX_ITEM_CODE       CONSTANT NUMBER := 20;
– For Oracle11gR2: KU$_DFHDR_MAX_ITEM_CODE       CONSTANT NUMBER := 22;

dbms_output.put_line(’Disk Path: ’ || v_path);

IF v_filetype = 1 OR v_filetype = 2 THEN
– Get characterset name:
BEGIN
SELECT var_values(5) || ’ (’ || nls_charset_name(var_values(5)) ||
‘)’ INTO var_values(5) FROM dual;
EXCEPTION WHEN OTHERS THEN null;
END;
IF v_filetype = 2 THEN
dbms_output.put_line(
‘Filetype.: ’ || v_filetype || ’ (Original Export dumpfile)’);
dbms_output.put_line(v_separator);
SELECT DECODE(var_values(13), ’0′, ’0 (Conventional Path)’,
‘1′, ’1 (Direct Path)’, var_values(13))
INTO var_values(13) FROM dual;
dbms_output.put_line(’…Characterset ID.: ’ || var_values(5));
dbms_output.put_line(’…Direct Path…..: ’ || var_values(13));
dbms_output.put_line(’…Export Version..: ’ || var_values(15));
ELSIF v_filetype = 1 THEN
dbms_output.put_line(
‘Filetype.: ’ || v_filetype || ’ (Export Data Pump dumpfile)’);
dbms_output.put_line(v_separator);
SELECT SUBSTR(var_values(1), 1, 15) INTO v_fileversion FROM dual;
SELECT DECODE(var_values(1),
‘0.1′, ‘0.1 (Oracle10g Release 1: 10.1.0.x)’,
‘1.1′, ‘1.1 (Oracle10g Release 2: 10.2.0.x)’,
‘2.1′, ‘2.1 (Oracle11g [...]

如何从逻辑备份的dumpfile文件里获取DDL脚本?

在数据库的管理工作中,难免会遇到使用Export/Import或者是EXPort Data Pump/IMPort Data Pump工具来执行逻辑备份、恢复的场景。在有些时候,我们可能会对产生的dumpfile的内容感兴趣。本文就这两种工具产生的逻辑备份文件分别描述如何获取数据定义语句(Data Definition Language)的脚本?
1 先来看,如何从传统的Export工具产生的dumpfile里获取DDL语句?
首先,导出HR用户的所有对象:
rac1-> id

uid=1101(oracle) gid=1000(oinstall) groups=1000(oinstall),1201(asmdba),1300(dba),1301(oper)

rac1-> pwd

/home/oracle

rac1-> ls -l

total 24

drwxrwxr-x 17 root   root      4096 May 26 21:20 12419321

-rw-r–r–  1 oracle oinstall 15626 Aug 31 14:28 db.rsp

drwxr-x—  3 oracle oinstall  4096 Aug 31 15:03 oradiag_oracle

rac1-> exp hr/hr file=exp_hr.dmp log=exp_hr.log owner=hr

Export: Release 11.2.0.1.0 – Production on Mon Nov 21 [...]

ORA-39142 IMPDP跨版本导入数据报错解决

前几天,公司某项目组搭建一套演示应用系统,需要将后台的Oracle数据从一台服务器迁移到另外一套系统。在执行IMPDP导入的过程遭遇下述错误,后经查找Metalink给出解决方法。
-bash-3.2$ impdp directory=mig_dir dumpfile=dms_expdp.dmp logfile=impdp.log schemas=dms
Import: Release 10.2.0.5.0 – 64bit Production on Thursday, 10 November, 2011 3:12:56
Copyright (c) 2003, 2007, Oracle. All rights reserved.
Username: sys/oracle as sysdba
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39001: invalid argument value
ORA-39000: bad dump file [...]

Oracle 数据逻辑恢复及权限控制一例

近日,应公司内部东南亚Regional Integrated Management Information System项目组需求,完成下述测试环境的搭建:
1 在现有开发库中,创建一个新的名为RIMISADMIN的schema,将现有RIMIS这个schema下的所有数据逻辑备份出来并导入到新建的RIMISADMIN这个schema下;
2 另外创建一个新的测试schema 名为RIMISTEST,该测试schema与RIMISADMIN公用一份数据,并限制其权限仅可以执行DML语句,对数据表有增删改查功能,不允许执行DDL语句,同时不允许对如下表执行DML语句操作:
cd_menu;cd_functionpoint;cd_menu_function;cd_office_fmenu;cd_role_fmenu;cd_office_biz_config;
cd_serial_no;cd_codedict;cd_codetype;edi_code_table;edi_code_type;pr_report_config;
上述内容是公司同事发给我的一封邮件,当然是我与需求同事沟通确认后,整理出来的需求信息。
我的解决思路:
1 在现有RAC数据库中将RIMIS schema用户下的所有数据用EXPDP按照schema模式全部逻辑导出;
2 准备使用IMPDP工具附带remap_schema=rimis:rimisadmin参数全部导入,在这一步执行之前确认RAC数据库的存储信息时,发现ASM磁盘组的总空间为236G,剩余空间只有区区的30G左右。而原有RIMIS schema下的所有数据在数据库中占用将近55G的空间,看来不能直接在这台RAC数据库上搭建这个测试环境,除非先给ASM磁盘组添加磁盘,而开发库又需要给各个项目组使用,不好直接停服务加磁盘,怕影响其他项目组进度。只好选择一种迂回的方案,先将测试环境搭建到另外一套数据库中,等有机会的话,再停RAC数据库,然后添加存储之后另作处理。
3 在新的测试环境上执行逻辑导入,导入之前,在新环境下创建必要的表空间,表空间名需要与原环境下RIMIS用户对象所在表空间名相同,否则,在导入时就得指定REMAP_TABLESPACE选项了,不然,就不可能顺利导入。具体的导入的命令如下:

impdp directory=mig_dir dumpfile=expdp_rimis_20111114.dmp logfile=impdp_rimis.log  remap_schema=rimis:rimisadmin exclude=table_statistics

4 导入之后,发现有些对象编译失效,图省事,执行下述命令直接编译RIMISADMIN schema下的所有对象:
SQL> exec dbms_utility.compile_schema(’RIMISADMIN’);
5 以SYS用户登录数据库,修改RIMISADMIN schema的口令,并确认RIMISADMIN 可以正常访问数据库;
[oracle@OEL511gR2 mig_dir]$ rlwrap sqlplus / as sysdba
SQL*Plus: Release 10.2.0.5.0 – Production on Wed Nov 16 16:10:42 2011
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 – [...]

解析Oracle rowid系列三(完)

承接解析Oracle rowid系列一、系列二。今天,我们来探讨特定场景下的Oracle rowid,大文件表空间下的Oracle rowid。大文件的表空间是Oracle 10g的新特性,关于该特性暂且不作过多表述,简单一句话来说,同小文件类型的表空间(数据库默认的表空间类型)相比,该类型的表空间只能包含一个而且最多只能有一个数据文件。正是因为如此,所以位于大文件类型表空间下的表的rowid显得有些特殊,接下来我们探讨究竟特殊在哪儿?
首先,准备场景,建立大文件表空间,并在该表空间下建立一张普通的Heap表。
SQL> conn / as sysdba;
Connected.
SQL> select * from v$version;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
PL/SQL Release 11.2.0.1.0 – Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 – Production
NLSRTL Version 11.2.0.1.0 – Production
SQL> create bigfile tablespace big_tbs datafile size 10m autoextend on;
Tablespace [...]

解析Oracle rowid系列二

在解析Oracle rowid系列一里,我们简单探讨了Oracle rowid的格式及获取rowid的方法,在本篇中我们探讨的主题是:通过Oracle rowid真的可以唯一定位到表的一条记录吗?或者说在同一Oracle数据库中,rowid就一定唯一、没有重复的吗?
实验步骤:
1 构建cluster table并插入测试数据:
SQL> conn / as sysdba;
Connected.
SQL> select * from v$version;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
PL/SQL Release 11.2.0.1.0 – Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 – Production
NLSRTL Version 11.2.0.1.0 – Production
SQL> conn hr/hr;
Connected.
SQL> create cluster dept_emp_cluster(department_id number(4));
Cluster created.
SQL> create [...]