oracle学习笔记 存储结构_文件



oracle学习笔记 存储结构_文件


从这节课开始我们开始讲oracle的存储结构


oracle的存储结构对于oracle的备份恢复以及oracle的优化都很有帮助
所以存储结构讲的相对深入一些


一)oracle的物理文件类型


先看一个数据库都包含哪些文件


物理数据库结构包括
控制文件、数据文件、联机重做日志文件、参数文件、备份文件、归档日志文件、口令文件、预警和跟踪日志文件


控制文件、数据文件、联机重做日志文件这三类文件以前讲过
一个数据库至少包括这三类文件


控制文件主要放的是数据库的名字、数据库的物理结构信息以及关于数据库的字符集的信息
还有 SCN号 checkpoint 以及一些状态信息
还包括一些归档日志的历史信息


数据文件里面放的实实在在的数据
数据文件又分两类
一类是我们讲的普通的数据文件
另外一类数据文件是临时数据文件


加上联机重做日志文件
对数据库来讲这三类文件是联机文件
不管哪个坏了数据库都会报错并可能会出现崩溃的情况


这三类文件很关键
oracle就针对这三类文件提供了很多的安全保障措施


二)控制文件


1)看一下oracle有哪些控制文件


课程中老师讲课这里用了Oracle SQL Developer工具
操作起来较友好
但是输出结果需要截图或者导出比较麻烦
我的笔记无图所以看结果还是使用字符操作和输出的putty工具


SQL> select name,value from v$parameter where name like '%control%';

NAME
------------------------------
VALUE
------------------------------------------------------------------------------------------------------------------------------------------------------
control_files
/u01/app/oracle/oradata/jiagulun/control01.ctl, /u01/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/oradata/jiagulun/control03.ctl

control_file_record_keep_time
7


结果中control files有三个文件
/u01/app/oracle/oradata/jiagulun/control01.ctl

/u01/app/oracle/oradata/jiagulun/control02.ctl

/u01/app/oracle/oradata/jiagulun/control03.ctl


这三个控制文件是完全一样的,是一种复用的关系


当前这三个控制文件都放在了同一个目录底下
这是非常不好的一种状况


建议将这三个文件放到三个不同的目录,最好是放到三个不同的磁盘里面去
物理上让这三个文件隔离开,这样坏了一个还有另外两个
它们完全是复用的关系


oracle为什么用了这三个文件就因为要让这三个文件复用
这是control files
控制文件的安全是通过复用的方式


2)下面演示一下怎么把这三个控制文件放到不同的目录底下去


控制控制文件路径的参数在oracle的spfile或pfile类型的参数文件中
参数名为control_files


改变控制文件的路径就要修改这个参数


a)第一种方法使用alter命令更改参数值


先建一个测试用的目录


[oracle@redhat4 oracle]$ pwd
/u01/app/oracle
[oracle@redhat4 oracle]$ mkdir ctltest
[oracle@redhat4 oracle]$ ll
总用量 24
drwxr-x---  3 oracle oinstall 4096 2016-04-11  admin
drwxr-xr-x  2 oracle oinstall 4096  2月 20 07:58 ctltest
drwxr-x---  3 oracle oinstall 4096 2016-04-11  flash_recovery_area
drwxr-x---  3 oracle oinstall 4096 2016-04-11  oradata
drwxrwx---  6 oracle oinstall 4096 2016-04-10  oraInventory
drwxrwx---  3 oracle oinstall 4096 2016-04-10  product


此时数据库处于open状态


这里只修改第三个控制文件control03.ctl的路径
SQL> alter system set control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl',
'/u01/app/oracle/oradata/jiagulun/control02.ctl',
'/u01/app/oracle/ctltest/control03.ctl'
scope=spfile;  2    3    4

System altered.


scope=spfile因为修改这个参数只能使用spfile,不能使用both立即生效
如果使用
scope=both
会有错误提示
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified


修改了spfile文件后
这时运行的数据库此参数值仍是原值
要重启数据库使之生效


这时重启过程有错误提示
SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              83887720 bytes
Database Buffers          192937984 bytes
Redo Buffers                7168000 bytes
ORA-00205: error in identifying control file, check alert log for more info


是因为修改了第三个控制文件路径
但是在新路径下没有第三个控制文件
结果导致数据库启动未进入mount状态


[oracle@redhat4 ctltest]$ pwd
/u01/app/oracle/ctltest
[oracle@redhat4 ctltest]$ ll
总用量 0


需要把原控制文件拷贝到这个目录
把第三个控制文件移动到ctltest目录下


[oracle@redhat4 ctltest]$ mv /u01/app/oracle/oradata/jiagulun/control03.ctl /u01/app/oracle/ctltest/
[oracle@redhat4 ctltest]$ ls
control03.ctl


重新启动数据库
SQL> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              83887720 bytes
Database Buffers          192937984 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.
数据库启动成功


再看控制文件
SQL> select name,value from v$parameter where name like '%control_files%';

NAME
--------------------------------------------------------------------------------
VALUE
----------------------------------------------------------------------------------------------------------------------------------------------------------------
control_files
/u01/app/oracle/oradata/jiagulun/control01.ctl, /u01/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/ctltest/control03.ctl
第三个控制文件路径修改成功


