Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249597
  • 博文数量: 64
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 565
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-18 10:54
文章分类

全部博文(64)

文章存档

2011年(4)

2010年(60)

我的朋友

分类: Oracle

2010-03-24 19:22:45

ocp原厂培训笔记(第五天) 

 whole database=full database+控制文件+归档日志文件
instance recovery (系统掉电)
media recovery (文件删除,介质损坏,需要dba干预)

数据库crash的情况:
redo 组中所有成员损坏,当进程访问的时候才会crash.
控制文件丢失,数据文件也会丢失
undo,或者系统表空间丢失
Keeping a Database Open
After the instance is open, it fails in the case of the
loss of:
• Any control file
• A data file belonging to the system or undo
tablespaces
• An entire redo log group. As long as at least one
member of the group is available, the instance
remains open


unix 环境下可以强制删除文件,windows 文件因为有锁,是没办法强制删除的.
当文件被删除后,要过一段时间系统才会报错.
这种情况下,要用 shutdown abort来关闭数据库,
如果用shutdown immediate; 数据库会hang在那里而报错.(dbwr 写回失败)


如果丢失了某日志文件group 中的一个member,如果丢失的日志组已经被归档了,
你可以重建日志组,重建丢失的文件.
clear,相当于把日志文件清除掉,再重建.
当删除连机日志文件后,alert.log会出现失败的报警.
Loss of a Redo Log File
If a member of a redo log file group is lost, as long as
the group still has at least one member, then:
• The normal operation of the instance is not
affected.
• You receive a message in the alert log notifying
you that a member cannot be found.
• You can restore the missing log file by dropping
the lost redo log member and adding a new
member.
• If the group with the missing log file has been
archived, you can clear the log group to re-create
the missing file.


问:实际操作时,为什么把日志文件干掉之后,alter system switch logfile,
系统还是没有报错.

老师回答:oracle 有一个机制,叫做lazy write,怀疑是它的原因导致的数据库问题。

非mount状态才能拷贝控制文件.


联机日志文件的状态:
current:表示 lgwr正在写这个文件.
active:表示,日志对应的脏数据没写回到数据文件,下次的实例恢复要用到这个日志.

数据库状态: nomount,mount,open;
对应instance状态:started,mount,open(select status from v$instance)

闪回是为了解决逻辑的错误(用户错误)
闪回的类型
闪回库,闪回表,

 

闪回库:
我们可以把数据库打开到只读方式打开.(read only),查询数据数据是否恢复到我们要求的状态,可以在
mount状态下我们再打开闪回功能,恢复到我们希望的状态,最后以alter database open resetlogs方式恢复数据库.
闪回是recover的反方向.

下面情况是闪回不支持的情况
控制文件被恢复或者重建
表空间被删除了
数据文件被缩小了
You cannot use Flashback Database in the following
situations:
• The control file has been restored or re-created.
• A tablespace has been dropped.
• A data file has been shrunk.

闪回表是in-place操作,不会影响数据库的大小,
闪回表的时候,行移动必须被打开(数据库默认表是没有打开行移动的),闪回到一个时间.
logminer 可以挖掘日志,归档或连机日志,来查看时间

闪回表的时候,数据库会对闪回表加DML锁.
Flash back table的时候
不能跨DDL 语句(fore example)
不能对系统表做修改
会产生undo和redo.


练习:
    alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    flash table employees to_timestamp('2009_08_21 11:33:37','yy-mm-dd hh24:mi:ss');
    alter table employees enable row movement;
    update hr.employees set salary=2000;
    flashback table hr.employees to timestamp(systimestamp-3/1440); 闪回到三分钟之前.
   
    查看某个用户下的所有index.并重建这些index.
    select index_name from user_indexes;
    alter index EMP_EMP_ID_PK rebuild;

    闪回表利用的是recycle bin,以下的情况无法闪回
    1.闪回job 不能在系统表空间
    2.字典类型的表空间
    3.purge的表无法回来
   
    练习:
    SQL>conn hr/hr
    SQL>drop table dept
    SQL>drop table dept constraints cascade;
    SQL>show recyclebin
    SQL>flashback table dept before drop;
    把表闪回的时候,相关的外键不会拿出来.

    sys 不能查看 hr帐号下被删除的表.
SQL>conn / as sysdba
    SQL>show recyclebin
