5/11/2009

DD指令解释

首先你必须先了解到 "dd 指令" 的定义:
dd即可从标准输入设备(或档案读取数据)?
经过指定的格式来转换数据,
再输出至档案、装置或标准输出。
先用 df 观看扇区

扇区备份需要不同扇区才行
例:
hda1 挂载根目录 / 为扇区1
hda2 挂载 /home 为扇区2

备份:
dd if=/dev/hda1 of=/home/backup_system/file_name
还原:
dd if=/home/backup_system/file_name of=/dev/hda1

实例一:
制作swap只是其中之一个应用。
# dd if=/dev/zero of=/tmp/swap bs=4k count=16382
(此指令是在 /tmp 底下做个空间约64M的 file size 给swap使用,
当您做完这个file时,还要做swpaon、mount…等动作才可以达到目的,
致于如何利用硬盘制作swap不在此说明内,鸟哥和酷学园都找的到相关教学!)

实例二:
备分档案、partition或整个硬盘。
以下是将第一个硬盘整个做到第二颗硬盘备分的指令~~
#dd if=/dev/hda of=/dev/hdb
(这个实例很实用喔!
切记如果你要备分的是partition,不能将"要备分的分割区"放在同一个partition内,
如指令:# dd if=/dev/hda1 of=/dev/hda2/copy_datas)

实例三:
在linux下制作开机片。
#dd if=boot.img of=/dev/fd0 bs=1440k

实例四:
做一个测试的file。(于/tmp下做一个100m的测试档案,动作如同作swap一样)
# dd if=/dev/zero of=/tmp/100M bs=1M count=100

4/01/2009

Debian下安装SSH and Telnet服务

1.SSH
debian:~# apt-get install openssh-server
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
将会安装下列额外的软件包:
openssh-blacklist openssh-blacklist-extra
建议安装的软件包:
ssh-askpass rssh molly-guard
下列【新】软件包将被安装:
openssh-blacklist openssh-blacklist-extra openssh-server
共升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 0 个软件未被升级。
需要下载 0B/4547kB 的软件包。
解压缩后会消耗掉 9179kB 的额外空间。
您希望继续执行吗?[Y/n]y
更换介质:请把标有
“Debian GNU/Linux 5.0.0 _Lenny_ - Official i386 DVD Binary-1 20090214-16:54”
的碟片插入驱动器“/cdrom/”再按回车键

正在预设定软件包 ...
选中了曾被取消选择的软件包 openssh-blacklist。
(正在读取数据库 ... 系统当前总共安装有 97277 个文件和目录。)
正在解压缩 openssh-blacklist (从 .../openssh-blacklist_0.4.1_all.deb) ...
选中了曾被取消选择的软件包 openssh-blacklist-extra。
正在解压缩 openssh-blacklist-extra (从 .../openssh-blacklist-extra_0.4.1_all.deb) ...
选中了曾被取消选择的软件包 openssh-server。
正在解压缩 openssh-server (从 .../openssh-server_5.1p1-5_i386.deb) ...
正在处理用于 man-db 的触发器...
正在设置 openssh-blacklist (0.4.1) ...
正在设置 openssh-blacklist-extra (0.4.1) ...
正在设置 openssh-server (1:5.1p1-5) ...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Restarting OpenBSD Secure Shell server: sshd.


2.Telnet

debian:~# apt-get install xinetd
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包将被【卸载】:
openbsd-inetd
下列【新】软件包将被安装:
xinetd
共升级了 0 个软件包,新安装了 1 个软件包,要卸载 1 个软件包,有 0 个软件未被升级。
需要下载 0B/136kB 的软件包。
解压缩后会消耗掉 180kB 的额外空间。
您希望继续执行吗?[Y/n]y
dpkg:openbsd-inetd:有依赖问题,但是如您所愿还是继续删除:
swat 依赖于 openbsd-inetd inet-superserver;然而:
即将删除 openbsd-inetd。
未曾安装软件包“inet-superserver”。
提供了 inet-superserver 的软件包 openbsd-inetd 即将被删除。
swat 依赖于 openbsd-inetd inet-superserver;然而:
即将删除 openbsd-inetd。
未曾安装软件包“inet-superserver”。
提供了 inet-superserver 的软件包 openbsd-inetd 即将被删除。
(正在读取数据库 ... 系统当前总共安装有 97243 个文件和目录。)
正在删除 openbsd-inetd ...
Stopping internet superserver: inetd.
正在处理用于 man-db 的触发器...
选中了曾被取消选择的软件包 xinetd。
(正在读取数据库 ... 系统当前总共安装有 97237 个文件和目录。)
正在解压缩 xinetd (从 .../xinetd_2.3.14-7_i386.deb) ...
正在处理用于 man-db 的触发器...
正在设置 xinetd (1:2.3.14-7) ...
Stopping internet superserver: xinetd.
Starting internet superserver: xinetd.

debian:~# apt-get install telnetd
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列【新】软件包将被安装:
telnetd
共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 0 个软件未被升级。
需要下载 0B/42.3kB 的软件包。
解压缩后会消耗掉 106kB 的额外空间。
更换介质:请把标有
“Debian GNU/Linux 5.0.0 _Lenny_ - Official i386 DVD Binary-2 20090214-16:54”
的碟片插入驱动器“/cdrom/”再按回车键

选中了曾被取消选择的软件包 telnetd。
(正在读取数据库 ... 系统当前总共安装有 97265 个文件和目录。)
正在解压缩 telnetd (从 .../telnetd_0.17-36_i386.deb) ...
正在处理用于 man-db 的触发器...
正在设置 telnetd (0.17-36) ...
正在将用户“telnetd”加入到“utmp”组中
--------- IMPORTANT INFORMATION FOR XINETD USERS ----------
The following line will be added to your /etc/inetd.conf file:

telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd

If you are indeed using xinetd, you will have to convert the
above into /etc/xinetd.conf format, and add it manually. See
/usr/share/doc/xinetd/README.Debian for more information.
Suggested entry (automatically converted using itox):

service telnet
{
socket_type = stream
protocol = tcp
wait = no
user = telnetd
You must use option -daemon_dir if you use tcpd
-----------------------------------------------------------
然后新建了一个/etc/xinetd.d/telnet,内容如下:

debian:~#vi /etc/xinetd.d/telnet
service telnet
{
disable=no
flags=REUSE
socket_type+stream
wait=no
user=root
server=/usr/sbin/in.telnetd
server_args=-h
log_on_failure +=USERID
}
保存ok.

3/16/2009

DBMS常用包介绍

首先介绍:dbms_rowid
DBMS_ROWID包主要是用来获得数据库块的block number,object number等信息
常用的选项有下:
ROWID_BLOCK_NUMBER Function
Returns the block number of a ROWID
根据ROWID获取数据块的NUMBER
SQL> select * from T4 2 ;
ID NAME———- ——————– 1 seagull80 2 liguohua80
SQL> select dbms_rowid.rowid_block_number(rowid) from T4;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)———————————— 1514 1514
这个常用来DUMP数据块号,分析
ROWID_CREATE Function
Creates a ROWID, for testing only
用来创建ROWID,一般用来测试
格式如下:
BMS_ROWID.ROWID_CREATE ( rowid_type IN NUMBER, object_number IN NUMBER, relative_fno IN NUMBER, block_number IN NUMBER, row_number IN NUMBER) RETURN ROWID;
ROWID_RELATIVE_FNO Function
Returns the file number of a ROWID
返回ROWID所在文件号
SQL> select dbms_rowid.rowid_relative_fno(rowid) from T4;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)———————————— 6 6
SQL> select dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from T4;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)———————————— ———————————— 6 1514 6 1514
ROWID_ROW_NUMBER Function
Returns the row number
返回行号
还有如下几个,大家可以参照官方文档
ROWID_TO_ABSOLUTE_FNO Function
Returns the absolute file number associated with the ROWID for a row in a specific table
ROWID_TO_EXTENDED Function
Converts a ROWID from restricted format to extended
ROWID_TO_RESTRICTED Function
Converts an extended ROWID to restricted format
ROWID_TYPE Function
Returns the ROWID type: 0 is restricted, 1 is extended
ROWID_VERIFY Function
Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function
ROWID_INFO Procedure
Returns the type and components of a ROWID
ROWID_OBJECT Function
Returns the object number of the extended ROWID
第2个包:dbms_utility
可以用来将数据块地址转换为块的地址和文件块号
比如我们在分析索引接受时就可以用到
SQL> create index ind_dbms on T4(id);
索引已创建。
SQL> select object_id from dba_objects where object_name=’IND_DBMS’;
OBJECT_ID———- 54147
SQL> alter session set events ‘immediate trace name treedump level 54147′;
会话已更改。
—– begin tree dumpleaf: 0×1000b74 16780148 (0: nrow: 2 rrow: 2)—– end tree dump
我们可以将叶块地址16780148转换为叶块所在文件和块号
SQL> select dbms_utility.data_block_address_file(16780148) “file”, 2 dbms_utility.data_block_address_block(16780148) “block” from dual;
file block———- ———- 4 2932
当然相应我们可以夸大表结构然后重建索引,可以DUMP索引结果的分支快啥的
从汪海BLOG看到如下信息:
unique index和non-unique index它的构造是不一样的。对于unique index,它的branch block里面只保存key value和leaf block的address,因为根据这2个值就可以定位当新值插入时会选择哪个leaf block进行插入,leaf block里面的值也没必要按照rowid的顺序排列了,只需要按照key value排序就行了。但是如果是non-unique index,branch block里面必须保存key value,leaf block的address,和rowid。在leaf block里面如果key value相同的话要按照rowid做升序排列,我个人觉得这样做会有2个好处,一个是可以提高相同一个leaf block内相同key value能尽量关联到相同的data block。第2个好处是当插入新的相同key value时能很容易定位插入到哪个block。为了能做到这些,non-unique index必须在branch block里面放入rowid
功能模块有如下:
ACTIVE_INSTANCES Procedure
Returns the active instance
ANALYZE_DATABASE Procedure
Analyzes all the tables, clusters, and indexes in a database [see alsoDeprecated Subprograms]
ANALYZE_PART_OBJECT Procedure
Analyzes the given tables and indexes
ANALYZE_SCHEMA Procedure
Analyzes all the tables, clusters, and indexes in a schema [see also Deprecated Subprograms]
CANONICALIZE Procedure
Canonicalizes a given string
COMMA_TO_TABLE Procedures
Converts a comma-delimited list of names into a PL/SQL table of names
COMPILE_SCHEMA Procedure
Compiles all procedures, functions, packages, and triggers in the specified schema
CREATE_ALTER_TYPE_ERROR_TABLE Procedure
Creates an error table to be used in the EXCEPTION clause of the ALTER TYPE statement
CURRENT_INSTANCE Function
Returns the current connected instance number
DATA_BLOCK_ADDRESS_BLOCK Function
Gets the block number part of a data block address
DATA_BLOCK_ADDRESS_FILE Function
Gets the file number part of a data block address
DB_VERSION Procedure
Returns version information for the database
EXEC_DDL_STATEMENT Procedure
Executes the DDL statement in parse_string
FORMAT_CALL_STACK Function
Formats the current call stack
FORMAT_ERROR_BACKTRACE Function
Formats the backtrace from the point of the current error to the exception handler where the error has been caught
FORMAT_ERROR_STACK Function
Formats the current error stack
GET_CPU_TIME Function
Returns the current CPU time in 100th’s of a second
GET_DEPENDENCY Procedure
Shows the dependencies on the object passed in.
GET_HASH_VALUE Function
Computes a hash value for the given string
GET_PARAMETER_VALUE Function
Gets the value of specified init.ora parameter
GET_TIME Function
Finds out the current time in 100th’s of a second
INVALIDATE Procedure
Invalidates a database object and (optionally) modifies its PL/SQL compiler parameter settings
IS_CLUSTER_DATABASE Function
Finds out if this database is running in cluster database mode
MAKE_DATA_BLOCK_ADDRESS Function
Creates a data block address given a file number and a block number
NAME_RESOLVE Procedure
Resolves the given name
NAME_RESOLVE Procedure
Calls the parser to parse the given name
PORT_STRING Function
Returns a string that uniquely identifies the version of Oracle and the operating system
TABLE_TO_COMMA Procedures
Converts a PL/SQL table of names into a comma-delimited list of names
VALIDATE Procedure
Converts a PL/SQL table of names into a comma-delimited list of names
这些东西了解下OK,具体用的时候可以看下
第三个dbms_stats
用来收集对象信息比如表 索引,这些信息对于CBO下产生计划有着重要的影响
统计信息包括下面几类:
表统计:包括记录数、block数和记录平均长度。
列统计:列中不同值的数量(NVD)、空值的数量和数据分布(HISTOGRAM)。
索引统计:索引叶块的数量、索引的层数和聚集因子(CLUSTERING FACTOR)。
系统统计:I/O性能和利用率和CPU性能和利用率。
生成统计信息:
统计信息生成技术包括三种:
基于数据采样的估计方式;
精确计算方式;
用户自定义的统计信息收集方式;
其中采用估算方式可以指定总记录数的估算百分比或者总块数的估算百分比。
分区表的统计信息分为几级:分区表的整体信息、分区的统计信息和子分区的统计信息。
最常用的收集统计信息的方式包括:DBMS_STATS包和ANALYZE语句,Oracle推荐使用DBMS_STATS包来收集统计信息。
dbms_stats.gather_database_stats:收集数据库中所有对象的统计信息;在CREATE INDEX和ALTER INDEX REBUILD时可以指定COMPUTE STATISTICS语句,对于非分区表重建索引时会收集表、列和索引的统计信息。对于分区表,只收集索引信息,不会收集表和列信息。
可以在将METHOD_OPT参数设置为“FOR ALL HIDDEN COLUMNS SIZE N”来收集函数索引的索引表达式信息。Oracle根据下列条件来决定使用哪些索引:
索引中的记录数;
索引中不同键值的数量;
索引的层数;
索引中的叶块数;
聚集因子;
每个键值平均叶块数;
如果两个索引的选择性、查询代价和集势都相同,那么优化器会根据索引名称的字母顺序选
常用的有如下:
DBMS_STATS包中用于收集统计信息的过程包括:
dbms_stats.gather_table_stats 收集表、列和索引的统计信息; dbms_stats.gather_schema_stats 收集SCHEMA下所有对象的统计信息; dbms_stats.gather_index_stats 收集索引的统计信息; dbms_stats.gather_system_stats 收集系统统计信息。 dbms_stats.delete_table_stats 删除表的统计信息
dbms_stats.delete_index_stats 删除索引的统计信息 dbms_stats.export_table_stats 输出表的统计信息 dbms_stats.create_state_table dbms_stats.set_table_stats 设置 表的统计 dbms_stats.auto_sample_size
要注意的是,在删除统计信息前最好做个备份以免删除后发生问题用来恢复。
导出 导入 收集、删除统计信息可以:按数据库 数据字典 用户 表 索引来进行
其他可以作为了解
ALTER_DATABASE_TAB_MONITORING ProcedureALTER_SCHEMA_TAB_MONITORING ProcedureALTER_STATS_HISTORY_RETENTION ProcedureCONVERT_RAW_VALUE ProceduresCONVERT_RAW_VALUE_NVARCHAR ProcedureCONVERT_RAW_VALUE_ROWID ProcedureCREATE_STAT_TABLE ProcedureDELETE_COLUMN_STATS ProcedureDELETE_DATABASE_STATS ProcedureDELETE_DICTIONARY_STATS ProcedureDELETE_FIXED_OBJECTS_STATS ProcedureDELETE_INDEX_STATS ProcedureDELETE_SCHEMA_STATS ProcedureDELETE_SYSTEM_STATS ProcedureDELETE_TABLE_STATS ProcedureDROP_STAT_TABLE ProcedureEXPORT_COLUMN_STATS ProcedureEXPORT_DATABASE_STATS ProcedureEXPORT_DICTIONARY_STATS ProcedureEXPORT_FIXED_OBJECTS_STATS ProcedureEXPORT_INDEX_STATS ProcedureEXPORT_SCHEMA_STATS ProcedureEXPORT_SYSTEM_STATS ProcedureEXPORT_TABLE_STATS ProcedureFLUSH_DATABASE_MONITORING_INFO ProcedureGATHER_DATABASE_STATS ProceduresGATHER_DICTIONARY_STATS ProcedureGATHER_FIXED_OBJECTS_STATS ProcedureGATHER_INDEX_STATS ProcedureGATHER_SCHEMA_STATS ProceduresGATHER_SYSTEM_STATS ProcedureGATHER_TABLE_STATS ProcedureGENERATE_STATS ProcedureGET_COLUMN_STATS ProceduresGET_INDEX_STATS ProceduresGET_PARAM FunctionGET_STATS_HISTORY_AVAILABILITY FunctionGET_STATS_HISTORY_RETENTION FunctionGET_SYSTEM_STATS ProcedureGET_TABLE_STATS ProcedureIMPORT_COLUMN_STATS ProcedureIMPORT_DATABASE_STATS ProcedureIMPORT_DICTIONARY_STATS ProcedureIMPORT_FIXED_OBJECTS_STATS ProcedureIMPORT_INDEX_STATS ProcedureIMPORT_SCHEMA_STATS ProcedureIMPORT_SYSTEM_STATS ProcedureIMPORT_TABLE_STATS ProcedureLOCK_SCHEMA_STATS ProcedureLOCK_TABLE_STATS ProcedurePREPARE_COLUMN_VALUES ProceduresPREPARE_COLUMN_VALUES_NVARCHAR2 ProcedurePREPARE_COLUMN_VALUES_ROWID ProcedurePURGE_STATS ProcedureRESET_PARAM_DEFAULTS ProcedureRESTORE_DATABASE_STATS ProcedureRESTORE_DICTIONARY_STATS ProcedureRESTORE_FIXED_OBJECTS_STATS ProcedureRESTORE_SCHEMA_STATS ProcedureRESTORE_SYSTEM_STATS ProcedureRESTORE_TABLE_STATS ProcedureSET_COLUMN_STATS ProceduresSET_INDEX_STATS ProceduresSET_PARAM ProcedureSET_SYSTEM_STATS ProcedureSET_TABLE_STATS ProcedureUNLOCK_SCHEMA_STATS ProcedureUNLOCK_TABLE_STATS ProcedureUPGRADE_STAT_TABLE Procedure以DBMS_STATS.GATHER_SCHEMA_SATTS为例
exec dbms_stats.gather_schema_stats( -ownname => ‘SCOTT’, -options => ‘GATHER AUTO’, -estimate_percent => dbms_stats.auto_sample_size, -method_opt => ‘for all columns size repeat’, -degree => 15 -)
为了充分认识dbms_stats的好处,你需要仔细体会每一条主要的预编译指令(directive)。下面让我们研究每一条指令,并体会如何用它为基于代价的SQL优化器收集最高质量的统计数据。
options参数使用4个预设的方法之一,这个选项能控制Oracle统计的刷新方式:
gather——重新分析整个架构(Schema)。gather empty——只分析目前还没有统计的表。gather stale——只重新分析修改量超过10%的表(这些修改包括插入、更新和删除)。gather auto——重新分析当前没有统计的对象,以及统计数据过期(变脏)的对象。注意,使用gather auto类似于组合使用gather stale和gather empty。注意,无论gather stale还是gather auto,都要求进行监视。如果你执行一个alter table xxx monitoring命令,Oracle会用dba_tab_modifications视图来跟踪发生变动的表。这样一来,你就确切地知道,自从上一次分析统计数据以来,发生了多少次插入、更新和删除操作。
estimate_percent选项以下estimate_percent参数是一种比较新的设计,它允许Oracle的dbms_stats在收集统计数据时,自动估计要采样的一个segment的最佳百分比:estimate_percent => dbms_stats.auto_sample_size
要验证自动统计采样的准确性,你可检视dba_tables sample_size列。一个有趣的地方是,在使用自动采样时,Oracle会为一个样本尺寸选择5到20的百分比。记住,统计数据质量越好,CBO做出的决定越好。
method_opt选项dbms_stats的method_opt参数尤其适合在表和索引数据发生变化时刷新统计数据。method_opt参数也适合用于判断哪些列需要直方图(histograms)。
某些情况下,索引内的各个值的分布会影响CBO是使用一个索引还是执行一次全表扫描的决策。例如,假如在where子句中指定的值的数量不对称,全表扫描就显得比索引访问更经济。
如果你有一个高度倾斜的索引(某些值的行数不对称),就可创建Oracle直方图统计。但在现实世界中,出现这种情况的机率相当小。使用CBO时,最常见的错误之一就是在CBO统计中不必要地引入直方图。根据经验,只有在列值要求必须修改执行计划时,才应使用直方图。
为了智能地生成直方图,Oracle为dbms_stats准备了method_opt参数。在method_opt子句中,还有一些重要的新选项,包括skewonly,repeat和auto:method_opt=>’for all columns size skewonly’method_opt=>’for all columns size repeat’method_opt=>’for all columns size auto’
skewonly选项会耗费大量处理时间,因为它要检查每个索引中的每个列的值的分布情况。
假如dbms_stat发现一个索引的各个列分布得不均匀,就会为那个索引创建直方图,帮助基于代价的SQL优化器决定是进行索引访问,还是进行全表扫描访问。例如,在一个索引中,假定有一个列在50%的行中,如清单B所示,那么为了检索这些行,全表扫描的速度会快于索引扫描。–*************************************************************– SKEWONLY option—Detailed analysis–– Use this method for a first-time analysis for skewed indexes– This runs a long time because all indexes are examined–*************************************************************
begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size skewonly’, degree => 7 );end;重新分析统计数据时,使用repeat选项,重新分析任务所消耗的资源就会少一些。使用repeat选项(清单C)时,只会为现有的直方图重新分析索引,不再搜索其他直方图机会。定期重新分析统计数据时,你应该采取这种方式。–**************************************************************– REPEAT OPTION - Only reanalyze histograms for indexes– that have histograms–– Following the initial analysis, the weekly analysis– job will use the “repeat” option. The repeat option– tells dbms_stats that no indexes have changed, and– it will only reanalyze histograms for– indexes that have histograms.–**************************************************************begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size repeat’, degree => 7 );end;使用alter table xxx monitoring;命令来实现Oracle表监视时,需要使用dbms_stats中的auto选项。如清单D所示,auto选项根据数据分布以及应用程序访问列的方式(例如通过监视而确定的一个列的工作量)来创建直方图。使用method_opt=>’auto’类似于在dbms_stats的option参数中使用gather auto。begin dbms_stats.gather_schema_stats( ownname => ‘SCOTT’, estimate_percent => dbms_stats.auto_sample_size, method_opt => ‘for all columns size auto’, degree => 7 );end;
并行收集Oracle允许以并行方式来收集CBO统计数据,这就显著提高了收集统计数据的速度。但是,要想并行收集统计数据,你需要一台安装了多个CPU的SMP服务器。
更快的执行速度dbms_stats是提高SQL执行速度的一种出色机制。通过使用dbms_stats来收集最高质量的统计数据,CBO能够正确判断执行任何SQL查询时的最快途径。dbms_stats还在不断地改进。目前,它的一些令人激动的新特性(自动样本大小和自动直方图生成)已经显著简化了Oracle专家的工作。
详细DBMS包见 http://lbdwww.epfl.ch/f/teaching/courses/oracle8i/server.815/a68001/dbms_sta.htm

