一、数据库名
什么是数据库名?
数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数db_name表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数db_name被写入参数文件之中。格式如下:
db_name=myorcl
...
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改db_name的值。但是在oracle启动时,由于参数文件中的db_name与控制文件中的数据库名不一致,导致数据库启动失败,将返回ora-01103错误。
数据库名的作用
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
有很多oracle安装文件目录是与数据库名相关的,如:
winnt: d:\oracle\product\10.1.0\oradata\db_name\...
unix: /home/app/oracle/product/10.1.0/oradata/db_name/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\db_name\pfile\ini.ora
unix: /home/app/oracle/product/10.1.0/admin/db_name/pfile/init$oracle_sid.ora
跟踪文件目录:
winnt: /home/app/oracle/product/10.1.0/admin/db_name/bdump/...
另外,在创建数据时,careate database命令中的数据库名也要与参数文件中db_name参数的值一致,否则将产生错误。
同样,修改数据库结构的语句alter database,当然也要指出要修改的数据库的名称。
如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指db_name。
还有在备份或恢复数据库时,都需要用到数据库名。
总之,数据库名很重要,要准确理解它的作用。
查询当前数据名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件。
修改数据库名
前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
1.关闭数据库。
2.修改数据库参数文件中的db_name参数的值为新的数据库名。
3.以nomount方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)
二、数据库实例名
什么是数据库实例名?
数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。
数据库名和实例名可以相同也可以不同。
在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。
查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询。
数据库实例名与oracle_sid
虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而oracle_sid是操作系统的环境变量。oracld_sid用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过oracle_sid。在winnt不台,oracle_sid还需存在于注册表中。
且oracle_sid必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“oracle not available”,在winnt平台,是“tns:协议适配器错误”。
数据库实例名与网络连接
数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名service_name。这个概念接下来说明。
三、数据库域名
什么是数据库域名?
在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:
全国交通运政系统的分布式数据库,其中:
福建节点: fj.jtyz
福建厦门节点: xm.fj.jtyz
江西: jx.jtyz
江西上饶:sr.jx.jtyz
这就是数据库域名。
数据库域名在存在于参数文件中,他的参数是db_domain.
查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询。
全局数据库名
全局数据库名=数据库名 数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz
四、数据库服务名
什么是数据库服务名?
从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是service_name。
如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。
查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在参数文件中查询。
数据库服务名与网络连接
从oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是oracle_sid,即数据库实例名。
sql*plus: release 10.2.0.1.0 - production on 星期一 7月 5 09:50:36 2010
凯发天生赢家一触即发官网 copyright (c) 1982, 2005, oracle. all rights reserved.
sql> conn /as sysdba
已连接。
sql> shutdown normal
ora-01109: 数据库未打开
已经卸载数据库。
oracle 例程已经关闭。
sql> startup mount
oracle 例程已经启动。
total system global area 289406976 bytes
fixed size 1248576 bytes
variable size 83886784 bytes
database buffers 197132288 bytes
redo buffers 7139328 bytes
数据库装载完毕。
sql> alter database open
2 ;
alter database open
*
第 1 行出现错误:
ora-00600: 内部错误代码, 参数: [kcratr1_lastbwr], [], [], [], [], [], [], []
sql> alter database noarchivelog;
数据库已更改。
sql> alter database open;
alter database open
*
第 1 行出现错误:
ora-00600: 内部错误代码, 参数: [kcratr1_lastbwr], [], [], [], [], [], [], []
sql> shutdown immediate
ora-01109: 数据库未打开
已经卸载数据库。
oracle 例程已经关闭。
sql> startup mount
oracle 例程已经启动。
total system global area 289406976 bytes
fixed size 1248576 bytes
variable size 83886784 bytes
database buffers 197132288 bytes
redo buffers 7139328 bytes
数据库装载完毕。
sql> recover database;
完成介质恢复。
sql> alter database open;
数据库已更改。
sql> exit
将表空间和数据文件从一个位置移动到另一个位置的操作方法
一. offline
offline 分为alter database 与 alter tablespace offline,
他们的区别参看blog:
按数据文件来:
1.先将相应的数据文件 offline
alter database datafile 'd:\oracle\oradata\dba\test01.dbf' offline;
2.把数据文件 copy 到新位置
3. alter database rename file 'd:\oracle\oradata\dba\test01.dbf' to 'd:\test01.dbf';
4. 介质恢复(offline 数据文件必须要介质恢复)
recover datafile 'd:\test01.dbf'
5. 将相应的数据文件 online
sql>alter database datafile 'd:\test01.dbf' online;
按表空间来:
1.先将相应的表空间 offline
sql>alter tablespace test offline;
2.把数据文件 copy 到新位置
3. alter tablespace test rename datafile 'd:\test01.dbf' to 'd:\oracle\oradata\dba\test01.dbf'
4. 将表空间 online
sql>alter tablespace test online;
二. shutdown 数据库
1. 关闭数据库
c:>set oracle_sid=dba
c:>sqlplus /nolog
sql*plus: release 10.2.0.1.0 - production on 星期日 11月 29 11:14:02 2009
凯发天生赢家一触即发官网 copyright (c) 1982, 2005, oracle. all rights reserved.
sql> conn sys/admin as sysdba
已连接。
sql> shutdown immediate
数据库已经关闭。
已经卸载数据库。
oracle 例程已经关闭。
sql>
2. 把数据文件 copy 到新位置
3. rename datafile
sql> startup mount
oracle 例程已经启动。
total system global area 289406976 bytes
fixed size 1248576 bytes
variable size 71303872 bytes
database buffers 209715200 bytes
redo buffers 7139328 bytes
数据库装载完毕。
sql> alter database rename file 'd:\oracle\oradata\dba\test01.dbf' to 'd:\test01
.dbf';
数据库已更改。
sql> alter database open;
数据库已更改。
sql> select file#,name,status from v$datafile;
file# name status
-------- ------------------------------------------------------- ---------------
1 d:\oracle\oradata\dba\system01 system
2 d:\oracle\oradata\dba\undotbs0 online
3 d:\oracle\oradata\dba\sysaux01 online
4 d:\oracle\oradata\dba\users01. online
5 d:\test01.dbf online
1、删除多余的归档日志
在oracle10g中,默认的归档路径为$oracle_base/flash_recovery_area。对于这个路径,oracle有一个限制,就是默认只能有2g的空间给归档日志使用,可以使用下面两个sql语句去查看它的限制:
1. select * from v$recovery_file_dest;
2. show parameter db_recovery_file_dest(这个更友好直观一些)
当归档日志数量大于2g时,那么就会由于没有更多的空间去容纳更多的归档日志会报无法继续归档的错误。
如:“ra-19809: limit exceeded for recovery files
ora-19804: cannot reclaim 10017792 bytes disk space from 2147483648 limit
arc0: error 19809 creating archive log file to '/u01/app/oracle/flash_recovery_area/orcl/archivelog/2007_04_30/o1_mf_1_220_0_.arc' ”这时我们可以修改它的默认限制,比如说将它增加到5g或更多,也可以将归档路径重新置到别的路径,就不会有这个限制了。
更改限制语句如下:
alter system set db_recovery_file_dest_size=5368709102 (这里为5g 5x1024x1024x1024=5g)
alter system set db_recovery_file_dest_size=10737418240
进入
执行下边的交叉校验
crosscheck archivelog all;
此时可能会提示校验失败,类似下边的提示:
rman> crosscheck archivelog all;
释放的通道: ora_disk_1
分配的通道: ora_disk_1
通道 ora_disk_1: sid=14 devtype=disk
对归档日志的验证失败
…………….
这时,需要执行exit退出rman。
在命令提示符窗口下执行下边的字符集设置
c:>set nls_lang=american_america.zhs16gbk
然后再进入rman ,再执行crosscheck archivelog all;一般不会再出现这样的问题了。
在命令窗口里面执行
delete archivelog all completed before 'sysdate-7';
说明
sysdata-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。
同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库
delete archivelog from time 'sysdate-7';
unix/linux下也可以通过find找到7天前的归档数据,使用exec子操作删除
find /oraarchive -xdev -mtime 7 -name "*.dbf" -exec rm -f {} ;
这样做仍然会在rman里留下未管理的归档文件
仍需要在rman里执行下面2条命令
crosscheck archivelog all;
delete expired archivelog all;
所以还不如上面的方法好用,不过用find的好处就是,可以在条件上,和exec子项上做很多操作,实现更复杂的功能
2、report obsolete及delete obsolete删除过期备份命令
使用report obsolete命令报告过期备份
rman> report obsolete;
rman retention policy will be applied to the command
rman retention policy is set to redundancy 1
report of obsolete backups and copies
type key completion time filename/handle
-------------------- ------ ------------------ --------------------
backup set 125 01-nov-04
backup piece 125 01-nov-04 /data1/oracle/orabak/full_1_541045804
backup set 131 04-nov-04
backup piece 131 04-nov-04 /data1/oracle/orabak/full_avatar2_20041104_131
....
使用delete obsolete命令删除过期备份:
rman> delete obsolete;
rman retention policy will be applied to the command
rman retention policy is set to redundancy 1
using channel ora_disk_1
deleting the following obsolete backups and copies:
type key completion time filename/handle
-------------------- ------ ------------------ --------------------
backup set 125 01-nov-04
backup piece 125 01-nov-04 /data1/oracle/orabak/full_1_541045804
....
archive log 2704 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2716.dbf
archive log 2703 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2715.dbf
archive log 2702 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2714.dbf
do you really want to delete the above objects (enter yes or no)? yes
deleted backup piece
backup piece handle=/data1/oracle/orabak/full_avatar2_20041206_173 recid=173 stamp=544156241
.....
注:在执行删除的时候,可能会提示下边的报错信息:
ora-19554: 配置设备时出错, 设备类型: sbt_tape, 设备名称:
ora-27211: 未能加载介质管理库
解决方法,运行下边的命令:
rman> allocate channel for maintenance type disk;
rman> crosscheck archivelog all;
rman> delete obsolete;
3、oracle rman的show,list,crosscheck,delete
oracle rman的show,list,crosscheck,delete 命令整理
1、show命令:
显示rman配置: rman> show all;
2、report命令:
2.1、rman> report schema 报告目标数据库的物理结构;
2.2、rman>report need backup days=3; 报告最近3天没有被备份的数据文件;
2.3、rman> report need backup days 3 tablespace users; 在users表空间上3天未备份的数据文件;
2.4、rman> report need backup incremental 3; 报告恢复数据文件需要的增量备份个数超过3次的数据文件;
2.5、rman> report need backup redundancy 2 database; 报告备份文件低于2份的所有数据文件;
rman>report need backup redundancy=2;
2.6、rman> report need backup recovery window of 6 days; 报告文件报表的恢复需要超过6天的归档日志的数据文件;
2.7、rman> report unrecoverable; 报告数据库所有不可恢复的数据文件;
2.8、rman> report obsolete redunndancy 2; 报告备份次数超过2次的陈旧备份;
2.9、rman>report obsolete; 报告多余的备份;
3、list命令:列出备份信息
3.1、列出数据文件备份集
rman>list backup 列出详细备份;
rman>list expired backup 列出过期备份;
rman> list backup of database; 列出所有数据文件的备份集;
rman> list backup of tablespace user01; 列出特定表空间的所有数据文件备份集;
3.2、rman> list backup of controlfile 列出控制文件备份集;
3.3、rman> list backup of archivelog all 列出归档日志备份集详细信息;
rman>list archivelog all; 列出归档日志备份集简要信息
3.4、rman> list backup of spfile 列出spfile备份集;
3.5、rman> list copy of datafile 5 列出数据文件映像副本;
3.6、rman> list copy of controlfile 列出控制文件映像副本;
3.7、rman> list copy of archivelog all 列出归档日志映像副本;
3.8、rman> list incarnation of database 列出对应物/列出数据库副本;
3.9、rman>list backup summary; 概述可用的备份;
b表示backup
f表示full
a表示archive log
0 1表示incremental backup
s说明备份状态(aavailablex expired )
3.10、rman>list backup by file 按备份类型列出备份;
按照数据文件备份,归档日志备份,控制文件备份,服务器参数文件备份 列出
4、crosscheck命令:校验备份信息
4.1、rman> crosscheck backup 核对所有备份集;
4.2、rman> crosscheck backup of database 核对所有数据文件的备份集;
4.3、rman> crosscheck backup of tablespace users 核对特定表空间的备份集;
4.4、rman> crosscheck backup of datafile 4 核对特定数据文件的备份集;
4.5、rman> crosscheck backup of controlfile 核对控制文件的备份集;
4.6、rman> crosscheck backup of spfile 核对spfile的备份集;
4.7、rman> crosscheck backup of archivelog sequence 3 核对归档日志的备份集;
4.8、rman> crosscheck copy 核对所有映像副本;
4.9、rman> crosscheck copy of database 核对所有数据文件的映像副本;
4.10、rman> crosscheck copy of tablespace users 核对特定表空间的映像副本;
4.11、rman> crosscheck copy of datafile 6 核对特定数据文件的映像副本;
4.12、rman> crosscheck copy of archivelog sequence 4 核对归档日志的映像副本;
4.13、rman> crosscheck copy of controlfile 核对控制文件的映像副本;
4.14、rman> crosscheck backup tag='sat_backup';
4.15、rman> crosscheck backup completed after 'sysdate - 2'
4.16、rman> crosscheck backup completed between 'sysdate - 5' and 'sysdate -2 '
4.17、rman> crosscheck backup device type sbt;
4.18、rman> crosscheck archivelog all;
4.19、rman> crosscheck archivelog like '%arc00012.001'
4.20、rman> crosscheck archivelog from sequence 12;
4.21、rman> crosscheck archivelog until sequence 522;
5、delete:删除备份
5.1、rman> delete obsolete; 删除陈旧备份;
5.2、rman> delete expired backup; 删除expired备份
5.3、rman> delete expired copy; 删除expired副本;
5.4、rman> delete backupset 19; 删除特定备份集;
5.5、rman> delete backuppiece ''d:\backup\demo_19.bak'' 删除特定备份片;
5.6、rman> delete backup 删除所有备份集;
5.7、rman> delete datafilecopy ''d:\backup\demo_19.bak'' 删除特定映像副本;
5.8、rman> delete copy 删除所有映像副本;
5.9、rman> delete archivelog all delete input;
rman> delete backupset 22 format = ''d:\backup\%u.bak'' delete input
在备份后删除输入对象;
5.10、rman> delete backupset id;
4、em控制台对备份的操作
使用sys用户的sysdba权限进入em控制台
在“维护”模块下,点击进入到“管理当前备份”操作选项。
如果要删除备份,可以在下边的列表中选中要删除的备份集,执行“删除”命令,这时会有一个确认提示的页面:
点击“是”按钮,进行删除操作。如果提示操作“删除”失败,可以将上一步要执行的命令在命令提示符下使用rman命令来执行。
5、小结
像归档日志之类的备份,备份的文件夹是在一个叫flash_recovery_area的目录下边。
1、归档日志备份在archivelog 这个文件夹下边,上边对归档日志的操作基本上是对这个文件夹下的文件进行操作。
2、obsolete删除操作基本上是对autobackup这个文件夹下的文件进行操作。(不是十分的确定)
3、delete backup操作基本上是对backupset文件夹和datafile文件夹的内容进行操作的。
4、在em管理后台,最下边有一个“相关链接”模块,下有“作业”选项链接,可以看到所有数据库备份操作历史作业记录,在此可以对相应的备份作业进行修改操作。
另外如果要添加备份操作作业时,需要在“维护”模块下找到“调试备份”链接,推荐使用“oracle 建议的备份”来添加备份操作作业。
linux下查看文件夹大小的命令du -sh docname
select * from v$sqlarea t order by t.last_active_time desc
注意 :执行此语句等等一些相关的语句 必须具有dba 的权限 虽然这条语句很普通 但是需要的时候很管用 能够及时查出一个人执行sql语句情况
-------oracle 查看已经执行过的sql 这些是存在共享池中的 --------->
select * from v$sqlarea t order by t.last_active_time desc
-----------查看oracle会话----------------------------》
select * from v$session t order by t.last_active_time desc
-------------查看oracle的权限角色------------------------------>
select * from dba_role_privs; 授予用户和其他角色的角色
select * from dba_sys_privs; 授予用户和其他角色的系统权限
select * from dba_tab_privs; 数据库中对象的所有授权
select * from user_role_privs; 查看当前用户的角色
ora-00257: archiver error. connect internal only, until freed.
oracle 10g数据库物理空间管理方式与以前oracle发生了变化,对归档日志所在的flash_recovery_area空间进行了另外限制
flash_recovery_area空间缺省安装时比较小,只有2gb,容易用完
解决过程
根据数据库目前可用存储空间情况、flash_recovery_area空间为2gb的实际情况,把flash_recovery_area的空间修改为20gb()。
sql> alter system set db_recovery_file_dest_size=20g;
系统已更改。
(其实问题的本质是归档日志的使用已经达到了spfile等启动参数文件中指定的最大值。oracle 10g中归档日志默认的存放地是闪回目录,即%oracle_base%/flash_recovery_area的相应实例名下面,这个位置的大小在参数文件中有个限制,解决空间不足的问题可以通过两种方式来实现,一个修改这个大小限制,还有一个就是修改归档日志存放位置。)
如果不要这些archivelog的话,可以删除一些
rman>delete noprompt archivelog until time 'sysdate-3'; 直接运行这条 这样会只保留三天的归档
sql> select * from v$flash_recovery_area_usage;
file_type percent_space_used percent_space_reclaimable number_of_files
------------------------------- ------------------------------------- ----------------------------------------------------- -------------------------------
controlfile 0 0 0
onlinelog 0 0 0
archivelog 6.11 0 3
backuppiece 0 0 0
imagecopy 0 0 0
flashbacklog 0 0 0
还可参考:
rman crosscheck删除失效归档
当手工删除了归档日志以后,rman备份会检测到日志缺失,从而无法进一步继续执行。
所以此时需要手工执行crosscheck过程,之后rman备份可以恢复正常。
1.crosscheck日志
$ rman target /
recovery manager: release 9.2.0.4.0 - 64bit production
凯发天生赢家一触即发官网 copyright (c) 1995, 2002, oracle corporation. all rights reserved.
connected to target database: avatar2 (dbid=2480694409)
rman> crosscheck archivelog all;
using target database controlfile instead of recovery catalog
allocated channel: ora_disk_1
channel ora_disk_1: sid=25 devtype=disk
validation failed for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659
validation failed for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268
...........
validation failed for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2985.dbf recid=2973 stamp=545399327
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2986.dbf recid=2974 stamp=545400820
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2987.dbf recid=2975 stamp=545401757
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2988.dbf recid=2976 stamp=545402716
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2989.dbf recid=2977 stamp=545403661
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2990.dbf recid=2978 stamp=545404946
validation succeeded for archived log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2991.dbf recid=2979 stamp=545406220
crosschecked 278 objects
rman>
2.使用delete expired archivelog all 命令删除所有过期归档日志:
rman> delete expired archivelog all;
released channel: ora_disk_1
allocated channel: ora_disk_1
channel ora_disk_1: sid=12 devtype=disk
list of archived log copies
key thrd seq s low time name
------- ---- ------- - --------- ----
376 1 2714 x 23-nov-04 =/opt/oracle/oradata/avatar2/archive/1_2714.dbf
.....
3.简要介绍一下report obsolete命令
使用report obsolete命令报告过期备份
rman> report obsolete;
rman retention policy will be applied to the command
rman retention policy is set to redundancy 1
report of obsolete backups and copies
type key completion time filename/handle
-------------------- ------ ------------------ --------------------
backup set 125 01-nov-04
backup piece 125 01-nov-04 /data1/oracle/orabak/full_1_541045804
backup set 131 04-nov-04
backup piece 131 04-nov-04 /data1/oracle/orabak/full_avatar2_20041104_131
....
backup set 173 06-dec-04
backup piece 173 06-dec-04 /data1/oracle/orabak/full_avatar2_20041206_173
backup set 179 11-dec-04
backup piece 179 11-dec-04 /data1/oracle/orabak/arch544588206.arc
.....
backup piece 189 17-dec-04 /data1/oracle/orabak/arch545106606.arc
backup set 190 17-dec-04
backup piece 190 17-dec-04 /data1/oracle/orabak/arch545106665.arc
backup set 191 20-dec-04
backup piece 191 20-dec-04 /data1/oracle/orabak/arch_avatar2_20041220_194
archive log 2973 20-dec-04 /opt/oracle/oradata/avatar2/archive/1_2985.dbf
archive log 2971 20-dec-04 /opt/oracle/oradata/avatar2/archive/1_2984.dbf
.....
archive log 2705 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2717.dbf
archive log 2704 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2716.dbf
archive log 2703 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2715.dbf
archive log 2702 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2714.dbf
4.使用delete obsolete命令删除过期备份:
rman> delete obsolete;
rman retention policy will be applied to the command
rman retention policy is set to redundancy 1
using channel ora_disk_1
deleting the following obsolete backups and copies:
type key completion time filename/handle
-------------------- ------ ------------------ --------------------
backup set 125 01-nov-04
backup piece 125 01-nov-04 /data1/oracle/orabak/full_1_541045804
....
archive log 2704 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2716.dbf
archive log 2703 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2715.dbf
archive log 2702 17-dec-04 /opt/oracle/oradata/avatar2/archive/1_2714.dbf
do you really want to delete the above objects (enter yes or no)? yes
deleted backup piece
backup piece handle=/data1/oracle/orabak/full_avatar2_20041206_173 recid=173 stamp=544156241
.....
deleted archive log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2715.dbf recid=2703 stamp=545108268
deleted archive log
archive log filename=/opt/oracle/oradata/avatar2/archive/1_2714.dbf recid=2702 stamp=545107659
deleted 286 objects
rman> crosscheck archivelog all;
released channel: ora_disk_1
allocated channel: ora_disk_1
channel ora_disk_1: sid=19 devtype=disk
specification does not match any archive log in the recovery catalog
-the end-
-- job 权限
grant create job to somebody;
-- job 创建
begin
dbms_scheduler.create_job (
job_name => 'agent_liquidation_job',
job_type => 'stored_procedure',
job_action => 'agent_liquidation.liquidation', --存储过程名
start_date => sysdate,
repeat_interval => 'freq=monthly; interval=1; bymonthday=1;byhour=1;byminute=0;bysecond=0', -- 按月,间隔为1个(月),每月1号,凌晨1点
comments => '执行代理商清分程序'
);
end;
/
-- job 执行时间测试
declare
start_date date;
return_date_after date;
next_run_date date;
begin
start_date := sysdate;--to_timestamp_tz('10-oct-2004 10:00:00','dd-mm-yyyy hh24:mi:ss');
return_date_after := start_date;
for i in 1..10 loop
dbms_scheduler.evaluate_calendar_string('freq=monthly; interval=1; bymonthday=1;byhour=1;byminute=0;bysecond=0',start_date, return_date_after, next_run_date);
dbms_output.put_line('next_run_date: ' || to_char(next_run_date,'yyyy-mm-dd hh24:mi:ss'));
return_date_after := next_run_date;
end loop;
end;
/
-- job 查询
select owner, job_name, state from dba_scheduler_jobs;
select job_name, state from user_scheduler_jobs;
select * from all_jobs;
-- job 启用
begin
dbms_scheduler.enable('backup_job');
end;
/
-- job 运行
begin
dbms_scheduler.run_job('cola_job',true); -- true代表同步执行
end;
/
-- job 停止(不太好用)
begin
dbms_scheduler.stop_job(job_name => 'cola_job',force => true);
end;
/
-- job 删除(对停job来说好用)
begin
dbms_scheduler.drop_job(job_name => 'cola_job',force => true);)
end;
/
存储过程里不能直接使用ddl语句,所以只能使用动态sql语句来执行
--on commit delete rows 说明临时表是事务指定,每次提交后oracle将截断表(删除全部行)
--on commit preserve rows 说明临时表是会话指定,当中断会话时oracle将截断表。
create or replace procedure temptest
(p_searchdate in date)
is
v_count int;
str varchar2(300);
begin
v_count := 0;
str:='drop table sett_dailytest';
execute immediate str;
str:='create global temporary table sett_dailytest (
naccountid number not null,
nsubaccountid number not null)
on commit preserve rows';
execute immediate str; ----使用动态sql语句来执行
str:='insert into sett_dailytest (select naccountid,nsubaccountid from sett_dailyaccountbalance)';
execute immediate str;
end temptest;
上面建立一个临时表的存储过程
下面是执行一些操作,向临时表写数据。
create or replace procedure pr_dailycheck
(
p_date in date,
p_office in integer,
p_currency in integer,
p_check in integer,
p_countnum out integer)
is
v_count int;
begin
v_count := 0;
if p_date is null then
dbms_output.put_line('日期不能为空');
else
if p_check = 1 then
insert into sett_dailytest (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_date);
select
count(sd.naccountid) into v_count
from sett_subaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
and sa.nofficeid = p_office and sa.ncurrencyid = p_currency
and rownum < 2;
commit;
p_countnum := v_count;
dbms_output.put_line(p_countnum);
end if;
if p_check = 2 then
insert into sett_dailytest (select naccountid,nsubaccountid from sett_dailyaccountbalance
where dtdate = p_date);
select
count(sd.naccountid) into v_count
from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
and sa.nofficeid = p_office and sa.ncurrencyid = p_currency
and rownum < 2;
commit;
p_countnum := v_count;
dbms_output.put_line(p_countnum);
end if;
end if;
end pr_dailycheck;
需要创建一个临时表,请举例说明,谢谢!
---------------------------------------------------------------
是temporary
create global temporary table flight_schedule (
startdate date,
enddate date,
cost number)
---------------------------------------------------------------
create proecdure name_pro
as
str varchar2(100);
begin
str:='create global temporary table tablename on
commit preserve rows as select * from
others_table';
execute immediate str;
end;
/
可以把临时表指定为事务相关(默认)或者是会话相关:
on commit delete rows:指定临时表是事务相关的,oracle在每次提交后截断表。
on commit preserve rows:指定临时表是会话相关的,oracle在会话中止后截断表。
=================
可以创建以下两种临时表:
1。会话特有的临时表
create global temporary
on commit preserve rows;
========
对全局临时表的总结
在临时表上的操作比在一般的表上的操作要快。因为:
1创建临时表不需要往编目表中插入条目,临时表的使用也不需要访问编目表,因此也没有对编目表的争用。
2仅有创建临时表的app才可存取临时表,所以在处理临时表时没有锁。
3如果指定not logged选项,在处理临时表时不记日志。所以如果有仅在数据库的一个会话中使用的大量临时数据,把这些数据存入临时表能大大提高性能。
declare global temporary table tt(c1 int, c2 char(20));
在connect reset命令后,临时表不再存在。
建临时表是动态编译的,所以对临时表的使用也必须放在declare curser 后面
create procedure instt2(p1 int, p2 char(20))
begin
declare global temporary table tt(c1 int, c2 char(20)) %
insert into session.tt values(p1, p2);
begin
declare c1 cursor with return for select * from session.tt;
end;
end %
2。事务特有的临时表
create global temporary
on commit delete rows;
在oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了,这与ms和sybase不一样。实际上在断开数据库连接时,临时
表中数据自动清空,不同的session之间是隔离的,不许要当心相互影响,不过如果起用了连接共享的话,你要用on commit
delete rows使数据仅在事物内部有效。
3建立临时表
临时表的定义对所有会话session都是可见的,但是表中的数据只对当前的会话或者事务有效.
建立方法:
1) on commit delete rows 定义了建立事务级临时表的方法.
create global temporary table admin_work_area
(startdate date,
enddate date,
class char(20))
on commit delete rows;
example:
sql> create global temporary table admin_work_area
2 (startdate date,
3 enddate date,
4 class char(20))
5 on commit delete rows;
sql> create table permernate( a number);
sql> insert into admin_work_area values(sysdate,sysdate,'temperary table');
sql> insert into permernate values(1);
sql> commit;
sql> select * from admin_work_area;
sql> select * from permernate;
a
1
2)on commit preserve rows 定义了创建会话级临时表的方法.
create global temporary table admin_work_area
(startdate date,
enddate date,
class char(20))
on commit preserve rows;
example:
会话1:
sql> drop table admin_work_area;
sql> create global temporary table admin_work_area
2 (startdate date,
3 enddate date,
4 class char(20))
5 on commit preserve rows;
sql> insert into permernate values(2);
sql> insert into admin_work_area values(sysdate,sysdate,'session temperary');
sql> commit;
sql> select * from permernate;
a
----------
1
2
sql> select * from admin_work_area;
startdate enddate class
---------- ---------- --------------------
17-1ôâ -03 17-1ôâ -03 session temperary
会话2:
sql> select * from permernate;
a
----------
1
2
sql> select * from admin_work_area;
未选择行.
会话2看不见会话1中临时表的数据.
(increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程忘同一张表中插入数据时才能使用。在集群下不要使用)