Archive of the categories: 数据库技术

mysql无法访问本地或远程访问的解决办法

问题重现(以下讨论范围仅限Windows环境):

C:\AppServ\MySQL> mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

编辑mysql配置文件my.ini(不知道在哪请搜索),在[mysqld]这个条目下加入
skip-grant-tables

保存退出后重启mysql

1.点击“开始”->“运行”(快捷键Win+R)。

2.启动:输入 net stop mysql

3.停止:输入 net start mysql

这时候在cmd里面输入mysql -u root -p就可以不用密码登录了,出现password:的时候直接回车可以进入,不会出现ERROR 1045 (28000),但很多操作都会受限制,因为我们不能grant(没有权限)。按下面的流程走(红色部分为输入部分,粉红色的是执行后显示的代码不用输入):

1.进入mysql数据库:

mysql> use mysql;
Database changed

2.给root用户设置新密码,蓝色部分自己输入(这些也很关键有时就是无法登录):
mysql> update user set password=password(“新密码”) where user=”root”;
Query OK, 1 rows affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

3.刷新数据库(这步很关键没有这个很可能权限没有更新)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4.退出mysql:
mysql> quit
Bye

改好之后,再修改一下my.ini这个文件,把我们刚才加入的”skip-grant-tables”这行删除,保存退出再重启mysql就可以了。

另外发现这个问题:

1194 – Table ‘user’ is marked as crashed and should be repaired
可能通过mysql> repair table user //user是指那个有问题的表。

启动Oracle服务和监听程序

  • $ su – oracle
  • $ sqlplus / nolog
  • sql> conn / as sysdba
  • sql> startup (一般不需要加参数,只要设置好环境变量)
  • sql> quit (退出sql模式)
  • $ lsnrctl start (启动监听器)关闭oracle
    1. $ lsnrctl stop(关闭监听器,在这之前,应该先关闭应用程序)
    2. $ sqlplus  /nolog
    3. sql>shutdown 其参数 :shutdown有四个参数,四个参数的含义如下: Normal 需要等待所有的用户断开连接 Immediate 等待用户完成当前的语句 Transactional 等待用户完成当前的事务 Abort 不做任何等待,直接关闭数据库 normal需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接 immediate在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。 transactional 在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。 abort 执行强行断开连接并直接关闭数据库。 前三种方式不回丢失用户数据。第四种在不的已的情况下,不建议采用!

    经常遇到的问题:

    1)权限问题,解决方法,切换到oracle用户;

    2)没有关闭监听器 ,解决方法:关闭监听器

    3)有oracle实例没有关闭,解决办法:关闭oracle实例

    4)环境变量设置不全,解决办法:修改环境变量

oracle sql 时间查询

to_date()与24小时制表示法及mm分钟的显示:
一、在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会和我一样,直觉的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。
如:select to_date(‘2005-01-01 13:14:20′,’yyyy-MM-dd HH24:mm:ss’) from dual;
原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
select to_date(‘2005-01-01 13:14:20′,’yyyy-MM-dd HH24:mi:ss’) from dual;

二、另要以24小时的形式显示出来要用HH24
select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’) from dual;//mi是分钟
select to_char(sysdate,’yyyy-MM-dd HH24:mm:ss’) from dual;//mm会显示月份

to_date() 与 to_char() 日期和字符串转换

to_date(“要转换的字符串”,”转换的格式”) 两个参数的格式必须匹配,否则会报错。

即按照第二个参数的格式解释第一个参数。

to_char(日期,”转换格式” ) 即把给定的日期按照“转换格式”转换。

转换的格式:

表示year的:y 表示年的最后一位 yy 表示年的最后2位 yyy 表示年的最后3位 yyyy 用4位数表示年

表示month的:mm 用2位数字表示月;mon 用简写形式 比如11月或者nov ;month 用全称 比如11月或者november

表示day的:dd 表示当月第几天;ddd表示当年第几天;dy 当周第几天 简写 比如星期五或者fri;day当周第几天 全写

比如星期五或者friday。