11/04/2008

Oracle Audit

1、什么是审计

审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)中。默认情况下审计是没有开启的。
不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。

2、和审计相关的两个主要参数

Audit_sys_operations:
默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。

Audit_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。

注:这两个参数是static参数,需要重新启动数据库才能生效。

3、审计级别

当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、object(对象)。

Statement:
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。

Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。

Object:
按对象审计,只审计on关键字指定对象的相关操作,如aduit alter,delete,drop,insert on cmy.t by scott; 这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。注意Oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on default子句来实现自动审计,比如执行audit drop on default by access;后, 对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比trigger可以对schema的DDL进行“审计”,这个功能稍显不足。

4、审计的一些其他选项

by access / by session:
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。

whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,
whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。

5、和审计相关的视图

dba_audit_trail:保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一个子集。
dba_stmt_audit_opts:可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
all_def_audit_opts:用来查看数据库用on default子句设置了哪些默认对象审计。

6、取消审计

将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;

7、10g中的审计告知一切

Oracle 数据库 10g 审计以一种非常详细的级别捕获用户行为,它可以消除手动的、基于触发器的审计。
假定用户 Joe 具有更新那张表的权限,并按如下所示的方式更新了表中的一行数据:
update SCOTT.EMP set salary = 12000 where empno = 123456;
您如何在数据库中跟踪这种行为呢?在 Oracle 9i 数据库及其较低版本中,审计只能捕获“谁”执行此操作,而不能捕获执行了“什么”内容。例如,它让您知道 Joe 更新了 SCOTT 所有的表EMP,但它不会显示他更新了该表中员工号为 123456 的薪水列。它不会显示更改前的薪水列的值 — 要捕获如此详细的更改,您将不得不编写您自己的触发器来捕获更改前的值,或使用 LogMiner 将它们从存档日志中检索出来。
细粒度审计(FGA) ,是在 Oracle 9i 中引入的,能够记录 SCN 号和行级的更改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 DML ,如 update 、insert 和delete 语句。因此,对于 Oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。