第一种方法总结:
1、SQL> alter system set control_files=... scope=spfile;
修改spfile文件中的control_files参数,为控制文件指定新的位置
2、SQL> shutdown immediate;
要使用control_files新的参数值必须重新启动数据库
3、拷贝控制文件到新目录
把控制文件放到新的位置,使新的参数值位置有最新控制文件
4、SQL> startup


b)第二种方法编辑spfile文件


为了保证安全先用spfile文件生成一个pfile文件
SQL> create pfile ='/u01/app/oracle/ctltest/init0.ora' from spfile;

File created.


修改过程控制文件位置仍以原位置开始
SQL> select name from v$controlfile;

NAME
------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/control01.ctl
/u01/app/oracle/oradata/jiagulun/control02.ctl
/u01/app/oracle/oradata/jiagulun/control03.ctl


spfile默认位置为
/u01/app/oracle/product/10.2.0/db_1/dbs/目录下
我的实验环境为
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat  init.ora    orapwjiagulun
initdw.ora       lkJIAGULUN  spfilejiagulun.ora
spfilejiagulun.ora文件就是数据库默认的参数文件


但此文件是二进制文件直接修改很容易把文件修改坏
我尝试了一下直接使用文本编辑器修改此文件中的control_files参数的值
结果
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun.ora'

说明文件已经损坏


但是错误提示中并没有直接说明spfilejiagulun.ora文件损坏
原因在于oracle启动时查找参数文件的顺序
第一个使用的参数文件是spfile{SID}.ora,一般这个文件是在数据库创建时自动生成的默认参数文件
spfile{SID}.ora文件没有或损坏会查找第二个参数文件spfile.ora
spfile.ora没有或损坏会找第三个参数文件init{SID}.ora
第三个参数文件再不可使用就会报错,数据库启动就会失败
并且报出上面的LRM-00109错误
实际的意思是说当前已没有可用的参数文件。


我的实验环境spfile.ora和init{SID}.ora没有自动生成
要使用还要自己建立


这三个文件的格式类型,数据库是有要求的
启动时使用的
spfile{SID}.ora和spfile.ora必须是二进制文件
init{SID}.ora必须是ASCII text类型文件
并且启动时只以这种类型的文件类型来处理
类型不对数据库会拒绝使用


如把spfilejiagulun.ora尝试当做pfile文件使用
SQL> startup pfile="/u01/app/oracle/product/10.2.0/db_1/dbs/spfilejiagulun.ora";
LRM-00123: invalid character 0 found in the input file
ORA-01078: failure in processing system parameters
读不出字符,
说明把它当做pfile文件使用但和pfile文件的类型不一样,
pfile为字符型文件,而spfile是二进制文件


虽然你可以create spfile或create pfile命令将这三个文件的类型进行转变
但spfile{SID}.ora和spfile.ora文件如果是文本文件,或init{SID}.ora如果是二进制文件数据库系统都不会使用。


查看一个文件的类型可以使用file命令


