Oracle数据库是什么?
Oracle DataBase是⼀款关系型数据库管理系统,同类的产品还有MySQL, SQLServer等。
我们会把那个承载我们核心数据的系统笼统地成为数据库服务器。
严格意义上来讲Oracle DataBase是由两个部分组成
instance+database=数据库服务
Oracle instance:⼀组后台进程和内存结构 ,后台进程就是ps -ef || grep ora_查询出来的那些
Oracle database:存放在操作系统上的物理文件,比如datafile,logfile…
Oracle数据库体系结构——database

——database数据库

1.data file数据文件

在操作系统层可以看到
【select * from v$datafile;】

2.control file控制文件
  • 在数据库使用过程中,Oracle数据库会不断更新控制文件,每个控制文件只与⼀个oracle数据库相关联。
  • 功能和特点:
    1)记录数据库当前物理状态 ,记录了数据文件datafile和日志文件logfile的所有信息。
    2)维护数据库的一致性(SCN#)
    3)是一个二进制小文件
    4)在mount阶段被读取
    5)记录RMAN备份的元数据
    控制文件信息只能通过oracle数据库修改;没有数据库管理员或用户可以编辑控制文件。
  • 查看控制文件信息:
    【select * from v$controlfile;】
    【show parameter control_files】
    冗余:有两个一样的控制文件
  • controlfile不能在操作系统层看到,必须手动生成控制文件到操作系统层面:
    【alter database backup controlfile to trace as ‘/u01/ctl01.bak’;】
  • 控制文件更新机制
    当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle 服务器进程(Server Process)会立即更新控制文件以反映数据库结构的变化。
    日志写进程 LGWR 负责把当前日志***记录到控制文件中。
    检查点进程 CKPT 负责把校验点的信息记录到控制文件中。
    归档进程 ARCN 负责把归档日志的信息记录到控制文件中。
    通过视图 【v$controlfile_record_section】 可以了解到控制文件中记录了大量的数据库当前状态信息
  • 控制文件多元化(多路复用)
    两个控制文件副本(最好三个)
    每个磁盘上一个副本
    至少在单独的磁盘控制器上有一个副本
  • 手动添加控制文件:
    1)先备份参数文件
    【spfile SQL> create pfile from spfile;】
    2)查看当前控制文件信息
    【SQL> show parameter control_files; 】
    3)修改控制文件,并在参数中增加一个新的控制文件
    【 SQL> alter system set control_files=’/u01/app/oracle/oradata/orcl/control01.ctl’,

    ‘/u01/app/oracle/oradata/orcl/control04.ctl’ scope=spfile;】
    4)复制控制文件,Oracle 建议分配在不同的物理磁盘上
    【cd /u01/app/oracle/oradata/orcl】
    【cp control01.ctl control03.ctl】
    5)重启数据库
    【shutdown immediate】
    【startup】
    6)再次查看
    【SQL> show parameter control_files; 】

控制文件如果损坏需要重建,重建控制文件必须使系统在 NOMOUNT状态下

  1. 单个文件损坏:通过简单复制解决。
  2. 所有的控制文件丢失:
    a) 如果有 binary 控制文件备份,利用备份恢复控制文件,
    b) 如果没有备份,利用 trace 脚本文件重新创建控制文件(代价:丢失归档记录信息和 RMAN 备份信息)
  • 重建控制文件
    1)生成一个脚本
    【SQL> alter database backup controlfile to trace as ‘/u01/app/oracle/oradata/oradb/ control.trc’;】
    2)nomount 状态执行脚本文件中的创建语句(有NORESETLOGS和RESETLOGS方式)
    【 [[email protected] oradb]$ more control.trc
    STARTUP NOMOUNT
    CREATE CONTROLFILE REUSE DATABASE “oradb” NORESETLOGS MAXLOGFILES 16 MAXLOGMEMBERS 3

    ZHS16GBK ;】
    执行上述【startup nomount …ZHS16GBK】
    3)打开数据库
    【alter database open NORESETLOGS;】
    4)将临时文件加到临时表空间
    【alter tablespace TEMP add tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’;】
    5)之前offline或者read only的文件会发生异常
    例如:/u01/app/oracle/product/11204/db_1/dbs/MISSING00007 7 TBS_LK02
    直接将数据文件进行改名,改为原来的名字,然后alter tablespace online/read write
    /u01/app/oracle/product/11204/db_1/dbs/TBS_LK02.dbf 7 TBS_LK02