表示hour的:hh 2位数表示小时 12进制; hh24 2位数表示小时 24小时

表示minute的:mi 2位数表示分钟

表示second的:ss 2位数表示秒 60进制

表示季度的:q 一位数 表示季度 (1-4)

另外还有ww 用来表示当年第几周 w用来表示当月第几周。

24小时制下的时间范围:00:00:00-23:59:59

12小时制下的时间范围:1:00:00-12:59:59

比如:

select to_char(sysdate,’yy-mm-dd hh24:mi:ss’) from dual //显示:08-11-07 13:22:42

select to_date(‘2005-12-25,13:25:59′,’yyyy-mm-dd,hh24:mi:ss’) from dual //显示:2005-12-25 13:25:59

而如果把上式写作:select to_date(‘2005-12-25,13:25:59′,’yyyy-mm-dd,hh:mi:ss’) from dual,则会报错,因为小时hh是12进制,13为非法输入,不能匹配。

补充:

当前时间减去7分钟的时间
select sysdate,sysdate – interval ‘7’ MINUTE from dual
当前时间减去7小时的时间
select sysdate – interval ‘7’ hour from dual
当前时间减去7天的时间
select sysdate – interval ’7’ day from dual
当前时间减去7月的时间
select sysdate,sysdate – interval ‘7’ month from dual
当前时间减去7年的时间
select sysdate,sysdate – interval ‘7’ year from dual
时间间隔乘以一个数字
select sysdate,sysdate – 8*interval ‘7’ hour from dual

time字段是DATETIME类型
select * from table_name where jxlx=’03002′ and time between to_date(‘2007-9-1′,’yyyy-mm-dd’) and to_date(‘2007-9-20 23:59:59’,’yyyy-mm-dd hh24:mi:ss)

还有一个to_char()

与null值比较:is not null,is null

如 select * from orders where price is null ,price等于null

如: select * from orders where price is not null , price不等于null

【转】 pl/sql developer 中文字段显示乱码

在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样检索出来的中文内容就不会是乱码了。如果想转换为UTF8字符集,可以赋予“NLS_LANG”为 “AMERICAN_AMERICA.UTF8”,然后重新启动 pl/sql developer。其它字符集设置同上。
NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言。territory 指定服务器的日期和数字格式。charset 指定字符集。

如何设置客户端字符集与服务器端字符集一致:

运行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE,第三步选择 Oracle,第四步选择 NLS_LANG,键入与服务器端相同的字符集。

例如:AMERICAN_AMERICA.UTF8或者SIMPLIFIED CHINESE_CHINA.ZHS16GBK

oracle 10g装上后,建了个表写入中文数据,发现通过工具PL/SQL Developer中文不能正常显示.

要正常显示中文,就必须得服务器和客户端编码一致才行。于是检查:

1.检查服务器编码:

执行SQL语法:

select * from v$nls_parameters;

也可以参照/home/oracle/.bash_profile 相关语言设置.
可以看到我的相关设置是:

LANG=zh_CN.GBK
NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”

2.设置本地客户端编码:

进入我的电脑,属性,高级,环境变量,添加2项:

LANG=zh_CN.GBK
NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”

如图:

3.重新连接sqlplus,查看数据:

显示正常.

4.PL/SQL Developer设置并重新连接:

在pl/sql developer的菜单->tools->preferences->user interface->fonts 中修改为中文字体

重新连接,如图:

显示正常.OK!

Oracle 中SYS、SYSTEM、SYSMAN、DBSNMP的区别

Users and Passwords
A big part of the confusion over authentication is due to the fact that there are two diffrent forms of authentication! Authentication can be done using password authentication (also called internal authentication) or OS authentication(external authentication).

If the database is configured for OS authentication you can log into the database without authenticating to Oracle based on your UNIX UID. OS authentication is enabled or disabled based on the “os_roles” parameter. When you create a database using dbca OS authentication is disabled by default. In fact, you won’t be able to enable it unless you edit the initialization parameters in step 10 by selecting “All Initialization Parameters” and then selecting “Show Advanced Parameters”! If you scroll down the long list you’ll see “os_roles” is set as false, which you can then enable if you choose. All this tells you one thing: Oracle isn’t keen on you using it. Therefore… don’t.

