创建物化视图的一个例子

创建一个物化视图用来提高查询数据速度,要创建的视图是sj_jf_zgyb_dw,和sj_jf_zgyb_dw表,这里使用的是将视图sj_jf_zgyb_dw查询出来的数据存储在相应的sj_jf_zgyb_dw表中来减少以后查询相同的数据不用再从视图中获取而提高速度.
— Create table

create table SJ_JF_ZGYB_DW
(
  XZDM       VARCHAR2(64),
  XZQHDM     VARCHAR2(6),
  TCQDM      VARCHAR2(6),
  DWBH       VARCHAR2(64),
  FKSSQ      VARCHAR2(6),
  FKSSQ_DY   VARCHAR2(6),
  DZRQ_DW    VARCHAR2(8),
  ZJFS       VARCHAR2(2),
  JFLX       VARCHAR2(1),
  JFJE_DW_YJ NUMBER(38,6),
  JFJE_DW_SJ NUMBER(38,6),
  JFJE_DWHGR NUMBER(38,6),
  JFJS_DW    NUMBER(38,6),
  JFBL_DW    NUMBER(38,6),
  JFRS_YJ    NUMBER(38,6),
  JFRS_SJ    NUMBER(38,6),
  DZBZ_DW    VARCHAR2(1)
)
tablespace HYGEIA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns
comment on column SJ_JF_ZGYB_DW.XZDM
  is '险种名称        该项填“城镇职工基本医疗保险”                                                                                                  ';
comment on column SJ_JF_ZGYB_DW.XZQHDM
  is '行政区划代码      指社保机构所在地的行政区划代码,参照GB/T2260-2007中华人民共和国行政区划代码填列。                                                                  ';
comment on column SJ_JF_ZGYB_DW.TCQDM
  is '统筹区代码       指此险种的统筹区,填列所属统筹区的行政区划代码。                                                                                         ';
comment on column SJ_JF_ZGYB_DW.DWBH
  is '单位编号        指系统内单位的唯一标识                                                                                                      ';
comment on column SJ_JF_ZGYB_DW.FKSSQ
  is '费款所属期       指核定用人单位或个人社会保险费时的年月,表示方式为YYYYMM                                                                                  ';
comment on column SJ_JF_ZGYB_DW.FKSSQ_DY
  is '对应费款所属期     指核定的社会保险费应收取年月或社会保险待遇应付出年月,表示方式为YYYYMM当对应费款所属期小于费款所属期时,为补收或补发;当对应费款所属期等于费款所属期时,为正常缴费/待遇;当对应费款所属期大于费款所属期时,为趸缴或预支付 ';
comment on column SJ_JF_ZGYB_DW.DZRQ_DW
  is '单位到帐日期      指社保机构实际收到社会保险费时的日期,通常采用自然日期,表示方式为YYYYMMDD。当原始数据仅能精确到月份,而无法确定到“日”时,统一设为当月第一天。                                     ';
comment on column SJ_JF_ZGYB_DW.ZJFS
  is '征缴方式        指社保机构收取社会保险费的方式,按下列代码填列:1-银行托收,2-税务代征/税务全责征收,3-经办机构自收,4-学校代收,5-社区代收 ,99-其他                                       ';
comment on column SJ_JF_ZGYB_DW.JFLX
  is '缴费类型        按下列代码填列:1-正常,2-补缴,3-退费,4-预交,5-缓缴                                                                                 ';
comment on column SJ_JF_ZGYB_DW.JFJE_DW_YJ
  is '单位应缴金额      指用人单位应缴纳的社会保险费金额。不可为空,可填0                                                                                        ';
comment on column SJ_JF_ZGYB_DW.JFJE_DW_SJ
  is '单位实缴金额      指用人单位实际缴纳的社会保险费金额。不可为空,可填0                                                                                       ';
comment on column SJ_JF_ZGYB_DW.JFJE_DWHGR
  is '单位金额划个人账户金额 指从用人单位实际缴纳的社会保险费中划转记入个人账户的金额。不可为空,可填0                                                                            ';
comment on column SJ_JF_ZGYB_DW.JFJS_DW
  is '单位缴费基数      指单位缴纳社会保险费的基数。不可为空,可填0                                                                                           ';
comment on column SJ_JF_ZGYB_DW.JFBL_DW
  is '单位缴费比例      指用人单位缴纳保险费的比例。比例以小数方式表示,如“0.20”                                                                                  ';
comment on column SJ_JF_ZGYB_DW.JFRS_YJ
  is '应缴人数        指用人单位当月应缴纳社会保险费人数。不可为空,可填0                                                                                       ';
comment on column SJ_JF_ZGYB_DW.JFRS_SJ
  is '实缴人数        指用人单位当月实际缴纳社会保险费人数。不可为空,可填0                                                                                      ';
comment on column SJ_JF_ZGYB_DW.DZBZ_DW
  is '单位到账标志      按下列代码填列:1-已到账,0-未到账                                                                                              ';



