Oracle高级培训 第6课 学习笔记
作者:JackYang (JackYang.sh@gmail.com)
日期:2006-10-18
本课包含多个实验,目前还未通过上机验证。
TSPITR(表空间基于时间点的恢复)
为了减少损失,推出TSPITR。比DBPITR高级。
设计思想:
假如一个生产数据库的某个TABLE被误删除了。
先对原来的生产数据库CLONE,然后再造一个辅助数据库和原来的一模一样。
CLONE出来的数据库叫做辅助数据库,原来的数据库叫生产数据库。对辅助数据库做TSPITR。把辅助数据库恢复到备份点。
然后把辅助数据库包含被删除表的表空间EXPORT(导出)。把导出的表空间,导入生产数据库。这样生产数据库中,其它的表空间不受影响,仅仅是受损表空间恢复。
在辅助数据库上所作的恢复操作和恢复一个表的操作是一样的。
TSPITR的具体步骤参考老师提供的文件TSPITR.txt
(一)Prepare Product Database:
1. Checking self contained for recovery set
sql>execute dbms_tts.transport_set_check('DATA2',true);
sql>select * from transport_set_violation;
no rows selected
检查表空间是否自包含。
对数据库克隆只要包含系统表空间,临时表空间和受损的表空间。其它表空间不用CLONE到辅助表空间中。
自包含的意思:受损表空间中的一个表有index。这个index被其它表空间使用,那么那个表空间也要被CLONE。
2. simulate before fault:
sql> create table dept1 tablespace data1 as select * from scott.dept;
sql> create table dept2 tablespace data2 as select * from scott.dept;
sql> insert into dept1(deptno,dname) values(28,'before drop');
sql> insert into dept2(deptno,dname) values(28,'before drop');
sql> commit;
sql> alter system archive log current;
3. Backup recovery set and auxiliary set before TSPITR time
sql> alter database begin backup;
sql> host copy d:/ora101g/oradata/db1/*.dbf d:/backup/db1
sql> alter database end backup;
sql> alter system archive log current;
sql> alter database backup controlfile to
2 'D:/backup/db1/conl.ctl' reuse;
sql> alter system archive log current;
对数据库进行备份
4. simulate after fault:
sql>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
recoding the sysdate!
sql> truncate table dept2;
sql> insert into dept1(deptno,dname) values(38,'after drop');
sql> commit;
sql> alter system archive log current;
取出时间。
删除表,模拟损坏的操作。
插入一行数据,以便验证恢复结果是否成功。
(二)Prepare AUXiliary DataBase:
1. Prepare OS environment:
dos>mkdir F:/auxdb1
dos>mkdir F:/auxdb1/bdump
dos>mkdir F:/auxdb1/udump
dos>mkdir F:/auxdb1/arc
创建辅助数据库
2. create oracle service for AUXiliary Database:
dos>oradim -new -sid AUXDB1 -intpwd ora123
创建服务
3. Prepare parameter file for AUXiliary database:
(dos>copy D:/ora101g/database/initDB1.ora
D:/ora101g/database/iniAUXDB1.ora
EDIT D:/ora101g/database/initAUXDB1.ora:)
老师提供文件initAUXDB1.ora的内容如下:
db_unique_name='AUXDB1'
db_file_name_convert='D:/ora101g/oradata/db1','F:/auxdb1'
log_file_name_convert='D:/ora101g/oradata/db1','F:/auxdb1','D:/ora101g/oradata/db1','F:/auxdb1'
background_dump_dest='F:/auxdb1/bdump'
compatible='10.1.0.2.0'
control_files=('F:/auxdb1/con1.ctl','F:/auxdb1/con2.ctl')
core_dump_dest='F:/auxdb1/cdump'
db_name='DB1'
remote_login_passwordfile='EXCLUSIVE'
sessions=20
undo_management='AUTO'
undo_tablespace='undotbs'
user_dump_dest='F:/auxdb1/udump'
log_archive_dest_1='location=D:/backup/db1/arc'
log_archive_format='%s_%t_%r.arc'
service_names='AUXDB1'
instance_name='AUXDB1'
复制初始化参数文件,并进行小修改
其中:
db_name不变
加db_uniqure_name
db_file_name和log_file_name_convert 把原来DB1的路径转化为辅助数据库的路径。
log_archive_dest_1不变,把克隆的数据库恢复时,要用到归档日志。辅助数据库没有归档日志,生产数据库有归档日志,所以这个路径不改变。
改service_name和instance_name
4. RESTORE Recovery SET and auxiliary SET
sql>host copy D:/backup/db1/*.dbf F:/auxdb1
sql>host copy D:/backup/db1/con1.ctl F:/auxdb1/con1.ctl
sql>host copy D:/backup/db1/con1.ctl F:/auxdb1/con2.ctl
把原来生产数据库的备份文件,copy到辅助数据库里面去。
5. Start AUX DB:
sql>connect sys/ora123@AUXDB1 as sysdba
sql>startup nomount
sql> alter database mount clone database;
sql> alter database datafile 'F:/auxdb1/SYS01.DBF' online;
sql> alter database datafile 'F:/auxdb1/UNDOTBS.DBF' online;
sql> alter database datafile 'F:/auxdb1/data2.dbf' online;
sql> recover database until time '2007-04-01 17:28:43' using backup controlfile;
sql> alter database open resetlogs;
check the table dept2 exist:
sql> select * from dept2;
sql> alter tablespace temp add tempfile 'F:/auxdb1/temp.dbf' size 5M reuse;
启动辅助数据库
进行CLONE操作
using backup controlfile是指使用备份的控制文件。
克隆的时候不能修改控制文件,执行recover的时候能够修改控制文件,因为recover能够利用redo log
(三) EXPort and IMPort Recovery Set
1. EXPort Recovery Set
dos>exp 'sys/ora123 as sysdba' point_in_time_recover=y tablespaces=data2
file=F:/auxdb1/data2.dmp
Export terminated successfully without warnings.
用sysdba登录,用exp命令导出指定的表空间。
2. IMPort Recovery Set
sql>connect sys/ora123@DB1 as sysdba
sql> alter tablespace data2 offline;
dos>copy F:/auxdb1/data2.dbf D:/ora101g/oradata/db1
dos>imp 'sys/ora123@DB1 as sysdba' point_in_time_recover=y datafiles=
D:/ora101g/oradata/db1/data2.dbf file=F:/auxdb1/data2.dmp
Import terminated successfully without warnings.
连接到生产数据库上
使生产数据库中损坏的表空间offline。
3. Check the TSPITR result:
sql> alter tablespace data2 online;
sql>select * from dept2;
sql>select * from dept1;
检查恢复的结果
被删除的表要恢复。
违背删除的表,记录都要在
4. delete AUXiliary DB
删除辅助数据库
实验一:
实验目的:实践TSPITR
1. SQL> select * from dept1;
2. SQL> select * from dept2;
现在数据库中有两个表dept1和dept2。
故障是表空间data1中的dept1被误删除,恢复表空间dept1,且不影响到表空间data2中的dept2
3. SQL> alter database begin backup;
4. SQL> host copy e:/ora01g/oradata/db1/*.dbf e:/backup/db1/hot
5. SQL> alter database end backup;
6. SQL> alter database backup controlfile to ‘E:/backup/db1/hot/con1.ctl’ reuse;
7. SQL> alter system archive log current;
备份好之后,立刻对数据库做一次手工归档。
8. SQL> select to_char(sysdate, ‘YYYY-MM-DD HH24:MI:SS’) from dual;
取一个用于恢复的时间
9. SQL> drop table dept1;
删除表,模拟故障
10. SQL> select * from dept1;
查询失败
11. SQL> insert into dept2(deptno,dname) values (99,’after 1908’);
12. SQL> insert into dept2(deptno,dname) values(66,’after 1908’);
插入两条数据,用于验证恢复的结果是否成功。
13. 另外打开一个终端窗口来CLONE数据库
oradim –new –sid AUXDB1 –intpwd ora123
创建辅助数据库的服务
14. COPY过来初始化参数文件,并进行修改。
修改了:
db_file_name_convert
log_file_name_convert
background_dump_dest
user_dump_dest
control_files
core_dump_dest
service_name
instance_name
然后利用初始化参数文件启动数据库
15. copy e:/backup/db1/hot/*.dbf e:/auxdb1
e:/auxdb1中的data2.dbf是不需要COPY的
16. copy e:/backup/db1/hot/con1.ctl e:/auxdb1
17. copy e:/backup/db1/hot/con1.ctl e:/auxdb1/con2.ctl
copy控制文件
18. sqlplus /nolog
19. SQL> connect sys/ora123@AUXDB1 as sysdba
20. SQL> startup nomount
21. SQL> alter database mount clone database;
22. SQL> alter database datafile ‘e:/auxdb1/system01.dbf’ online;
23. SQL> alter database datafile ‘e:/auxdb1/undotbs.dbf’ online;
24. SQL> alter database datafile ‘e:/auxdb1/sysaux01.dbf’ online;
25. SQL> alter database datafile ‘e:/auxdb1/data1.dbf’ online;
26. SQL> recover database until time ‘2006-10-17 19:08:05’ using backup controlfile;
恢复操作
没成功,把生产数据库再归档一次。
回到生产数据库的终端窗口进行下面这个操作
SQL> alter system archive log current;
27. SQL> alter database open resetlogs;
28. SQL> select * from dept1;
dept1表被恢复出来了,但目前实在辅助数据库中,接着要用exp命令导出。
29. SQL> host exp ‘sys/ora123@AUXDB1 as sysdba’ point_in_time_recover=Y tablespaces=data1 file=data1.dmp
最后看到屏幕上显示’Export terminated successfully without warnings’这句话,才表示导出操作成功。
省略了检查自包含的步骤。
30. 回到生产数据库的终端窗口
31. SQL> alter tablespace data1 offline;
32. SQL> host copy e:/auxdb1/data1.dbf e:/ora01g/oradata/db1
33. SQL> host imp ‘sys/ora123@db1 as sysdba’ point_in_time_recover=Y datafiles=’e:/ora01g/oradata/db1/data1.dbf’ file=data1.dmp
最后看到屏幕上显示’Import terminated successfully without warnings.’这句话,才表示导入操作成功。
34. SQL> alter tablespace data1 online;
35. SQL> select * from dept1;
36. SQL> select * from dept2;
前面插入的两条记录都在,99 after 1908和66 after 1908
以下出现的页码与《Oracle9i 数据库管理基础II Ed 1.1 Vol.2.pdf》对应
指南下载地址:
P121
配置ORACLE服务器的共享模式
之前用的都是ORACLE服务器的专用模式
在专用服务器模式下,每个用户进程对应一个服务器进程。浪费资源。
在共享服务器模式下,一个服务器进程可以同时为多个用户服务。
P125
除了有共享服务进程(Snnn),一定还要有调度程序。
P127
ORACLE共享服务器的优点
调度程序进行调度,来实现负载均衡
P128
TNSNAME.ORA文件的内容
有SERVER=DEDICATED,采用专用服务器模式。如果没有这个参数,ORACLE会尽量采用共享服务器模式
使用共享服务器模式,不能发shutdown和startup命令。发这两个命令必须用专用服务器模式建立连接。
P129
共享服务器模式下,不能使用SET ORACLE_SID的方式来连接数据库,而必须使用网络连接方式,因为要先连接到ORACLE的侦听器上。
P130
这图非常重要。
连接步骤
用户发出请求,请求送到监听程序。监听程序把请求发到三个调度程序中,最空的一个调度程序。所有的调度程序共享一个请求队列(一个实例只有一个请求队列)。
共享服务器进程一有空,就去请求队列看是否有请求,有就拿来提供服务。
每个调度程序有它自己的响应队列。响应队列和调度程序一一对应。
ORACLE的调度程序会进程到自己的响应队列中去看,有没有从共享服务器进程返回的应答,有就取出来,返回用户进程 。
整个过程中有个看不见的幽灵,叫虚拟电路circuit。
共享服务器模式下,每个用户进程和虚拟电路(本质是内存中的一小块空间)一一对应。虚拟电路的数据和会话的数目相等。
一但用户进程起来和调度程序建立连接,那么之后的请求都是这个调度程序进行处理,而不会换成别的调度程序。不过,共享服务进程处理请求队列中的请求,是随机的。
每个调度程序最多可以为1024个用户服务,一般一个调度程序为200个用户服务。
P132
共享服务器模式下,共享池的大小要扩大些
P133
配置共享服务器要用到的参数。
DISPATCHERS,表示在例程启动时,要启动多少个调度程序。
SHARED_SERVERS。表示在例程启动时,启动多少个共享服务进程。缺省为0,表示只能执行专用服务器模式。
MAX_DISPATCHERS,系统最大启动的调度程序数。和OS有关的参数
MAX_SHARED_SERVERS,系统最大启动的共享服务进程数
CIRCUITS,虚拟电路。
SHARED_SERVER_SESSIONS,单指共享的会话数,这个值等于SESSIONS减5,这5个留给专用服务器。用于执行startup和shutdown等命令。
P134
通过不同的协议连接,每个协议必须都创建DISPATCHER
P136
设置这个参数,可以动态的增加调度程序
P138
系统启动的时候,创建的服务进程数目。
P141
CIRCUITS的大小,影响到SGA的大小
P142
把SESSIONS减5,留给专用服务器
P143
LARGE_POOL_SIZE
SGA空间要扩大
缺省情况下,等于0,相关信息都放到SHARED_POOL里面。设置了LARGE_POOL_SIZE,相关信息就放在LARGE_POOL中。
P145
listener要侦听调度程序,也要到listener中去注册。这个是自动注册(DB startup后的60秒内进行注册)。可用lsnrctl services查看是否注册成功。
P147
共享服务器模式下,有一个请求队列和多个响应队列。
查看队列情况的动态视图
在OLAP里面,用户数多,操作时间比较短的情况下,用共享服务器模式比较多。
在DSS数据仓库里面,用专用服务器模式比较多
实验二:
实验目的:配置共享服务器模式
ORAcle V9.2来进行的实验。
初始化参数文件initDB91.ora中
没有下面这些参数,数据库起来后,只能使用专用服务器模式
shared_serviers
max_shared_servers
dispatchers
dispatchers
dispatchers
max_dispathers
设置三个dispather,是因为它们各对应不同的协议。
1. sqlplus /nolog
2. SQL> connect sys/ora123@DB91D as sysdba
3. SQL> startup
4. SQL> host
5. lsnrctl
6. LSNRCTL> service
数据库启动了,这个时候就能看到DISPATCHERS都启动了。说明DISPATCHERS是自动注册的。
检查数据库中的DISPATCHER是否启动。
并且能看到每个DISPATCHER当前各建立了多少连接。
7. LSNRCTL> exit
8. exit
9. SQL> show parameter dispatcher
查看在参数中设置的dispatcher
10. SQL> select * from v$queue;
00是请求队列,后面三个是响应队列。
TATALQ表示曾经处理过的请求数。
11. SQL> select * from v$circuit;
信息比较多
12. SQL> show parameter circuit
circuits的值是38
13. SQL> show parameter sessions
sessions的值是38
shared_server_sessions的值是33
14. SQL> get perf601
看服务进程的忙碌程度,使用/进行执行
具体所执行的SQL语句,在老师提供的perf601.sql文件中。
15. SQL> alter system set shared_servers=4;
强行设置共享服务进程数为4
16. SQL> desc v$shared_server
17. SQL> select name,status from v$shared_server;
列出4个共享服务进程
18. SQL> alter system set shared_servers=1;
19. SQL> desc v$dispatcher
20. SQL> column network format a15
21. SQL> column status format a5
22. SQL> select name,network,status from v$dispatcher;
network/admin/TNSNAMES文件中
server=shared 共享服务器模式
server=dedicated 专用服务器模式
sysdba进去用DB91D
SQL> connect sys/ora123@DB91D as sysdba
保证是以专用服务器模式进去,这样就能shutdown了
老师提供的db10doc目录下重要文件有:
initAUXDB1.ora
TSPITR.txt
standby.txt
华腾给轨道交通系统做的容灾备份数据库。
保存SQL语句的方法
SQL>save perfcache.sql
保存在当前目录下
调出已保存的SQL语句
SQL> get perf602
SQL> /
/是执行