Oracle数据库是什么?
Oracle DataBase是⼀款关系型数据库管理系统,同类的产品还有MySQL, SQLServer等。
我们会把那个承载我们核心数据的系统笼统地成为数据库服务器。
严格意义上来讲Oracle DataBase是由两个部分组成
instance+database=数据库服务
Oracle instance:⼀组后台进程和内存结构 ,后台进程就是ps -ef || grep ora_查询出来的那些
Oracle database:存放在操作系统上的物理文件,比如datafile,logfile…
——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状态下
- 单个文件损坏:通过简单复制解决。
- 所有的控制文件丢失:
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 vlogfile;】
【select * from v$log; 】
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’;】
- 添加组成员文件
【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