一、Oracle目录结构详解:

oracle体系结构
- 数据库实例:用来访问和使用数据库的一块进程,只存在于内存中,和java中new出来的实例对象差不多,一个数据库可以有N个实例。
- 表空间:通过表空间存储物理表,一个数据库实例存储N个表空间,一个表空间存储N个表,可以有N个数据文件;
- 数据文件:数据文件是数据库的物理存储单位,数据库的数据是存储在表空间中的,真正是在某一个或多个数据文件中,而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间,一旦数据文件被加入到某个表空间后,就不能直接删除这个数据文件,要删除它,只能删除它所属的表空间。

- 用户:Oracle创建好之后,如果想要在数据库中建表,必须先给数据库创建用户,并为用户指定表空间

dbf文件用来存储数据库中的实际数据、索引以及其他对象的二进制文件
二、Oracle基础维护:
启动:
- startup nomount 仅启动instances
- startup mount 启动instances,连上mount数据库
- startup normal 启动instances,连上mount数据库(推荐)缺省参数就是normal
listener:
- Isnrctl start
- Isnrctl stop
关闭数据库:
- sql> shutdown 和启动一样,并且缺省也是normal
三、数据库备份:
1、冷备:关闭数据库,将datafile、controlfile、redolog、archived redolog、initora.ora等全部备份,需要恢复时将文件放回目录即可。
2、逻辑备份:
- EXP
- 完全:exp wootest/woo22 buffer=64000 file=/backup/full.dmp full=y (导出整个库的内容,前提登录用户需要有权限)
buffer=64000指定导出操作中使用的内部缓冲区大小,这里是一个导出性能可调整点
full -y表示导出完全备份
- 用户模式:exp wootest/woo22 buffer=64000 file=/back/wootest01.dmp owner=wootest
备份用户woo的所有对象到/back/wootest.dmp文件中
- 表模式:exp wootest/woo22 buffer=64000 file=/back/score.dmp owner=wootes tables=score
备份用户wootest的表score
- IMP
- 完全:imp wootest/woo22 buffer=64000 file=/back/full.dmp full=y (完全导入需要有角色IMP_FULL_DATABASE)
b、用户模式:imp wootest/woo22 buffer=64000 file=/back/wootest.dmp fromuser=wootest touser=wootestbak
备份wootest的所有对象到/back/wootest.dmp到用户woo22中,必须指定fromuser、touser参数
c、表模式:imp wootest/woo22 buffer=64000 file=/back/source.dmp fromuser=wootest touser=wootestbak tables=source
备份用户wootest的表souce导入到wootestbak中
- 物理备份
- % tar cvf /dev/rmt0 oracle路径下的所有文件备份到磁盘机上
- % tar xvf /dev/rmt0 把备份磁盘带上所有文件恢复进oracle当前路径
- % tar tvf /dev/rmt0 查看磁带上有哪些文件
- 备份控制文件
每次数据库物理结构发生改变时,必须及时备份控制文件
SQL> alter database backup controlfile to /backup/control.ctl;
SQL> alter database backup controlfile to trace #将控制文件的变化备份到跟踪文件中
- 联机全备份+日志备份
设置:
Oracle两种运行方式–> 归档和不归档
SQL> connect internal
SQL> starup mount
SQL> alter database archivelog 切换为归档模式
- 使用自动存档
在初始化文件”init*.ora”下加参数:log_archive_start=true
- 指定存档得重做登录文件名和存放的位置,同样是在初始化文件”init*.ora”中加入 参数:
log_archive_formal=%S.arc
log_archive_dest=/arch11/arch
- 重启数据库生效
- archive log list查看状态,去除归档日志功能的命令是alter database noarchivelog
步骤:
- 联机全备份:
数据库处于open状态,依次对各个表空间备份

表空间备份:
SQL-> alter tablespace system begin backup;
begin backup是对表空间冻结写入,end backup是解除冻结,因此复制datafile的过程不能太长,不然可能会导致大批量数据不能入库
备份controlfile:
SQL> alter database backup controlfile to 备份目录;
- 日志备份
SQL> alter system archive log stop;
移去日志目录下的所有archived redolog
SQL> alter system archive log start;
- 恢复
前提:数据库处于shutdown状态
- 磁盘全部损坏,仅保存上次联机全备份和每天日志备份。这种情况最坏。
解决硬件故障,配置系统软件及环境
oracle用户,将全备份和日志备份转移至相应目录,根据initSid.ora中controlfile的配置,将备份控制文件复制到相应目录下
SQL> startup mount;
SQL> recover database until cancel using backup controlfile;
recover database:数据库执行恢复操作,尝试恢复到指定状态。
until cancel:恢复操作将一直持续直到用户手动取消为止。意味着数据库会持续应用归档日志,只能手动停止。
using backup controlfile:表示要使用备份的控制文件来执行数据库恢复操作。
逐个确认恢复的archived redolog,待最后一个完成时,键入cancel,数据库停止应用归档日志,恢复操作将结束,
SQL> alter database open resetlogs; #重置重做日志文件的日志序列号和日志记录信息。
open resetlogs:表示打开数据库时要重置重做日志文件。重做日志文件记录了数据库中发生的所有修改操作。
注意:由于日志已经重置,所以应该尽快做一次联机全备份。
- 丢失某数据文件
将此文件从上次联机全备份钟复制到其目录,并将上次联机全备份以来所有日志备份移至归档目录。
SQL> startup mount;
SQL> alter database recover datafile path/file; path/file要恢复的数据文件的路径和文件名。
SQL> alter database open;
- 文件损坏或丢失,又无备份
将此文件脱机,将数据exp出来,重建表空间,再imp进去。
具体实现步骤:
假设表空间user_data中的数据文件user01.dbf发生损坏而无法访问,并且没有可用的备份。
1)将损坏的数据文件脱机
alter database datafile ‘/path/to/user01.dbf’ OFFLINE DROP;
2)使用exp工具将数据导出到文件中
exp username/password@database FILE=/path/to/user_data.dmp owner=username TABLES=table1.table2,…
3)创建新的表空间;
create tablespace new_user_data;
DATAFILE ‘/new/path/to/user_data01.dbf’ size 100M;
4)使用imp工具将导出的数据导入新的表空间中,
imp username/password@database FILE=/path/to/user_data.dmp REMAP_TABLESPACE=user_data:new_users_data;
- 注意要点
- 获取前必须要先做冷备,留条后路
- rollback段损坏
非常严重的问题,可以在initora.ora中写入_corrupted_rollback_segments=(rxx),启动时避开损坏的rollback段,但是不能解决根本性问题。如果数据处于archivelog,应从上一次全备份起,利用备份的日志进行恢复;如果数据库处于noarchivelog,应尽快将全部数据export出来,重建数据库,再import进去,但是所有操作前,都需要先做冷备份。
通过查询数据字典来查看损坏的rollback段名称,命令如下:
select segment_name from dba_rollback_segs where status=’NEEDS RECOVERY’;
检索出需要恢复的rollback段。
- 数据库异常中止处理
通过手工shutdown abort操作中止数据库,不会产生多大影响
如果系统崩溃引起的中止,就用上面的恢复方法。
- 数据库扩容
- 增加表空间
增加回滚和临时表空间:
SQL> create rollback segment segment_name tablespace 表空间名 storage(initial 1m next 4m);
SQL> create tmpporary tablespace 临时表空间名 tempfil “表空间路径/temp.dbf” size 32M reuse autoextend on next 640K minimum extent 64k default storage (
initial 64k
next 64k
minextents 1
maxextents unlimited
pctincrease0
)
temporary;
- REUSE: 表示如果已经存在相同名称的表空间,可以重用。
- AUTOEXTEND ON NEXT 640K: 表示在需要时自动扩展表空间,并指定每次扩展的大小为640K。
- MINIMUM EXTENT 64K: 指定表空间的最小扩展大小为64K。
- DEFAULT STORAGE: 指定表空间的默认存储参数。INITIAL 64K: 指定新对象的初始大小为64K。
- NEXT 64K: 指定在对象需要扩展时每次增加的大小为64K。
- MINEXTENTS 1: 指定对象的最小扩展数为1。
- MAXEXTENTS UNLIMITED: 指定对象的最大扩展数为无限。
- PCTINCREASE 0: 指定对象不会按百分比递增。
- TEMPORARY: 表示创建的是临时表空间,用于存储临时数据
使用完成后,删除或者offline
SQL> drop tablespace segment_name;
SQL> drop tablespace 临时表空间;
SQL> alter tablespace segment_name offline;
SQL> alter tablespace 临时表空间 offline;
- 增加某个表空间的大小
SQL> alter tablespace 表空间 add datafile ‘表空间路径/表空间名.dbf’ size 3M;
- 授权
SQL> grant connect to newuser;
SQL> grant resource to newsource;
SQL> grant update on 表名to newuser;
4、中断用户与数据库的连接
SQL> select sid,serial#,username from v$session;
SQL> alter system kill session sid,serial#;