When you create a database with dbca, in step 5, it will ask you to assign passwords to the default Oracle accounts. The default accounts are: sys, system, dbsnmp, and sysman. Lets break down the default users. (Descriptions taken directly from the DBCA help.)

SYS
The SYS user owns all base tables and user-accessable view of the data dictionary (Oracle configuration information). No Oracle user should ever alter (update, delete, or insert) any rows or schema objects conatained in the SYS schema, because such activity can compromise data integrety. The security administrator must keep strict control of this central account.
SYSTEM
The SYSTEM user is used to create additional tables and views that display administrative information, and internal tables and views used by various Oracle options and tools.
SYSMAN
The SYSMAN user represents the Enterprise Manager super admin account. This EM admin can create and modify other EM admin accounts as well as admin the database instance itself.
DBSNMP
The DBSNMP user is used by EM to monitor the database. EM uses this account to access performance stats about the database. The DBSNMP credentials sometimes referred to as the monitoring credentials.
In addition to these users, a user can connect with diffrent levels of privileges, namely SYSDBA and SYSOPER. When you connect using “connect sys/passwd as sysdba” your connecting as the SYS user and requesting SYSDBA privs. Because the SYS user is the Oracle equivilent to the UNIX root user Oracle makes you specify the amount of control you have, which is why you’ll get an error if you try to connect without specifying the privs:

SQL> connect sys/passwd
ERROR:
ORA-28009: connection to sys should be as sysdba or sysoper
SQL> connect sys/passwd as sysdba
Connected.
SQL>

The big diffrence between SYSDBA and SYSOPER privs is that SYSDBA can do anything (just like root). The SYSOPER privs allow you just about the same amount of control but won’t allow you to look at user data. Both privs allow you to ALTER DATABASE, CREATE SPFILE, STARTUP or SHUTDOWN, ALTER DATABASE ARCHIVELOG, and includes RESTRICTED SESSION privs. However, only SYSDBA can CREATE or DROP DATABASE, and the ALTER DATABASE RECOVER options for SYSOPER are limited to complete recovery only.

Naturally these are all administrative accounts and therefore shouldn’t be used for general database usage. (We used sysin our basics chapter because its already there and I wanted to focus on the basics without jumping straight into authentication).

Oracle EM 按钮乱码解决 (半原创)

今天发现em中网页的内容正常,但按钮是乱码,其实原来遇到过,快忘了,主要原因是通过java生成的图片需要的字体文件的位置不对。

下面是解决办法:

1.修改jdk 下面的字体,这个经过对比,主要是解决图片本身。

[oracle@rac2 db_1]$ cd $ORACLE_HOME/jdk/jre/lib/

[oracle@rac2 lib]$ mv font.properties font.properties_bak

[oracle@rac2 lib]$

[oracle@rac2 lib]$ cp font.properties.zh_CN.RedHat font.properties

[oracle@rac2 lib]$

2.修改jre 下面的字体,这个经过测试对比,可以不去配置,只要jdk的字体配置就OK了,网络很多说要修改……

[oracle@rac2 lib]$ cd $ORACLE_HOME/jre/1.4.2/lib

[oracle@rac2 lib]$ mv font.properties font.properties_bak

[oracle@rac2 lib]$ cp font.properties.zh_CN.RedHat font.properties

3.清除em的cache

[oracle@rac2 lib]$ cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/em/em/cabo/images/cache/zhs

[oracle@rac2 zhs]$ rm *.gif

4. 重新启动em

[oracle@rac2 zhs]$ emctl stop dbconsole

[oracle@rac2 zhs]$ emctl start dbconsole

另外,还需要注意font.properties最后一行的设置字体文件,如果不存在需要指定已经存在的字体文件,还要注意字体文件必须有操作的权限,下面是我的RHEL5.4的设置