[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ file spfilejiagulun.ora
spfilejiagulun.ora: data
[oracle@redhat4 dbs]$ file init.ora
init.ora: ASCII English text


另外参数文件的默认路径下有一个init.ora文件
是个文本文件
它只是个参数文件的模板
实际环境无法直接使用,因为里面的参数数目和参数的值和实际环境都不一样
如果所有参数文件都丢失可以使用这个模板编辑生成可用的参数文件


在/u01/app/oracle/admin/jiagulun/pfile/目录下有一个pfile文件
我的环境下名字是init.ora.3112016134140
这个是一个可以使用的pfile文件
参数个数和值是数据库建立时生成的,是个最原始的可用pfile文件
可以用它启动数据库
SQL> startup pfile="/u01/app/oracle/admin/jiagulun/pfile/init.ora.3112016134140";
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              88082024 bytes
Database Buffers          188743680 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.
也可以用它来生成spfile,但参数值不能保证是最新的。


系统默认的spfile文件是spfile{SID}.ora
系统默认的pfile文件是init{SID}.ora
它们的默认路径都是在/u01/app/oracle/product/10.2.0/db_1/dbs下


用此方法开始时建立的最新的pfile恢复原来的spfile
SQL> create spfile ='/u01/app/oracle/product/10.2.0/db_1/dbs/spfilejiagulun.ora' from pfile='/u01/app/oracle/ctltest/init0.ora';

File created.

SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              83887720 bytes
Database Buffers          192937984 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.
启动成功
说明文件spfilejiagulun.ora不能直接修改


只能使用间接的方法
利用pfile文件来完成


看一下当前使用的spfile文件
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/10.2.0
                                                 /db_1/dbs/spfilejiagulun.ora
当前使用的是spfilejiagulun.ora文件


首先以当前可用的spfile文件创建一个pfile文件
SQL> create pfile ='/u01/app/oracle/ctltest/pfiletest.ora' from spfile;

File created.


修改字符型文件pfiletest.ora

将control_files部分改为
*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/ctltest/control03.ctl'
改完后
如果这时想替换原spfile文件
SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora'
  2  ;
create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora'
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance
说明当前实例正在使用此spfile文件,不能替换
只能重启数据库使实例使用其它参数文件时替换这个spfile文件


数据库关闭后
这时把要更改路径的控制文件移动到更改的目录
如果不是这时移动的控制文件,数据库启动时可能会发生控制文件版本不一致的错误
ORA-00214: control file '/u01/app/oracle/oradata/jiagulun/control01.ctl' version 782 inconsistent with file '/u01/app/oracle/ctltest/control03.ctl' version 763
数据库没有完全启动起来:database not mounted


控制文件是时刻变化着的而且各个控制文件是复用关系要求必须完全一样
发生的版本错误就是说控制文件内容不一样了


这时只要重新拷贝一下最新的控制文件使每个控制文件都完全一样就可以了
[oracle@redhat4 ctltest]$ cp /u01/app/oracle/oradata/jiagulun/control01.ctl /u01/app/oracle/ctltest/control03.ctl
重新启动一下数据库
shutdown以后
SQL> startup pfile="/u01/app/oracle/ctltest/pfiletest.ora";
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              96470632 bytes
Database Buffers          180355072 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.


看一下现在使用的是不是spfile参数文件
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string
无值说明没有使用spfile文件


这时数据库使用的是pfile文件可以重新生成spfile了

SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora';

File created.
重新启动数据库
startup成功


再查看一下控制文件
SQL> select name from v$controlfile;

NAME
------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/control01.ctl
/u01/app/oracle/oradata/jiagulun/control02.ctl
/u01/app/oracle/ctltest/control03.ctl
修改成功!


第二种方法总结出来的最简步骤:
1、SQL> shutdown immediate;
先关闭数据库
2、SQL> create pfile ='/u01/app/oracle/ctltest/pfiletest_1.ora' from spfile;
用spfile生成一个临时的pfile文件
3、[oracle@redhat4 dbs]$ vi /u01/app/oracle/ctltest/pfiletest_1.ora
编辑这个pfile文件,更改control file文件的位置
4、SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest_1.ora';
用这个更改后的临时pfile文件生成新的spfile文件
5、拷贝控制文件到新目录
将控制文件放到新的位置
6、SQL> startup
正常启动数据库,这时用的是新的spfile文件。


经测试最简方法是可行的!


各个控制文件在不同的磁盘或目录对安全会有进一层的保护
我实验环境只是演示一下后面还是继续老师的课程使用的是控制文件的默认状态和位置


3)控制文件大小


控制文件文件的大小都是比较小的
一般都几M


现在用的实验环境中
控制文件在/u01/app/oracle/oradata/jiagulun/目录下
文件都很小的并且不会怎么增长


我们到目录下看一下


[oracle@redhat4 jiagulun]$ pwd
/u01/app/oracle/oradata/jiagulun
[oracle@redhat4 jiagulun]$ ll
总用量 1083832
-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control01.ctl
-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control02.ctl
-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control03.ctl
-rw-r-----  1 oracle oinstall 104865792  2月  4 09:31 example01.dbf
-rw-r-----  1 oracle oinstall  52429312  2月  4 09:26 redo01.log
-rw-r-----  1 oracle oinstall  52429312  2月  4 11:21 redo02.log
-rw-r-----  1 oracle oinstall  52429312 12月 30 14:47 redo03.log
-rw-r-----  1 oracle oinstall 262152192  2月  4 11:21 sysaux01.dbf
-rw-r-----  1 oracle oinstall 503324672  2月  4 11:20 system01.dbf
-rw-r-----  1 oracle oinstall  20979712 12月 30 11:00 temp01.dbf
-rw-r-----  1 oracle oinstall  36708352  2月  4 11:21 undotbs01.dbf
-rw-r-----  1 oracle oinstall   5251072  2月  4 09:31 users01.dbf


从结果中可以看到控制文件就是ctl文件,大小都是7061504 就是7兆


三个控制文件都是7兆,很小
而且这三个控制文件大小不怎么变化,变化的幅度都很小
我们该避免控制文件变的很大


有一个参数
control_file_record_keep_time
可以限制控制文件变的很大


控制文件由两大部分组成:可重用的部分和不可重用的部分
不可重用的部分记录着数据库中固定部分的内容
如数据库的实例信息和包含的数据文件日志文件等的信息
一般情况下不会变化也是不能丢失的


可重用部分是提供恢复管理器来使用的,这部分的内容可以自动扩展
可重用的部分的大小可用CONTROL_FILE_RECORD_KEEP_TIME参数来控制
该参数的默认值为7天
就是这部分内容不是必须的,只保留7天,7天后这部分内容可以被覆盖


这样只有不可重用的部分的内容是控制文件大小的固定部分
可重用的部分只保留7天的内容
7天内记录的内容不多控制文件就不会变的很大
若7天记录的内容还太多可以缩小这个值到满意的大小


控制文件里没有实实在在的数据都是一些系统的信息


三)数据文件


数据文件分两类
一类是普通数据文件,另外一类是临时数据文件
数据文件里面放的是实实在在的数据


我们知道数据库里面放的是表
数据库最主要的是表
表里面是一行行的数据


1)数据文件大小


对使用oracle来讲
一个数据库里面放几百张表
表的大小达到上亿行都很正常


当然数据库里面不可能所有的表都上亿行
往往有四五个以内的大表上亿行
别的表可能几万行,十几万行


