分类: Oracle
2010-03-24 19:20:31
TCL :事物控制语言,比如 commit,rollback
plsql :提供对面向对象的支持,可调用 c来操纵硬件。
调用时,plsql会被放入share pool里面的 library cache 。
plsql的结构
package
package body(pakage body可以被加密,保护plsql的产权)
trigger和function的区别:
trigger是被自动触发的,而function是被手动调用的,且function必须有返回值。
把一系列的plsql过程打包,就产生了package。
store procedure 存储过程不要求返回值。
package的结构如下:
1>声明(Package Specification)
2>包体 (Package body)
oracle有350个内建的包。
object的种类:
1>segment object(table,索引,会不断地增加)
2>source object(原代码对象,不能扩展)
oracle中的 object:如果不存在会被标识为invalid.
由oracle事件触发,
DML 包含的内容:插入事件.insert,update,delete
DDL create,drop,alter ,grant,revoke,rename
database LOGON,LOGOFF
不同于其它的语言,oracle一般不推荐用触发器来进行业务逻辑的编程(因为oracle 的delete并不会自动提交,需要最后还敲入commit,而sql server等类似的库都是自动提交的)
对于业务逻辑的编程,oracle一般通过 procedure来做。
所以在sqlserver 上触发器的代码如果要移植到oracle平台来,一般会通过procedure来执行。
oracle 的锁机制:
做锁的目的是:为了防止对同一个数据 做并发的修改操作。
锁的一个特性是,不会自动升级。(有的库里锁是自动升级)
锁是和事务相关的,一旦事务结束,锁就会消失(什么是事务,参照第2天的内容
(oracle 事务的开始和结束:
从第一条DML语句隐含开始
事物到commit ,rollbak结束
)
锁的两大类型:
S、X共享锁,排它锁
锁的一个属性,查询时没有锁
锁的另一个属性,可以自动排队,加锁再解锁。
DML语句会产生两个锁:
1> 影响的行产生一个 排它锁(EXCLUSIVE)
2> 表级别的共享锁
如果别的语句对同一个行做dml操作,这个操作会等待(而不是报错),直到这个锁被释放才能继续
ddl语句会产生独占锁,
冲突的两种类型:
1>阻塞
原因: 事务长期没被提交;一个事务长期在运行;用户使用了不必要的高级别锁。
解决办法:kill session
语法
select sid,serial#,username from v$session where sid in(select blocking_session from v$session);
2>死锁
一旦oracle发生死锁,oracle会管理这个锁,会自动对某一个会话提交错误。
这个时候,需要用户来手工把某一个会话结束,再重新运行那个被阻塞的会话。
关于undo
用户可以建立多个undo表空间,但对于一个instance,只有一个undo表空间。
在RAC环境下,每个节点的instance都有各自的 undo tablespace
undo segment:
10g是自动管理的,但是在8i上还是手动管理的。
10g上,oracle会根据session数的1.1倍建立回滚段的数量。
在对大表进行删除的时候,建议指定一个大的undo tablespace。而且周期性做提交操作。
建议制定undo许可时间(undo_retention) >=用户可能的最长查询时间
如果undo表空间不够,就会产生错误
ora-01650:unable to extend rollback segment
undo_retention(默认不是强制的)
1.有足够得的时间容纳
2.大对象参数
3.保证保留参数
undo_retention来说
无论怎么样,oracle都会强制保留一个事务在15分钟内的可重用空间。
通过undo Advisor,我们可以察看预估采样
sql>alter tablespace undosbs1 retention guarantee;(强制保证undo_retention参数保证的时间内数据不被覆盖)
缺省情况下 undo表空间是处于 noguarantee状态。
察看回滚段的信息:
select usn,xacts from v$rollstat;
usn xacts
0 0
1 1
2 0
3 0
这里(usn,xacts)为(0,0) 对应的是系统回滚段,(usn=0表示系统回滚段)(xacts 表示系统回滚段当前的活动会话数 )
usn等于其它值得内容为事务回滚段。(1,1)表示某个事务回滚段,有一个正在活动的会话。
察看undo 顾问,步骤如下:
a) In Enterprise Manager, select Administration > Related Links > Advisor Central.
b) Click Undo Management.
c) Click Undo Advisor.
d) In the New Undo Retention field, enter 2. Then select days from the drop-down list.
e) Select Last Seven Days in the Analysis Time Period drop-down list. Results of the
analysis will be displayed.
Note: The values that you see are likely to be different from those shown here.
security
DBA责任 1>industry security requirement Sarbanes-Oxelay Act(SOX) 财务的安全规范,确保财务数据
必须被保存多长时间才能被删除
2>HIPAA:个人隐私安全规范,保证个人隐私不能被访问。
Audit: 1.拥有dba权限用户必须被信任
2.需要对数据进行审计
3.DBA 职权必须被共享
4.DBA帐号不能被共享(dba 不能用sys去做管理,应该用各自的帐号)
5.DBA和系统管理员必须是不同的两个账户(root ,sysdba 是两个分开的角色)
6.分开操作员(operator)和DBA权限
数据库安全 1.限制对数据的访问(防火墙外,接卡器)
2.验证用户,高级安全选项
3.检查审计活动。
最小权限原则
1.只安装最小的服务
2.只打开必须的服务
3.仅给需要的服务
4.root用户密码要保证
5.限制权限(select any table 权限的限制)
grant select any table to hr;
这样hr 用户可以看到数据库的所有表了(除了system表空间下的表)
如果授权给public,任何用户都可用。
限制有管理员权限的用户,
限制远程操作系统认证
REMOTE_OS_AUTHENT=FALSE;(默认false,索引不用改了)
如果打开了这个选项,
本地和远程机器oracle如果密码碰巧相同,则远程用户可以直接登录到数据库上来,而不需要认证。(但是仍然需要通过tnsnames.ora
连接到listener)
审计(Mandatory auditory)
standard database auditing(标准审计,缺省没打开)
value_based auditing
fine-grained auditing(FGA,细粒度审计)
如果打开标准审计记录,则oracle会把审计数据放在 aud$.基于这个表产生视图DBA_AUT_TRAIL,DBA_COMMON_AUDIT_TRAIL
如果打开细粒度地审计记录,则oracle 会把审计记录到 FGA_LOG$里。基于这个表会产生视图 dba_aut_f*,DBA_COMMON_AUDIT_TRAIL
审理的过程
1.打开审计
2.指定审计内容
3.产生审计记录
4.产生审计记录(aut$)
5.察看
DBA_AUT_TRAIL(标准视图) DBA_AUT_F_TRAIL(细粒度的视图)
DBA_COMMON_AUDIT_TRAIL(综合标准视图和细粒度视图)
alter system set audit_trail=A scope=spfile;(静态参数)
A= 'true(db)' 记录放在db的dictionary里面
A='os' 记录放OS里(文件系统文件夹里
A='XML' 以xml文本格式放在 OS文件系统文件夹里
sql>audit update,delete on hr.employees by access;(会话不断,只要有一个新的符合条件的语句,就会产生审计记录)
audit update,delete on hr.employees by session;(会话不断,则只有一条审计记录)
无焦点审计:
sql>audit all on hr.employees;无焦点审计
删除审计记录
sql>noaudit delete on hr.jobs;
通过 trigger来做审计(可以知道被审计的内容的前映像)
上下文环境函数: sys_context()
CREATE OR REPLACE TRIGGER system.hrsalary_audit
AFTER UPDATE OF salary
ON hr.employees
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :old.salary != :new.salary THEN
INSERT INTO system.audit_employees
VALUES (sys_context('userenv','os_user'), sysdate,
sys_context('userenv','ip_address'),
:new.employee_id ||
' salary changed from '||:old.salary||
' to '||:new.salary);
END IF;
END;
/
FINE-GRAINED AUDITING(可以带条件的审计,和标准审计有区别,标准审计只知道做了什么操作)
1.select insert update,delete
2.DBMS_FGA
审计的DML规则
DELETE 总会被审计
merge->看为insert,update来审计
records->符合条件
无条件审计:null条件
如果审计的内容不存在,会产生错误, ORA-28112
对数据审计必须放在数据库外面
如果把系统参数audit_sys_operations 设置为true
则oracle会 把sys的所有操作都记录在 audit_file_dest所对应位置。
如果打开标准审计记录,则oracle会把审计数据放在 aud$.基于这个表产生视图DBA_AUT_TRAIL,DBA_COMMON_AUDIT_TRAIL
如果打开细粒度地审计记录,则oracle 会把审计记录到 FGA_LOG$里。基于这个表会产生视图 dba_aut_f*,DBA_COMMON_AUDIT_TRAIL
如果想把审计打开,也可察看操作的具体sql命令,则需要如下设置
sql>alter system set audit_trail='db_extended' scope=spfile;
oracle网络环境
底层接口:oci接口 java.
JDBC接口(包含了oci 接口)
sqlnet.ora 客户方和服务器方都需要(网络配置文件)
察看globalname
sql>show parameter service;
察看数据库的instance,主机名
select instance_name,host_name from v$instance;
dedicated server
则 server process放在PGA的位置
listener 的静态注册:
把相应信息写入 listener.ora,数据库启动时自动注册到listener上,自动生成 handler.
service 状态是unkown,表示是静态注册的。
listener的动态注册:
数据库后台Pmon把数据库进程注册到1521的端口监听器里面去。
listener状态
PLSExtProc:(调用c语言的接口服务)
连接方式:
1>easy connect: conn
2>local naming:使用tnsnames.ora
3>direcotory naming:使用集中管理的方法
编辑 sqlnet.ora,添加目录服务器的地址
连接器的路由方式:
从A机到C机,必须先通过B机器,原路由要用到一个cman(连接管理器)
配置tnsnanme的连接属性,容错性和负载均衡
配置数据库的连接容错:until one succeeds
负载均衡:randomly
试验:
netmgr配置监听和连接local naming连接方式
netca配置监听,和连接local naming连接方式(相当于netca的下一步下一步)
共享池连接方式: 采用 dispatcher连接方式
1.通过Dispacher放到 请求队列
2.
3.把响应队列 取出来发送给用户进程
在共享池连接方式下,
SGA的共享池里会放入用户私有信息,如果SGA中定义了大池,则放在大池里。
什么时候不要使用共享方式
1.关闭数据库的时候
2.备份和恢复的时候
3.负载均衡的时候
服务器方面配置了 dispacher参数和share server参数。
才能在客户端配置 share 方式连接。
练习:
配置客户端的监听负载均衡:
配置两个数据库的两个listener.
service naming里面定制冗余。
配置过程
1.用netmgr修改listener,建立两个listener,其中之一(假设为listener1)的 非1521端口,必须用静态注册方式
2.用netmgr修改连接字符串,orcl的信息,多添加一个server.在service naming里面定制冗余。
3.把listener打开,
lsnrctl start
lsnrctl start listener1
listener.ora 文件类似:
orcl=
(description=
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=TCP)
(HOST=EDSIR294)(PORT=1521)
(ADDRESS=(PROTOCOL=TCP)
(HOST=EDSIR294)(PORT=1523)
若想也采用动态注册的方式注册第2个监听,需要修改参数local_listener
具体方式可以自己查文档。
停止listener,再开启后,如果数据库采用动态注册方式,则要等待1分钟,pmon才会把数据库注册到监听。
因为pmon默认每分钟轮询一次。
TNS_ADMIN
windows 环境下的环境变量->系统变量
unix环境下设置 profile->export profile
必须设置TNS_ADMIN这个参数 ,告诉oracle 默认从这个位置 抓取tnsnames.ora这些参数。