8、实例讲解

8.1、激活审计

SQL> conn /as sysdba
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE

SQL> alter system set audit_sys_operations=TRUE scope=spfile; --审计管理用户(以sysdba/sysoper角色登陆)
SQL> alter system set audit_trail=db,extended scope=spfile;
SQL> startup force;
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB, EXTENDED

8.2、开始审计

SQL> conn /as sysdba
SQL> audit all on t_test;
SQL> conn u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test (c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format a30
col SQL_TEXT format a60
SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;

sql> audit select table by u_test by access;
如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).

例:
AUDIT DELETE ANY TABLE; --审计删除表的操作
AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; --只审计删除失败的情况
AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; --只审计删除成功的情况
AUDIT DELETE,UPDATE,INSERT ON user.table by test; --审计test用户对表user.table的delete,update,insert操作

8.3、撤销审计
SQL> noaudit all on t_test;

9、精细审计

9.1、创建审计标记
SQL> exec dbms_fga.add_policy(object_schema=>'ryan',object_name=>'test',policy_name=>'chk_test',statement_types=>'select');

9.2、开启审计
SQL> exec DBMS_FGA.ENABLE_POLICY(object_schema=>'ryan' ,object_name=>'test' ,policy_name=>'chk_test');

9.3、查看审计记录
SQL> conn system/811226@ryan123
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system