现在对oracle来讲
百万以下的表我们我们都称为小表
千万以下的表在千万到百万之间的我们叫中型表
千万以上的叫大型表
上亿行的我们叫巨型表


一般对小表来讲我们关注的少
对大表我们关注的多一些


这样一个表大小动辄几个G十几个G也都很正常


表的数据实实在在的放到数据文件里面
数据文件可能非常大


大部分情况我们数据库的数据文件几百G一个T以内
当然也有出现一个数据库的数据文件达到几个T几十个T上百T的情况


所以对数据库来讲最主要的最大的文件是数据文件
主要是因为它放的是实实在在的数据


2)数据文件的安全


对数据文件来讲它没有复用
比如里面有十个数据文件
这十个数据文件是不一样的,里面的内容也是不一样


oracle害怕控制文件坏,害怕redolog坏
唯独不害怕的是数据文件损坏
但是对数据文件来讲我们必须做一件事情备份


备份完了的文件是旧文件
比如昨天备份的文件是旧文件
今天数据库坏了,我是昨天备份的
备份里面只有昨天的数据,没有今天的数据
但oralce有日志
只要有旧的备份文件和足够的日志文件
就可以把数据文件给跑成最新的


oracle只要有旧的数据文件的备份文件
再加上日志文件,数据文件就是安全的


所以只有数据文件损坏我们不害怕


3)oracle数据文件的位置


SQL> select * from dba_data_files;

FILE_NAME                   FILE_ID TABLESPACE      BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_
------------------------ ---------- ---------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- -------
/u01/app/oracle/oradata/          4 USERS         5242880        640 AVAILABLE            4 YES 3.4360E+10    4194302          160    5177344         632 ONLINE
jiagulun/users01.dbf

/u01/app/oracle/oradata/          3 SYSAUX      262144000      32000 AVAILABLE            3 YES 3.4360E+10    4194302         1280  262078464       31992 ONLINE
jiagulun/sysaux01.dbf

/u01/app/oracle/oradata/          2 UNDOTBS1     36700160       4480 AVAILABLE            2 YES 3.4360E+10    4194302          640   36634624        4472 ONLINE
jiagulun/undotbs01.dbf

/u01/app/oracle/oradata/          1 SYSTEM      503316480      61440 AVAILABLE            1 YES 3.4360E+10    4194302         1280  503250944       61432 SYSTEM
jiagulun/system01.dbf

/u01/app/oracle/oradata/          5 EXAMPLE     104857600      12800 AVAILABLE            5 YES 3.4360E+10    4194302           80  104792064       12792 ONLINE
jiagulun/example01.dbf


可以看到当前环境有5个数据文件,它们在的目录是
/u01/app/oracle/oradata/jiagulun/
BYTES和BLOCKS列是数据文件的大小
一个是数据文件的位数大小一个是数据文件所占的块数


数据文件里面还有一类是临时文件

SQL> select * from dba_temp_files;

FILE_NAME                   FILE_ID TABLESPACE      BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS
------------------------ ---------- ---------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- -----------
/u01/app/oracle/oradata/          1 TEMP         20971520       2560 AVAILABLE            1 YES 3.4360E+10    4194302           80   19922944        2432
jiagulun/temp01.dbf


可看到oracle只有一个临时文件


现在知道怎么去找到这些数据文件就可以了


四)联机重做日志文件


日志文件的位置


SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                             IS_
---------- ------- ------- -------------------------------------------------- ---
         3         ONLINE  /u01/app/oracle/oradata/jiagulun/redo03.log        NO
         2         ONLINE  /u01/app/oracle/oradata/jiagulun/redo02.log        NO
         1         ONLINE  /u01/app/oracle/oradata/jiagulun/redo01.log        NO

当前有三个重做日志文件
也可以看重做日志文件有多大


同样默认在
/u01/app/oracle/oradata/jiagulun
目录下

-rw-r-----  1 oracle oinstall  52429312  2月  4 09:26 redo01.log
-rw-r-----  1 oracle oinstall  52429312  2月  4 11:21 redo02.log
-rw-r-----  1 oracle oinstall  52429312 12月 30 14:47 redo03.log

有50兆大小


你设大了将来可能会有问题,设小了也会有问题


控制文件 数据文件 联机重做日志文件
我们通常都放到存储上


oracle的实际生产环境
一般的是两个服务器机器和一个存储设备


对数据库来讲
两边的服务器放oracle软件
但是控制文件、redolog和数据文件这三类文件一定要放到存储上


五)参数文件


以后有章节会专门讲oracle的参数文件及它的意义是什么


参数文件放的是参数,并且有很多参数


举个最简单的例子,最基础参数的使用


数据库启动,启动起来以后
在物理内存里面要划出一块oracle的内存空间来
这块内存空间到底该怎么划,划多大出来
空间划出来以后里面每一块该设多大


还如我们SGA有六个池子,有PGA
我们的一些进程,该启哪些进程


这所有的信息都在参数文件里面


oracle的参数文件是有个变迁的历史的


这里只讲一下参数文件的位置