create materialized view SJ_JF_ZGYB_DW
on prebuilt table
WITH REDUCED PRECISION--当与视图相应的表中的字段长度不匹配时减少精度
refresh force on demand
enable query rewrite
as
select '城镇职工基本医疗保险' as XZDM,
       lt.center_id as XZQHDM,
       substr(lt.center_id,0,4) as TCQDM,
       to_char(lt.corp_id) as DWBH,
       lt.calc_prd as FKSSQ,
       to_char(lt.to_pay_date, 'yyyymm') as FKSSQ_DY,
       to_char(lt.fac_pay_date, 'yyyymmdd') as DZRQ_DW,
       '1' as ZJFS,
       to_char(lt.topay_type) as JFLX,
       sum(decode(pm.indi_flag, 1, lc.pay_money, 0)) as JFJE_DW_YJ,
       sum(decode(lt.payed_flag,
                  1,
                  decode(pm.indi_flag, 1, lc.pay_money, 0),
                  0)) as JFJE_DW_SJ,
       Sum(decode(pm.money_id, 5, lc.pay_money, 0)) as JFJE_DWHGR,
       sum(decode(lc.money_id, 4, abs(sign(lc.pay_money) * lc.calc_base), 0)) as JFJS_DW,
       0.07 as JFBL_DW,
       sum(decode(lc.money_id, 4, lc.calc_man_sum, 0)) as JFRS_YJ,
       sum(decode(lc.money_id, 4, lc.calc_man_sum, 0)) as JFRS_SJ,
       decode(lt.payed_flag, 1, '1', '0') as DZBZ_DW
  From lv_insr_topay  lt,
       lv_cropfundpar lc,
       pfs_money_info pm
 Where lt.pay_info_no = lc.pay_info_no
   And pm.money_id = lc.money_id
   And lt.insr_detail_code = 2
   And lt.src_type = 1
/*   And lt.center_id=430701
   And lt.calc_prd between '201201' and '201202'*/
   group by  lt.center_id,
   lt.corp_id,
   lt.calc_prd,
   to_char(lt.to_pay_date, 'yyyymm'),
   to_char(lt.fac_pay_date, 'yyyymmdd'),
   to_char(lt.topay_type),
   decode(lt.payed_flag, 1, '1', '0');

这里是手工刷新数据,因为有上十亿的数,查询的是十几年的医保缴费数据

call  dbms_mview.refresh('SJ_JF_ZGYB_DW');

只有.dbf数据文件进行数据库恢复

由于数据库服务器崩溃,造成了无法进入系统进行数据库备份,只能把oracle相关文件拷贝出来。对于拷贝出来的文件在测试机上进行一次不完全恢复,具体流程如下所示:

1、安装oracle 10g服务端并创建一个与要进行恢复的数据库相同名称的实例(db_name,sid,字符集一样,因为在创建控制文件时,会判断你要恢复的dbf文件中文件头信息中的数据库名是否与所在的实例名是否一样)
2、以sysdba身份进行备份控件文件到udmp目录的trace文件(语句:

alter database backup controlfile to trace


3、Shutdown immediate停止数据库,备份当前~\oracle\product\10.2.0\oradata目录中的文件,
接着删除这些文件并把需恢复的数据库的所有.dbf文件拷到此目录下。其中 system01.dbf,sysaux01.dbf和存储真实数据的.dbf文件是必要的
(只要DBF就可以了,日志和控制文件不要)。
4、以sysdba进入并执行startup nomount。把数据库启动到nomount状态。
5、从第2步备份出来trace文件中拷贝CREATE CONTROLFILE部分语句来重建控制文件。此处应根据实际情况增删表空间文件记录,如以下黑体部分则为新增记录。

CREATE CONTROLFILE   set Database ocp  Resetlogs
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 100
  MAXINSTANCES 8
  MAXLOGHISTORY 292
LOGFILE
GROUP 1 'C:\oracle\product\10.2.0\oradata\ocp\RED001.LOG'SIZE 50M,
GROUP 2 'C:\oracle\product\10.2.0\oradata\ocp\RED002.LOG'SIZE 50M,
GROUP 3 'C:\oracle\product\10.2.0\oradata\ocpRED003.LOG'SIZE 50M
DATAFILE
'D:\oradata\SYSTEM01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\UNDOTBS01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\SYSAUX01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\USERS01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\EXAMPLE01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\HYGEIA01.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\HYGEIA02.DBF',--要恢复的数据所在的dbf文件
'D:\oradata\HYGEIA03.DBF'--要恢复的数据所在的dbf文件
CHARACTER SET ZHS16GBK

6

alter database open  resetlogs;

7 重新创建临时表空间
8 查看恢复后结果

第二种情况(其实要恢复数据库只要system01.dbf,sysaux01.dbf和存储真实数据的.dbf文件)
1、安装oracle 10g服务端并创建一个与要进行恢复的数据库相同名称的实例(db_name,sid,字符集一样,因为在创建控制文件时,会判断你要恢复的dbf文件中文件头信息中的数据库名是否与所在的实例名是否一样)
2、以sysdba身份进行备份控件文件到udmp目录的trace文件(语句:alter database backup controlfile to trace)
3、Shutdown immediate停止数据库,备份当前~\oracle\product\10.2.0\oradata目录中的文件,接着删除这些文件并把需恢复的数据库的所有.dbf文件拷到此目录下。其中 system01.dbf,sysaux01.dbf和存储真实数据的.dbf文件是必要的
(只要DBF就可以了,日志和控制文件不要)。
4、以sysdba进入并执行startup nomount。把数据库启动到nomount状态。
5、从第2步备份出来trace文件中拷贝CREATE CONTROLFILE部分语句来重建控制文件。此处应根据实际情况增删表空间文件记录,如以下黑体部分则为新增记录。

CREATE CONTROLFILE   set Database ocp  resetlogs
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 100
  MAXINSTANCES 8
  MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\oracle\product\10.2.0\oradata\ocp\RED001.LOG'SIZE 50M,
GROUP 2 'D:\oracle\product\10.2.0\oradata\ocp\RED002.LOG'SIZE 50M,
GROUP 3 'D:\oracle\product\10.2.0\oradata\ocp\RED003.LOG'SIZE 50M
DATAFILE
'D:\oracle\product\10.2.0\oradata\ocp\SYSTEM01.DBF',--损坏的数据库的system表空间的数据文件
'D:\oracle\product\10.2.0\oradata\ocp\SYSAUX01.DBF',--损坏的数据库的sysaux表空间的数据文件
'D:\oracle\product\10.2.0\oradata\ocp\HYGEIA01.DBF',--要恢复的数据所在的dbf文件
'D:\oracle\product\10.2.0\oradata\ocp\HYGEIA02.DBF', --要恢复的数据所在的dbf文件
'D:\oracle\product\10.2.0\oradata\ocp\HYGEIA03.DBF'  --要恢复的数据所在的dbf文件
CHARACTER SET ZHS16GBK

6、

Shutdown immediate

7、在admin\pfile目录下的init.ora里加入隐含参数:

_allow_resetlogs_corruption=true
_allow_terminal_recovery_corruption=true
undo_tablespace='SYSTEM'
undo_management='MANUAL'

8、执行

startup pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\init.ora(文件名和目录按照实际情况而定)' mount force;

9、

Recover database\ recover database until cancel

进行介质恢复。
10、

Alter database open resetlogs

打开数据库可能不成功:此处出现了ORA-03113 ” ORA-03113: 通信通道的文件结尾”的错误提示。
11、 重新启动数据库(startup) ,结果出现以下错误提示:
ora-01113:文件1需要介质恢复
ora-01110:数据文件1:’D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF’
12、 从新恢复表空间文件

recover datafile D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF

(其它表空间文件可能也需要恢复)
13、

alter database open;

数据库已更新
14.重新创建UNDOTBS1表空间

create undo tablespace undotbs1 DATAFILE
'D:\oracle\product\10.2.0\oradata\orcl\undotbs01.dbf' SIZE 200M

15、

Shutdown immediate

16、在admin\pfile目录下的init.ora里删除隐含参数:
删除_allow_resetlogs_corruption=true
删除_allow_terminal_recovery_corruption=true
undo_tablespace=’UNDOTBS1′
undo_management=’AUTO’
17.

startup pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\init.ora

18、 full export备份数据库。
19 重新创建临时表空间
20 查看恢复后结果

10g关闭归档/启用闪回恢复区归档

一、关闭归档

  1、启动SQL*PLUS以管理身份登录Oracle数据库:

  SQL> connect / as sysdba

  2、关闭数据库实例

  SQL> shutdown immediate

  3、备份数据库:在对数据库做出任何重要的改变之前,建议备份数据库以免出现任何问题。
  4、启动一个新的实例并装载数据库,但不打开数据库:

  SQL> startup mount

  5、禁止自动存档

  SQL> alter system archive log stop;

  6、禁止存档联机重做日志:转换数据库的存档模式。

  SQL> alter database noarchivelog ;

  7、打开数据库:

  SQL> alter database open ;

  8、察看已连接实例的存档信息:

  SQL> archive log list ;

  数据库日志模式 非存档模式
  自动存档 禁用
  存档终点 E:oraclearc
  最早的联机日志序列 50
  当前日志序列 52
  二、启用闪回恢复区归档(Oracle 10g新特性)-Oracle数据库安装完成后首次创建自动归档日志
  1、启动SQL*PLUS以管理身份登录Oracle数据库:

  SQL> connect / as sysdba

  2、关闭数据库实例

  SQL> shutdown immediate

  3、备份数据库:在对数据库做出任何重要的改变之前,建议备份数据库以免出现任何问题。
  4、启动一个新的实例并装载数据库,但不打开数据库:

  SQL> startup mount

  5、转换数据库的存档模式为归档方式:

  SQL> alter database archivelog ;

  6、打开数据库:

  SQL> alter database open ;

  7、在数据库实例启动后允许自动存档方式:

  SQL> alter system archive log start ;

  8、通过资源管理器察看flash_recovery_area的日志文件结构快照如下:
  9、启用回闪:

  SQL>alter database flashback on;

  10、闪回区默认的存储空间为2G,修改FLASH_RECOVERY_AREA空间为20GB和快速恢复区的目录

    SQL> alter system set db_recovery_file_dest='D:\oracle\product\10.2.0\flash_recovery_area'
    SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g ;
    

使用logminer来分析对表所做的修改

使用logminer来分析对表所做的修改
1.设置初始化参数UTL_FILE_DIR 以指定一个允许 PL/SQL 文件 I/O 的目录

utl_file_dir='D:\oracle\log';

2.执行 BMS_LOGMNR_D.BUILD 过程以创建字典文件

execute dbms_logmnr_d.build('ocp.ora','D:\oracle\log');

指定要分析的日志文件
3.设置 V$LOGMNR_CONTENTS 视图:
初始化新列表并指定第一个日志文件

SQL> execute dbms_logmnr.add_logfile('D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO01.LOG',dbms_logmnr.new);

PL/SQL 过程已成功完成。

向列表中添加其它日志文件

SQL> execute dbms_logmnr.add_logfile('D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\REDO02.LOG',dbms_logmnr.addfile);

PL/SQL 过程已成功完成。

设置 LogMiner 会话
一旦创建了字典文件您就可以开始分析重做日志第一步是使用
DBMS_LOGMNR.ADD_LOGFILE 过程指定要分析的日志文件
使用下列常量
? DBMS_LOGMNR.NEW 创建一个新列表并指定第一个日志文件
? DBMS_LOGMNR.ADDFILE 向列表中添加其它日志文件
? DBMS_LOGMNR.REMOVEFILE 从列表中删除重做日志
LogMiner 可以分析联机和归档日志文件
开始分析重做日志文件
初始化 LogMiner 会话:

EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME=>'D:\oracle\log\ocp.ora');