看不到的.


flashback query:闪回查询
闪回所有版本查询的内容

举例:
select employee_id,salary from employees as of timestamp t1;


闪回行版本查询:

事务:1,2,3
查找2的事物号,

flashback versions:目的是找到事务ID,闪回事务查询,flashback-transaction-querey

闪回版本查询不能跨DDL语言,不能用在externer表,不能跨DDL语言,不能跨段收缩(segment shrink),
版本查询->找到事物ID->找到UNDO->找到语句->重做

 

11G, T1-T2-T3
分析撤消事务的影响.自动因为T1被删除,T2,和T3需要怎么改变才能让整个事务没有被影响.

移动数据:
SQLLOAD:外部数据家在到内部来
DATAPUMP:外部表通过DATAPUMP传送数据

expdp会自动选择采用
外部表 API 还是 Direct Path API
外部表或直接路径API.

以前的导入导出可以放到客户端(exp ,imp)
新的备份方式都是基于主机的rman,expdp备份都是放在数据库服务器上的(不能放在客户端).


建立目录对象 EXTAB)LOG_DIR
SQL_LOAD
DATAPUMP必须要有目录对象

通过控制文件定义怎么把数据文件加载到段和行,失败的变成BAD文件.
Discarded:过滤不满足条件的语句.
数据文件,控制文件和数据库的控制文件不是一个概念,它们都是ASCII码形式的.
控制文件样例

SQL*Loader Control File (continued)
1 -- This is a sample control file
2 LOAD DATA
3 INFILE ’SAMPLE.DAT’
4 BADFILE ’sample.bad’
5 DISCARDFILE ’sample.dsc’
6 APPEND
7 INTO TABLE emp
8 WHEN (57) = ’.’
9 TRAILING NULLCOLS
10 (hiredate SYSDATE,
deptno POSITION(1:2) INTEGER EXTERNAL(3)
NULLIF deptno=BLANKS,
job POSITION(7:14) CHAR TERMINATED BY WHITESPACE
NULLIF job=BLANKS "UPPER(:job)",
mgr POSITION(28:31) INTEGER EXTERNAL
TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
ename POSITION(34:41) CHAR
TERMINATED BY WHITESPACE "UPPER(:ename)",
empno POSITION(45) INTEGER EXTERNAL
TERMINATED BY WHITESPACE,
sal POSITION(51) CHAR TERMINATED BY WHITESPACE
"TO_NUMBER(:sal,’$99,999.99’)",
comm INTEGER EXTERNAL ENCLOSED BY ’(’ AND ’%’
":comm * 100"
)


控制文件默认是insert(必须空表)
所以改成append(附加方式)

Direct 路径方式比Conventional load,性能速度快,功能差一些.

 

sqlldr  inventory/verysecure control=lab_18_05.ctl

DATAPUMP:
DATAPUMP 调用了下面的包
expdp impdp web-based interface

datapump 有强大的功能,传统导入导出
expdp必须指定目录对象,备份源和目的地都要使用这个参数

重映射: REMAP_DATAFILE=.....
   传输属性:对象,高级代码

expdp hr/hr FULL=y
DUMPFILE=dp_dir1:full1%U.dmp, dp_dir2:full2%U.dmp
FILESIZE=2G PARALLEL=3
LOGFILE=dp_dir1:expfull.log JOB_NAME=expfull

FILESIZE:指定文件最大2G
默认产生几个文件

外部表:
ORACLE有两种类型的外部表
加载进去,利用SQLLOADER临时加载数据.
外部表里没有真正行,行是放在外面的.
如果用下面命令,select * from ....;后台会调用SQLLDR来加载这个表.
create table as select * from 外部表;
只是希望得到里面的统计值,不需要所有记录,这个时候可以把数据存储到外部表.

外部表的目的:ETL(抽区,转换,加载)

9i,SQLLOADER加载,不存在卸载
10G,从源端可以卸载出来,但9I的SQLLOAD没这个功能
外部表只有表名

练习:
create directory d1 as '/home/oracle';
grant all on direcotry d1 to system;
把hr对象导出到所有用户.
sysdba身份不允许对数据做datapump.
必须以normal方式导入导出.

在windows必须为用户赋予批处理登陆的权限,来做sqlloader 相关的语句。

阅读(1366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~