SQL> select * from v$parameter where name like '%spfile%';

  NUM NAME     TYPE VALUE                DISPLAY_VALUE        ISDEFAULT ISSES ISSYS_MOD ISINS ISMODIFIED ISADJ ISDEP DESCRIPTION              UPDATE_COMMENT        HASH
----- ------- ----- -------------------- -------------------- --------- ----- --------- ----- ---------- ----- ----- ------------------------ --------------- ----------
  128 spfile      2 /u01/app/oracle/prod /u01/app/oracle/prod TRUE      FALSE FALSE     FALSE FALSE      FALSE FALSE server parameter file                    3653611964
                    uct/10.2.0/db_1/dbs/ uct/10.2.0/db_1/dbs/
                    spfilejiagulun.ora   spfilejiagulun.ora


目前我的参数文件是在
/u01/app/oracle/product/10.2.0/db_1/dbs/
目录底下
有个spfile+数据库名字.ora文件
这就是oracle数据库的参数文件
我们平时改的参数都在这里面


访问的v$parameter视图
其实就是从参数文件里面取的值


上面的语句不加where条件,直接访问

SQL> select num,name from v$parameter;

  NUM NAME
----- ----------------------------------------
    2 tracefile_identifier
   25 lock_name_space
   26 processes
   27 sessions
   28 timed_statistics
.
.
.
 1330 asm_diskstring
 1334 asm_diskgroups
 1335 asm_power_limit
 1372 sqltune_category

258 rows selected.


结果中有很多行
这些数据就是oracle的参数数据
而这些参数数据都在spfile里面设置


控制文件、数据文件、联机重做日志文件
这三类文件坏了一个,oracle数据库可能就会崩溃 
也就是这三类文件对数据库很关键很重要


对参数文件来讲原则上是
oracle在启动的时候会用一次参数文件,此后基本上不用了


oracle启动的时候会读、访问参数文件
启动完了以后这个参数文件基本上不怎么用了
oracle数据库在启动以后即使参数文件坏了oracle还是可以正常跑


参数文件我们一般放到
$ORACLE_HOME的dbs目录底下


安装在windows的oracle的spfile文件在database目录下
linux和unix在dbs目录下

[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat  initdw.ora  init.ora  lkJIAGULUN  orapwjiagulun  spfilejiagulun.ora


参数文件名是spfilejiagulun.ora
它是个二进制文件,不能用vi编辑
编辑的话容易给编辑坏


oracle数据库很有特色
参数文件是oracle启动的时候会去读它一下
但是读了以后它并不把这个文件关闭
数据库整个的启动以后这个参数文件一直是打开的
但是它即使丢了的话oracle也不会崩溃
参数文件有一点半脱机半联机的感觉
都放在两边的服务器上,一般不放在存储上


六)备份文件


控制文件可以备份
参数文件可以备份
我们对备份文件主要备的是数据文件还有归档日志文件


控制文件和参数文件每次备份的时候不一定都备份,可在需要备份的时候备份


但是对数据文件和归档日志文件我们每次备份是需要一定备份的


原则性问题:
备份文件千万不要放到存储上


备份文件是离线文件
备完了以后就放在一个离线的位置


我们一般把备份文件放在带库上


带库就是磁带库
经过复杂的整合可拥有多个读写驱动装置和基本无限制的磁带
最基础组件是磁带机,是读写磁带的设备
和硬盘一样都是磁介质存储设备
它们最主要的区别:
硬盘主要用在运行的系统中
而磁带库主要用于备份恢复上
因为硬盘便于读写速度较快而磁带读写较麻烦速度较慢


要备份数据和长久保留数据使用磁带库是个较好的选择
备份是把数据存在一个位置方便恢复时使用
磁带和硬盘相比作为备份介质的优势
从它们的基本区别可以看出


都使用 磁 储存数据
硬盘存储的位置是中心的磁盘
对数据的读写使用了集成在一起的复杂的机电设备
带库存储的中心位置在条形的磁带
读写使用的是磁带和可以于它分离的驱动器


硬盘结构复杂对磁盘的洁净度要求非常的高
而且各个组件间无法分离,
一个组件损坏硬盘就报废了
虽说可以把中间的磁盘取出进行恢复
但那是一个非常麻烦和耗时的过程,同时也极不安全


带库要保留住数据只要保留住磁带即可
可方便的脱离出原带库系统在其它磁带机中读出


他们的使用都有寿命
任何形式的备份都不可能完全保障任何时候都能恢复出原来的数据


延长使用寿命,保存磁带更简单和容易实行


所以磁带相对的非常稳定
这和存储数据的最本质要求是相符的。


安全对备份是第一位的
对安全来讲,速度总是显得不重要,并且在高速下安全总是难于保障


如果只对备份来讲现在带库的速度其实一点也不慢


带库设备
我们有虚拟带库跟真实的两种带库
我们要掌握带库的工作原理,去使用它操作它


一般的备份,备份的数据放到带库上
比较有钱的用户或者比较规矩的用户一般用真实的带库
当然现在虚拟的带库使用越来越大但还是有些问题
建议大家数据不要放在虚拟带库上


虚拟带库是将硬盘或磁盘阵列虚拟成磁带库
有多种的虚拟方法
如:磁盘阵列型(Disk Array Based)、应用服务器型(VTL Appliance)、备份软件型(Backup Software)
但都是在一定的位置运用储存虚拟软件,将连接讯号仿真成磁带机的表述格式
欺骗操作系统和备份软件,误以为连接到的是一部实体的磁带装置