4.创建一个中间表用来存储对lv_insr_topay表的dml操作记录

create table jy_logmnr
(sql_redo varchar2(4000),
sql_undo varchar2(4000)
);

insert into jy_logmnr
SELECT sql_redo,SQL_UNDO FROM v$logmnr_contents WHERE seg_name = 'LV_INSR_TOPAY';

select * from jy_logmnr;
SQL> select * from jy_logmnr ;

SQL_REDO                                                                         SQL_UNDO
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
insert into "INSUR_CHANGDE"."LV_INSR_TOPAY"("PAY_INFO_NO","CALC_PRD","PAY_MONEY" delete from "INSUR_CHANGDE"."LV_INSR_TOPAY" where "PAY_INFO_NO" = '17524467' and

也可以运行

SELECT timestamp, username, sql_redo,SQL_UNDO
FROM v$logmnr_contents
WHERE seg_name = 'LV_INSR_TOPAY';

SQL> SELECT timestamp, username, sql_redo,SQL_UNDO
  2  FROM v$logmnr_contents
  3  WHERE seg_name = 'LV_INSR_TOPAY';


TIMESTAMP   USERNAME                       SQL_REDO                                                                         SQL_UNDO
----------- ------------------------------ -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
2012-1-1 13                                insert into "INSUR_CHANGDE"."LV_INSR_TOPAY"("PAY_INFO_NO","CALC_PRD","PAY_MONEY" delete from "INSUR_CHANGDE"."LV_INSR_TOPAY" where "PAY_INFO_NO" = '17524467' and

5.完成 LogMiner 会话:

EXECUTE DBMS_LOGMNR.END_LOGMNR;

创建外部表

一,先在操作系统中创建目录 data,bad,log,dis
以下是外部文件中的记录

20080629,修改,1301110022,邹雪辉,01110022
20080629,修改,1302050023,王晓斌,02050023
20080629,修改,1306060130,邵静,06060130
20080629,修改,1304020386,张晋,04020386
20080629,修改,1301070082,许征,01070082

二,在数据库中创建目录

SQL> create or replace directory data_log as 'D:\oracle\data';--用于存放外部表数据文件

Directory created

SQL> create or replace directory bad_log as 'D:\oracle\bad';--用于存放查询外部表时错误的文件

Directory created

SQL> create or replace directory dis_log as 'D:\oracle\dis';

Directory created

SQL> create or replace directory log_log as 'D:\oracle\log';--用于存放日志文件
授予读写权限
SQL> grant read,write on directory data_dir to insur_changde;

Grant succeeded

SQL> grant read,write on directory bad_dir to insur_changde;

Grant succeeded

SQL> grant read,write on directory dis_dir to insur_changde;

Grant succeeded

SQL> grant read,write on directory log_dir to insur_changde;

Grant succeeded

三.创建外部表

create table wbb
(rowno varchar2(50),
operation varchar2(50),
iphone varchar2(50),
username varchar2(50),
userid varchar2(50)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_dir

ACCESS Parameters
(
RECORDS DELIMITED BY NEWLINE
badfile  bad_dir:'test.bad'
logfile log_dir:'test.log'
discardfile dis_dir:'test.dis'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
rowno,
operation,
iphone,
username,
userid
)
)
LOCATION('extenal.dat')
)reject limit unlimited
四.查询外部表验证数据
select * from wbb t;

120080629修改1301110022邹雪辉01110022
220080629修改1302050023王晓斌02050023
320080629修改1306060130邵静06060130
420080629修改1304020386张晋04020386
520080629修改1301070082许征01070082

今天因为要转换10万条数据到新系统中来,特意的想使用一下外部表,实践证明是可行的,以上只是一这简单的例子

不同shutdown命令的区别

SHUTDOWN NORMAL:

不允许新的连接、等待会话结束、等待事务结束、做一个检查点并关闭数据文件。启动时不需要实例恢复。

SHUTDOWN TRANSACTIONAL:

不允许新的连接、不等待会话结束、等待事务结束、做一个检查点并关闭数据文件。启动时不需要实例恢复。

SHUTDOWN IMMEDIATE:

不允许新的连接、不等待会话结束、不等待事务结束、做一个检查点并关闭数据文件。没有结束的事务是自动rollback的。启动时不需要实例恢复。

SHUTDOWN ABORT:

不允许新的连接、不等待会话结束、不等待事务结束、不做检查点且没有关闭数据文件。启动时自动进行实例恢复。

当oracle丢失所有控制文件后可以重新创建控制文件来恢复数据库

当oracle丢失所有控制文件后可以重新创建控制文件来使数据库正常打开

重新创建控制文件的方法如下:
第一步是查询出该数据的所有日志文件,数据文件和控制文件

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------

D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO03.LOG
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO02.LOG
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO01.LOG
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO01A.LOG
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO02A.LOG
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO03A.LOG

6 rows selected.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------

D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\SYSTEM01.DBF
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\UNDOTBS01.DBF
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\SYSAUX01.DBF
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\USERS01.DBF
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\EXAMPLE01.DBF
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\OCP
D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\RCAT_TS

7 rows selected.

SQL> select value from v$parameter where name='control_files';

VALUE
--------------------------------------------------------------------------------

D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\CONTROL01.CTL, D:\ORACLE\PRODUCT\10.1.0\ORA

DATA\OCP\CONTROL02.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\CONTROL03.CTL, D:\O

RACLE\PRODUCT\CONTROL04.CTL

第二步是关闭数据库

shutdown

第三步是备份所有的日志文件和数据文件
第四步是启动数据库到nomount的状态

startup nomount

第五步是重新创建控制文件,当重新创建控制文件时如果你丢失了一个要添加到新创建的控制文件中的一个日志组,
在这种情况下数据库要从丢失该日志组的情况下恢复,如果你要重命名数据库的话你就是使用RESETLOGS语句,否则
你就使用NORESETLOGS语句.

CREATE CONTROLFILE reuse set
 DATABASE ocp noresetlogs
LOGFILE GROUP 1 ('D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO01.LOG',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO01A.LOG') size 200m ,
GROUP 2 ('D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO02.LOG',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO02A.LOG') size 200m,
GROUP 3 ('D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO03.LOG',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\REDO03A.LOG') size 200m
RESETLOGS
DATAFILE 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\UNDOTBS01.DBF' ,
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\SYSAUX01.DBF' ,
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\USERS01.DBF' ,
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\OCP\EXAMPLE01.DBF'
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6

第六步是在脱机的磁盘上备份你新创建的控制文件
第七步是编辑初始化参数文件修改control_files参数指向你重新创建的参数文件
第八步打开数据库,

alter database open;

如果你在重新创建控制文件时使用了resetlogs语句的话那么在打开数据库时
就得用

alter database open resetlogs

来打开数据库.

linux安装oracle rac机器的时间同步问题

在安装oracle rac所有节点的时间要同步

Linux自带了ntp服务 — /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个timeserver的角色,让其他机器和他同步时间
配置文件就是/etc/ntp.conf。

现在让两台机器做时间同步
weblogic30 — 10.138.130.30和weblogic29 — 10.138.130.29做时间同步。
在时间同步前两台机器的时间是不一至的

[root@weblogic29 ~]# date
Wed Nov  7 10:48:42 CST 2012

[root@weblogic30 ~]# date
Wed Nov  7 10:51:53 CST 2012

weblogic29做time server,weblogic29本身不和其他机器时间同步,就是取本地时间。
所以,先把weblogic29机器的时间调准了:

[root@weblogic29 ~]date --set "01/23/2011 10:49"

也可以就用当前weblogic29机时所显示的时间

[root@weblogic29 ~]clock -w
[root@weblogic29 ~]hwclock --systohc

后两个命令是把设置的时间写到硬件时间中去(也就是CMOS里面的时间)。

然后将weblogic29配置成一个time server,修改/etc/ntp.conf,

[root@weblogic29 ~]vi /etc/ntp.conf

其他的配置不怎么需要改,只需要关注restrict的配置:

加入:

restrict 10.138.130.0 mask 255.255.255.0 -- 让10.138.130网段上的机器能和本机做时间同步

这样就可以了,记得下面的:

server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

这两行需要,这是让本机的ntpd和本地硬件时间同步。

当然,我们也可以添加server xxx.xxx.xxx.xxx,让他和其他的time server时间同步。

[root@weblogic29 ~]/etc/init.d/ntpd restart

[root@weblogic29 ~]chkconfig ntpd on

修改iptables配置,将tcp和udp 123端口开放,这是ntp需要的端口,
在/etc/services中可以查到这个端口。

3
这样weblogic29就成为一台time server了,现在我们配置weblogic30这台机器,也是修改/etc/ntp.conf ,

[root@weblogic30 ~]vi /etc/ntp.conf

restrict default ignore这行保留为注释状态,因为不需要做time server

注释掉server 127.127.1.0, fudge 127.127.1.0 stratum 10这两行,因为这台机器不需要和本地硬件时钟同步了。

加入server 10.138.130.29这行,和weblogic29机器同步。

这样就OK了。看看时间,已经和weblogic29同步了。往后默认配置好像是5分钟和time server同步一次。ntpdate命令是显式的和某台机器做时间同步,以前将ntpdate放到crontab中定期同步也是可以的,但是既然ntpd本身就可以做这个时间

4.将ntpdate放到crontab中定期步也是可以的

[root@weblogic30 ~]#vi ntpupdate.sh
/usr/sbin/ntpdate 10.138.130.29
[root@weblogic30 ~]#chmod 755 ntpupdate.sh

crontab可以定时去执行你要做的动作
直接用crontab命令编辑
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
一般使用crontab -e来编辑一个计划动作,编辑模式同vi编辑器相同
crontab内的基本编辑格式如下
*  *  *  *  *  command
分  时  日  月 周  命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /etc/init.d/smb restart
上面的例子表示每晚的21:30重启smb 。
45 4 1,10,22 * * /etc/init.d/smb restart
上面的例子表示每月1、10、22日的4 : 45重启smb 。
10 1 * * 6,0 /etc/init.d/smb restart
上面的例子表示每周六、周日的1 : 10重启smb 。
0,30 18-23 * * * /etc/init.d/smb restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启smb 。
0 23 * * 6 /etc/init.d/smb restart
上面的例子表示每星期六的11 : 00 pm重启smb 。
* */1 * * * /etc/init.d/smb restart
每一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
每月的4号与每周一到周三的11点重启smb
0 4 1 jan * /etc/init.d/smb restart
一月一号的4点重启smb
现在让weblogic30每分钟与weblogic29做一次时间同步

[root@weblogic30 ~]#crontab -e
*/1 * * * * /root/ntpupdate.sh

[root@weblogic30 ~]#/etc/init.d/crond restart

在同步后两台机器时间显示如下:

[root@weblogic30 ~]# date
Wed Nov  7 11:13:04 CST 2012

[root@weblogic29 ~]# date
Wed Nov  7 11:13:06 CST 2012

oracle的undo的作用

undo表空间与redo日志文件在oracle中的作用非常重要,重做日志用于从一个实例故障或介质故障中恢复数据库.在应用程序试图回退(撤消)一个事务处理时,不使用重做日志.在这种情况下,oracle将从回退段恢复旧信息,它还有oracle的另一个强大的特性—多版本读取一致性(multi-version read consistency).

undo中数据的特点:
是数据修改前的备份,主要是保证用户的读一致性,在事务修改数据时产生
至少保存到事务结束
undo数据的作用:
回滚(rollback)操作,实现读一致性与闪回查询,从失败的事务中还原数据
, 非正常停机后的实例恢复
undo回滚段的特点:
回滚段是由实例自动创建用于支持事务运行的专用段,同样是区和块组成,回滚 段会按实际需要自动进行增长或收缩,是一段可以给指定事务循环使用的存储缓冲区
每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务
当一个事务开始的时候,会指定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。
在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完,如果当前的盘区不够用,事务会在段中请求扩展下一个盘区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用.
回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。
回滚段中的数据主要分为以下几种
Uncommitted undo information; 未提交的回滚数据,该数据所关联的事务并未提交,用于实现读一致性,所以该数据不能被其它事务的数据所覆盖
Committed undo information;已经提交但未过期的回滚数据,该数据关联的事务已经提交,但是仍受到undo retention参数保持时间的影响
Expired undo information;事务已经提交,而且数据保存时间已经超过undo retention参数指定的时间,属于已经过期的数据
当回滚段满了后,会优先覆盖Expired undo information,当过期数据空间用完后,会再覆盖Committed undo information的区域,这时undo retention参数所规定的保持时间会被破坏,Uncommitted undo information的数据是不允许覆盖的,如果要求提交的数据在undo retention参数规定的时间内不会被覆盖,可以在undo表空间上指定RETENTION GUARANTEE,语法如下:
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
undo数据与redo数据的区别:
undo记录数据修改之前的操作,redo记录磁盘数据将要进行的操作.
undo用于数据的回滚操作,和实现一致性读,redo用于前滚数据库操作
undo存储在回滚段里,redo存储在重做日志文件里
undo用于在多用户并发的系统里保证一致性读,redo用于防止数据丢失
与undo有关的相关参数
undo_management = auto 自动的undo表空间管理
undo_tablespace = undotbs1 设置undo表空间的名称,可以存在多个undo表空间,但同时只能使用一个
undo_retention = 1800(秒) 设置快照保存的最少时间,设置后在此时间段内仍有可能会被覆盖
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 强制所有快照必须保存 undo_retention所规定的时间。

Oracle10g 数据泵导出命令 expdp 使用总结

expdp使用

使用EXPDP工具时,其转储文件只能被存放在DIRECTORY对象对应的OS目录中,而不能直接指定转储文件所在的OS目录.因此使用EXPDP工具时,必须首先建立DIRECTORY对象.并且需要为数据库用户授予使用DIRECTORY对象权限.

首先得建DIRECTORY:

SQL> conn /as sysdba
SQL> CREATE OR REPLACE DIRECTORY dir_dump  AS '/u01/backup/';
SQL> GRANT read,write ON DIRECTORY dir_dump TO public;

1) 导出scott整个schema
–默认导出登陆账号的schema

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott_full.dmp
    LOGFILE=scott_full.log

–其他账号登陆, 在参数中指定schemas

$ expdp system/oracle@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott_full.dmp
    LOGFILE=scott_full.log
    SCHEMAS=SCOTT

2) 导出scott下的dept,emp表

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott.dmp
    LOGFILE=scott.log
    TABLES=DEPT,EMP

3) 导出scott下除emp之外的表

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott.dmp
    LOGFILE=scott.log
    EXCLUDE=TABLE:"='EMP'"

4) 导出scott下的存储过程

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott.dmp
    LOGFILE=scott.log
    INCLUDE=PROCEDURE