SQL> SELECT session_id,TIMESTAMP,db_user,os_user,userhost,sql_text FROM Dba_Fga_Audit_Trail;

SESSION_ID TIMESTAMP DB_USER OS_USER USERHOST SQL_TEXT
---------- ----------- ------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
201 2008-11-4 2 RYAN Ryan WORKGROUP\LENOVO-C30DA497 select * from test

9.4、关闭审计
SQL> exec DBMS_FGA.DISABLE_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');

9.5、删除审计标记
SQL> exec DBMS_FGA.DROP_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');

11/02/2008

install Oracle10.2 on rhel4(oracle) u6 手札

参考至 http://www.oracle.com/technology/pub/articles/smiley_10gdb_install.html
1.安装好检查好Oracle的必须包,如果没有的在linux安装盘找到并安装之
[root@localhost RPMS]#rpm -q binutils compat-db control-center gcc gcc-c++ glibc glibc-common \gnome-libs libstdc++ libstdc++-devel make pdksh sysstat xscreensaver libaio openmotif21

glibc-common-2.3.4-2.39
libstdc++-devel-3.4.6-9.0.1
sysstat-5.0.5-16.rhel4
glibc-2.3.4-2.39
libstdc++-3.4.6-9.0.1
binutils-2.15.92.0.2-24
make-3.80-6.EL4
pdksh-5.2.14-30.6
gnome-libs-1.4.1.2.90-44.2
xscreensaver-4.18-5.rhel4.14.0.1
control-center-2.8.0-12.rhel4.5
gcc-3.4.6-9.0.1
libaio-0.3.105-2
openmotif21-2.1.30-11.RHEL4.6
compat-db-4.1.25-9
gcc-c++-3.4.6-9.0.1