虚拟带库本质还是使用的硬盘,速度达到了硬盘的速度,但安全方面也是和硬盘一样,没有真实的带库安全


备份文件是离线的千万不要放在存储上


七)归档日志文件


1)默认归档日志的产生


以前向大家描述了归档产生的过程
这里看一下oracle产生多少归档,都归档到什么位置去了
可以查,但查的不一定准


在没有更改归档目录的默认情况下


现在我的实验环境
SQL> select * from v$archived_log;

no rows selected
没有归档日志


而且在归档日志的默认目录也没有产生
[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 JIAGULUN]$ ls
onlinelog


这是因为现在我的学习环境还没有打开归档模式所以先打开它


在23课logbuffer相关设置中我们讲过了归档模式的切换了
这里把它切换一下,切换到自动归档模式


切换刚完成时
SQL> select * from v$archived_log;

no rows selected
仍没有归档日志


[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 JIAGULUN]$ ls
onlinelog
而且没有归档目录


可以执行归档命令进行手动的归档,对未归档日志进行归档


alter system archive log all;
归档所有未归档日志,但不对当前的日志进行操作,就是不归档当前日志,也不进行当前日志的切换


alter system archive log current;
归档当前所有的未归档日志,包括当前的日志,归档后会进行一次当前日志的切换,改变当前日志到下一个


SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 46;
归档指定序号的未归档日志,序号可以在v$log视图中找到,不能归档当前日志


现在是自动归档模式手动切换一下日志
SQL> alter system switch logfile;

System altered.
自动归档模式下日志切换会造成日志归档


[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 JIAGULUN]$ ls
archivelog  onlinelog
默认归档目录产生了,就是/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog目录


SQL> select recid,name from v$archived_log;

     RECID NAME
---------- ----------------------------------------------------------------------------------------------------
         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc


在v$archived_log视图中也有了一条归档记录


可以看出在默认归档目录下归档的日志都放在名称为当前日期的子目录下


再次切换日志文件又会产生一个归档日志
SQL> select recid,name from v$archived_log;

     RECID NAME
---------- ----------------------------------------------------------------------------------------------------
         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc
         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc


进入此目录查看
[oracle@redhat4 2017_02_05]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05
[oracle@redhat4 2017_02_05]$ ll
总用量 27068
-rw-r-----  1 oracle oinstall 27256320  2月  5 17:32 o1_mf_1_6_d9fw96tx_.arc
-rw-r-----  1 oracle oinstall   419328  2月  5 17:40 o1_mf_1_7_d9fwqk9o_.arc
如果多次切换日志造成多次的日志发生归档,会产生多个归档日志文件


隔天后切换日志
[oracle@redhat4 archivelog]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog
[oracle@redhat4 archivelog]$ ls
2017_02_05  2017_02_06
产生了另一日期的目录及归档日志


新日期目录下
[oracle@redhat4 2017_02_06]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06
[oracle@redhat4 2017_02_06]$ ll
总用量 3664
-rw-r-----  1 oracle oinstall 3745792  2月  6 08:21 o1_mf_1_8_d9hjchs0_.arc
有了新归档


SQL> select recid,name from v$archived_log;

     RECID NAME
---------- ----------------------------------------------------------------------------------------------------
         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc
         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc
         3 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_8_d9hjchs0_.arc
查询出有不同日期的归档日志


再多次发生归档后
SQL> select recid,name from v$archived_log;

     RECID NAME
---------- ----------------------------------------------------------------------------------------------------
         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc
         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc
         3 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_8_d9hjchs0_.arc
         4 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_9_d9hjxryc_.arc
         5 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_10_d9hjxvrv_.arc
         6 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_11_d9hjy0pb_.arc

6 rows selected.
有了多条归档记录


oracle产生了这么多归档日志
都存储到了
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/
目录下
名字是自动取的,后缀为arc


2)归档日志不要放到存储上


当然归档日志是离线文件


oracle归档的时候会归档到这个目录底下
有可能出现这个文件被拷走了然后被删除了


所以这个位置并不能真实的来反应这个归档日志是不是在这个地方


但它要反应两个问题
第一个 oracle当年归档的时候把它归档到这个目录底下去了
第二个 如果oracle要找归档的话,它要到这个目录底下去按照这个名字去找归档
       找不到的话它会报错


记住归档日志文件有一个原则,归档日志文件千万不要放到存储上


我们很多用户特别是大的银行用户,非常喜欢把归档日志放到存储上
原因很简单
第一存储有空间有足够的空间空间很大
第二归档日志占用的空间很大
这里面可能最占用空间的就是归档日志文件
所以用户就理所当然的把数据文件和归档日志文件放到存储上
这样数据库一旦出了问题,存储一旦出了问题
数据库肯定会丢失数据,肯定会有一批人会倒霉


归档日志文件一定不要放到存储上


老师每次讲课的时候在中国在国内
就为了这个问题老师呼吁了很多次了
因为存储出问题太经常了
存储出问题如果你把归档跟数据文件全部放到存储上肯定会丢数据


