控制文件
控制文件主要是在oracle启动的时候,启动到第二部mount的时候,会从控制文件中读取日志文件和数据文件的路径信息
[oracle@sq ~]$ cd /u01/app/oracle/oradata/orcl/
.ctl为控制文件
oracle默认会创建三个控制文件,三个控制文件里边的内容完全是一模一样的,是二进制文件
包含 数据库名称与表示
表空间名称
数据文件与日志文件位置与名称
归档日志文件信息
备份信息 (RMAN)备份元数据信息
SQL> select * from v$controlfile;(查看系统的控制文件)
[oracle@sq orcl]$ strings control01.ctl |more
减少控制文件
1.修改控制文件相关参数
SQL> alter system set control_files='/oracle/app/oradata/TEST/control01.ctl' scope=spfile;
SQL> shutdown abort
[oracle@sq orcl]$ rm -rf control03.ctl
[oracle@sq dbs]$ cd /u01/app/oracle/product/10.2.0/db_1/dbs/
[oracle@sq dbs]$ strings spfileorcl.ora |grep control_files(只有一个)
增加控制文件
SQL> alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl' scope=spfile;
[oracle@sq orcl]$ cp control01.ctl control02.ctl
SQL> shutdown abort
SQL> startup
SQL> show parameters control_files
======================================
检查点
8i后 引入了增量检查点(incremental checkpoint)主要变化为,加入了 检查点队列(CKPTQ)
在数据库内部,每一个脏块都记录到 检查点队列中,按照LRBA(low RBA,第一次对数据块修改对应的redo byte address)的顺序来排列,如一个数据块修改了多次,该块 在队列上顺序并不会改变(相对于LRBA,后面修改的RBA叫做HRBA)
当执行增量检查点时,DBWR从队列中 按LRBA的顺序写,同时CKPT进程 将LRBA写入到控制文件中,为了减少频繁写对性能影响,CKPT进行轻量级更新时,不会写数据文件检查点信息和数据文件头信息.
==========================================
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M,
GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M,
GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/orcl/system01.dbf',
'/u01/app/oracle/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/oradata/orcl/users01.dbf',
'/u01/app/oracle/oradata/orcl/aaa.dbf'
CHARACTER SET WE8ISO8859P1
;
=============================================
在线日志文件
SQL> select * from v$log order by 1;
INACTIVE 状态为未使用
CURRENT状态为正在使用
ACTIVE 状态为正在同步
切换日志组
SQL> alter system switch logfile;
SQL> select * from v$log order by 1;
SQL> alter system switch logfile;
SQL> alter system switch logfile;(在执行2次后速度会很慢)
因为其他组 状态为ACTIVE 只有同步完 才能切换数据
把oracle中结果输出到 系统文件中
SQL> spool /home/oracle/aaa
SQL> select * from v$log;
SQL> spool off
[oracle@oracle11 ~]$ cd /home/oracle/
[oracle@oracle11 ~]$ cat aaa.lst
强制检查触发点,同步数据缓冲区内容到磁盘
手动执行检查点
SQL> alter system checkpoint;
此操作执行后执行SQL> select * from v$log order by 1;组的ACTIVE 状态将变成INACTIVE状态
注:commit操作只同步日志缓冲区内容到日志文件,oracle只要保证修改操作被写入到日志文件,那么此操作即为成功而无需保证数据缓冲区内容写入到数据文件。
-------------------------------------------------
日志文件中 记录着 low scn(起始scn) next scn (结束scn)
当前日志没有结束 ,素以结束scn被设置无限大fffffffff
等到数据恢复时候,通过scn号 就能判断需要找哪个 日志或归档文件
select * from v$log;
first_change# 列为low scn
---------------------------------------------------
测试
SQL> create table test01 as select * from sys.dba_objects;
SQL> insert into test01 select * from test01;(多执行几次)
看日志文件的大小 跟变化
--------------------------
SQL> show parameter log_checkpoint_interval (默认值为0)
log_checkpoint_interval 指的是两次checkpoint之间操作系统数据块改变的个数
SQL> alter system set log_checkpoint_interval=100;
(改变100个块执行checkpoint)
1.把日志组状态变为active
2.SQL> create table aaa as select * from all_objects;(改变100个块以上)
3.再次查看日志组 所有状态都变成了 inactive 因为改变100个以上的块 执行了checkpoint
----------------------------
SQL> show parameter mttr(fast_start_mttr_target值为0 )
是指允许DBA指定数据库进行崩溃恢复需要的秒数
FAST_START_MTTR_TARGET其实就是一个目标值,也就是如果oracle 的redo size per second 非常大的情况下,系统只有增加checkpoint 次数,以便oracle 在instance recovery 的时间接近 该值
--------------------------------
自动切换日志组
1.编写存储过程
SQL> create or replace procedure abc
as
begin
execute immediate 'alter system switch logfile';
end;
/
查看存储过程
SQL> select * from dba_procedures;
2.编写计划任务
SQL> variable job1 number;
SQL> begin
sys.dbms_job.submit(job => :job1,
what => 'abc;',
next_date => sysdate,
interval => 'sysdate+1/1440');
commit;
end;
/
3.删除
select * from dba_jobs(查看出job列的值,如列值为21)
SQL> begin
2 dbms_job.remove(21);
3 end;
4 /
查看存储过程中的内容
SQL> select text from user_source where name='ABC';
----------------------------------------------------
添加在线日志组
SQL> alter database add logfile group 4 ('/oracle/app/oradata/TEST/redo04.log','/home/oracle/redo04b.log')size 10M;
[oracle@sq ~]$ cd /u01/app/oracle/oradata/orcl/
[oracle@sq orcl]$ ls(多出两个成员)
在线添加日志成员
SQL> alter database add logfile member '/u01/app/oracle/redo003.log' to group 3;
重命名日志文件
SQL> select * from v$log order by 1;
结果为1组为 CURRENT
SQL> alter system checkpoint;(执行检查点 )
SQL> alter system switch logfile; 手动切换
SQL> select * from v$log order by 1;(1组状态为INACTIVE )
[oracle@sq orcl]$ touch redo11.log
SQL> alter database rename file '/u01/app/oracle/oradata/orcl/redo01.log' to '/u01/app/oracle/oradata/orcl/redo11.log'
如果进行重命名操作,则重命名的文件一定要先存在才可以进行重命名操作,否则报错
删除日志组
SQL> alter database drop logfile group 4;
SQL> select * from v$logfile;(查看日志文件)
========================================================
把sql内容输出到 文本
SQL> spool /home/oracle/aaa.txt
SQL> select count(*) from dba_objects;
SQL> spool off;
[oracle@oracle1 ~]$ cat aaa.txt
==========================================================
表空间分为:系统表空间
非系统表空间
系统表空间:system系统表空间 里面包含数据字典
Sysaux辅助表空间(oracle不允许删除和重命名也不支持传输表空间
三种表空间的类型:永久 存放数据以及索引
UNDO 存放执行DML语句时自动生成的回滚字段(删除或修改时,数未被提交前存储数据的表空间,roollback恢复数据时要找的空间)
排}系统同时只能有一个UNDO表空间使用并且在表空间满后盖
使用
临时 存放排序数据(TEMP表空间){先在内存排序满了以后在硬盘上
查看表所属表空间
SQL> select table_name,tablespace_name from user_tables;
查看数据文件信息
SQL> select * from dba_data_files;
查看临时文件信息
SQL> select * from dba_temp_files;
查看表空间信息:
SQL> select * from dba_tablespaces;
创建普通永久表空间
SQL> create tablespace test1 datafile '/oracle/app/oradata/TEST/test1.dbf' size 10M;
SQL> create table t2 (id int) tablespace test1;
[oracle@sq ~]$ cd /u01/app/oracle/oradata/orcl/
[oracle@sq orcl]$ ls(多出个test1.dbf数据文件)
创建UNDO表空间(用于存储回滚段,不能包含其他对象)
SQL> create undo tablespace undo1 datafile '/u01/app/oracle/oradata/orcl/undo1.dbf' size 20M;
切换undo表空间
SQL> alter system set undo_tablespace='undo1';
创建临时表空间
用于数据排序操作:存放排序数据
不能包含其他对象(数据以及索引等)
SQL> create temporary tablespace temp02 tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' size 10M;
切换临时表空间
SQL> alter database default temporary tablespace temp02;
查看临时表空间 v$tempfile
表空间offline
SQL> alter tablespace test1 offline;
表空间online
SQL> alter tablespace test1 online;
表空间读写模式切换
设置表空间只读
SQL> alter tablespace test1 read only;
设置表空间读写
SQL> alter tablespace test1 read write;
删除表空间
SQL> drop tablespace test1 including contents and datafiles;
[oracle@sq ~]$ cd /u01/app/oracle/oradata/orcl/
[oracle@sq orcl]$ ls(所属数据文件也删除)
修改表空间大小
SQL> create tablespace test2 datafile '/u01/app/oracle/oradata/orcl/test2.dbf' size 10M;
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 20M;
alter database datafile '/oracle/app/oradata/TEST/test1.dbf' autoextend on;
在表空间添加新的数据文件
SQL> alter tablespace test2 add datafile '/u01/app/oracle/oradata/orcl/test22.dbf' size 10M;
========================================
删除重复行
create table a(a varchar2(10),b varchar2(20));
插入数据
insert into a values('11','22');
insert into a values('11','22');
insert into a values('11','22');
insert into a values('aa','bb');
insert into a values('aa','bb');
insert into a values('cc','dd');
commit;
方法1.
SQL> create table test_copy as (select distinct * from a);
方法2.
delete from a t where rowid not in(
select max(rowid) from a p where t.a=p.a and t.b=p.b);
======================================================================
在线移动数据文件
1.SQL> alter tablespace test2 offline;
2.[oracle@sq ~]$ mv /u01/app/oracle/oradata/orcl/test2.dbf /u01/aa2.dbf
3.
SQL> alter tablespace test2 rename datafile '/u01/app/oracle/oradata/orcl/test2.dbf' to '/u01/aa2.dbf';
4.SQL> alter tablespace test2 online;
SQL> delete from t22 where rownum<10;
(表空间自动扩展)
SQL> create tablespace test
2 datafile '/oracle/app/oradata/TEST/test.dbf' size 10M
3 autoextend on
4 next 5M
5 maxsize 100M;
查看默认表空间
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users
更改默认表空间
SQL> alter database default tablespace test2;
==============================================================
追加日志
因为在oracle里在做update操作时候,有些信息是不技术redo log,例如主键或唯一键等,这样在根据redolog 来解析数据是时候你就不知道具体那行数据被修改,如果根据rowid 来做key值的,在不同数据库里脱离了块,rowid也就没有任何意义了,所以oracle提供了supplemenetal log,通过配置启动它,oracle会在redo log里技术主键或唯一键的信息。
alter database add supplemental log data
alter database drop supplemental log data
本文转自陈继松 51CTO博客,原文链接:http://blog.51cto.com/chenjisong/1737382,如需转载请自行联系原作者