5) 导出scott下以’E’开头的表

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott.dmp
    LOGFILE=scott.log
    INCLUDE=TABLE:"LIKE 'E%'"   //可以改成NOT LIKE,就导出不以E开头的表

6) 带QUERY导出

$ expdp scott/tiger@db_esuite parfile=/orahome/expdp.par
expdp.par内容:
    DIRECTORY=dir_dump
    DUMPFILE=scott.dmp
    LOGFILE=scott.log
    TABLES=EMP,DEPT
    QUERY=EMP:"where empno>=8000"
    QUERY=DEPT:"where deptno>=10 and deptno< =40"

注: 处理这样带查询的多表导出, 如果多表之间有外健关联, 可能需要注意查询条件所筛选的数据是否符合这样的外健约束, 比如 EMP中有一栏位是 deptno, 是关联dept中的主键, 如果"where empno>=8000"中得出的deptno=50的话, 那么, 你的dept的条件"where deptno>=10 and deptno< =40"就不包含deptno=50的数据, 那么在导入的时候就会出现错误. expdp选项 1. ATTACH 该选项用于在客户会话与已存在导出作用之间建立关联.语法如下: ATTACH=[schema_name.]job_name schema_name用于指定方案名,job_name用于指定导出作业名.注意,如果使用ATTACH选项,在命令行除了连接字符串和ATTACH选项外,不能指定任何其他选项,示例如下:

expdp scott/tiger ATTACH=scott.export_job

2. CONTENT
该选项用于指定要导出的内容.默认值为ALL.语法如下:
CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
当设置CONTENT为ALL 时,将导出对象定义及其所有数据; 为DATA_ONLY时,只导出对象数据; 为METADATA_ONLY时,只导出对象定义,示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY

3. DIRECTORY
指定转储文件和日志文件所在的目录.语法如下:
DIRECTORY=directory_object
directory_object用于指定目录对象名称.需要注意,目录对象是使用CREATE DIRECTORY语句建立的对象,而不是OS 目录,示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump

建立目录:

CREATE DIRECTORY dump as 'd:\dump';

查询创建了那些子目录:

SELECT * FROM dba_directories;

4. DUMPFILE
用于指定转储文件的名称,默认名称为expdat.dmp.语法如下:
DUMPFILE=[directory_object:]file_name[,….]
directory_object用于指定目录对象名,file_name用于指定转储文件名.需要注意,如果不指定directory_object,导出工具会自动使用DIRECTORY选项指定的目录对象,示例如下:

expdp scott/tiger DIRECTORY=dump1 DUMPFILE=dump2:a.dmp

5. ESTIMATE
指定估算被导出表所占用磁盘空间的方法.默认值是BLOCKS.语法如下:
EXTIMATE={BLOCKS | STATISTICS}
设置为BLOCKS时,oracle会按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用的空间,设置为STATISTICS时,根据最近统计值估算对象占用空间,示例如下:
expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
一般情况下, 当用默认值(blocks)时, 日志中估计的文件大小会比实际expdp出来的文件大, 用statistics时会跟实际大小差不多.
6. EXTIMATE_ONLY
指定是否只估算导出作业所占用的磁盘空间,默认值为N.语法如下:
EXTIMATE_ONLY={Y | N}
设置为Y时,导出作用只估算对象所占用的磁盘空间,而不会执行导出作业,为N时,不仅估算对象所占用的磁盘空间,还会执行导出操作,示例如下:

expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y

7. EXCLUDE
该选项用于指定执行操作时要排除的对象类型或相关对象.语法如下:
EXCLUDE=object_type[:name_clause][,….]
object_type用于指定要排除的对象类型,name_clause用于指定要排除的具体对象.EXCLUDE和INCLUDE不能同时使用,示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW

在EXPDP的帮助文件中, 可以看到存在EXCLUDE和INCLUDE参数, 这两个参数文档中介绍的命令格式存在问题, 正确用法是:
EXCLUDE=OBJECT_TYPE[:name_clause][,…]
INCLUDE=OBJECT_TYPE[:name_clause][,…]
示例:

expdp   schema=scott exclude=sequence,table:"in('EMP','DEPT')"
impdp   schema=scott include=function,package,procedure,table:"='EMP'"

有了这些还不够, 由于命令中包含了多个特殊字符, 在不同的操作系统下需要通过转义字符才能使上面的命令顺利执行,
如:

EXCLUDE=TABLE:\"IN('BIGTALE')\"

8. FILESIZE
指定导出文件的最大尺寸,默认为0(表示文件尺寸没有限制).
9. FLASHBACK_SCN
指定导出特定SCN时刻的表数据.语法如下:
FLASHBACK_SCN=scn_value
scn_value用于标识SCN值.FLASHBACK_SCN和FLASHBACK_TIME不能同时使用,示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523