[oracle@localhost lib]$ tail -n 3 font.properties
filename.-misc-zysong18030-medium-r-normal–*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/zh_CN/TrueType/zysong.ttf

改成如下:具体需要查看字体的位置。
filename.-misc-zysong18030-medium-r-normal–*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/chinese/TrueType/uming.ttf

Oracle9i系统服务和用户 介绍 【转】

Oracle的系统服务。在完全安装的情况下,Oracle的系统服务共有11项:
1.Oracle OLAP 9.0.1.0.1
2.Oracle OLAP Agent
3.OracleOraHome90Agent
4.OracleOraHome90ClientCache
5.OracleOraHome90HTTPServer
6.OracleOraHome90ManagementServer(0.5M)
7.OracleOraHome90PagingServer
8.OracleOraHome90SNMPPeerEncapsulator
9.OracleOraHome90SNMPPeerMasterAgent
10.OracleOraHome90TNSListener(5.2M)
11.OracleServiceORACLE(70M)
(注:OraHome90是可以在安装时改变的Oracle的主目录名称,是安装时的默认值)
其中最重要的服务有3个,分别是OracleOraHome90ManagementServer、oracleOraHome90TNSListener与OracleServiceORACLE。下面就来看一下有哪些启动错误与它们有关。

1.Oracle系统提示:Ora-12541:TNS:没有监听器;
2.操作系统提示:在本地计算机无法启动OMS服务 错误:1053:服务并未及时响应来控制请求附带;
以上两种错误提示大都是由OracleOraHome90TNSListener监听服务引起的。
解决方法:控制面版->管理工具->服务->右键单击“OracleOraHome90TNSListener”,再单击“启动”。

3.Oracle系统提示:Ora-12500:TNS:监听程序无法启动专用服务器进程;
该错误是由OracleServiceORACLE专用服务器进程引起的。
解决方法:控制面版->管理工具->服务->右键单击“OracleServiceORACLE”,再单击“启动”。

4.Oracle系统提示:VTK-1000:无法连接到Management Server。请验证您已输入Oracle Management Server的正确主机名和状态。
该错误引起的原因有两种,一是OracleOraHome90ManagementServer还没启动;二是没有输入主机名。
解决方法:控制面版->管理工具->服务->右键单击“OracleOraHome90ManagementServer”,再单击“启动”,或是输入您这台计算机的完整名称。

接着针对第二点谈谈登录时用的用户名和口令。在安装结束后,系统提供了两个默认的数据库系统管理员,其用户名和口令分别是SYS/change_on_install和SYSTEM/manager,同时系统还提供了登录OMS的用户名和口令:sysman/oem_temp。这里容易出现错误的是在登录OMS是用SYS或SYSTEM作为用户名进行登录,那么Oracle系统就回有“登录身份证明不正确”的提示。

小结:这三个服务的启动或关闭还有先后的顺序。一般来讲,启动时必须先启动OracleOraHome90TNSListener再启动OracleOraHome90ManagementServer或OracleServiceORACLE,在启动OracleOraHome90ManagementServer时,同时也启动了OracleServiceORACLE。而关闭时必须先关闭OracleOraHome90ManagementServer再关闭OracleOraHome90TNSListener或OracleServiceORACLE,关闭OracleOraHome90ManagementServer时,若有提示输入用户名和口令,请输入sysman的用户名和口令,以确保成功的执行。有些其他提示如:资源已被占用,I/O重复,端口已被使用等等之类的话,那最好与系统管理员联系,再寻求解决办法。

oracle中的用户很多,也很令初学者费解.
oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户

