控制文件 日志文件 表空间

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

控制文件

控制文件主要是在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,如需转载请自行联系原作者


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
159 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
2月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
3月前
|
监控 Linux 应用服务中间件
系统监控:使用日志文件 journalctl的使用
本文介绍了如何使用`journalctl`命令来监控和查看Linux系统的日志文件,包括查看特定行数、过滤日志级别、实时跟踪日志、按时间段查询日志以及日志轮换和压缩的配置。
111 2
系统监控:使用日志文件 journalctl的使用
|
3月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
3月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
46 1
|
3月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
4月前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能