2.检查系统的内存以及swap大小,安装空间大小

[root@localhost ~]# grep MemTotal /proc/meminfo
MemTotal: 1034564 kB <== 最小1G
[root@localhost ~]# grep SwapTotal /proc/meminfo
SwapTotal: 1052248 kB <== 最小1G

[root@localhost ~]# df -h <== 2.5G空间即可

Filesystem 容量 已用 可用 已用% 挂载点
/dev/sda3 19G 3.4G 15G 20% /
/dev/sda1 99M 12M 83M 13% /boot
none 506M 0 506M 0% /dev/shm
/dev/hdc 452M 452M 0 100% /mnt

3.创建Oracle用户组以及用户

[root@localhost ~]# groupadd oinstall
[root@localhost ~]# groupadd dba
[root@localhost ~]# useradd -m -g oinstall -G dba oracle
[root@localhost ~]# id oracle
uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)
[root@localhost ~]# passwd oracle <== 为Oracle用户设置密码


4.修改系统参数

修改/etc/sysctl.conf 文件, 增加如下:

kernel.shmmax=1073741824
kernel.shmmni=4096
kernel.shmall=2097152
kernel.sem=250 322000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144

设置oracle用户的环境变量
[root@localhost ~]# su - oracle
[oracle@localhost ~]$ vi .bash_profile

PATH=$PATH:$HOME/bin
export LD_ASSUME_KERNEL=2.4.19
export ORACLE_BASE=/opt/ora10
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0
export ORACLE_SID=Ryan
export NLS_LANG=AMERICAN
export LD_LIBRARY_PATH=$ORACLE_HOME/bin:/lib:/usr/lib:/usr/local/lib
export PATH=$PATH:$ORACLE_HOME/bin
unset USERNAME

然后执行环境参数
oracle@localhost ~]$ . .bash_profile

5.创建ORACLE安装目录

[root@localhost ~]# mkdir -p /opt/ora10/product/10.2.0
[root@localhost ~]# mkdir /var/opt/oracle
[root@localhost ~]# chown oracle.dba /var/opt/oracle
[root@localhost ~]# chown -R oracle.dba /opt/ora10

6.正式安装
上传介质, 然后解压缩
[oracle@localhost ~]$unzip 10201_database_linux32.zip
[oracle@localhost ~]$startx
[oracle@localhost ~]$./home/oracle/database/runInstaller