oracle 表空间 logfile,控制文件 日志文件 表空间

控制文件

控制文件主要是在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值