Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249375
  • 博文数量: 64
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 565
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-18 10:54
文章分类

全部博文(64)

文章存档

2011年(4)

2010年(60)

我的朋友

分类: Oracle

2010-03-24 19:20:31

ocp原厂培训笔记(第三天)

  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这些参数。

阅读(1693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~