3)归档日志目录的设置


有三组设置参数
第一种 默认 参数db_recovery_file_dest并且此参数默认值为/u01/app/oracle/flash_recovery_area
第二组 参数log_archive_dest(主归档路径)和log_archive_duplex_dest(从归档路径) 最多两个位置 默认无值
第三组 参数log_archive_dest_n n是从1开始的数字最多10个不同的归档路径 默认无值


设置了第二种或第三种参数 第一种参数会自动失效
第二种和第三种参数的设置是互斥的不能同时设置


第一种第二种参数只能指定本地路径,参数值是一个已存在目录
第三种参数可以指定本地和远程路径,
在设置时要在参数值中使用'LOCATION=本地的一个路径'或'SERVICE=远程服务名'
远程数据库的网络服务名要在tnsnames.ora文件中配置


第二种第三种中的参数设置一个就可以使用,
若设置了多个则它们是复用的关系同时使用,就是每个目录都进行归档并且归档的文件一样。


log archive还有不少的其它参数,通过这些参数可以把归档按自己的要求设置使归档比较合理。


八)口令文件


和oracle安全有关系
这个文件即使丢了也没关系我们可以再重新生成
可以临时生成
当远程以SYSDBA的身份登录数据库的时候需要用到这个口令文件



九)预警和跟踪日志


oracle有两种日志
联机重做日志是记录oracle操作,记录oracle数据块变更的
用来恢复数据,保证数据一致


oracle还有一个日志叫alert日志预警日志
oracle重大的操作以及错误信息都在这个日志里面会出现
用来判断oracle有没有问题


先简单的看一下


1)alert日志


在/u01/app/oracle/admin/jiagulun目录下有一堆dump文件
在bdump目录下有一个alert日志


[oracle@redhat4 bdump]$ pwd
/u01/app/oracle/admin/jiagulun/bdump
[oracle@redhat4 bdump]$ ls
alert_jiagulun.log       jiagulun_cjq0_6634.trc   jiagulun_lgwr_6626.trc
jiagulun_arc0_30179.trc  jiagulun_lgwr_13460.trc  jiagulun_p000_6646.trc
jiagulun_arc1_30181.trc  jiagulun_lgwr_13577.trc  jiagulun_p001_6648.trc
jiagulun_arc2_30183.trc  jiagulun_lgwr_13643.trc  jiagulun_pmon_6618.trc
jiagulun_cjq0_13651.trc  jiagulun_lgwr_29955.trc


alert_jiagulun.log就是alert日志是数据库的问题诊断的一个入口
oracle重大的操作以及oracle的错误都会出现在这个日志中


我们可以看一下这个文件的内容


[oracle@redhat4 bdump]$ more alert_jiagulun.log
Mon Apr 11 13:38:53 2016
Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Shared memory segment for instance monitoring created
Picked latch-free SCN scheme 2
Using LOG_ARCHIVE_DEST_10 parameter default value as USE_DB_RECOVERY_FILE_DEST
Autotune of undo retention is turned on.
IMODE=BR
ILAT =18
LICENSE_MAX_USERS = 0
SYS auditing is disabled
ksdpec: called for event 13740 prior to event group initialization
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
  processes                = 150
  nls_language             = SIMPLIFIED CHINESE
  nls_territory            = CHINA
  sga_target               = 285212672
  control_files            = /u01/app/oracle/oradata/jiagulun/control01.ctl, /u0
1/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/oradata/jiagulun/co
ntrol03.ctl
.
.
.
Mon Feb  6 07:43:33 2017
MMNL absent for 50192 secs; Foregrounds taking over
Mon Feb  6 08:20:58 2017
Thread 1 cannot allocate new log, sequence 9
Private strand flush not complete
  Current log# 1 seq# 8 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log
Thread 1 advanced to log sequence 9
  Current log# 2 seq# 9 mem# 0: /u01/app/oracle/oradata/jiagulun/redo02.log
Mon Feb  6 08:30:48 2017
Thread 1 advanced to log sequence 10
  Current log# 3 seq# 10 mem# 0: /u01/app/oracle/oradata/jiagulun/redo03.log
Thread 1 advanced to log sequence 11
  Current log# 1 seq# 11 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log
Thread 1 cannot allocate new log, sequence 12
Checkpoint not complete
  Current log# 1 seq# 11 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log
Thread 1 advanced to log sequence 12
  Current log# 2 seq# 12 mem# 0: /u01/app/oracle/oradata/jiagulun/redo02.log

内容太多只截取其中一部分


里面都是重大的操作


内容中可看到
数据库的启动、发生的一些checkpoint事件和备份了一个控制文件等
还包括oracle的错误
都出现在这个文件里面
出现了错误,要去找相关的错误


以后oracle排错的时候,会首先从这个文件入手


2)trc文件


此目录下有很多的.trc文件
这些文件叫trace文件


比如jiagulun_lgwr_13460.trc文件
一看就是LGWR进程产生的
这个trc文件往往意味着LGWR进程出现问题了
trace文件往往记录着这个LGWR这个进程出问题的一瞬间的内存的状态


每一个进程包括前台进程包括后台进程都有PGA空间
trace文件基本记录着LGWR等进程出问题那一瞬间进程的PGA的信息


