一、目的:
Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用
Create
Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如果把该profile分配给用户,则该用户所能使用的数据库资源都在该
profile的限制之内。
二、条件:
创建profile必须要有CREATE PROFILE的系统权限。
为用户指定资源限制,必须:
1.动态地使用alter system或使用初始化参数resource_limit使资源限制生效。该改变对密码资源无效,密码资源总是可用。
SQL> show parameter resource_limit
NAME TYPE VALUE
———————————— ———– ——————————
resource_limit boolean FALSE
SQL> alter system set resource_limit=true;
系统已更改。
SQL> show parameter resource_limit;
NAME TYPE VALUE
———————————— ———– ——————————
resource_limit boolean TRUE
SQL>
2.使用create profile创建一个定义对数据库资源进行限制的profile。
3.使用create user 或alter user命令把profile分配给用户。
三、语法:
CREATE PROFILE profile
LIMIT { resource_parameters
| password_parameters
}
[ resource_parameters
| password_parameters
]... ;
<resource_parameters>
{ { SESSIONS_PER_USER
| CPU_PER_SESSION
| CPU_PER_CALL
| CONNECT_TIME
| IDLE_TIME
| LOGICAL_READS_PER_SESSION
| LOGICAL_READS_PER_CALL
| COMPOSITE_LIMIT
}
{ integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA
{ integer [ K | M ] | UNLIMITED | DEFAULT }
}
< password_parameters >
{ { FAILED_LOGIN_ATTEMPTS
| PASSWORD_LIFE_TIME
| PASSWORD_REUSE_TIME
| PASSWORD_REUSE_MAX
| PASSWORD_LOCK_TIME
| PASSWORD_GRACE_TIME
}
{ expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
{ function | NULL | DEFAULT }
}
四、语法解释:
profile:配置文件的名称。Oracle数据库以以下方式强迫资源限制:
1.如果用户超过了connect_time或idle_time的会话资源限制,数据库就回滚当前事务,并结束会话。用户再次执行命令,数据库则返回一个错误,
2.如果用户试图执行超过其他的会话资源限制的操作,数据库放弃操作,回滚当前事务并立即返回错误。用户之后可以提交或回滚当前事务,必须结束会话。
提示:可以将一条分成多个段,如1小时(1/24天)来限制时间,可以为用户指定资源限制,但是数据库只有在参数生效后才会执行限制。
Unlimited:分配该profile的用户对资源使用无限制,当使用密码参数时,unlimited意味着没有对参数加限制。
Default:指定为default意味着忽略对profile中的一些资源限制,Default profile初始定义对资源不限制,可以通过alter profile命令来改变。
Resource_parameter部分
Session_per_user:指定限制用户的并发会话的数目。
Cpu_per_session:指定会话的CPU时间限制,单位为百分之一秒。
Cpu_per_call:指定一次调用(解析、执行和提取)的CPU时间限制,单位为百分之一秒。
Connect_time:指定会话的总的连接时间,以分钟为单位。
Idle_time:指定会话允许连续不活动的总的时间,以分钟为单位,超过该时间,会话将断开。但是长时间运行查询和其他操作的不受此限制。
Logical_reads_per_session:指定一个会话允许读的数据块的数目,包括从内存和磁盘读的所有数据块。
Logical_read_per_call:指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。
Private_sga:指定一个会话可以在共享池(SGA)中所允许分配的最大空间,以字节为单位。(该限制只在使用共享服务器结构时才有效,会话在SGA中的私有空间包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL)。
Composite_limit:指定一个会话的总的资源消耗,以service
units单位表示。Oracle数据库以有利的方式计算
cpu_per_session,connect_time,logical_reads_per_session和private-sga总的
service units
Password_parameter部分:
Failed_login_attempts:指定在帐户被锁定之前所允许尝试登陆的的最大次数。
Password_life_time:指定同一密码所允许使用的天数。如果同时指定了
password_grace_time参数,如果在grace
period内没有改变密码,则密码会失效,连接数据库被拒绝。如果没有设置password_grace_time参数,默认值unlimited将引
发一个数据库警告,但是允许用户继续连接。
Password_reuse_time和password_reuse_max:这两个参数必须互相关联设置,password_reuse_time指定了密码不能重用前的天数,而password_reuse_max则指定了当前密码被重用之前密码改变的次数。两个参数都必须被设置为整数。
1.如果为这两个参数指定了整数,则用户不能重用密码直到密码被改变了password_reuse_max指定的次数以后在password_reuse_time指定的时间内。
如:password_reuse_time=30,password_reuse_max=10,用户可以在30天以后重用该密码,要求密码必须被改变超过10次。
2.如果指定了其中的一个为整数,而另一个为unlimited,则用户永远不能重用一个密码。
3.如果指定了其中的一个为default,Oracle数据库使用定义在profile中的默认值,默认情况下,所有的参数在profile中都被设置为unlimited,如果没有改变profile默认值,数据库对该值总是默认为unlimited。
4.如果两个参数都设置为unlimited,则数据库忽略他们。
Password_lock_time:指定登陆尝试失败次数到达后帐户的缩定时间,以天为单位。
Password_grace_time:指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。
Password_verify_function:该字段允许将复杂的PL/SQL密码验证脚本做为参
数传递到create profile语句。Oracle数据库提供了一个默认的脚本,但是自己可以创建自己的验证规则或使用第三方软件验证。
对Function名称,指定的是密码验证规则的名称,指定为Null则意味着不使用密码验证功能。如果为密码参数指定表达式,则该表达式可以是任意格
式,除了数据库标量子查询。
五、举例:
1.创建一个profile:
create profile new_profile
limit password_reuse_max 10
password_reuse_time 30;
2.设置profile资源限制:
create profile app_user limit
sessions_per_user unlimited
cpu_per_session unlimited
cpu_per_call 3000
connect_time 45
logical_reads_per_session default
logical_reads_per_call 1000
private_sga 15k
composite_limit 5000000;
总的resource cost不超过五百万service units。计算总的resource cost的公式由alter resource cost语句来指定。
3.设置密码限制profile:
create profile app_users2 limit
failed_login_attempts 5
password_life_time 60
password_reuse_time 60
password_reuse_max 5
password_verify_function verify_function
password_lock_time 1/24
password_grace_time 10;
4.将配置文件分配给用户:
SQL> alter user dinya profile app_user;
用户已更改。
SQL> alter user dinya profile default;
用户已更改。
第八章: managing password security and resources
1.controlling account lock and password
sql> alter user juncky identified by oracle account unlock;
2.user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql> password_grace_time 5;
4.altering a profile
sql> alter profile default failed_login_attempts 3
sql> password_life_time 60 password_grace_time 10;
5.drop a profile
sql> drop profile grace_5 [cascade];
6.create a profile : resource limit
sql> create profile developer_prof limit sessions_per_user 2
sql> cpu_per_session 10000 idle_time 60 connect_time 480;
7. view => resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql> alter system set resource_limit=true;
9.设置指定用户应用profile
sql> alter user test profile profile_user;
第四章:索引
1.creating function-based indexes
sql> create index summit.item_quantity on summit.item(quantity-
quantity_shipped);
2.create a B-tree index #oracle 默认是这种索引,此种索引适用于唯一性高的列
sql> create [unique] index index_name on table_name(column,.. asc/desc)
tablespace
sql> tablespace_name [pctfree integer] [initrans integer] [maxtrans integer] #不能指定pctused参数
sql> [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql> maxextents 50);
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum
number of rows
4.creating reverse key indexes
sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial
200k
next 200k pctincrease 0 maxextents 50) tablespace indx;
5.create bitmap index #此种索引适用于唯一性低的列,如性别列,只有"男","女"两种
情况,也就是说,很多行会重复。
sql> create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next
200k
sql> pctincrease 0 maxextents 50) tablespace indx;
6.change storage parameter of index
sql> alter index xay_id storage (next 400k maxextents 100);
7.allocating index space
sql> alter index xay_id allocate extent(size 200k datafile
'c:/oracle/index.dbf');
8.deallocating index space
sql> alter index xay_id deallocate unused;
9.rebuilding indexes
sql> alter index testindex3 rebuild tablespace indx;#移到指定tablespace
sql> alter index testindex3 rebuild reverse;#转换成反转索引
10.online rebuild of indexes
sql> alter index testindex3 rebuild online #不锁定表,原有索引的基础上建
11.coalescing indexes 碎片整理
sql> alter index testindex3 coalesce;
12.checking index validity 校验索引
sql> analyze index testindex validate structrue;
13.dropping indexes
sql> drop index testindex;
14.identifying unused indexes
sql> alter index testindex monitoring useage; #开始监视
sql> alter index testindex nomonitoring useage; #取消监视
15. obtaining index information
dba_indexes, dba_ind_columns, dba_ind_expressions,v$object_usage
16.oracle B-tree和bitmap索引区别
1、都是树型结构,叶子节点存储内容不一样。
2、列的取值范围较大(适合常规b—tree索引),取值范围较小(适合位图索引);
3、由于bitmap索引的特点,他不是unique型的,也不涉及unique概念。
4、bitmap通常where如果有or连接效率比较高。
5、b-tree适合oltp,bitmap适合数据仓库。
16.索引占用空间使用情况
sql>analyze index ***.***_subscriber_groupid_indx validate structure;
Index analyzed.
column name format a15
column blocks heading "ALLOCATED|BLOCKS"
column lf_blks heading "LEAF|BLOCKS"
column br_blks heading "BRANCH|BLOCKS"
column Empty heading "UNUSED|BLOCKS"
SQL> list
1 select name,
2 blocks,
3 lf_blks,
4 br_blks,
5 blocks-(lf_blks+br_blks) empty
6* from index_stats
SQL> /
ALLOCATED LEAF BRANCH UNUSED
NAME BLOCKS BLOCKS BLOCKS BLOCKS
————— ———- ———- ———- ———-
***_SUBSCRIBER 640 577 3 60
_GROUPID_INDX
也可通过如下的查询来确定该索引在BTREE空间内使用情况
SQL> list
1 select name,
2 btree_space,
3 used_space,
4 pct_used
5* from index_stats
SQL> /
NAME BTREE_SPACE USED_SPACE PCT_USED
—————————— ———– ———- ———-
AGCF_SUBSCRIBER_GROUPID_INDX 4637776 3027283 66
Temp Table 的特点:
(1) 多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的 Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;
(2) 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你创建临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。
Temp Table 数据的时效性:
(1)On Commit Delete Rows: 数据在 Transaction 期间有效,一旦COMMIT后,数据就被自动 TRUNCATE 掉了;
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Trans
2 ON COMMIT DELETE ROWS
3 AS
4 SELECT * FROM t_Department;
表已创建。
SQL> INSERT INTO QCUI_Temp_Trans
2 SELECT * FROM t_Dept;
已创建4行。
SQL> SELECT * FROM QCUI_Temp_Trans;
DEPTID DEPTNAME
---------- --------------------
101 销售部
201 财务部
301 货运部
401 采购部
SQL> commit;
提交完成。
SQL> SELECT * FROM QCUI_Temp_Trans;
未选定行
(2)On Commit Preserve Rows :数据在 Session 期间有效,一旦关闭了Session 或 Log Off 后,数据就被 ORACLE 自动 Truncate 掉。
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM t_Department;
表已创建。
SQL> Select * from QCUI_Temp_Sess;
DEPTID DEPTNAME
---------- --------------------
101 销售部
301 货运部
401 采购部
201 财务部
SQL> exit
C:\Documents and Settings\QCUI>sqlplus sqltrainer@ibm
SQL> SELECT * FROM QCUI_Temp_Sess;
未选定行
注:这里要说明的是,ORACLE Truncate 掉的数据仅仅是分配给不同 Session 或 Transaction的 Temp Segment 上的数据,而不是将整张表数据 TRUNCATE 掉。
Temp Table 的应用:
Temp Table 就我理解而言,主要有两方面应用。
对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。
因此,对于这种案例,就可以采用创建临时表( ON COMMIT PRESERVE ROWS )的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML的压力。
注:这里似乎说得不对,对于B/S应用,虽然SESSION是一个,但此session并不是数据库连接的session,每次页面请求都是使用新的连接(或从连接池中获取的),对于数据库而言是新的session,这种情况下,临时表内的数据是不是不能共享呀??
wallimn 2009-11-11
Temp Table 的另一个应用,就是存放数据分析的中间数据。
Temp Table 存放在哪儿?
Temp Table 并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中。
SQL> Select Table_Name, Tablespace_Name
2 From User_Tables
3 Where Table_Name Like 'QCUI%';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
QCUI_TEMP_SESS
QCUI_TEMP_TRANS
可见这两张临时表并未存放在用户的表空间中。
用户 SQLTRAINER 的临时表空间是 TEMP , 用户创建的临时表是存放在TEMP表空间中的。下面来证明
SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts
2 FROM User_Users;
USERNAME DEF_TS TEMP_TS
----------------------------- ------------------ ----------
SQLTRAINER ts_ORASQLTraining TEMP
SQL> connect system/manager@ibm
已连接。
SQL> alter tablespace temp offline;
表空间已更改。
SQL> connect sqltrainer/sqltrainer@ibm
已连接。
SQL> INSERT INTO QCUI_Temp_Sess
2 SELECT * FROM t_Department;
INSERT INTO QCUI_Temp_Sess
*
ERROR 位于第 1 行:
ORA-01542: 表空间'TEMP'脱机,无法在其中分配空间
对 Temp Table 的 DML 操作是否不产生 Redo Log ?
尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log 的,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。
SQL> Set AutoTrace On
SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess_AllObj
2 ON COMMIT PRESERVE ROWS
3 AS
4 SELECT * FROM All_Objects;
表已创建。
SQL> INSERT INTO QCUI_Temp_Sess_AllObj
2 SELECT * FROM All_Objects;
已创建21839行。
Statistics
---------------------------------------------------------
……
168772 redo size
……
SQL> CREATE TABLE QCUI_ALL_OBJECTS
2 AS
3 SELECT * FROM All_Objects
4 WHERE 1 = 0;
表已创建。
SQL> INSERT INTO QCUI_All_Objects
2 SELECT * FROM ALL_Objects;
已创建21839行。
Statistics
----------------------------------------------------------
……
2439044 redo size
……
第三章:表
1.create a table
sql> create table table_name (column datatype,column datatype]....)
sql> tablespace tablespace_name [pctfree integer] [pctused integer]
sql> [initrans integer] [maxtrans integer]
sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)
sql> [logging|nologging] [cache|nocache]
2.copy an existing table
sql> create table table_name [logging|nologging] as subquery
3.create temporary table
sql> create global temporary table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows #具体可见oracle临时表的应用
4.pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k
sql> minextents 2 maxextents 100);
6.manually allocating extents
sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
7.move tablespace
sql> alter table employee move tablespace users;
#此操作会造成索引不可用,需要重建索引,但权限之类的不受影响
sql> alter index index_name rebuild;
8.deallocate of unused space
sql> alter table table_name deallocate unused [keep integer]
9.truncate a table
sql> truncate table table_name;
10.drop a table
sql> drop table table_name [cascade constraints];
11.drop a column
sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
12.mark a column as unused
sql> alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
13.obtaining table information
data_dictionary : dba_unused_col_tabs
dba_tables
dba_objects
sql> select * from dba_tables where owner = 'ET';
sql> select * from dba_objectswhere owner = 'ET';
14.truncate,delete,drop的异同点
之前看到的:“在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次
DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了”
之前看到的:“在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次
DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了”后来查了点资料,感觉有一定道理,因为Oracle 10g开始,当我执行Drop Table是,Oracle也会把被删除的表放到
数据库回收站(Database Recyclebin)里。这样我们就可以用flashback table命令恢复被删除的表,语法:
Flashback table 表名 to before drop;
但没有资料说,可以恢复truncate的内容。当然,他说的也不完全,因为我们删除表时想要的效果不同。其实这三个指令之前我从来没有怎么注意,只是知道我想保住表结构,但
不想要里头内容时,我会用truncate,如果删除的内容不太确定,就是用delete,因为它可以回退,有点像垃圾筒的概念,如果这整张表我都不想要了,我就drop掉它。今天在网
上查了点资料,有一篇写得挺好,感觉比较全面:
truncate,delete,drop的异同点
注意:这里说的delete是指不带where子句的delete语句
相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据
不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据
1.forcing log switches
sql> alter system switch logfile;
2.forcing checkpoints
sql> alter system checkpoint;
3.adding online redo log groups
sql> alter database add logfile [group 4] ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;
4.adding online redo log members
sql> alter database add logfile member '/disk3/log1b.rdo' to group 1, '/disk4/log2b.rdo' to group 2;
5.changes the name of the online redo logfile
sql> alter database rename file 'c:/oracle/oradata/oradb/redo01.log' to 'c:/oracle/oradata/redo01.log';
6.drop online redo log groups
sql> alter database drop logfile group 3;
7.drop online redo log members
sql> alter database drop logfile member 'c:/oracle/oradata/redo01.log';
8.clearing online redo log files
sql> alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
9.using logminer analyzing redo logfiles #这个可能是8i的日志分析,10g的请看另一篇日志挖掘。
a. in the init.ora specify utl_file_dir = ' '
b. sql> execute dbms_logmnr_d.build('oradb.ora','c:"oracle"oradb"log');
c. sql> execute dbms_logmnr_add_logfile('c:"oracle"oradata"oradb"redo01.log', dbms_logmnr.new);
d. sql> execute dbms_logmnr.add_logfile('c:"oracle"oradata"oradb"redo02.log', dbms_logmnr.addfile);
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>'c:"oracle"oradb"log"oradb.ora');
f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters v$logmnr_logs);
g. sql> execute dbms_logmnr.end_logmnr;
10.查看系统日志文件信息及大小
sql>select a.group#, a.sequence#,a.bytes/1024/1024 tsize , a.members,a.status,b.member,b.type from v$log a , v$logfile b where a.group#=b.group#;
oracle数据库通过控制文件保持数据库的完整性,一旦控制文件被破坏数据库将无法启动,因此建议采用多路控制文件或者备份控制文件的方法。
控制文件是数据库建立的时候自动生成的二进制文件,只能通过实例进行修改,如果手动修改的话会造成控制文件与物理信息不符合,从而导致数据库不能正常工作。
控制文件主要包括下面内容:
1.控制文件所属数据库的名字,一个控制文件只能属一个数据库
2.数据库创建时间
3.数据文件的名称,位置,联机,脱机状态信息
4.所有表空间信息
5.当前日志序列号
6.最近检查点信息
其中,数据库名称,标识和创建时间在数据库创建时写入;数据文件和重做日志名称和位置在增加,重命名或者删除的时候更新;表空间信息在增加或者删除表空间的时候进行更新。
在初始化参数文件中control_files参数主要来描述控制文件的文件名跟物理路径,如下所示:
control_files=("d:\oracle\oradata\oradb\control01.ctl")
该参数只设置一个,也可以设置多个,如下所示:
control_files=('d:\oracle\oradata\oradb\control01.ctl',
'd:\oracle\oradata\oradb\control02.ctl',
'd:oracle\oradata\oradb\control03.ctl')
这个方法叫做多路控制文件,oracle可以利用这个方法恢复被破坏的控制文件,oracle最多允许设置8个多路控制文件。
必须所有的多路控制文件都完整正确数据库才能正常启动,只要丢失一个或者一个内容不正确数据库就不能顺利启动。
对控制文件的管理原则:
1.明确控制文件的名称和存储路径
参数设置错误将无法打开数据库,数据库打开以后,实例将同时写入所有的控制文件但是只会读取第一个控制文件的内容。
2.为数据库创建多路控制文件
a.多路控制文件内容必须完全一样,oracle实例同时将内容写入到control_files变量所设置的控制文件中。
b.初始化参数control_files中列出的第一个文件是数据库运行期间唯一可读取的控制文件。
c.创建,恢复和备份控制文件必须在数据库关闭的状态下运行,这样才能保证操作过程中控制文件不被修改。
d.数据库运行期间如果一个控制文件变为不可用,那么实例将不再运行,应该终止这个实例,并对破坏的控制文件进行修复。
3.将多路控制文件放在不同的硬盘上
4.采用操作系统镜像方式备份控制文件
5.手工方式备份控制文件
应该及时备份特别是发生了如下的操作的时候:
添加删除重命名数据文件
添加删除表空间,改变表空间读写状态
添加删除重做日志文件
如果手工备份不及时的话,就会产生备份的控制文件与正在使用的控制文件不一致,那么利用备份的控制文件启动数据库时会破坏数据库的一致性完整性,甚至不能启动数据库,因此手工备份控制文件要注意及时备份。
创建多路控制文件
利用spfile文件创建多路控制文件
(spfile以二进制文本形式存在,不能用vi等编辑器对其中参数进行修改。文件格式为spfileSID.ora。如果要对spfile文件进行修改,可以采用SQL语言)
1.利用SYS帐号登陆SQL*PLUS,查询一下控制文件信息视图
SQL>select name from v$controlfile;
结果显示为:
NAME
----------------------------------
d:\oracle\oradata\oradb\control01.ctl
d:\oracle\oradata\oradb\control02.ctl
d:\oracle\oradata\oradb\control03.ctl
这里列出了控制文件的名称以及位置
2.更改spfile中控制文件的信息:(增加了一个新的控制文件)
SQL>alter system set control_files=
'd:\oracle\oradata\oradb\control01.ctl',
'd:\oracle\oradata\oradb\control02.ctl',
'd:\oracle\oradata\oradb\control03.ctl',
'd:\oracle\oradata\oradb\control04.ctl'
scope=spfile
结果显示为:
系统已经更改。
(第二步的操作需要注意的是:进行这些操作,必须是在DB启动的时候,否则会弹出“ORACLE not available”错误。)
3.关闭数据库
4.在操作系统中将已有的控制文件复制,修改名称保存到刚才增加控制文件的指定位置。(这步必须做的,否则数据库无法启动)
5.重新启动控制文件,使控制文件改变生效。
6.还可以使用pfile的方法来修改控制文件,使用create pfile from spfile;来生成pfile,然后使用vi等编辑器编译pfile,先手工拷贝控制文件修改相应的名称,然后把新的控制文件的路径增加到pfile中,使用pfile启动数据库,然后使用pfile创建spfile即可.
管理控制文件
备份控制文件
SQL> alter database backup controlfile to ‘d:\20080326.ctl’
SQL> alter database backup controlfile to trace;(备份创建控制文件的脚本)
# 具体文件名请看<background_dump_dest>/alert_<SID>.log文件里有详细说明。例如在/opt/app/oracle/diag/rdbms/orcl/orcl/trace/目录下。
alter database backup controlfile to trace
Mon Nov 23 10:27:56 2009
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Backup controlfile written to trace file /opt/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4169.trc
数据库已更改。
然后从这个备份的位置直接把文件拷贝回之前的目录覆盖就好了。
删除控制文件(删除某一路的控制文件)
spfile文件
1.利用SYS帐号登陆SQL*PLUS,查询一下控制文件信息视图
SQL>select name from v$controlfile;
结果显示为:
NAME
----------------------------------
d:oracle\oradata\oradb\control01.ctl
d:oracle\oradata\oradb\control02.ctl
d:oracle\oradata\oradb\control03.ctl
d:oracle\oradata\oradb\control04.ctl
这里列出了控制文件的名称以及位置
2.更改spfile中控制文件的信息,删除一个新的控制文件
SQL>alter system set control_files=
'd:oracle\oradata\oradb\control01.ctl',
'd:oracle\oradata\oradb\control02.ctl',
'd:oracle\oradata\oradb\control03.ctl',
scope=spfile
结果显示为:
系统已经更改。
3.关闭数据库
4.在操作系统中删除控制文件
5.重新启动数据库,使控制文件生效
Oracle 10g可以使用LOGMNR在线分析和挖掘日志,使用当前在线的数据字典,非常方便。
查看包是否已经安装
SQL>desc dbms_logmnr
首先执行一些DDL或DML操作:
SQL> connect eygle/eygle
Connected.
SQL> alter system switch logfile;
System altered.
SQL> create table eygle as select * from dba_users;
Table created.
SQL> set autotrace on
SQL> select count(*) from eygle;
COUNT(*)
----------
19
Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| EYGLE | 19 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
7 consistent gets
5 physical reads
0 redo size
411 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
然后可以执行LOGMNR解析工作:
SQL> connect / as sysdba
Connected.
SQL> select * from v$log where status='CURRENT';
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------
2 1 100 52428800 1 NO CURRENT 12729697 01-JUL-09
SQL> SELECT MEMBER from v$logfile where group#=2;
MEMBER
------------------------------------------------------------------------------------------------------------------------
/opt/oracle/oradata/mmstest/redo02.log
SQL> exec dbms_logmnr.add_logfile('/opt/oracle/oradata/mmstest/redo02.log',dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); # 这里可以指定参数:STARTTIME与ENDTIME
PL/SQL procedure successfully completed.
SQL> select count(*) from v$logmnr_contents;
COUNT(*)
----------
136
SQL> select sql_redo from v$logmnr_contents; #同样这里可以执行命令 select sql_undo from v$logmnr_contents;
SQL_REDO
------------------------------------------------------------------------------------------------------------------------
set transaction read write;
insert into "SYS"."OBJ$"("OBJ#","DATAOBJ#","OWNER#","NAME","NAMESPACE","SUBNAME","TYPE#","CTIME","MTIME","STIME","STATUS
","REMOTEOWNER","**NAME","FLAGS","OID$","SPARE1","SPARE2","SPARE3","SPARE4","SPARE5","SPARE6") values ('25847','25847'
,'31','EYGLE','1',NULL,'2',TO_DATE('01-JUL-09', 'DD-MON-RR'),TO_DATE('01-JUL-09', 'DD-MON-RR'),TO_DATE('01-JUL-09', 'DD-
MON-RR'),'1',NULL,NULL,'0',NULL,'6','1',NULL,NULL,NULL,NULL);
set transaction read write;
update "SYS"."CON$" set "CON#" = '10823' where "CON#" = '10822' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
SQL_REDO
------------------------------------------------------------------------------------------------------------------------
update "SYS"."CON$" set "CON#" = '10824' where "CON#" = '10823' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10825' where "CON#" = '10824' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10826' where "CON#" = '10825' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10827' where "CON#" = '10826' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10828' where "CON#" = '10827' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
set transaction read write;
update "SYS"."CON$" set "CON#" = '10829' where "CON#" = '10828' and ROWID = 'AAAAAcAABAAAACqAAM';
commit;
create table eygle as select * from dba_users;
set transaction read write;
Unsupported
update "SYS"."TSQ$" set "TS#" = '0', "GRANTOR#" = '43080', "BLOCKS" = '0', "MAXBLOCKS" = '0', "PRIV1" = '0', "PRIV2" = '
0' where "TS#" = '0' and "GRANTOR#" = '43072' and "BLOCKS" = '0' and "MAXBLOCKS" = '0' and "PRIV1" = '0' and "PRIV2" = '
0' and ROWID = 'AAAAAKAABAAAABbAAF';
commit;
set transaction read write;
SQL> exec dbms_logmnr.end_logmnr
注:在Oracle安装过程中,如果数据库是自动创建的,那么该数据库最初的存档模式是由操作系统指定的。通常情况下,归档日志在Oracle数据库安装结束后需要手工创建。
环境:Oracle 10g 10.2.0.1.0/Windows 2003 Server SP1
数据字典视图:v$archived_log,v$log,v$archive_dest,v$database,v$archive_processes,
v$backup_redolog,v$log_histroy,v$recovery_file_dest.
一、关闭归档
1、启动SQL*PLUS以管理身份登录Oracle数据库:
SQL> connect / as sysdba
2、关闭数据库实例
SQL> shutdown immediate
3、备份数据库:在对数据库做出任何重要的改变之前,建议备份数据库以免出现任何问题。
4、启动一个新的实例并装载数据库,但不打开数据库:
SQL> startup mount
5、禁止自动存档
SQL> alter system archive log stop;
6、禁止存档联机重做日志:转换数据库的存档模式。
SQL> alter database noarchivelog ;
7、打开数据库:
SQL> alter database open ;
8、察看已连接实例的存档信息:
SQL> archive log list ;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 E:\oracle\arc
最早的联机日志序列 50
当前日志序列 52
二、启用类Oracle9i的归档
1、启动SQL*PLUS以管理身份登录Oracle数据库:
SQL> connect / as sysdba
2、关闭数据库实例
SQL> shutdown immediate
3、备份数据库:在对数据库做出任何重要的改变之前,建议备份数据库以免出现任何问题。
4、启动一个新的实例并装载数据库,但不打开数据库:
SQL> startup mount
5、转换数据库的存档模式为归档方式:
SQL> alter database archivelog ;
6、打开数据库:
SQL> alter database open ;
7、在数据库实例启动后允许自动存档方式:
SQL> alter system set log_archive_start=true scope=spfile;
8、指定归档日志文件的存放位置并记录到SPFILE:
SQL> alter system set log_archive_dest_1='location=E:\oracle\arc' scope=spfile;
9、指定归档日志文件名命名格式:使用%s来包含日志序号作为文件名的一部份,并且使用%t来包含线程号,使用大写字母(%S和%T)来以0填补文件名左边的空处。
The following variables can be used in the format:
%s log sequence number
%S log sequence number, zero filled
%t thread number
%T thread number, zero filled
SQL> alter system set log_archive_format='BE%S_%R_%T.arc' scope=spfile;
三、在Oracle 10g里启动自动归档模式
$ sqlplus "/ as sysdba"
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 25
Current log sequence 27
SQL> show parameter log_archive_start
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_start boolean FALSE
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3204448256 bytes
Fixed Size 1304912 bytes
Variable Size 651957936 bytes
Database Buffers 2550136832 bytes
Redo Buffers 1048576 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 25
Next log sequence to archive 27
Current log sequence 27
SQL>
查看表空间有多大
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
查看表空间及其数据文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
查看表空间总大小,已使用,剩下多少
select a.tablespace_name,total,free,round(free/total*100,2) free_precent,total-free used from
( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files
group by tablespace_name) a,
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;
1.create tablespaces
sql> create tablespace tablespace_name datafile 'c:"oracle"oradata"file1.dbf' size 100m,
sql> 'c:"oracle"oradata"file2.dbf' size 100m minimum extent 550k [logging/nologging]
sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql> [online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql> create tablespace user_data datafile 'c:"oracle"oradata"user_data01.dbf'
sql> size 500m extent management local uniform size 10m;
3.temporary tablespace
sql> create temporary tablespace temp tempfile 'c:"oracle"oradata"temp01.dbf'
sql> size 500m extent management local uniform size 10m;
4.change the storage setting
sql> alter tablespace app_data minimum extent 2m;
sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or online
sql> alter tablespace app_data offline;
sql> alter tablespace app_data online;
6.read_only tablespace
sql> alter tablespace app_data read only|write;
7.droping tablespace
sql> drop tablespace app_data including contents;
8.enableing automatic extension of data files
sql> alter tablespace app_data add datafile 'c:"oracle"oradata"app_data01.dbf'size 200m
sql> autoextend on next 10m maxsize 500m;
9.change the size fo data files manually
sql> alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m;
9.1改变表空间大小有三种方法:
a)sql>alter database datafile 'c:\oracle\oradata\app_data.dbf' autoextend on .. 自动扩大
b)sql>alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m; #同9一样
c) alter tablesapce users add datafile 'c:\oracle\oradata\app_data01.dbf' size 10M #为表空间,手动新增一个datafile
10.Moving data files: alter tablespace
sql> alter tablespace app_data rename datafile 'c:\oracle\oradata\app_data.dbf' to 'c:\oracle\app_data.dbf';
11.moving data files:alter database
sql> alter database rename file 'c:\oracle\oradata\app_data.dbf' to 'c:\oracle\app_data.dbf';
12.OMF管理表空间
设置参数:db_create_file_dest
sql>alter system set db_create_file_dest = 'c:\oradata';
sql>create tablespace usertb; #默认100M,并存放于db_create_file_dest 目录下
sql>drop tablespace usertb; #相应的物理文件也自动删除
13.表空间的一些数据字典与动态性能表
dba_tablespaces v$tablespace v$datafile dba_data_files,
14.查询系统回滚段
sql>select * from dba_rollback_segs
15.限制用户使用表空间大小
sql>alter user eton quota 10M on users(表空间名 )
16.何为临时表空间
由于Oracle工作时经常需要一些临时的磁盘空间,这些空间主要用作查询时带有排序(Group by,Order by等)等算法所用,当用完后就立即释放,对记录在磁盘区的信息不再使用,因此叫临时表空间。一般安装之后只有一个TEMP临时表空间。