用户名 密码 描述
ANONYMOUS ANONYMOUS 访问http的匿名用户帐户
CTXSYS CTXSYS interMedia Text用户
DBSNMP DBSNMP 目录集成平台用户
EXFSYS EXFSYS 表达式过滤器用户
MDDATA MDDATA oracle空间数据帐户
MDSYS MDSYS oracle空间数据媒体管理员
MGMT_VIEW MGMT_VIEW
OLAPSYS MANGER 用于创建olap元数据
ORDPLUGINS ORDPLUGINS oracle ineterMedia,video用户
ORDSYS ORDSYS image管理员
OUTLN OUTLN 拥有connect和resource角色
SCOTT Tiger 样例帐户
SI_INFORMATN_SCHEMA 静止图像浏览帐户
SYS 用户指定 数据库管理帐户
SYSMAN OEM_TEMP 企业管理器帐户
SYSTEM 用户指定 数据库管理帐户
WK_TEST WK_TEST 同wksys
WKPROXY 代理帐户
WKSYS WKSYS 同wk_test
WMSYS WMSYS 工作空间管理帐户
XDB CHANGE_ON_INSTALL xml db帐户

默认情况下oracle指对sys,system,dbsnmp,sysman,mgmt_view5个帐户进行了解锁,如果希望其它用户也能登录需要手工进行解锁

show user 显示当前登录系统的用户名
select username,account_status,expiry_date from dba_user; 查看用户状态
alter user outln account unlock; 解锁帐户

—–

CTXSYS: The Oracle Text account,Oracle Text Reference
DBSNMP: The account used by the Management Agent component of Oracle ,Enterprise Manager to monitor and manage the database Oracle Enterprise Manager Grid Control Installation and Basic Configuration
LBACSYS: The Oracle Label Security administrator account, Oracle Label Security Administrator's Guide
MDDATA: The schema used by Oracle Spatial for storing Geocoder and router data, Oracle Spatial User's Guide and Reference
MDSYS: The Oracle Spatial and Oracle interMedia Locator administrator account, Oracle Spatial User's Guide and Reference
DMSYS: The Oracle Data Mining account. Oracle Data Mining Administrator's Guide,Oracle Data Mining Concepts
OLAPSYS MANAGER The account used to create OLAP metadata structures. It owns the OLAP Catalog (CWMLite). Oracle OLAP Application Developer's Guide

ORDPLUGINS: The Oracle interMedia user. Plug-ins supplied by Oracle and third party format plug-ins are installed in this schema, Oracle interMedia User's Guide
ORDSYS: The Oracle interMedia administrator account Oracle interMedia User's Guide
OUTLN: The account that supports plan stability. Plan stability enables you to maintain the same execution plans for the same SQL statements. OUTLN acts as a role to centrally manage metadata associated with stored outlines. Oracle Database Performance Tuning Guide
SI_INFORMTN_SCHEMA : The account that stores the information views for the SQL/MM Still Image Standard, Oracle interMedia User's Guide
SYS: The account used to perform database administration tasks, Oracle Database Administrator's Guide
SYSMAN: The account used to perform Oracle Enterprise Manager database administration tasks. Note that SYS and SYSTEM can also perform these tasks. Oracle Enterprise Manager Grid Control Installation and Basic Configuration
SYSTEM: Another account used to perform database administration tasks.

ORACLE审计

1、什么是审计

审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在system表空间中的 SYS.AUD$表中,可通过视图dba_audit_trail查看)中。默认情况下审计是没有开启的。

不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。

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

AUDIT_SYS_OPERATIONS

AUDIT_SYS_OPERATIONS enables or disables the auditing of operations issued by user SYS, and users connecting with SYSDBA or SYSOPER privileges. The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to XML.

AUDIT_TRAIL

AUDIT_TRAIL enables or disables database auditing.

Values:

none

Disables database auditing.

os

Enables database auditing and directs all audit records to the operating system's audit trail.

db

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).

db,extended

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.

xml

Enables database auditing and writes all audit records to XML format OS files.

xml,extended

Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.

You can use the SQL statement AUDIT to set auditing options regardless of the setting of this parameter.

注:这两个参数是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 之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。

如果在命令后面添加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操作

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 WORKGROUPLENOVO-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');

设置ORACLE审计

下列步骤可以设置ORACLE的审计功能:

1.修改参数文件(init<sid>.ora,如果使用服务器参数文件使用alter system set<parameter>=<value> scope=spfile|both,设置AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:

DB/TRUE:启动审计功能,并且把审计结果存放在数据库的SYS.AUD$表中

OS:启动审计功能,并把审计结果存放在操作系统的审计信息中

DB_EXTENDED:具有DB/TRUE的功能,另外填写AUD$的SQLBIND和SQLTEXT字段

NONE/FALSE:关闭审计功能

2.如果设置AUDIT_TRAIL = OS,还需要修改参数AUDIT_FILE_DEST。

如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE_DEST所指定的目录下,并且文件名包含进程的PID。

比如:

AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit

$ ls -l $ORACLE_HOME/rdbms/audit

-rw-rw—- 1 ora92 dba 881 Mar 17 09:57 ora_13264.aud

$ ps -ef|grep 13264

ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)

SQL> select spid, program, username from v$process;

SPID PROGRAM USERNAME

—— ——————————————– ————-

13264 oracle@frhp11 (TNS V1-V3) ora92

注意:WINDOWS NT不使用AUDIT_FILE_DEST参数,如果使用OS设置,那么审计信息会存放在WINDOWS NT的事件日志里。

3.确认审计相关的表是否已经安装

SQLPLUS> connect / AS SYSDBA

SQLPLUS> select * from sys.aud$; –没有记录返回

SQLPLUS> select * from dba_audit_trail;–没有记录返回

如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。

SQLPLUS> connect / as sysdba

SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。

4.关闭并重启数据库

5.设置所需要的审计信息

下面是一个例子

SQL> connect system/manager

SQL> grant audit system to scott;

SQL> connect scott/tiger

SQL> audit session;

停止审计:

SQL> noaudit session;

设置审计的实例:对试图尝试口令的访问的审计

本节讨论的是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:

1.修改审计相关参数2.重启数据库

3.设置审计信息

SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL

4.查询AUD$

SQL> select returncode, action#, userid, userhost, terminal,timestamp

from aud$

RETURNCODE ACTION# USERID USERHOST TERMINAL

———- ———- ——– ——————– ——————–

1017 100 SCOTT WPRATA-BR

1017 100 SCOTT WPRATA-BR

1017 100 SCOTT WPRATA-BR

ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:

create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)

is

USER_ID VARCHAR2(20);

cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')

group by userid;

cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')

from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2(40);

BEGIN

OPEN C1;

dbms_output.enable(1024000);

LOOP

FETCH C1 INTO USER_ID,CT;

EXIT WHEN C1%NOTFOUND;

IF(CT>=TIMES) THEN

DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);

OPEN C2;

LOOP

FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;

DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);

EXIT WHEN C2%NOTFOUND;

ENDLOOP;

close c2;

END IF;

ENDLOOP;

close c1;

END;

/

一下是执行结果:

SQL>set serveroutput on;

SQL> execute auditlogin('2004-01-01',2);

USER BROKEN ALARM:SYS

HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00

HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01

HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

PL/SQL过程已成功完成。

将审计相关的表移动到其他表空间

由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:

实际上sys.aud$表上包含了两个lob字段,并不是简单的move table就可以。
下面是具体的过程:
alter table sys.aud$ move tablespace users;
alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);
alter index sys.I_AUD1 rebuild tablespace users;

alter table audit_actions move tablespace <new tablespace>;

alter index i_audit_actions rebuild online tablespace <new tablespace>;

Oracle审计数据迁移

事情起因:一个小库进行了一次跨平台数据迁移。由于审计的需要,所有数据库审计数据也需要迁移过去。

expdp时不能导出sys用户下的对象:

expdp "/ as sysdba" directory=dump_dir tables=sys.aud$ dumpfile=aud.dmp logfile=aud.log

Total estimation using BLOCKS method: 0 KB
ORA-39166: Object AUD$ was not found.
ORA-31655: no data or metadata objects selected for job
Job "SYS"."SYS_EXPORT_TABLE_01" completed with 2 error(s) at 13:27:36

sys用户下创建表audit_temp

SQL> create table audit_temp as select * from aud$;

expdp "/ as sysdba" directory=dump_dir tables=audit_temp dumpfile=aud.dmp logfile=aud.log