这些信息一般只有oracle的人才能看懂
一般的开发人员,一般我们的人都看不懂


所以我们平常只要看alert日志就是alert_jiagulun.log文件
其它的trc文件是后台进程的trace文件


那么serverprocess的trace文件在udump目录

[oracle@redhat4 udump]$ pwd
/u01/app/oracle/admin/jiagulun/udump
[oracle@redhat4 udump]$ ls
jiagulun_ora_11458.trc  jiagulun_ora_13551.trc  jiagulun_ora_29945.trc
jiagulun_ora_12933.trc  jiagulun_ora_13567.trc  jiagulun_ora_29972.trc
jiagulun_ora_13393.trc  jiagulun_ora_13592.trc  jiagulun_ora_29974.trc
jiagulun_ora_13449.trc  jiagulun_ora_13617.trc  jiagulun_ora_31683.trc
jiagulun_ora_13450.trc  jiagulun_ora_13633.trc  jiagulun_ora_3623.trc
jiagulun_ora_13475.trc  jiagulun_ora_13660.trc  jiagulun_ora_4721.trc
jiagulun_ora_13525.trc  jiagulun_ora_16478.trc  jiagulun_ora_6616.trc
jiagulun_ora_13529.trc  jiagulun_ora_21408.trc  jiagulun_ora_6643.trc
jiagulun_ora_13547.trc  jiagulun_ora_26989.trc  jiagulun_ora_6644.trc
jiagulun_ora_13550.trc  jiagulun_ora_27058.trc


这里面也有一堆trace文件
这些trace文件都是serverprocess产生的


udump里面都是serverprocess产生的日志文件
bdump里面都是后台进程产生的trace文件
里面都记录着数据库
进程出问题那一瞬间它的一个内存的情况


预警和跟踪日志文件
它丢不丢和数据库都没有关系
这里面只有一个最重要的文件alert_jiagulun.log就是alert日志


这节课讲了数据库的物理结构信息
各种文件都在什么位置,以及文件的重要性


十)总结


摘自于老师使用的ppt课件


物理数据库结构


 
构成Oracle数据库的文件可以分为以下几类:


 控制文件:包含有关数据库本身的数据(即物理数据库的结构信息)。
           这些文件对数据库而言至关重要。没有这些文件,就无法打开用于访问数据库数据的数据文件。


 数据文件:包含数据库中的用户数据或应用程序数据。


 联机重做日志文件:可用来实现数据库实例恢复。
                   如果数据库已崩溃但未丢失任何数据文件,那么使用这些文件中的信息可以通过实例恢复数据库。


 要成功运行数据库,以下附加文件非常重要:


 参数文件:用于定义启动实例时如何配置实例。


 口令文件:允许用户远程连接到数据库并执行管理任务。


 备份文件:用于恢复数据库。
           当因介质故障或用户错误而损坏或删除了原始文件时,通常需要还原备份文件。


 归档日志文件:包含实例生成的数据更改(重要)的实时历史记录。
               使用这些文件和数据库备份可以恢复丢失的数据文件。也就是说,使用归档日志可以恢复还原的数据文件。


 跟踪文件:每个服务器和后台进程都可以对关联的跟踪文件执行写操作。
           如果在进程中检测到内部错误,进程就会将关于错误的信息转储到进程的跟踪文件中。
           写入到跟踪文件中的某些信息专门供数据库管理员使用,另一些信息则供Oracle支持服务部门使用。


 预警日志文件:是特殊的跟踪文件,又称为预警日志。
               数据库预警日志是按时间顺序列出的信息日志和错误日志。Oracle建议查看这些文件。



                2017年3月11日              
                                                                                                             文字:韵筝


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle是一种关系型数据库管理系统,广泛用于企业级应用程序中。学习Oracle需要全面了解其结构、基本概念和操作技巧。 首先,了解Oracle数据库的体系结构非常重要。Oracle数据库由实例和数据库组成。实例是数据库在内存中的运行实体,数据库是磁盘上存储数据的地方。了解实例和数据库之间的关系以及它们各自的功能对于后续学习非常重要。 其次,掌握SQL语言对于学习Oracle至关重要。SQL是结构化查询语言的缩写,用于与数据库进行交互。学习SQL语言,包括基本的SELECT、INSERT、UPDATE和DELETE语句,以及高级的聚合函数、连接查询和子查询等操作,可以帮助我们有效地访问和操作Oracle数据库。 此外,熟悉Oracle数据库的基本概念也是学习的关键。如表、视图、索引、约束、触发器等一系列数据库对象的使用和管理,以及事务的概念和ACID特性的重要性等。 了解Oracle的性能调优也是学习Oracle的必备知识之一。通过优化查询、索引和存储结构等手段来提高数据库的性能可以使数据库系统更加高效地运行。 最后,了解Oracle的高级特性和功能也是学习的重点。如分区表、数据泵、分布式数据库、备份和恢复等高级功能,在复杂的企业级环境中能够更好地应对各种需求。 总之,学习Oracle需要综合掌握数据库的结构、SQL语言、基本概念、性能调优和高级特性等。通过理论学习和实践操作相结合,逐步积累经验,才能够成为熟练的Oracle数据库管理员或开发人员。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值