一:Oracle的概述
什么是Oracle
Oracle数据库是Oracle(中文名称叫甲骨文)公司的核心产品,Oracle数据库是一个适合于大中型企业的数据库管理系统。在所有的数据库管理系统中(比如:微软的SQL Server,IBM的DB2等),Oracle的主要用户涉及面非常广,包括:银行、电信、移动通信、航空、保险、金融、电子商务和跨国公司等。Oracle产品是免费的,可以在Oracle官方网站上下载到安装包,另一方面Oracle服务是收费的。
Oracle的特点
-- 方便地从一种计算机配置移至另一种计算机配置上。
-- 支持大数据库、多用户的高性能的事务处理。
-- ORACLE遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。
-- 实施安全性控制和完整性控制。
-- 支持分布式数据库和分布处理。
Oralce的体系结构
Oracle体系结构决定了数据库如何 使用内存、 硬盘、cpu 和 网络
Oracle Server 包括: One Oracle Instance / Several Oracle Database Files......
Oracle 数据库结构
Oracle 数据库结构 包括:物理(Physical)结构,逻辑(Logical)结构
物理结构(Physical Structure)即 数据元素 在计算机中储存的 方法,又称计算机对数据的理解;Physical Structure 指数据库中的 操作系统文件的 集合,包含以下三种文件:
数据文件(data file)
一个数据库中至少包含一个数据文件。-------------------------database 与 data files 关系
数据文件的特性有:
1: 一个数据文件只能被一个数据库使用,但是一个数据库至少包含一个数据文件(data files)。
2:数据文件(Data File)具有自动扩展的特性,数据库空间不足时,呈现此功能。
3:一个或者多个数据文件(Data File)构成数据库的逻辑存储单元叫做表空间(tablespace).
Redo logs(重作日志) :包含对数据库的修改记录,可以在数据失败后恢复。 一个数据需要至少两个重作日志文件(Redo logs)。
Control files (控制文件) :包含维护和检验数据库一致性的信息。例如:控制文件用来检验数据文件(Data File)和重作日志文件(ReDo Logs)。一个数据库至少需要一个控制文件。
Parameter File(参数文件):定义 Oracle Instance 的 特征;它包含SGA 内存的大小。
PassWords File(口令验证文件):用来Verify & Seton 和Close Oracle Instance的用户;
Arichive log Files (存档重做日志文件)是重做日志的备份用以恢复数据;
Logical Structure(逻辑结构)
逻辑结构(在计算机语言中的映射),数据元素之间的逻辑关系,即:人对数据的理解,进而抽象的模型。它包括:tablespaces,segments,extends,data blocks.Oracle server 可以有条理的通过表空间以及段、区间、数据块控制磁盘空间。
Tablespaces(表空间):Oracle Server 中的 数据 存储在 Tablespaces中:
-- 一个Oracle 数据库 能够 在逻辑上 分成 更小的逻辑区域 被称为 Tablespaces;
-- 一个Tablespace 只能同时属于 一个database(数据库);
-- 每一个Tablespace 包含 一个或多个 操作系统文件(Data files);
-- 一个Tablespace 可能包含 一个或多个 segments;
-- Tablespace 可以在 数据库(database)运行时 在线(online);
-- 除了SYSTEM tablespace 或 有活动回滚段的 tablespace ,tablespaces 可以被离线(offline);
-- Tablespaces 可以在读/写之间切换;
Data Files(数据文件)
Oracle数据库 tablespace包含的 一个或多个文件叫做 数据文件(data files)。这些物理结构在oracle服务运行时与操作系统相配合。
-- 一个数据文件只能属于一个tablespace
-- Oracle 服务为 表空间(Tablespace)创建一个数据文件(data file),分配指定的磁盘空间再加上额外的一小部分开销...
-- 数据库管理员在数据文件(data files)创建后可以改变它的大小或者设置为根据需要自动增长;
Segments(段)
Segments 是指 在Tablespace中 特定的逻辑储存结构分配空间;例如, 为表分配的所有存储空间就是就是一个segment...
-- 一个tablespace 可能包含一个或多个 segments;
-- Segments 不能跨越 tablespace,但是, 一个 segment 可以 跨越多个属于同一 Tablespace 的 data files 。
-- 每一个Segment 是由 一个或多个extends 构成;
Extends(间)
-- 通过extends 给 Segments 分配空间
--一个或对个extends组成一个segment
--一个segment创建时,至少包含一个extend
--当segment 增长时,extends被加到segment
--DBA 可以手工为segment 增加 extends
--一个 extend 由一系列的Oracle blocks组成
一个extend不能跨越 datafile 但必须存放在data file中。
数据块(data blocks)
Oracle Server 管理data file 存储空间的单位叫做 Oracle blocks or data blocks
Oracle 数据库最小的存储数据单位为 data blocks
Oracle data blocks 是 Oralce server存储 读 写的最小的存储单位
一个data block对应一个或分配给 data file的操作系统块
在Oracle数据库创建时,初始参数文件 db_block_size 确定 Oracle数据库 data block的大小
Data Block的大小应该为操作系统块得整数倍,以减少I/O量
Data Block的最大尺寸依赖于操作系统
Instance(实例)
实例= 内存分配 + 一组后台进程
如果把Oracle比作一部汽车,instance 相当于汽车的发动机一样,启动oracle前提应该先启动instance.内存被分配了,进程才能被启动。
Oracle Instance包含SGA内存结构和管理数据库的一些后台进程。Instance被看成使用各个操作系统的特定方法 instance 只能同时打开和使用一个Database。
System Global Area (SGA 系统全局区)
SGA是存储数据库进程共享的数据库信息的内存区域。它包含Oracle Server数据和控制信息。分配在Oracle Server驻留在计算机虚拟内存中。SAG包含如下内存结构:
共享池(shared pool)用来存储最近执行的SQL语句和最近使用的数据字典(data dictionary)的数据。这些SQL语句可能是被用户递交的也可能是存储过程调用。
数据缓冲区(database buffer cache)用来存储最近从数据文件中读写过的数据。
重作日志缓冲区(redo log buffer)用来记录服务或后台进程对数据库的操作。
另外在SGA中还有两个可选的内存结构:
java pool 用来存储java代码
Large pool 用来存储与SQL直接相关的大型数据结构。例如:在备份和恢复是的数据拷贝。
background Processes(后台进程)
Database Writer(DBWO)负责将数据的更改由 database buffer cache 写到data files.
Log Writer(LGWR)负责将数据更改由redo log buffer 写到 redo log files
System Monitor(SMON)检查数据库的一致性,必要的情况下,在数据库打开时执行恢复
Process Monitor(PMON)用户进程失败时,进程监控程序实现进程恢复。
The checkpoint Process(CKPT)负责更新数据库的控制文件(Control files)中的状态信息。在数据缓存永久写入数据库中。
PGA(程序全局区)
PGA是内存中的区域,包含单个进程的数据和控制信息。每个服务器进程分配一个PGA,PGA由灭个服务器进程独占。当用户连接入Oracle数据库并建立会话时,Oracle分配PGA. 与SGA不同,PGA仅被一个程序使用。
Data Dictionary(数据词典)
什么是数据字典
数据字典是Oracle数据库的重要组成,是数据库中所有对象及其关系的信息集合。它由一组只读表组成。它包括:
• 数据库所有对象的定义(表,视图,索引,簇,同义词,序列 ,过程,函数,程序包,触发器)
• 空间的分配和使用状况
• 列的缺省值
• 完整性约束信息
• 用户的名字
• 已授予用户的角色和权限
• 用户访问或使用的审计信息等
数据字典的作用
数据字典最重要的作用是作为分析阶段的工具。任何字典最重要的用途都是供人查询对不了解的条目的解释,在结构化分析中,数据字典的作用是给数据流图上每个成分加以定义和说明。换句话说,数据流图上所有的成分的定义和解释的文字集合就是数据字典,而且在数据字典中建立的一组严密一致的定义很有助于改进分析员和用户的通信。
2.3数据字典结构
– 基表
• 存放相关数据库信息的基础表
– 视图
• 汇总并显示存放数据字典基表中信息的视图
2.4数据字典所有者
– Oracle的sys用户拥有数据字典所有的基表和视图。任何Oracle用户都不能改变数据字典的任何数据。不能更新、插入、 删除。数据字典的改变会影响数据库的正常运行。
– 系统管理员需要严格管理系统用户.(sys and system)
3数据库和实例的启动和关闭
一个ORACLE数据库没有必要对所有用户总是可用,数据库管理员可启动数据库,以致它被打开。在数据库打开情况下,用户可存取数据库中的信息。当数据库不使用时,DBA可关闭它,关闭后的数据库,用户不能存取其信息。
数据库的启动和关闭是非常重要的管理功能,通过以INTERNAL连接到ORACLE的能力来保护。以INTERNAL 连接到ORACLE需要有下列先决条件:
该用户的操作系统账号具有使用INTERNAL连接的操作系统特权。
对INTERNAL数据库有一口令,该用户知道其口令。
另外:当用户以INTERNAL连接时,可连接到专用服务器,而且是安全连接。
3.1数据库启动
启动数据库并使它可用有三步操作:
启动一个实例;
装配数据库
打开数据库
1) 启动一个实例
启动一实例的处理包含分配一个SGA(数据库信息使用的内存共享区)和后台进程的建立。实例起动的执行先于该实例装配一数据库。如果仅启动实例,则没有数据库与内存储结构和进程相联系。
2) 装配一数据库
装配数据库是将一数据库与已启动的实例相联。当实例安装一数据库之后,该数据库保持关闭,仅DBA可存取。
3) 打开一数据库
打开一数据库是使数据库可以进行正常数据库操作的处理。当一数据库打开所有用户可连接到该数据库用存取其信息。在数据库打开时,在线数据文件和在线日志文件也被打开。如果一表空间在上一次数据库关闭时为离线,在数据库再次打开时,该表空间与它所相联的数据文件还是离线的。
3.2数据库和实例的关闭
关闭一实例以及它所连接的数据库也有三步操作:
1) 关闭数据库
数据库停止的第一步是关闭数据库。当数据库关闭后,所有在SGA中的数据库数据和恢复数据相应地写入到数据文件和日志文件。在这操作之后,所有联机数据文件和联机的日志文件也被关闭,任何离线表空间中数据文件夹是已关闭的。在数据库关闭后但还安装时,控制文件仍保持打开。
2) 卸下数据库
停止数据库的第二步是从实例卸下数据库。在数据库卸下后,在计算机内存中仅保留实例。在数据库卸下后,数据库的控制文件也被关闭。
3) 停止实例
停止数据库的最后一步是停止实例。当实例停止后,SAG是从内存中撤消,后台进程被中止。
3.3初始化参数文件
在启动一个实例时,ORACLE必须读入一初始化参数文件(initialization parameter file),该参数文件是一个文本文件,包含有实例配置参数。这些参数置成特殊值,用于初始ORACLE实例的许多内存和进程设置,该参数文件包含:
一个实例所启动的数据库名字;
在SGA中存储结构使用多少内存;
在填满在线日志文件后作什么;
数据库控制文件的名字和位置;
在数据库中专用回滚段的名字。
Oracle导入、导出
Oracle的备份是Oracle操作中常见的工作,常见的备份方案有:逻辑备份(IMP&EXP命令进行备份)、物理文件备份(脱机及联机备份)、利用RMAN(Recovery Manager)的增量物理文件系统备份。ORACLE数据库的逻辑备份分为四种模式:表空间备份(tablespace)、表备份(table)、用户备份(user)和完全备份(full)。Oracle的逻辑备份是使用IMP&EXP命令进行数据导入导出的操作。使用EXP命令导出或者使用IMP命令导入时,需要Create Session系统权限,但是如果要导出其他的表,必须拥有权限:EXP_FULL_DATABASE。
调用导入导出命令时,首先要估计所需的空间。EXP命令导出的文件是二进制文件(*.dmp)只能由对应的IMP命令进行读取恢复。导入导出的用途是:
备份与恢复
Oracle平台更换:可以在相同版本之间进行备份与恢复,Oracle较低版本的export数据文件可以import到高版本的Oracle数据库中,但是Oracle的版本只能是相邻的,不能垮版本。
EXP导出数据
EXP命令可以在交互环境下导出数据库中的数据,也可以在非交互环境下执行命令。交互环境下的命令执行,是一步一步执行的过程。
代码演示:exp的交互环境
参数名 | 说明 |
USERID | 表示“用户名/密码”。 |
BUFFER | 数据缓冲区大小。以字节为单位,一般在64000以上。 |
FILE | 指定输出文件的路径和文件名。一般以.dmp为后缀名,注意该文件包括完整路径,但是路径必须存在,导出命令不能自动创建路径。 |
COMPRESS | 是否压缩导出,默认yes。 |
GRANTS | 是否导出权限,默认yes |
INDEXES | 是否导出索引,默认yes |
DIRECT | 是否直接导出,默认情况,数据先经过Oracle的数据缓冲区,然后再导出数据 |
LOG | 指定导出命令的日志所在的日志文件的位置。 |
ROWS | 是否导出数据行,默认导出所有数据。 |
CONSTRAINTS | 是否导出表的约束条件,默认yes |
PARFILE | 可以把各种参数配置为一个文本键值形式的文件,该参数可以指定参数文件的位置。 |
TRIGGERS | 是否导出触发器,默认值是yes。 |
TABLES | 表的名称列表,导出多个表可以使用逗号隔开。 |
TABLESPACES | 导出某一个表空间的数据 |
Owner | 导出某一用户的数据。 |
Full | 导出数据库的所有数据。默认值是no。 |
QUERY | 把查询的结果导出。 |
代码演示:exp的交互环境
D:\>exp scott/tiger@my_orcl ①
Export: Release 10.2.0.3.0 - Production on 星期一 10月 19 17:04:14 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
输入数组提取缓冲区大小: 4096 > ②
导出文件: EXPDAT.DMP > scott.dmp ③
(2)U(用户), 或 (3)T(表): (2)U > 2 ④
导出权限 (yes/no): yes > yes ⑤
导出表数据 (yes/no): yes > yes ⑥
压缩区 (yes/no): yes > no ⑦
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
. 正在导出 pre-schema 过程对象和操作
. 正在导出用户 SCOTT 的外部函数库名
. 导出 PUBLIC 类型同义词
. 正在导出专用类型同义词
. 正在导出用户 SCOTT 的对象类型定义
即将导出 SCOTT 的对象...
. 正在导出数据库链接
. 正在导出序号
. 正在导出簇定义
. 即将导出 SCOTT 的表通过常规路径...
. . 正在导出表 BONUS导出了 0 行
. . 正在导出表 DEPT导出了 10 行
. . 正在导出表 EMP导出了 14 行
. . 正在导出表 SALGRADE导出了 5 行
. . 正在导出表 TBLSTUDENT导出了 3 行
. 正在导出同义词
. 正在导出视图
. 正在导出存储过程
. 正在导出运算符
. 正在导出引用完整性约束条件
. 正在导出触发器
. 正在导出索引类型
. 正在导出位图, 功能性索引和可扩展索引
. 正在导出后期表活动
. 正在导出实体化视图
. 正在导出快照日志
. 正在导出作业队列
. 正在导出刷新组和子组
. 正在导出维
. 正在导出 post-schema 过程对象和操作
. 正在导出统计信息
成功终止导出, 没有出现警告。
D:\>
代码解析:
① Exp是导出命令,该命令后面紧跟“用户名/密码@服务器网络连接”。
② Exp程序导出时使用的缓冲区大小,缓冲区越大,导出速度越快。直接回车代表使用默认值4096B。
③ Exp命令会把所有要到处的数据导出到一个Dmp文件中,该步骤是Exp询问导出的数据文件名称。
④ Exp程序询问导出整个用户还是导出某个表。默认导出整个用户。
⑤ Exp程序询问是否导出每张表的访问权限。默认导出访问权限。
⑥ Exp程序询问是否导出表中的数据。默认导出数据库表中的数据。
⑦ Oracle表中的数据可能来自不同的分区中的数据块,默认导出时会把所有的数据压缩在一个数据块上,IMP导入时,如果不存在连续一个大数据块,则会导入失败。
也可以使用Exp命令时,设置各种参数,使准备就绪的Exp命令不需要与用户交互,按照参数的要求,Exp命令会一次性执行导出工作。要指定参数,您可以使用关键字:
EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
代码演示:exp的非交互环境
D:\>exp scott/tiger file=employee.dmp tables=(emp,dept)
Export: Release 10.2.0.3.0 - Production on 星期一 10月 19 17:38:25 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表 EMP导出了 14 行
. . 正在导出表 DEPT导出了 10 行
成功终止导出, 没有出现警告。
D:\>
2IMP导入
IMP程序导入就是把Exp导出的文件重新导入到数据库的过程。导入时也有一些重要的参数:
Fromuser:指出导出时dmp文件中记载的用户信息。
Touser:dmp文件要导入到什么目标用户中。
Commit:默认是N,在缓冲区满时是否需要commit,如果设为N,需要较大的回滚段。
Igore: Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据ignore参数的设置来决定如何操作。若ignore=y,Oracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到表中。若ignore=n,Oracle不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。
代码演示:Imp导入
D:\>imp system/manager file=employee.dmp fromuser=scott touser=employee commit=y
Import: Release 10.2.0.3.0 - Production on 星期一 10月 19 17:54:51 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
警告: 这些对象由 SCOTT 导出, 而不是当前用户
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SCOTT 的对象导入到 EMPLOYEE
. . 正在导入表 "EMP"导入了 14 行
. . 正在导入表 "DEPT"导入了 10 行
即将启用约束条件...
成功终止导入, 没有出现警告。
D:\>
7.3常见问题
数据库对象已经存在
一般情况, 导入数据前应该彻底删除目标数据下的表,序列,函数/过程,触发器等。
数据库对象已经存在, 按缺省的imp参数,则会导入失败。
如果用了参数ignore=y,会把exp文件内的数据内容导入。
如果表有唯一关键字的约束条件,不合条件将不被导入。
如果表没有唯一关键字的约束条件,将引起记录重复。
数据库对象有主外键约束
不符合主外键约束时,数据会导入失败。
解决办法: 先导入主表,再导入依存表。
disable目标导入对象的主外键约束,导入数据后,再enable它们。
权限不够
如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限。
导入大表( 大于80M ) 时,存储分配失败
默认的EXP时,compress = Y,也就是把所有的数据压缩在一个数据块上。
导入时,如果不存在连续一个大数据块,则会导入失败。
导出80M以上的大表时,记得compress= N,则不会引起这种错误。
mp和Exp使用的字符集不同
如果字符集不同,导入会失败,可以改变unix环境变量或者NT注册表里NLS_LANG相关信息。
Imp和Exp版本不能往上兼容
Imp可以成功导入低版本Exp生成的文件, 不能导入高版本Exp生成的文件根据情况我们可以用。