Total estimation using BLOCKS method: 0 KB
ORA-39166: Object AUDIT_TEMP was not found.
ORA-31655: no data or metadata objects selected for job
Job "SYS"."SYS_EXPORT_TABLE_01" completed with 2 error(s) at 13:37:30

于是在system账户下创建表audit_temp
conn system/***
create table audit_temp as select * from sys.aud$;

expdp system/*** directory=dump_dir tables=audit_temp dumpfile=aud.dmp logfile=aud.log

Starting "SYSTEM"."SYS_EXPORT_TABLE_01": system/******** directory=dump_dir tables=audit_temp dumpfile=aud.dmp logfile=aud.log
Estimate in progress using BLOCKS method…
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 52.12 MB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "SYSTEM"."AUDIT_TEMP" 44.21 MB 227614 rows
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TABLE_01 is:
/oradata/aud.dmp
Job "SYSTEM"."SYS_EXPORT_TABLE_01" successfully completed at 13:48:18

将aud.dmp传至目标数据库上,导入:

impdp "/ as sysdba" directory=dump_dir dumpfile=aud.dmp logfile=aud.log

备份现有审计数据:
sqlplus "/as sysdba"
create table audbk as select * from aud$;

插入新审计数据:
insert into aud$ select * from system.audit_temp;
commit;

最后将源adump目录内的文件拷入目标adump目录或这进行归档。

sys和system用户的区别

sys和system用户的区别
【system】用户只能用normal身份登陆em。
【sys】用户具有“SYSDBA”或者“SYSOPER”权限,登陆em也只能用这两个身份,不能用normal。
“SYSOPER”权限,即数据库操作员权限,权限包括:
打开数据库服务器 关闭数据库服务器
备份数据库 恢复数据库
日志归档 会话限制
“SYSDBA”权限,即数据库管理员权限,权限包括:
打开数据库服务器 关闭数据库服务器
备份数据库 恢复数据库
日志归档 会话限制
管理功能 创建数据库

normal 、sysdba、 sysoper有什么区别
normal 是普通用户
另外两个,你考察他们所具有的权限就知道了
sysdba拥有最高的系统权限
sysoper主要用来启动、关闭数据库,sysoper 登陆后用户是 public
sysdba登陆后是 sys

SQL> conn / as sysdba
已连接。
SQL> grant sysoper to test;

授权成功。

SQL> conn test/test as sysoper;
已连接。
SQL> show user
USER 为"PUBLIC"
SQL> conn test/test as sysdba
已连接。
SQL> show user
USER 为"SYS"
SQL>

dba和sysdba的区别
dba、sysdba这两个系统角色有什么区别呢
在说明这一点之前我需要说一下oracle服务的创建过程
·创建实例
·启动实例
·创建数据库(system表空间是必须的)
启动过程
·实例启动
·装载数据库
·打开数据库

sysdba,是管理oracle实例的,它的存在不依赖于整个数据库完全启动,
只要实例启动了,他就已经存在,以sysdba身份登陆,装载数据库、打开数据库
只有数据库打开了,或者说整个数据库完全启动后,dba角色才有了存在的基础!

PS:sysdba拥有的权限sysoper不一定有,sysoper拥有的权限sysdba一;用dba身份登录用任何用户名和密码都可以的,是因为你用dba登录时,oracle是以本机作为服务器,所以只要是dba身份就可以登录.

安装ORACLE时,若没有为下列用户重设密码,则其默认密码如下:

用户名 / 密码
登录身份
说明

sys/change_on_install
SYSDBA 或 SYSOPER
不能以 NORMAL 登录,可作为默认的系统管理员

system/manager
SYSDBA 或 NORMAL
不能以 SYSOPER 登录,可作为默认的系统管理员

sysman/oem_temp

sysman 为 oms 的用户名

scott/tiger
NORMAL
普通用户

aqadm /aqadm
SYSDBA 或 NORMAL
高级队列管理员

Dbsnmp/dbsnmp
SYSDBA 或 NORMAL
复制管理员