物理结构
逻辑结构
内存结构
进程结构
逻辑结构
内存结构
进程结构
[数据库管理员DBA(Database Administrator)]
DBA职责:
。Oracle核心软件安装与产品升级
。为数据库系统分配存储空间及规划未来存储需求
。创建数据库存储结构
。用户权限与角色管理
。监视与控制用户对数据库的存储
。维护数据库安全
。完成数据库备份与恢复
。监视与优化数据库性能
DBA职责:
。Oracle核心软件安装与产品升级
。为数据库系统分配存储空间及规划未来存储需求
。创建数据库存储结构
。用户权限与角色管理
。监视与控制用户对数据库的存储
。维护数据库安全
。完成数据库备份与恢复
。监视与优化数据库性能
一、物理结构:数据库是由构成数据库的操作系统文件所组成。
UNIX:/u01/app/oracle/oradata/db_name/ *.*
Windows NT/2000: D:\Oracle\oradata\db_name\*.*
UNIX:/u01/app/oracle/oradata/db_name/ *.*
Windows NT/2000: D:\Oracle\oradata\db_name\*.*
//为保证数据安全,只要将此目录中的所有文件备份即可。 Control0X.CTL文件(X为1,2,3)是一样的,只要有一个完好就可以。
包含三类物理文件:
1、数据文件(DataFiles):存储数据库数据的文件,表、索引、存储过程等都存储在数据文件中。
1、数据文件(DataFiles):存储数据库数据的文件,表、索引、存储过程等都存储在数据文件中。
[*]查询数据文件信息:
SQL> select * from dba_data_files;
SQL> select * from dba_data_files;
/* 数据文件的大小只是表示有多少存储数据的空间,并不表示数据量的大小。*/
[*]查询表空间空闲空间:
SQL> select * from dba_free_space; // 显示结果中包括碎片
SQL>select tablespace_name, sum(bytes) from dba_free_space
group by tablespace_name;
[*] 表空间碎片合并命令:
SQL> alter tablespace 表空间名 coalesce;
SQL> select * from dba_free_space; // 显示结果中包括碎片
SQL>select tablespace_name, sum(bytes) from dba_free_space
group by tablespace_name;
[*] 表空间碎片合并命令:
SQL> alter tablespace 表空间名 coalesce;
SQL> alter tablespace temp coalesce;
[*]数据块大小控制参数:db_block_size = 2K - 32K
在数据库安装后,数据块大小不得修改。
在数据库安装后,数据块大小不得修改。
系统缺省值如下:
Oracle7, Oracle8, Oracle8i 8.1.5: 2048(2K)
Oracle7, Oracle8, Oracle8i 8.1.5: 2048(2K)
Oracle8i 8.1.6: 8192(8K)
Oracle8i 8.1.7: 8192(8K)
这个参数存储在d:\oracel\admin\db_name\pfile\init.ora文件中。
SQL> select bytes, blocks, blocks*8192, file_name from dba_data_files;
数据文件的大小都是数据块的整数倍。数据块的大小在数据库安装之前确实,数据库安装之后就不能再修改。
[*] 显示数据块大小:
(1) d:\svrmgrl
SVRMGR> connect internal/oracle
(1) d:\svrmgrl
SVRMGR> connect internal/oracle
SVRMGR> show parameter db_black_size
SQL> select value form v$parameter where name='db_block_size'; (小写)
[1.1] 在Oracle数据库中,数据文件大小可以修改,命令如下:
SQL> Alter database datafile '数据文件名及路径' resize xxM;
SQL> Alter database datafile '数据文件名及路径' resize xxM;
SQL> alter database datafile 'd:\oracle\oradata\ora8i\system01.dbf' resize 100m;
// 上一行中ora8i在具体系统中应该是相应的数据库名
// 上一行中ora8i在具体系统中应该是相应的数据库名
更改之前,查询相应磁盘是否有空闲空间。
用相同的方法可以压缩数据文件的大小,但不能小于已经存储的数据的大小。
用相同的方法可以压缩数据文件的大小,但不能小于已经存储的数据的大小。
[1.2] 在Oracle8i数据库中,数据文件的大小可以自动扩展,命令如下:
SQL> Alter database datafile '数据文件名及路径' autoextend on; --//该数据文件允许自动扩展(缺省)
SQL> Alter database datafile '数据文件名及路径' autoextend on; --//该数据文件允许自动扩展(缺省)
SQL> Alter database datafile '数据文件名及路径' autoextend off; --//该数据文件不允许自动扩展
[*] 查询数据文件自动扩展属性:
SQL> select bytes, autoextensible, maxbytes, file_name from dba_data_files;
SQL> select bytes, autoextensible, maxbytes, file_name from dba_data_files;
SQL> Alter database datafile '数据文件名及路径' autoextend on
next 50m -- // 每次扩展50M
maxsize 1000m ; --// 最大扩展到1000M,如果unlimited,则受磁盘大小的限制
[*] 查询每次扩展量:
SQL> select bytes, increment_by, file_name from dba_data_files;
next 50m -- // 每次扩展50M
maxsize 1000m ; --// 最大扩展到1000M,如果unlimited,则受磁盘大小的限制
[*] 查询每次扩展量:
SQL> select bytes, increment_by, file_name from dba_data_files;
[安全起见,建议把自动扩展关闭]
[C.1] Sun Enterprise 6500: 8 * 34G
system01.dbf ==> 33G
SQL> Alter table emp deallocate unused; --// 压缩表未用空间
2、日志文件(Redo log files):记录数据库修改前后的信息,用于数据库恢复。
每一个数据库至少有两个日志文件组,每组有一个或多个日志成员文件。每个组的成员文件的缺省大小是1M。
[*]假设有三个组,每个组有三个成员文件,Oracle的日志工作流程(概括起来为循环覆盖):
(1) 每个组中的日志成员文件之间的关系是镜像关系,每个成员分别存储到不同的物理磁盘上,只有全部损坏,这个组才算损坏。如果只有一个成员,则这个数据库是不安全的。
(2) 在同一个时刻,只有一个组在工作。当第一组不能全部存放要记录的数据时,则转换到第二组,如果第二组仍然写不下,则转到第三组,第三组仍然存不下,则再转回到第一组。如果第一组日志的归档模式为归档日志,则第一组日志中存储的数据归档到磁盘或者磁带上,然后数据被覆盖,如果是非归档日志(默认模式,建议改变为归档模式),则新的数据直接覆盖第一组的数据,这种情况就会造成数据丢失。
[*] 确认数据库(日志)归档方式:
SQL> select log_mode from v$database;
SQL> select log_mode from v$database;
SVRMGR> archive log list
[C*] Oracle的数据库恢复
不完全数据库恢复:通过备份来回退,会造成部分数据的丢失
完全数据库恢复:数据不会丢失。
两种情况下都需要用到日志,日志对于数据库的恢复至关重要。
不完全数据库恢复:通过备份来回退,会造成部分数据的丢失
完全数据库恢复:数据不会丢失。
两种情况下都需要用到日志,日志对于数据库的恢复至关重要。
[*]
(1) 在线日志:v$log // 当前使用的日志,current
SQL> select * from v$log;
(1) 在线日志:v$log // 当前使用的日志,current
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
[如果当前日志文件损坏,则数据库无法恢复。(打死也恢复不了)。]
[C*]日志文件组的名称是:REDO0X.LOG(X=1,2,3)。
[对于Oracle数据库来说,还有一个关键文件是SYSTEM01.DBF,如果这个文件坏了,整个数据库系统无法启动,数据也会全部丢失。]
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
[如果当前日志文件损坏,则数据库无法恢复。(打死也恢复不了)。]
[C*]日志文件组的名称是:REDO0X.LOG(X=1,2,3)。
[对于Oracle数据库来说,还有一个关键文件是SYSTEM01.DBF,如果这个文件坏了,整个数据库系统无法启动,数据也会全部丢失。]
[!!! 一定要做好数据库及日志的备份!!!]
日志文件:v$logfile // 日志文件
归档日志:v$archived_log // 日志组切换时归档到磁盘或者磁带上的日志
归档日志:v$archived_log // 日志组切换时归档到磁盘或者磁带上的日志
(4) 历史日志:v$log_history // 日志的历史记录
SQL> select * from v$log_history;
SQL> select * from v$log_history;
[*] Redo Log 文件镜像
(1) 一组中Redo Log文件具有相同的信息。
(2) 选择合适的日志文件大小(不能太小,太小容易导致频繁的切换,从而导致过多的磁盘I/O,降低系统的性能)。
[C*] 内存的多少对数据库系统性能的影响是最重要的,日志虽然对系统性能有影响,但没有内存关键,内存一定要大。
(1) 一组中Redo Log文件具有相同的信息。
(2) 选择合适的日志文件大小(不能太小,太小容易导致频繁的切换,从而导致过多的磁盘I/O,降低系统的性能)。
[C*] 内存的多少对数据库系统性能的影响是最重要的,日志虽然对系统性能有影响,但没有内存关键,内存一定要大。
[C*] Oracle数据库最大化参数:
maxlogmembers: 最大值是5,缺省值是2。
maxlogfiles:最大254,缺省32个。 // 最大的日志文件个数
maxdatafiles:最大65534, 缺省254。
maxloghistory:最大65534,缺省65534
maxinstances: 最大63,缺省1。
maxlogmembers: 最大值是5,缺省值是2。
maxlogfiles:最大254,缺省32个。 // 最大的日志文件个数
maxdatafiles:最大65534, 缺省254。
maxloghistory:最大65534,缺省65534
maxinstances: 最大63,缺省1。
[组不需要太多,至少三个,四个一般就可以了]
[C* 不同日志文件组的文件大小可以不同,两个组中文件的个数也可以不同]
(3) 组中的成员同时被更新。
... [请参考PowerPoint教程]
(3) 组中的成员同时被更新。
... [请参考PowerPoint教程]
[*] 日志切换:
DBA强制日志切换命令:SQL> alter system switch logfile;
DBA强制日志切换命令:SQL> alter system switch logfile;
[*] 在Oracle中,文件的扩展名没有任何意义,从以下数据字典中查询相应的文件的文件名
(1) 表空间文件*.dbf: dba_data_file, v$datafile
(2) 日志文件*.log: v$logfile
(3) 控制文件*.ctl: v$controlfile
SQL> select * from v$log;
查询数据文件同步号:SQL> seelct file#, checkpoint_change#, from v$datafile;
控制文件同步号:SQL> select checkpoint_change# from v$database;
/* 随着日志的切换或者时间的推移,文件的同步号不断改变,如果上述同步号不一致,表明数据库出现问题;由此,不能将不同机器上的单个数据库文件互相拷贝,因为同步号不一致,只能把一台机器上的所有数据文件同时拷贝到另一台机器上才可以使用。Oracle的同步号以控制文件(*.ctl)中的为准。 */
Oracle不提供修改同步号的命令。如果在一个数据库中出现同步号不一致的情况,说明这个数据库的数据已经有不一致的部分,原因可能是进行了不完全恢复,只有当数据完全恢复后,同步号才能重新变得一致。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
上述显示结果中的SEQUENCE#的最大值是65534,如果达到最大值,会自动清零,从头开始。
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
上述显示结果中的SEQUENCE#的最大值是65534,如果达到最大值,会自动清零,从头开始。
[*]日志管理与配置命令
A. 增加日志文件组:
SQL> Alter database ADD
logfile group n('第一个日志成员文件','第二个日志成员文件') size xxM;
// n为组号。第二个日志成员文件为可选的,两个成员文件最好放到不同的物理磁盘上。
SQL>Alter database ADD
logfile group 4('d:\oracle\oradata\ora8i\log41.log', 'd:\oracle\oradata\ora8i\log42.log')
size 5m;
logfile group 4('d:\oracle\oradata\ora8i\log41.log', 'd:\oracle\oradata\ora8i\log42.log')
size 5m;
SQL>Alter database ADD
logfile group 4('d:\oracle\oradata\ora8i\log41.log', 'd:\oracle\oradata\ora8i\log42.log')
REUSE; // 如果在相应的路径下存在同名文件,请加Reuse直接覆盖原来的文件。
logfile group 4('d:\oracle\oradata\ora8i\log41.log', 'd:\oracle\oradata\ora8i\log42.log')
REUSE; // 如果在相应的路径下存在同名文件,请加Reuse直接覆盖原来的文件。
[C*]: Oracle不提供修改原来的日志组的属性(文件大小)的命令,解决办法是先创建新的,然后删除旧的
// ************************************* 实际操作内容 ************************************************
SQL> Alter database ADD
2 logfile group 4('d:\oracle\oradata\ora54\ReDo41.log', 'd:\oracle\oradata\ora54\ReDo42.log')
3 size 5m;
SQL> Alter database ADD
2 logfile group 4('d:\oracle\oradata\ora54\ReDo41.log', 'd:\oracle\oradata\ora54\ReDo42.log')
3 size 5m;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
4 1 0 5242880 2 YES UNUSED 0
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 199 1048576 1 NO CURRENT 153302 2002年04月
2 1 197 1048576 1 NO INACTIVE 112335 2002年04月
3 1 198 1048576 1 NO INACTIVE 132450 2002年04月
4 1 0 5242880 2 YES UNUSED 0
SQL> alter system switch logfile;
系统已更改。
SQL> /
系统已更改。
SQL> /
系统已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
B. 删除日志文件组:
SQL> Alter database DROP logfile group n;
SQL> Alter database DROP logfile group n;
说明:(1)Current, Active组不得删除,如果是归档日志组,要求先归档,否则,该组状态为ACTIVE,不能删除。
(2) 数据库只有两个日志组时,不得删除。
(3) 逻辑删除后,再删除物理文件。切记:不要删除错了文件,尤其是在UNIX下,最好在删除之间检查正在使用的物理文件,(当然,如果删除之前先备份文件更好)如下命令:
SQL> select * from v$logfile;
(2) 数据库只有两个日志组时,不得删除。
(3) 逻辑删除后,再删除物理文件。切记:不要删除错了文件,尤其是在UNIX下,最好在删除之间检查正在使用的物理文件,(当然,如果删除之前先备份文件更好)如下命令:
SQL> select * from v$logfile;
C. 增加日志成员文件:
SQL> Alter database ADD logfile member '成员文件名及路径' to group n;
SQL> Alter database ADD logfile member '成员文件名及路径' to group n;
D. 删除日志成员文件:
SQL> Alter database DROP logfile member '成员文件名及路径';
SQL> Alter database DROP logfile member '成员文件名及路径';
说明:(1) Current, Active组的成员不得删除;
(2) 日志组只有一个成员时,不得删除成员,可以删除组。
(2) 日志组只有一个成员时,不得删除成员,可以删除组。
3、控制文件(Control Files):是描述数据库结构的二进制文件。包括:
。数据库名db_name
。数据库创建的时间
。全部数据文件名及路径
。全部日志文件名及路径
。数据库恢复时所需的同步信息
// 控制文件只需要一个,但在oradata目录下有三个,另两个是镜像,三个文件内容相同。
。数据库名db_name
。数据库创建的时间
。全部数据文件名及路径
。全部日志文件名及路径
。数据库恢复时所需的同步信息
// 控制文件只需要一个,但在oradata目录下有三个,另两个是镜像,三个文件内容相同。
(1) 查询数据库跟踪文件信息(跟踪文件记录所有影响控制文件修改的命令):
D:\oracle\admin\db_name\bdump\SIDalrt.log // SID视具体情况而定
/u01/app/oracle/admin/db_name/bdump/alert_sid.log
D:\oracle\admin\db_name\bdump\SIDalrt.log // SID视具体情况而定
/u01/app/oracle/admin/db_name/bdump/alert_sid.log
// 这个文件时间长了之后会变得很大,因此需要定期删除。
(2) 建议设置:
。至少设置两个控制文件并保存于不同的磁盘。
。在数据库参数文件中的Control_files指明控制文件。
. 控制文件可以镜像,可以在安装或者安装完成后进行配置
.
[(2).C] 数据库参数文件名称及路径:
Unix:
/u01/app/oracle/admin/db_name/pfile/initSID.ora
。至少设置两个控制文件并保存于不同的磁盘。
。在数据库参数文件中的Control_files指明控制文件。
. 控制文件可以镜像,可以在安装或者安装完成后进行配置
.
[(2).C] 数据库参数文件名称及路径:
Unix:
/u01/app/oracle/admin/db_name/pfile/initSID.ora
Windows NT/2000:
D:\oracle\admin\db_name\pfile\init.ora
D:\oracle\admin\db_name\pfile\init.ora
指明控制文件的参数:
control_files = ('file1', 'file2', 'file3')
例:
control_files = ( "D:\Oracle\oradata\ora54\control01.ctl",
"D:\Oracle\oradata\ora54\control02.ctl",
"D:\Oracle\oradata\ora54\control03.ctl")
(3) 查询控制文件名及路径:
SQL> select * from v$controlfile;
control_files = ('file1', 'file2', 'file3')
例:
control_files = ( "D:\Oracle\oradata\ora54\control01.ctl",
"D:\Oracle\oradata\ora54\control02.ctl",
"D:\Oracle\oradata\ora54\control03.ctl")
(3) 查询控制文件名及路径:
SQL> select * from v$controlfile;
(4) 控制文控镜像方法:
A. 关闭数据库
B. 复制控制文件到目标路径
C. 修改参数文件control_files,包含新的控制文件
D. 重启数据库
A. 关闭数据库
B. 复制控制文件到目标路径
C. 修改参数文件control_files,包含新的控制文件
D. 重启数据库
[DBA的图形界面管理工具:DBA Studio]
启动DBA Studio, 选择“登录到Management Server”:
登录用户:sysman, 密码:oem_temp(默认,登录成功后要求修改)
启动DBA Studio, 选择“登录到Management Server”:
登录用户:sysman, 密码:oem_temp(默认,登录成功后要求修改)
在登录之前,要求Management Server服务已经启动,同时已经在系统控制台Console中搜索并增加(配置)了Management Server要管理的数据库。
二、逻辑结构:
数据库的逻辑结构包括:
。表空间(Tablespaces)
。段(Segments)
。区(Extents)
。数据块(Data Blocks)
数据库的逻辑结构包括:
。表空间(Tablespaces)
。段(Segments)
。区(Extents)
。数据块(Data Blocks)
数据块->区->段->表空间->(逻辑)数据库
(1) 表空间://对应四种不同的段类型,Oracle有四种对应的表空间
。数据表空间
。索引表空间: INDX
。临时表空间: TEMP
。回退表空间: RBS
(1) 表空间://对应四种不同的段类型,Oracle有四种对应的表空间
。数据表空间
。索引表空间: INDX
。临时表空间: TEMP
。回退表空间: RBS
(2) 段(Segments)的四种类型:
。数据段:用来存储基表数据
。索引段:存储索引数据
。临时段:用于排序(Order by)、汇总等
。回退段:用于事务回退,rollback语句使用
。数据段:用来存储基表数据
。索引段:存储索引数据
。临时段:用于排序(Order by)、汇总等
。回退段:用于事务回退,rollback语句使用
// 临时段和回退段占的空间固定,不能增大。
// Oracle中最复杂的就是回退段管理。
// 每个段的结构都大致相同,即包含若干个区,每个区的大小又是数据块的整数倍。
// 表空间是Oracle中最大的逻辑结构
// Oracle中最复杂的就是回退段管理。
// 每个段的结构都大致相同,即包含若干个区,每个区的大小又是数据块的整数倍。
// 表空间是Oracle中最大的逻辑结构
1、表空间(Tablespaces):
(1)表空间的特点与作用:
。控制数据库数据磁盘分配
(1)表空间的特点与作用:
。控制数据库数据磁盘分配
。跨越磁盘存储数据
。表空间通过离线(Offline)、在线(online)控制数据可用性。
[A]设置表空间offline、online、read only、read write属性:
SQL> Alter tablespace 表空间名 offline;
SQL> Alter tablespace 表空间名 online; // 正常状态
SQL> Alter tablespace 表空间名 read only;
SQL> Alter tablespace 表空间名 read write; // 正常状态
SQL> Alter tablespace 表空间名 offline;
SQL> Alter tablespace 表空间名 online; // 正常状态
SQL> Alter tablespace 表空间名 read only;
SQL> Alter tablespace 表空间名 read write; // 正常状态
[system表空间不得offline]
[B]查询表空间信息:
SQL> select * from dba_tablespaces;
SQL> select tablespace_name, status from dba_tablespaces;
SQL> select * from dba_tablespaces;
SQL> select tablespace_name, status from dba_tablespaces;
。完成部分数据库的备份与恢复
。表空间通过数据文件来扩大,表空间大小等于构成该表空间的所有数据文件大小之和。
[A] 查询表空间与数据文件之间的关系:
SQL> select tablespace_name, file_name from dba_data_files;
SQL> select tablespace_name, file_name from dba_data_files;
2、段(Segments):
(1) 数据段:存储基表数据的段,由Create table命令产生。用户在创建基表时,则自动在用户缺省表空间中创建一个数据段。
[A]查询用户与用户缺省表空间对应关系:
SQL>select username, default_tablespace from dba_users;
[B] 查询表与所在表空间的对应关系:
SQL> select table_name, tablespace_name from user_tables;
(1) 数据段:存储基表数据的段,由Create table命令产生。用户在创建基表时,则自动在用户缺省表空间中创建一个数据段。
[A]查询用户与用户缺省表空间对应关系:
SQL>select username, default_tablespace from dba_users;
[B] 查询表与所在表空间的对应关系:
SQL> select table_name, tablespace_name from user_tables;
如果一个表有分区,则用上面这个命令无法查询表所使用的表空间,因为表使用了多个表空间。查询方法如下:
SQL> select partition_name, segment_type, tablespace_naem from user_extents
where segment_name = 'EMPLOYEE';
SQL> select partition_name, segment_type, tablespace_naem from user_extents
where segment_name = 'EMPLOYEE';
(2)、索引段:存储索引数据的段,由Create index命令产生。用户在创建索引时,则自动在用户缺省表空间中创建一个索引段。
[A] 索引与所在表空间的对应关系:
SQL> select index_name, tablespace_name from user_indexes;
[A] 索引与所在表空间的对应关系:
SQL> select index_name, tablespace_name from user_indexes;
[B] 使用索引表空间创建索引:
SQL> create index emp_job on emp(job) tablespace indx;
// 如果不加tablespace indx,则索引默认创建在用户缺省表空间中。
SQL> create index emp_job on emp(job) tablespace indx;
// 如果不加tablespace indx,则索引默认创建在用户缺省表空间中。
(3)临时段:用户排序、汇总时临时工作空间。临时段表空间在DBA创建用户时确定。创建用户时未指定临时表空间,则系统自动使用system表空间作为临时表空间使用。临时表空间公用(temp)。
[A] 查询用户及所使用的临时表空间:
SQL> select username, temporary_tablespace from dba_users;
[A] 查询用户及所使用的临时表空间:
SQL> select username, temporary_tablespace from dba_users;
// 建议不要使用system作为用户的临时表空间,因为容易导致碎片。
[B]DBA可以修改用户的临时表空间
SQL> Alter user 用户名 temporary tablespace temp;
SQL> Alter user 用户名 temporary tablespace temp;
(4) 回退段:用于用户在回退事务时使用。回退段由DBA创建,全体用户公用。
[A] 查询回退段及所对应的表空间:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
[A] 查询回退段及所对应的表空间:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
[B]为什么要设回退段?
回退段是数据库的一部分,是Oracle 数据库的一个重要参数,其设计是否正确直接影响到数据库的动态性能。Rollback 段的使用用于保存一个事务的操作,以便在某些情况下回退或取消操作。 每个Oracle数据库都有多个回退段。
回退段是数据库的一部分,是Oracle 数据库的一个重要参数,其设计是否正确直接影响到数据库的动态性能。Rollback 段的使用用于保存一个事务的操作,以便在某些情况下回退或取消操作。 每个Oracle数据库都有多个回退段。
[C] 回退段的作用
。并发操作时,保证数据的读一致性。
。使用 SQL语句rollback回退一个事务的操作。
。事务恢复的需要。
。并发操作时,保证数据的读一致性。
。使用 SQL语句rollback回退一个事务的操作。
。事务恢复的需要。
[D]回退段操作举例
。由于语句错误回退一个事务。
。回退一个事务、或回退事务到一个保存点(SavePoint)。
。由于异常进程中断而回退。
。在例程恢复中回退所有未完成的事务。
。由于语句错误回退一个事务。
。回退一个事务、或回退事务到一个保存点(SavePoint)。
。由于异常进程中断而回退。
。在例程恢复中回退所有未完成的事务。
// delete操作是最消耗回退段的操作
[E]回退段使用原则
。根据事务大小及数量确定回退段。 // 每四个用户至少对应一个回退段
。每个事务必须对应一个回退段。
。一个事务可以根据回退段中“最少使用原则”来自动对应一个回退段。
[C*]只有delete、insert、update三个命令使用回退段
// 回退段可以自动动态扩展,但不能无限扩展。
。根据事务大小及数量确定回退段。 // 每四个用户至少对应一个回退段
。每个事务必须对应一个回退段。
。一个事务可以根据回退段中“最少使用原则”来自动对应一个回退段。
[C*]只有delete、insert、update三个命令使用回退段
// 回退段可以自动动态扩展,但不能无限扩展。
/* 如果回退段都已经被用户占用,那么再增加新用户,则新用户使用所有回退段中磁盘扩展量最小的回退段(与其它用户共 享使用),这就是“最少使用原则”。因此,回退段可以共享。
*/
*/
。在创建数据库后,应为系统创建回退段,事务越多,回退段应越多。
3、区(Extents):区是磁盘空间分配最小单位。每一个区的大小都是数据块的整数倍(用户可以指定,默认是5倍)。
SQL> select segment_type, extent_id, bytes, blocks from user_extents where segment_name = 'EMP';
(1)区大小控制参数(磁盘存储参数):
// 下面这五个参数对磁盘存储有直接影响
Initial:初始区大小
Next: 增长区大小
Minextents:区的最小个数
Maxextents:区的最大个数
Pctincrease:区的增长百分比
(1)区大小控制参数(磁盘存储参数):
// 下面这五个参数对磁盘存储有直接影响
Initial:初始区大小
Next: 增长区大小
Minextents:区的最小个数
Maxextents:区的最大个数
Pctincrease:区的增长百分比
SQL> Create table sales(
s1 char(20),
s2 char(20)
Storage( initial 10K --// 第一个分区的大小
next 10K --// 第二个分区的大小
minextents 1 --// 最少一个分区
maxextents 121 --// 最多121个分区
pctincrease 50); -- // 区的增长比例为50%。
以上语句中的Storage部分,在建表时如果不写是要隐含执行的。
1Block = 2K
第一个分区:Initial = 10K = 1Blocks * 5
第二个分区:Next = 10K
第三个分区= Next + next * 50% = 10K + 5K => 变成blocks的整数倍 = 16K
第四个分区 = 第三个分区 * ( 1 + 50%)
...
s1 char(20),
s2 char(20)
Storage( initial 10K --// 第一个分区的大小
next 10K --// 第二个分区的大小
minextents 1 --// 最少一个分区
maxextents 121 --// 最多121个分区
pctincrease 50); -- // 区的增长比例为50%。
以上语句中的Storage部分,在建表时如果不写是要隐含执行的。
1Block = 2K
第一个分区:Initial = 10K = 1Blocks * 5
第二个分区:Next = 10K
第三个分区= Next + next * 50% = 10K + 5K => 变成blocks的整数倍 = 16K
第四个分区 = 第三个分区 * ( 1 + 50%)
...
例:SQL> Create table sales(s1 char(20), s2 char(20)
Storage(initial 100K next 200K minextents 2 maxextents 121 pctincrease 0);
Storage(initial 100K next 200K minextents 2 maxextents 121 pctincrease 0);
/* 区太小,会导致区的数目太多,进一步导致磁盘碎片的产生。而区太大,则容易浪费空间。因此,要选择合适的分区大小。最好的办法是根据数据量的大小给表只分一个区。*/
估算分区的大小的方法:以上面例子中的表为例:
(1) 1 行 = 40B
(2) 1block = 2048B , 2048B - 2048 * 20% - 标识= 1547
// 2048 * 20% 表示给一个块儿留的剩余空间,标识是用来存储表中每行在块中的位置的信息,其大小可以通过查询V$type_size来获得
(3) 1547 / 40 = A
(4) 假设表中可能有1百万行的数据(最大数据量),则1000000/A*2K = B 兆。
估算分区的大小的方法:以上面例子中的表为例:
(1) 1 行 = 40B
(2) 1block = 2048B , 2048B - 2048 * 20% - 标识= 1547
// 2048 * 20% 表示给一个块儿留的剩余空间,标识是用来存储表中每行在块中的位置的信息,其大小可以通过查询V$type_size来获得
(3) 1547 / 40 = A
(4) 假设表中可能有1百万行的数据(最大数据量),则1000000/A*2K = B 兆。
则 initial 为 B兆, 此时next值不要太大,因为initial区中已经分配了足够的空间,假设是100M,那么可以把Next设置成1M。
(2) 区存储参数可以用于:表空间、表、段(回退段)、索引
(3) 存储参数优先使用原则:
实体级参数> 表空间级对应参数> 系统缺省参数
实体级参数> 表空间级对应参数> 系统缺省参数
实体级参数:指建立实体(如建表)时指定的存储参数
表空间级对应参数:可以从dba_tablespaces数据字典中查询。
表空间级对应参数:可以从dba_tablespaces数据字典中查询。
(4) 查询实体的存储参数:
SQL> select initial_extent, next_extent, min_extents, max_extents, pct_increase
from user_tables
where table_name = 'EMP';
SQL> select initial_extent, next_extent, min_extents, max_extents, pct_increase
from user_tables
where table_name = 'EMP';
[C* 有时SQL*Plus中查询某个字段较多的表时,屏幕宽度不够,而滚动条又不能横向滚动,此时修改环境变量中的arraysize参数,将缓冲区宽度修改一下,默认是1000,可以修改成500,保存设置后即可使用横向滚动条。]
(5)存储参数的修改:
SQL> Alter table emp
Storage (next 200k maxextents 2000 pctincrease 50); -- // 五个参数中只有这3个能够修改
SQL> Alter table emp
Storage (next 200k maxextents 2000 pctincrease 50); -- // 五个参数中只有这3个能够修改
4、数据块(Blocks): 数据文件存储空间单位,I/O最小单位。数据块大小由参数db_block_size决定,数据库创建后不得修改。
(1)查询数据块大小:
SQL> select value from v$parameter where name = 'db_block_size';
(1)查询数据块大小:
SQL> select value from v$parameter where name = 'db_block_size';
[2002.05.13]
//=====================================================================================================================
三、内存结构:
1、系统全局区SGA(System Glbal Area):共享的系统内存区域。SGA由三部分组成:数据缓冲区、日志缓冲区、共享池。
(1) 数据缓冲区(Database Buffer Cache): 存储由磁盘数据文件读入的数据,所有用户共享。数据缓冲区大小由参数db_block_buffers确定。
。数据缓冲区大小:db_block_buffers * db_block_size
。参数文件位置:
Windows NT: D:\oracle\admin\db_name\pfile\init.ora
UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora
// Dirty: 数据被修改而未写盘。Pinned: 未修改的数据
。LRU( Least Recently Used): 最近最少使用原则
(2) 日志缓冲区(Log Buffer Cache): 存储数据库修改信息,由LGWR将日志缓冲区数据写入磁盘日志文件组。
。大小由参数log_buffer确定
(3) 共享池(Shared Pool): SQL 缓冲区及数据字典区。对于SQL、PL/SQL程序进行语法分析、编译的内存区域。
。大小由参数SHARED_POOL_SIZE来确定。(在参数文件中,单位为字节)
。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)
。
[C*] SQL 语句执行计划:
Rule_Based: 基于规则,只考虑语句运行效率,不考虑成本。
Cost_Based: 基于成本,考虑代价,硬件资源占用小。
。SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size
//=====================================================================================================================
三、内存结构:
1、系统全局区SGA(System Glbal Area):共享的系统内存区域。SGA由三部分组成:数据缓冲区、日志缓冲区、共享池。
(1) 数据缓冲区(Database Buffer Cache): 存储由磁盘数据文件读入的数据,所有用户共享。数据缓冲区大小由参数db_block_buffers确定。
。数据缓冲区大小:db_block_buffers * db_block_size
。参数文件位置:
Windows NT: D:\oracle\admin\db_name\pfile\init.ora
UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora
// Dirty: 数据被修改而未写盘。Pinned: 未修改的数据
。LRU( Least Recently Used): 最近最少使用原则
(2) 日志缓冲区(Log Buffer Cache): 存储数据库修改信息,由LGWR将日志缓冲区数据写入磁盘日志文件组。
。大小由参数log_buffer确定
(3) 共享池(Shared Pool): SQL 缓冲区及数据字典区。对于SQL、PL/SQL程序进行语法分析、编译的内存区域。
。大小由参数SHARED_POOL_SIZE来确定。(在参数文件中,单位为字节)
。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)
。
[C*] SQL 语句执行计划:
Rule_Based: 基于规则,只考虑语句运行效率,不考虑成本。
Cost_Based: 基于成本,考虑代价,硬件资源占用小。
。SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size
[在实用情况中,SGA当然是越大越好,但最大不要超过系统可用内存的55%~57%。]
。查询SGA及数据参数取值:
SVRMGR> show sga
SVRMGR> show parameter
SVRMGR> show parameter db
SVRMGR> show parameter log
SVRMGR> show parameter 参数名称
SVRMGR> show sga
SVRMGR> show parameter
SVRMGR> show parameter db
SVRMGR> show parameter log
SVRMGR> show parameter 参数名称
SQL> select * from v$sga;
SQL>select * from v$sgastat;
SQL>select * from v$sgastat;
查询数据库名称:SQL> select name from v$database;
查询数据库实例名称:SQL> select instance_name from v$instance;
查询数据库实例名称:SQL> select instance_name from v$instance;
2、程序全局区PGA(Pragram Global Area): 非共享区域,主要是用户编程时变量、数组工作区域。
3、排序区SORT AREA:用户使用order by排序、汇总时临时工作区域。排序区大小由参数SORT_AREA_SIZE确定。
4、大区(Large Pool): 使用于数据备份工具Rman, 只用在Oracle8以上的版本数据库,大区的大小由参数:Large_Pool_size确定。
5、Java语言区(Java Pool): 用于Oracle 8i、Oracle9i中的Java语言。Java区的大小由参数Java_Pool_Size确定。
四、Oracle 实例的进程结构:
1、什么是Oracle实例?
数据库启动时,系统分配SGA内存区域,同时启动后台进程,该SGA与后台进程合称为一个Oracle实例(Instance)。
Instance ==> SGA + Background Processes
1、什么是Oracle实例?
数据库启动时,系统分配SGA内存区域,同时启动后台进程,该SGA与后台进程合称为一个Oracle实例(Instance)。
Instance ==> SGA + Background Processes
数据库与实例相联系,有一个数据库就有一个实例。实例名用参数instance_name表示,数据库名用参数db_name表示。
。数据库实例名:
instance_name (Oracle参数)
ORACLE_SID(操作系统环境变量)
在Unix系统中选择数据库实例:
$ORACLE_SID=ora8i
$export ORACLE_SID
存取另一个数据库时:
$ ORACLE_SID=ora835
$ export ORACLE_SID
$ svrmgrl
在Windows NT/2000中选择数据库实例:
c:\> set ORACLE_SID=ora8i
C:\> svrmgrl
C:\> set ORACLE_SID=ora835
C:\> svrmgrl
[*] 在Windows NT/2000中,数据库实例名定义在注册表中。
2、Oracle实例的进程结构:
Oracle进程:单进程
多进程==> 用户进程、服务器进程、后台进程。
Dnnn(Dispatcher): 调度进程
ARCH:归档进程
PMON: 进程监控
SMON: 系统监控
CKPT: checkpoint
RECO: Recovery
[*] 进程数量的限制参数:Processes,Oracle数据库进程数Processes < Unix 操作系统核心参数SEMMNS(这个参数指定Unix的最大进程数)。
// 查询后台进程及说明
SQL> select name, description from v$bgprocess;
(1) 用户与服务器进程
。用户进程(User Precess)在用户运行应用程序时自动产生。
instance_name (Oracle参数)
ORACLE_SID(操作系统环境变量)
在Unix系统中选择数据库实例:
$ORACLE_SID=ora8i
$export ORACLE_SID
存取另一个数据库时:
$ ORACLE_SID=ora835
$ export ORACLE_SID
$ svrmgrl
在Windows NT/2000中选择数据库实例:
c:\> set ORACLE_SID=ora8i
C:\> svrmgrl
C:\> set ORACLE_SID=ora835
C:\> svrmgrl
[*] 在Windows NT/2000中,数据库实例名定义在注册表中。
2、Oracle实例的进程结构:
Oracle进程:单进程
多进程==> 用户进程、服务器进程、后台进程。
Dnnn(Dispatcher): 调度进程
ARCH:归档进程
PMON: 进程监控
SMON: 系统监控
CKPT: checkpoint
RECO: Recovery
[*] 进程数量的限制参数:Processes,Oracle数据库进程数Processes < Unix 操作系统核心参数SEMMNS(这个参数指定Unix的最大进程数)。
// 查询后台进程及说明
SQL> select name, description from v$bgprocess;
(1) 用户与服务器进程
。用户进程(User Precess)在用户运行应用程序时自动产生。
[*] 数据存取方法:
a. 用户发出查询命令,产生user进程,server进程查找内存。
b. server 进程在内存没有找到数据时,则server进程从数据文件中读数据,则server进程在LRU找空闲块。
c. 将LRU中的dirty块--> Dirty List
d. Dirty List超长(threshold), 通知DBWR刷新缓冲区。
e. 从磁盘读数据进入空闲内存。
a. 用户发出查询命令,产生user进程,server进程查找内存。
b. server 进程在内存没有找到数据时,则server进程从数据文件中读数据,则server进程在LRU找空闲块。
c. 将LRU中的dirty块--> Dirty List
d. Dirty List超长(threshold), 通知DBWR刷新缓冲区。
e. 从磁盘读数据进入空闲内存。
(2) 后台进程:
[A]DBWR:数据写入进程。该进程将数据缓冲区数据写入磁盘数据文件,是进行数据缓冲区管理的后台进程。
设置DBWR进程数量参数:DB_WRITE_PROCESSES=1-10
进程名称依次为:DBW0, DBW1, ... DBW9
[B]LGWR:日志写入进程。将日志缓冲区日志信息写入磁盘日志文件组,在日志切换时,再将日志信息由归档进程ARCH写入磁盘或磁带,产生归档日志。一个数据库只有一个LGWR日志写入进程。
[C]PMON(Process Monitor): 进程监控。在用户进程中断时,负责清理该用户所占用的硬件资源。
[D]SMON(System Monitor):系统监控。负责清理用户不再使用的临时段。
[E]ARCH:归档进程。该进程在日志切换时,负责将日志信息写到指定的磁盘存储目录,产生归档日志,是与数据库备份有关的一个后台进程。在缺少状态下该进程不存在(因为oracle默认安装状态为下日志为非归档方式)。
[*] 与ARCH有关的数据库参数:
。启动归档进程参数:log_archive_start=true (缺省为false)
。确定归档日志文件磁盘存储目录:log_archive_dest=目录名
log_archive_dest=/home/oracle/archive
log_archive_dest=d:\oracle\archive
。确定归档文件存储格式:log_archive_format=%t.%s.arc
/* %t:表示线程号 %s:表示日志序列号,这样文件不会同名。可以不要%t, 扩展名自己给,也可以不要扩展名。如%s.log。如果写成%S(大写的S),则文件名前面加零对齐。如123.log 会变成00123.log这种形式。*/
。确定归档日志文件镜象目录:
log_archive_duplex_dest=镜像目录名 (Oracle8以上)
log_archive_duplex_dest=/home1/oracle/archive
。Oracle8i启用新的日志文件存储目录:
log_archive_dest_n = 'Location=目录名'(Oracle8i以上) n<=5 // 在oracle9i,n <= 10
log_archive_dest_1 = 'location=/home1/oracle/archive'
log_archive_dest_2 = 'location=/home2/oracle/archive'
...
log_archive_dest_5 = 'location=/home5/oracle/archive'
[注意:]归档日志存储目录要么为2个,即使用dest and duplex_dest这种方式,要么为5个,即使用dest_n这种方式,两种方式不能混用。
。失效参数(Oracle8i):
log_archive_dest_state_n=DEFER(失效)
log_archive_dest_state_n=ENABLE(生效)
//使相应目录失效:log_archive_dest_state_1 = DEFER
[*]也可以在线设置失效:SQL> alter system set log_archive_dest_state_1=defer;
。启动多个归档进程参数:log_archive_max_processes = 1~10 //要启动几个就写几
归档进程名称依次为:ARCH0, ARCH1, ... ARCH9
// 以上参数查询请在svrmgrl中使用:show parameter log
[SVRMGR> shutdown abort 是比shutdown immediate更有效的关闭数据库的命令]
[F] CKPT:检验点(Checkpoint)进程,用来同步各个数据文件。Checkpoint_Change#。
a. checkpoint产生的六个条件[参考PowerPiont教程:dba_结构.ppt P61]。
// DBA强制产生检验点:SQL> alter system checkpoint;
b. 检验点的几个参数
/* SVRMGR> show parameter checkpoint
NAME TYPE VALUE
----------------------------------- ------- ------------------------------
log_checkpoint_interval ?? 10000
log_checkpoint_timeout ?? 1800
log_checkpoints_to_alert ??? FALSE
*/
[A]DBWR:数据写入进程。该进程将数据缓冲区数据写入磁盘数据文件,是进行数据缓冲区管理的后台进程。
设置DBWR进程数量参数:DB_WRITE_PROCESSES=1-10
进程名称依次为:DBW0, DBW1, ... DBW9
[B]LGWR:日志写入进程。将日志缓冲区日志信息写入磁盘日志文件组,在日志切换时,再将日志信息由归档进程ARCH写入磁盘或磁带,产生归档日志。一个数据库只有一个LGWR日志写入进程。
[C]PMON(Process Monitor): 进程监控。在用户进程中断时,负责清理该用户所占用的硬件资源。
[D]SMON(System Monitor):系统监控。负责清理用户不再使用的临时段。
[E]ARCH:归档进程。该进程在日志切换时,负责将日志信息写到指定的磁盘存储目录,产生归档日志,是与数据库备份有关的一个后台进程。在缺少状态下该进程不存在(因为oracle默认安装状态为下日志为非归档方式)。
[*] 与ARCH有关的数据库参数:
。启动归档进程参数:log_archive_start=true (缺省为false)
。确定归档日志文件磁盘存储目录:log_archive_dest=目录名
log_archive_dest=/home/oracle/archive
log_archive_dest=d:\oracle\archive
。确定归档文件存储格式:log_archive_format=%t.%s.arc
/* %t:表示线程号 %s:表示日志序列号,这样文件不会同名。可以不要%t, 扩展名自己给,也可以不要扩展名。如%s.log。如果写成%S(大写的S),则文件名前面加零对齐。如123.log 会变成00123.log这种形式。*/
。确定归档日志文件镜象目录:
log_archive_duplex_dest=镜像目录名 (Oracle8以上)
log_archive_duplex_dest=/home1/oracle/archive
。Oracle8i启用新的日志文件存储目录:
log_archive_dest_n = 'Location=目录名'(Oracle8i以上) n<=5 // 在oracle9i,n <= 10
log_archive_dest_1 = 'location=/home1/oracle/archive'
log_archive_dest_2 = 'location=/home2/oracle/archive'
...
log_archive_dest_5 = 'location=/home5/oracle/archive'
[注意:]归档日志存储目录要么为2个,即使用dest and duplex_dest这种方式,要么为5个,即使用dest_n这种方式,两种方式不能混用。
。失效参数(Oracle8i):
log_archive_dest_state_n=DEFER(失效)
log_archive_dest_state_n=ENABLE(生效)
//使相应目录失效:log_archive_dest_state_1 = DEFER
[*]也可以在线设置失效:SQL> alter system set log_archive_dest_state_1=defer;
。启动多个归档进程参数:log_archive_max_processes = 1~10 //要启动几个就写几
归档进程名称依次为:ARCH0, ARCH1, ... ARCH9
// 以上参数查询请在svrmgrl中使用:show parameter log
[SVRMGR> shutdown abort 是比shutdown immediate更有效的关闭数据库的命令]
[F] CKPT:检验点(Checkpoint)进程,用来同步各个数据文件。Checkpoint_Change#。
a. checkpoint产生的六个条件[参考PowerPiont教程:dba_结构.ppt P61]。
// DBA强制产生检验点:SQL> alter system checkpoint;
b. 检验点的几个参数
/* SVRMGR> show parameter checkpoint
NAME TYPE VALUE
----------------------------------- ------- ------------------------------
log_checkpoint_interval ?? 10000
log_checkpoint_timeout ?? 1800
log_checkpoints_to_alert ??? FALSE
*/
五、Oracle连接配置结构
3、多线程服务器体系结构MTS(Multithreaded Server)
SVRMGR> show parameter mts;
转载于:https://blog.51cto.com/dusong/139189