10. FLASHBACK_TIME
指定导出特定时间点的表数据.语法如下:
FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME="TO_TIMESTAMP('25-08-2004 14:35:00','DD-MM-YYYY HH24:MI:SS')"

11. FULL
指定数据库模式导出,默认为N.语法如下:
FULL={Y | N}
为Y时,标识执行数据库导出.
12. HELP
指定是否显示EXPDP命令行选项的帮助信息,默认为N. 当设置为Y时,会显示导出选项的帮助信息,示例如下:
expdp help=y
13. INCLUDE
指定导出时要包含的对象类型及相关对象.语法如下:
INCLUDE=object_type[:name_clause][,… ]
示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp INCLUDE=trigger

14. JOB_NAME
指定要导出作用的名称,默认为SYS_XXX.语法如下:
JOB_NAME=jobname_string
示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp INCLUDE=trigger JOB_NAME=exp_trigger

后面想临时停止expdp任务时可以按Ctrl+C组合键,退 出当前交互模式,退出之后导出操作不会停止,这不同于Oracle以前的EXP. 以前的EXP,如果退出交互式模式,就会出错终止导出任务. 在 Oracle10g中,由于EXPDP是数据库内部定义的任务,已经与客户端无关. 退出交互之后,会进入export的命令行模式,此时支持 status等查看命令:
Export> status
如果想停止改任务,可以发出stop_job命令:
Export> stop_job
如果有命令行提示: “是否确实要停止此作业([Y]/N):” 或 “Are you sure you wish to stop this job ([yes]/no):”, 回答应是yes或者no, 回答是YES以后会退出当前的export界面.
接下来可以通过命令行再次连接到这个任务:

expdp test/test@acf attach=expfull

通过start_job命令重新启动导出:
Export> start_job
Export> status
15. LOGFILE
指定导出日志文件文件的名称,默认名称为export.log.语法如下:
LOGFILE=[directory_object:]file_name
directory_object用于指定目录对象名称,file_name用于指定导出日志文件名.如果不指定directory_object.导出作用会自动使用DIRECTORY的相应选项值,示例如下:

expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log

16. NETWORK_LINK
指定数据库链名,如果要将远程数据库对象导出到本地例程的转储文件中,必须设置该选项.
expdp中使用连接字符串和network_link的区别:
expdp属于服务端工具,而exp属于客户端工具,expdp生成的文件默认是存放在服务端的,而exp生成的文件是存放在客户端.

expdp username/password@connect_string //对于使用这种格式来说,directory使用源数据库创建的,生成的文件存放在服务端。

如何将生成的文件放在目标数据库而不放在源数据库呢,在expdp中使用network_link. 比如在本机expdp远程服务器的数据库,先在本机创建到服务端的dblink,然后创建directory及授权,然后expdp.
a) 创建到服务端的dblink

conn aa/aacc
create database link link_name connect to bb identified by password using 'connect_string';

b) 建立directory

conn / as sysdba
create or replace directory dir as 'directory';
grant read,write on directory dir to bb;

c) 通过network_link导出

expdp aa/aacc directory=dir network_link=link_name ...

17. NOLOGFILE
该选项用于指定禁止生成导出日志文件,默认值为N.
18. PARALLEL
指定执行导出操作的并行进程个数,默认值为1
19. PARFILE
指定导出参数文件的名称.语法如下:
PARFILE=[directory_path:]file_name
20. QUERY
用于指定过滤导出数据的where条件.语法如下:
QUERY=[schema.][table_name:]query_clause
schema 用于指定方案名,table_name用于指定表名,query_clause用于指定条件限制子句.QUERY选项不能 与 CONNECT=METADATA_ONLY,EXTIMATE_ONLY,TRANSPORT_TABLESPACES等选项同时使用,示例如下:

expdp scott/tiger directory=dump dumpfiel=a.dmp Tables=emp query='WHERE deptno=20'

21. SCHEMAS
该方案用于指定执行方案模式导出,默认为当前用户方案.
22. STATUS
指定显示导出作用进程的详细状态,默认值为0.
23. TABLES
指定表模式导出.语法如下:
TABLES=[schema_name.]table_name[:partition_name][,…]
schema_name用于指定方案名,table_name用于指定导出的表名,partition_name用于指定要导出的分区名.
24. TABLESPACES
指定要导出表空间列表.
25. TRANSPORT_FULL_CHECK
该选项用于指定被搬移表空间和未搬移表空间关联关系的检查方式,默认为N.
当设置为Y时,导出作用会检查表空间直接的完整关联关系,如果表所在表空间或其索引所在的表空间只有一个表空间被搬移,将显示错误信息.
当设置为N时,导出作用只检查单端依赖,如果搬移索引所在表空间,但未搬移表所在表空间,将显示出错信息,如果搬移表所在表空间,未搬移索引所在表空间,则不会显示错误信息.
26. TRANSPORT_TABLESPACES
指定执行表空间模式导出.
27. VERSION
指定被导出对象的数据库版本,默认值为COMPATIBLE.语法如下:
VERSION={COMPATIBLE | LATEST | version_string}
为COMPATIBLE时,会根据初始化参数COMPATIBLE生成对象元数据;为LATEST时,会根据数据库的实际版本生成对象元数据.version_string用于指定数据库版本字符串.