Oracle高级培训 第5课 学习笔记
本课笔记中的页码与《Oracle9i 数据库管理基础II Ed 1.1 Vol.2.pdf》对应
指南下载地址:
作者:JackYang (JackYang.sh@gmail.com)
日期:2006-10-17
本课包含多个实验,目前还未通过上机验证。
回顾上节课
不完全介质恢复,一定要在归档模式下进行,不能在非归档模式下进行。
不完全介质恢复,即使只损坏一个文件,都要把数据文件还原。
不完全介质恢复时,控制文件没有损坏,就不要用原来备份的控制文件。
redo log file,是ORACLE数据库的一个副本。
P93
基于取消的恢复
联机重做日志,在归档模式下不允许备份。
P94
一旦发现有联机文件丢失了,可以查看v$log_history;
归档日志序列号到47
48开始在联机重做日志文件中。
所有不完全介质恢复,打开数据库时都要用RESETLOGS
P96
假如控制文件没有丢失,还原的时候,就不用还原。
RECOVER database时,后面已经要加 useing backup controlfile
P97
误删除了一个表空间,用上节课的方法还原不行了。仅仅还原数据文件,不还原控制文件不行。必须用早期的控制文件来恢复,才能恢复表空间。
实验一:
实验目的:恢复被误删除的表空间
1. E:/ora01g> sqlplus /nolog
2. SQL> connect sys/ora123 as sysdba
3. SQL> startup
4. SQL> archive log list
5. SQL> select name from v$tablespace;
6. SQL> create tablespace data1 datafile ‘e:/ora01g/oradata/db1/data1.dbf’ size 2m;
7. SQL> create table dept1 tablespace data1 as select * from scott.dept;
8. SQL> insert into dept1(deptno.dname) values(28,’before drop’);
9. SQL> create tablespace data2 datafile ‘e:/ora01g/oradata/db1/data2.dbf’ size 2m;
10. SQL> create table dept2 tablespace data2 as select * from scott.dept;
11. SQL> insert into dept2(deptno.dname) values(28,’before drop’);
12. SQL> select * from dept1;
13. SQL> select * from dept2;
14. SQL> alter database begin backup;
做一个备份
数据库打开的状态下进行热备份,必须先执行命令alter database begin backup; 把数据文件冻结。把所有的修改不写到数据文件,而是写到redo log file。
15. SQL> host copy E:/ora01g/oradata/db1/*.dbf d:/oradata/db1/hot
16. SQL> alter database end backup;
17. SQL> alter system archive log current;
备份结束马上做一次强行归档
18. SQL> alter database backup controlfile to ‘d:/oradata/db1/hot/con1.ctl’ reuse;
备份控制文件
因为表空间被误删除,必须使用控制文件来恢复
加reuse是为了覆盖备份目录下的原来文件
19. SQL> drop tablespace data1 including contents;
删除表空间的时候,表空间中只要有一个表,就必须加上including contents,否则删不掉表空间
20. SQL> select * from dept1;
查询失败,因为表空间data1已经被删除
21. SQL> select * from dept2;
查询成功,因为表空间data2未被删除
22. SQL> insert into dept2(deptno,dname) values (30,’after drop’);
删除表空间后,插入一条模拟数据
23. SQL> select * from dept2;
24. SQL> commit;
25. SQL> alter system archive log current;
26. SQL> show parameter background_dump_dest;
27. SQL> show parameter user_dump_dest;
E:/ora01g/oradata/db1/udump路径下有alter_db1文件
文件中有一行drop tablespace data1 including contents表明了删除表空间data1的起始时间和结束时间。
28. SQL> shutdown immediate
不完全介质恢复必须在数据库关闭情况下,把所有数据文件还原,所以先关闭数据库。
29. 正常操作,应该把坏的数据库备份以下,redo log file也要备份,这里省了。
30. SQL> host copy d:/oradata/db1/hot/*.dbf e:/ora01g/oradata/db1
还原所有数据文件
31. SQL> host copy d:/oradata/db1/hot/con1.ctl e:/ora01g/oradata/db1/con1.ctl
32. SQL> host copy d:/oradata/db1/hot/con1.ctl e:/ora01g/oradata/db1/con2.ctl
两个控制文件是一样的,所以只需要备份一个。但现在必须还原出两个
33. SQL> startup mount
34. SQL> recover database until time ‘2006-10-12 18:55:20’ using backup controlfile;
去备份目录下查看ARC归档文件存在就回车。归档文件不存在,就要CANCEL
控制文件的路径是初始化参数文件指明的。
using backup controlfile是告诉recover命令要恢复控制文件。
35. SQL> alter database open resetlogs;
36. SQL> select * from dept1;
dept1恢复了
37. SQL> select * from dept2;
before drop纪录有,after drop纪录没有了
38. SQL> select * from v$log;
sequence number恢复到了1
39. SQL> alter system
恢复之后,要对数据库做一次完全备份。不做完全备份,下一次数据库再出故障,就无法恢复。因为现在的backup已经不能用了。
P99
当前重做日志文件丢失
已经备份的重做日志文件丢失没有问题。
redo logo file的内容没有归档的时候丢失了。recover到某个备份的redo logo file丢失,就用CANCEL。
当前是指数据库现在正在使用的文件。
对先前备份的所有数据文件都要还原,否则没法做RECOVER操作。
实验二:
实验目的:当前重做日志文件丢失后的恢复操作
1. 启动ORACLE服务
2. sqlplus /nolog
3. SQL> connect sys/ora123@DB4 as sysdba
网络连接
4. SQL> startup
5. SQL> archive log list
确定数据库在归档模式下
6. SQL> alter database begin backup;
必须先做一个备份
7. SQL> host copy e:/ora01g/oradata/db4/*.dbf d:/oradata/db4/hot
8. SQL> alter database end backup;
9. SQL> alter system archive log current;
current当前正在用的redo log file
active表示redo log file中纪录的信息,与数据库缓冲区中对应的脏数据未写入数据文件。
inactive表示redo log file中纪录的信息,与数据库缓冲区中对应的脏数据已经写入数据文件。
10. SQL> alter database backup controlfile to ‘d:/oradata/db4/hot/con1.ctl’ reuse;
备份控制文件
11. SQL> select * from v$log;
12. SQL> shutdown immediate;
关闭数据库之后,删除ora01g/oradata/db4/路径下的REDO01A和REDO01B
13. SQL> startup mount;
14. SQL> alter database clear logfile group 1;
REDO01A和REDO02B两个redo log file被重建,但是空的。
重建status处于inactive状态的redologfile。
15. SQL> alter database open;
16. SQL> select * from v$log;
17. SQL> shutdown immediate;
关闭数据库之后,模拟故障,把当前使用的REDO03A和REDO03B删掉。
18. SQL> startup mount;
19. SQL> alter database clear logfile group 3;
无法打开
20. SQL> host copy d:/oradata/db4/hot/*.dbf e:/ora01g/oradata/db4
还原所有数据文件
21. SQL> recover database until cancel;
不用控制文件的情况下,recover一下
48号文件是刚才没有归档的
所以要恢复48号文件的时候,要打CANCEL
因为当前的日志文件没有归档,所以CANCEL
22. SQL> alter database open resetlogs;
23. SQL> select * from scott.dept;
24. SQL> select name from v$controlfile;
25. SQL> select name from v$datafile;
实验三:
实验目的:通过网络连接访问ORACLE实例
创建scott数据库
2. sqlplus /nolog
3. SQL> connect scott/tiger@DB4
显示ERROR 访问 PROFILE
4. SQL> select * from dept;
查询失败
5. SQL> select * from emp;
查询失败
6. SQL> connect system/ora123
7. SQL> @?/sqlplus/admin/pupbld
建立profile
8. SQL> connect scott/tiger@DB4
连接成功
9. SQL> exit
退出
实验四:
实验目的:通过环境变量缺省连接
1. set ORACLE_SID_DB4
2. sqlplus /nolog
3. connect sys/ora123 as dba
实验五:
实验目的:配置ORACLE网络连接,配置分2部分,一部分是客户端配置,一部分是服务端配置
oracle安装目录下,由network/admin下有listener.ora
network/admin/sample 路径下有一个listener.ora的sample文件,但这个文件不用。
可以用老师提供的listener.ora的sample文件,配置在服务端。
文件中
LISTENER是listener的名称。
ORACLE服务端,可以1个或多个listener.版本不同都可以。10g可以侦听9i请求,反之亦然。
从oracle9i开始SID_LIST_LISTENER是可有可无的。有这段实现了静态注册。
上面是LISTNER1,那么下面就是SID_LIST_LISTENER1
动态注册,只要数据库启动之后,在1分钟以后,数据库会自动到LISTENER上去注册。
TNSNAMES配置在ORACLE客户端
oracle安装目录下network/admin路径下的TNSNAMES文件
可以参考老师提供的sample文件
初始化参数文件initdb1中和网络连接有关的两行
service_names=’DB1’
instance_name=’DB1’
oracle9i之后版本一定要有这两行,才能实现动态注册。
另外,服务中一定要有TNSlistener服务启动。
关掉这个服务以后,SQL> connect sys/ora123@DB4 as sysdba 会显示no listener的错误
1. lsnrctl
2. lsnrctl>start
凡是静态注册,状态都是UNKNOWN。因为静态注册,数据库没启动,都可以注册。关闭用命令LSNRCTL> stop
3. LSNRCTL> service
4. LSNRCTL> status
5. LSNRCTL> quit
oracle安装目录的network/admin目录下还有一个sqlnet.ora文件
文件中
NAMES.DIRECTORY_PATH=(TNSNAMES)
为了告诉oracle 名字解析的方法
> tnsping DB1
此命令用来验证是否能进行远程连接。
实验六:
实验目的:远程连接数据库
1. sqlplus /no log
2. SQL> connect sys/ora123@DB1 as sysdba
显示 an idle instance表示数据库未打开,要用startup命令打开数据库
3. SQL> startup
4. SQL> select * from v$log;
远程数据库文件相关的就是三个文件,一条命令。
listener.ora和TNSNAMES.ora文件中的HOST不能填LOCALHOST或127.0.0.1,必须填IP地址或机器名,机器名不能带减号或空格。