一:
使用Profile对用户Session会话进行资源限制
--但是如果使用了连接池之类的东东,就会出些问题,比如前台连接不上之类的
--http://www.eygle.com/archives/2008/10/profile_session_limit.html
sqlplus "/ as sysdba"
SQL> show parameter resource
SQL> alter system set resource_limit=true;
SQL> SELECT * FROM DBA_PROFILES;
--创建一个允许3分钟IDLE时间的PROFILE:
SQL> CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 3;
Profile created.
SQL> col limit for a10
SQL> select * from dba_profiles where profile='KILLIDLE';
SQL> alter user eygle profile killidle;
SQL> select username,profile from dba_users where username='EYGLE';
二:
如何把数据导入不同的表空间
--http://www.eygle.com/archives/2005/04/ecineeeeiaeioae.html
回收用户unlimited tablespace权限
这样就可以导入到用户缺省表空间
SQL> create user bjbbs identified by passwd
2 default tablespace bjbbs
3 temporary tablespace temp
4 /
User created.
SQL> grant connect,resource to bjbbs;
Grant succeeded.
SQL> grant dba to bjbbs;
Grant succeeded.
SQL> revoke unlimited tablespace from bjbbs;
Revoke succeeded.
SQL> alter user bjbbs quota 0 on users;
User altered.
SQL> alter user bjbbs quota unlimited on bjbbs;
User altered.
SQL> exit
重新导入数据
$ imp bjbbs/passwd file=bj_bbs.dmp fromuser=jive touser=bjbbs grants=n
SQL> select table_name,tablespace_name from user_tables;
则可以查看到数据导入了bjbbs
三:
Oracle中模拟及修复数据块损坏
--http://www.eygle.com/faq/Block_corruption.htm
一个数据块损坏后查询会出现如下错误提示
SQL> select count(*) from eygle.t;
select count(*) from eygle.t
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号4,块号35)
ORA-01110: 数据文件 4: 'E:/ORACLE/ORADATA/EYGLE/BLOCK.DBF'
SQL>
有个内部工具BBED也可以用来编辑数据块的内容
使用DBV检查数据文件
E:/Oracle/oradata/eygle>dbv file=block.dbf blocksize=8192
DBVERIFY: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:48:50 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
DBVERIFY - 验证正在开始 : FILE = block.dbf
标记为损坏的页35
***
Corrupt block relative dba: 0x01000023 (file 4, block 35)
Bad check value found during dbv:
Data in bad block -
type: 6 format: 2 rdba: 0x01000023
last change scn: 0x0000.00049097 seq: 0x1 flg: 0x06
consistency value in tail: 0x90970601
check value in block header: 0xd6cb, computed block checksum: 0x2c0a
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
标记为损坏的页69
***
Corrupt block relative dba: 0x01000045 (file 4, block 69)
Bad check value found during dbv:
Data in bad block -
type: 6 format: 2 rdba: 0x01000045
last change scn: 0x0000.00049097 seq: 0x1 flg: 0x06
consistency value in tail: 0x90970601
check value in block header: 0x33d1, computed block checksum: 0x653
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
DBVERIFY - 验证完成
检查的页总数 :128
处理的页总数(数据):117
失败的页总数(数据):0
处理的页总数(索引):0
失败的页总数(索引):0
处理的页总数(其它):9
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数 :0
标记为损坏的总页数:2
汇入的页总数 :0
现在需要检查损坏的对象,使用以下SQL:
SQL> SELECT tablespace_name, segment_type, owner, segment_name
2 FROM dba_extents
3 WHERE file_id = 4
4 and 35 between block_id AND block_id + blocks - 1
5 ;
TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME
---------------------------------------------------------------------------
BLOCK TABLE EYGLE T
如果损失的是数据,ok
我们可以设置内部事件,使exp跳过这些损坏的block
SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';
系统已更改。
说明
ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;
内部事件,设置在全表扫描时跳过损坏的数据块.
然后我们可以导出未损坏的数据
SQL> host
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
E:/
E:/>exp eygle/eygle file=t.dmp tables=t
Export: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:57:13 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径 ...
. . 正在导出表 T 8036 行被导出
在没有警告的情况下成功终止导出。
这时候数据成功导出.
然后我们可以drop table,recreate,然后导入数据
本例中
我们损失了
8192 - 8036 = 156 行数据
四:
如何快速找到备份过最近、最大序号的归档日志
--http://www.eygle.com/archives/2009/04/backupof_archivelog_sequence.html
我们常用列举备份过的归档日志的命令是:
list backup of archivelog all;
这里我们可以用另外一个命令:
LIST BACKUP OF ARCHIVELOG FROM SEQUENCE seq_no [THREAD thread_no];
选择一个合适的SEQuence号,接下来这个命令会将备份过的日志按照序号展现出来,非常便于观察。
对于RAC环境不同的Thread可以加上不同的Thread号。
对于单节点数据库是这样的
RMAN> LIST BACKUP OF ARCHIVELOG FROM SEQUENCE 5555;
List of Backup Sets
===================
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
1281 2.44G DISK 00:00:54 23-APR-09
BP Key: 1281 Status: AVAILABLE Compressed: NO Tag: TAG20090423T045004
Piece Name: /rman_backup/archivelog/archive_MDB_1281_1_1
List of Archived Logs in backup set 1281
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 5555 4810229702 23-APR-09 4810242319 23-APR-09
1 5556 4810242319 23-APR-09 4810253268 23-APR-09
1 5557 4810253268 23-APR-09 4810266091 23-APR-09
1 5558 4810266091 23-APR-09 4810277402 23-APR-09
1 5559 4810277402 23-APR-09 4810288629 23-APR-09
1 5560 4810288629 23-APR-09 4810301159 23-APR-09
1 5561 4810301159 23-APR-09 4810313380 23-APR-09
1 5562 4810313380 23-APR-09 4810325917 23-APR-09
1 5563 4810325917 23-APR-09 4810338897 23-APR-09
1 5564 4810338897 23-APR-09 4810352419 23-APR-09
RMAN> LIST BACKUP OF ARCHIVELOG FROM SEQUENCE 5562;
List of Backup Sets
===================
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
1281 2.44G DISK 00:00:54 23-APR-09
BP Key: 1281 Status: AVAILABLE Compressed: NO Tag: TAG20090423T045004
Piece Name: /rman_backup/archivelog/archive_MDB_1281_1_1
List of Archived Logs in backup set 1281
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 5562 4810313380 23-APR-09 4810325917 23-APR-09
1 5563 4810325917 23-APR-09 4810338897 23-APR-09
1 5564 4810338897 23-APR-09 4810352419 23-APR-09
对于集群环境,可以如下:
RMAN> list backup of archivelog from sequence 4650 thread 2;
List of Backup Sets
===================
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
1502 1.34G DISK 00:00:17 23-APR-09
BP Key: 1502 Status: AVAILABLE Compressed: NO Tag: TAG20090423T045014
Piece Name: /data/rman_backup/archivelog/archive_SDB_1505_1_1
List of Archived Logs in backup set 1502
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
2 4650 5935657272 22-APR-09 5936032418 22-APR-09
2 4651 5936032418 22-APR-09 5936324099 23-APR-09
2 4652 5936324099 23-APR-09 5936595419 23-APR-09
2 4653 5936595419 23-APR-09 5936606454 23-APR-09
RMAN> list backup of archivelog from sequence 6266 thread 1;
List of Backup Sets
===================
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
1502 1.34G DISK 00:00:17 23-APR-09
BP Key: 1502 Status: AVAILABLE Compressed: NO Tag: TAG20090423T045014
Piece Name: /data/rman_backup/archivelog/archive_SDB_1505_1_1
List of Archived Logs in backup set 1502
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 6266 5936066418 22-APR-09 5936180981 23-APR-09
1 6267 5936180981 23-APR-09 5936324084 23-APR-09
1 6268 5936324084 23-APR-09 5936413698 23-APR-09
1 6269 5936413698 23-APR-09 5936462250 23-APR-09
1 6270 5936462250 23-APR-09 5936595368 23-APR-09
1 6271 5936595368 23-APR-09 5936606456 23-APR-09
这样确认好了之后,删除归档就可以放心大胆了。
五:
使用Oracle9i的blockrecover新特性修复数据库中的坏块
--http://www.eygle.com/archives/2008/10/profile_session_limit.html
1.备份数据库
D:/>rman target /
恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
连接到目标数据库: EYGLE (DBID=1365961916)
RMAN> backup database format='d:/oradata/eygle_fullbk.bak' tag='eygle';
启动 backup 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=D:/ORADATA/EYGLE/SYSTEM01.DBF
输入数据文件 fno=00005 name=D:/ORADATA/EYGLE/UNDOTBS2.DBF
输入数据文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 12-6月 -05
通道 ORA_DISK_1: 已完成段 1 于 12-6月 -05
段 handle=D:/ORADATA/EYGLE_FULLBK.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 12-6月 -05
RMAN> list backup;
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
2 Full 140M DISK 00:00:22 12-6月 -05
BP 关键字: 1 状态: AVAILABLE 标记:TAG20050612T004442
段名:D:/ORADATA/EYGLE_FULL.BAK
包含的 SPFILE: 修改时间: 04-3月 -05
备份集 2 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
1 Full 452236 12-6月 -05 D:/ORADATA/EYGLE/SYSTEM01.DBF
2 Full 452236 12-6月 -05 D:/ORADATA/EYGLE/EYGLE01.DBF
5 Full 452236 12-6月 -05 D:/ORADATA/EYGLE/UNDOTBS2.DBF
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
4 Full 140M DISK 00:00:21 12-6月 -05
BP 关键字: 2 状态: AVAILABLE 标记:EYGLE
段名:D:/ORADATA/EYGLE_FULLBK.BAK
包含的 SPFILE: 修改时间: 04-3月 -05
备份集 4 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
1 Full 492975 12-6月 -05 D:/ORADATA/EYGLE/SYSTEM01.DBF
2 Full 492975 12-6月 -05 D:/ORADATA/EYGLE/EYGLE01.DBF
5 Full 492975 12-6月 -05 D:/ORADATA/EYGLE/UNDOTBS2.DBF
RMAN> exit
恢复管理器完成。
2.使用工具破坏数据块
可以使用UltraEdit或者WinHex打开文件修改某个数据块,然后保存。
3.访问损坏的数据
D:/>sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:06:19 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
已连接到空闲例程。
09:06:19 SQL> startup
ORACLE 例程已经启动。
Total System Global Area 59842188 bytes
Fixed Size 454284 bytes
Variable Size 33554432 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
09:06:33 SQL> select count(*)from t;
select count(*)from t
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号2,块号14)
ORA-01110: 数据文件 2: 'D:/ORADATA/EYGLE/EYGLE01.DBF'
此时alert_.log文件中会记录损坏块。
***
Corrupt block relative dba: 0x0080000e (file 2, block 14)
Bad check value found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0080000e
last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
consistency value in tail: 0x85840601
check value in block header: 0xca4b, computed block checksum: 0x5a6
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0080000e (file 2, block 14) found same corrupted data
4.检查坏块
也可以使用RMAN验证数据文件,以发现坏块:
D:/>rman target /
恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
连接到目标数据库: EYGLE (DBID=1365961916)
RMAN> backup validate datafile 2;
启动 backup 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 12-6月 -05
RMAN> exit
恢复管理器完成。
此时alert_.log文件中会记录RMAN发现的坏块信息:
***
Corrupt block relative dba: 0x0080000e (file 2, block 14)
Bad check value found during backing up datafile
Data in bad block -
type: 6 format: 2 rdba: 0x0080000e
last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
consistency value in tail: 0x85840601
check value in block header: 0xca4b, computed block checksum: 0x5a6
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of blocknum=14, file=D:/ORADATA/EYGLE/EYGLE01.DBF. found same corrupt data
5.查询RMAN发现的坏块信息
09:08:25 SQL> select * from v$database_block_corruption where file#=2;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
2 14 1 0 FRACTURED
已用时间: 00: 00: 00.00
6.执行恢复
D:/>rman target /
恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
已连接到目标数据库 (未启动)
RMAN> startup mount;
Oracle 例程已启动
数据库已加载
系统全局区域总计 59842188 字节
Fixed Size 454284 字节
Variable Size 33554432 字节
Database Buffers 25165824 字节
Redo Buffers 667648 字节
RMAN> blockrecover datafile 2 block 14 from backupset;
启动 blockrecover 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=11 devtype=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00002 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=D:/ORADATA/EYGLE_FULLBK.BAK tag=EYGLE params=NULL
通道 ORA_DISK_1: 块恢复已完成
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 12-6月 -05
7.检查数据的恢复
D:/>sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:10:55 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
09:10:55 SQL> alter database open;
数据库已更改。
已用时间: 00: 00: 07.01
09:11:08 SQL> select * from v$database_block_corruption where file#=2;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
2 14 1 0 FRACTURED
已用时间: 00: 00: 00.01
09:11:12 SQL> select count(*) from t;
COUNT(*)
----------
896
已用时间: 00: 00: 00.00
此时数据已经恢复,但是block corruption信息仍然记录在数据库中,直到下次validate才会清除这部分信息:
D:/>rman target /
恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
连接到目标数据库: EYGLE (DBID=1365961916)
RMAN> backup validate datafile 2;
启动 backup 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=9 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=D:/ORADATA/EYGLE/EYGLE01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 12-6月 -05
RMAN>
此时从数据库中查询,坏块信息被清除。
09:11:22 SQL> select * from v$database_block_corruption where file#=2;
未选定行
已用时间: 00: 00: 00.00
09:12:28 SQL>
六:
使用Oracle的外部表查询警告日志文件
--http://www.eygle.com/archives/2006/10/use_oracle_external_table.html
从Oracle9i开始,Oracle的外部表技术(Oracle External Tables)被极大的增强,通过外部表访问外部数据增强了Oracle数据库和外部数据源进行数据交互的能力,对于数据仓库和ETL来说,这些增强极大的方便了数据访问。
对于DBA来说,最常见一个例子是可以使用外部表来访问警告日志文件或其他跟踪文件.
以下一个例子用来说明外部表的用途。
首先需要创建一个Directory:
$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 15 21:42:28 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> create or replace directory bdump
2 as '/opt/oracle/admin/eygle/bdump';
Directory created.
SQL> col DIRECTORY_PATH for a30
SQL> col owner for a10
SQL> select * from dba_directories;
OWNER DIRECTORY_NAME DIRECTORY_PATH
---------- ------------------------------ ------------------------------
SYS BDUMP /opt/oracle/admin/eygle/bdump
然后创建一个外部表:
SQL> create table alert_log ( text varchar2(400) )
2 organization external (
3 type oracle_loader
4 default directory BDUMP
5 access parameters (
6 records delimited by newline
7 nobadfile
8 nodiscardfile
9 nologfile
10 )
11 location('alert_eygle.log')
12 )
13 reject limit unlimited
14 /
Table created.
然后我们就可以通过外部表进行查询警告日志的内容:
SQL> select * from alert_log where rownum < 51;
TEXT
-----------------------------------------------------------------------------------------
Mon Jun 26 12:00:24 2006
Starting ORACLE instance (normal)
Mon Jun 26 12:00:25 2006
WARNING: EINVAL creating segment of size 0x0000000008c00000
fix shm parameters in /etc/system or equivalent
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
SCN scheme 2
Using log_archive_dest parameter default value
LICENSE_MAX_USERS = 0
SYS auditing is disabled
Starting up ORACLE RDBMS Version: 9.2.0.4.0.
System parameters with non-default values:
processes = 150
timed_statistics = TRUE
shared_pool_size = 104857600
large_pool_size = 0
java_pool_size = 0
control_files = /opt/oracle/oradata/eygle/control01.ctl
db_block_size = 8192
db_cache_size = 16777216
db_cache_advice = ON
compatible = 9.2.0.0.0
db_file_multiblock_read_count= 16
fast_start_mttr_target = 300
log_checkpoints_to_alert = TRUE
undo_management = AUTO
undo_tablespace = UNDOTBS1
undo_retention = 10800
remote_login_passwordfile= EXCLUSIVE
db_domain =
instance_name = eygle
job_queue_processes = 10
hash_join_enabled = TRUE
background_dump_dest = /opt/oracle/admin/eygle/bdump
user_dump_dest = /opt/oracle/admin/eygle/udump
core_dump_dest = /opt/oracle/admin/eygle/cdump
sort_area_size = 524288
db_name = eygle
open_cursors = 500
star_transformation_enabled= FALSE
query_rewrite_enabled = FALSE
pga_aggregate_target = 52428800
aq_tm_processes = 0
PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6
RECO started with pid=7
50 rows selected.
SQL>
如果我们需要查看数据库中曾经出现过的ORA-错误,那么可以执行如下查询:
SQL> select * from alert_log where text like 'ORA-%';
TEXT
-----------------------------------------------------------------------------------
ORA-1652: unable to extend temp segment by 128 in tablespace TEMP
ORA-1113 signalled during: alter database open...
ORA-1113 signalled during: alter database datafile 3 online...
ORA-09968: scumnt: unable to lock file
ORA-1102 signalled during: ALTER DATABASE MOUNT...
ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'
ORA-27037: unable to obtain file status
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'
SQL>