3.redo log file日志文件
  • 作用
    数据 recovery恢复
  • 特征
    记录redo log buffer写进来的redo条目,数据库中块的变化(DML、DDL)
    用于数据块的 recover
    以组的方式管理 redo file,最少两组 redo,循环使用
    和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)
    日志的 block 和数据文件的block(8K)不⼀样
    在操作系统层可以看到
  • 查看日志文件信息:
    【select * from varchivedlog;selectfromvarchived_log;】 (归档模式下查看) 【select * from vlogfile;】
    【select * from v$log; 】
    Oracle数据库体系结构——database
    THREAD#: 线程在单实例的环境下,thread# 永远是1
    SEQUENCE#:日志***,在日志切换时会递增
    【 alter system switch logfile; 】切换日志文件
    FIRST_CHANGE# 在每个日志组对应⼀个 sequence 号,其中首条日志条目的第一个的scn号。
    STATUS 列有四种状态:
    current: 当前日志组对应的脏块还没有全部从 data buffer 写入到 data file, 含有实例恢复需要的信息,不能被覆盖
    active: 日志组对应的脏块还没有完全从data buffer写入到 data file,含 有实例恢复需要 的信息,不能被覆盖
    inactive: 日志组对应的脏块已经从data buffer写入到data file,可以覆盖
    unused:新添加的日志组,还没有使用

默认只有三个日志文件组,每组一个日志文件,三个文件轮流使用,写满之后系统自动归档永久保存
理想状态下每个redo log组有两个redo log file

  • 添加日志文件组
    1)查看当前日志信息
    【 select group#,sequence#,bytes/1024/1024 size_MB,archived,status
    from v$log;】

2)添加新组
【 alter database add logfile group 4 ‘/u01/app/oracle/oradata/orcl/redo04.log’ size 50M;】

3)查看日志状态
【select group#,sequence#,bytes/1024/1024 M,archived,status from v$log;】

  • 添加成员文件
    1) 先建好目录,准备放在/u01/app/ oracle/oradata/log_member1 下
    【 [[email protected] ~]$ mkdir -p /u01/app/oracle/oradata/log_member1 】
    2) 为group 1 添加成员文件
    【 alter database add logfile member ‘/u01/app/oracle/oradata/log_member1/redo01.log’ to group 1 】
    invalid:成员文件刚添加还未同步
    【 alter system switch logfile; 】切换日志文件使其同步
    一次添加多个日志文件
    【alter database add logfile group 5 (’/u01/app/oracle/oradata/oradb/redo05.log’, ‘/u01/app/oracle/oradata/log_member1/redo05.log’) size 50M;】
  • 日志文件的迁移
    方法一:不关库,先删后加
    1) 发起检查点,并查看日志情况,确认想删的日志文件状态是inactive
    【 alter system checkpoint;
    select group#,status from v$log; 】
    2)删除日志文件
    【alter database drop logfile member ‘/u01/app/oracle/oradata/oradb/redo01.log’;】
  1. 添加组成员文件
    【alter database add logfile member ‘/u01/app/oracle/oradata/log_member1/redo01.log’to group 1】
    方法二:关库,重命名
    1)关库
    【shutdown immediate】
    2)重命名
    【mv /u01/app/oracle/oradata/oradb/redo02.log /u01/app/oracle/oradata/log_member1/redo02.log】
    3)启动到mount
    【SQL > startup mount; 】
    【SQL > select group#,member from v$logfile order by 1;】
    4)通知控制文件
    【 SQL > alter database rename file ‘/u01/app/oracle/oradata/oradb/redo02.log’ to ‘/u01/app/ oracle/oradata/log_member1/redo02.log’; 】
    5)打开数据库
    【 alter database open; 】
  • 日志文件组的删除
    【 SQL> alter database drop logfile group 5;
    SQL> select group#,status,archived from v$log; 】
    drop logfile group 不会删磁盘上文件,删除物理文件需要rm

相关文章: