分类: Oracle
2010-03-24 19:22:45
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 相关的语句。