冷备份
发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法。适用于所有模式的数据库。
优点
缺点
热备份
是在数据库仍旧处于工作状态时进行备份,采用的是归档方式备份数据的方法。
优点
缺点
不同点
热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。
重建控制文件,用带 backup control file 子句的 recover 命令恢复数据库。
使用 create spfile from pfile 命令
data block 是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的 data block 就组成了 extend. 一个数据库对象拥有的所有 extents 被称为该对象的 segment
alert log.
两者都可以用来删除表中所有的记录。区别在于:truncate 是 DDL 操作,它移动 HWK ,不需要 rollback segment 而 Delete 是 DML 操作,需要 rollback segment 且花费较长时间
快速访问表中的 data block
Fact tables 和 dimension tables. fact table 包含大量的主要的信息而 dimension tables 存放对 fact table 某些属性描述的信息
位图索引(bitmap index)
主键和外键
子表的外键强制实效,重建母表,激活外键
归档模式是指你可以备份所有的数据库 transactions 并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。
但是非归档模式可以带来数据库性能上的少许提高
Alter database backup control file to trace.
STARTUP NOMOUNT ?C 数据库实例启动
STARTUP MOUNT - 数据库装载
STARTUP OPEN ?C 数据库打开
INST_ID 指明集群环境中具体的某个 instance
运行 utlxplan.sql 建立 plan 表
针对特定 SQL 语句,使用 explain plan set statement_id = 'tst1' into plan_table 运行 utlxplp.sql 或 utlxpls.sql 查看 explain plan
在数据库较繁忙时,适用 buffer cache advisory 工具,查询 v$db_cache_advice 如果有必要更改,可以使用 alter system set db_cache_size 命令
具体的出错信息是 snapshot too old within rollback seg , 通常可以通过增大 rollback seg 来解决问题。当然也需要查看一下具体造成错误的 SQL 文本
ORACLE_BASE 是 oracle 的根目录,ORACLE_HOME 是 oracle 产品的目录。
分区的实质是把一张大表的数据按照某种规则使用多张子表来存储。
然后这多张子表使用统一的表名对外提供服务,子表实际对用户不可见。类似于在多张子表上简历一个视图,然后用户直接使用该视图来访问数据。
当一张表的数据量到达上亿行的时候,表的性能会严重降低,这个时候就需要用到分区了,通过划分成多个小表,并在每个小表上建立本地索引可以大大缩小索引数据文件的大小,从而更快的定位到目标数据来提升访问性能。
分区除了可以用来提升访问性能外,还因为可以指定分区所使用的表空间,因此也用来做数据的生命周期管理。当前需要频繁使用的活跃数据可以放到访问速度更快但价格也更贵的存储设备上,而 2、3 年前的历史数据,或者叫冷数据可以放到更廉价、速度更低的设备上,从而降低存储费用。
Oracle 的分区可以分为:列表分区、范围分区、散列分区(哈希分区)、复合分区。
列表分区:
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
范围分区:
散列分区(哈希分区)
复合分区
根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区同再使用散列分区的一种分区方法。
分别从数据库设计方面、SQL 优化语句方面,物理优化方面
数据库设计方面
对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引;
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在 num 上设置默认值 0 ,确保表中 num 列没有 null 值,然后这样查询:select id from t where num = 0
并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引如一表中有字段sex、male、female几乎各占一半,那么即使在sex上建了索引也对查询效率起不了作用;
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源若应用系统需要频繁更新索引数据列,那么需要考虑是否应将该索引建为索引;
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
尽可能的使用varchar/nvarchar代替char/nchar,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些;
尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
避免频繁创建和删除临时表,以减少系统表资源的消耗;
临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
在新建临时表时,如果一次性插入数据量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先createtable,然后insert;
如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table,然后 drop table,这样可以避免系统表的较长时间锁定。
从SQL 语句方面
应尽量避免在where子句中使用!=或<操作符,否则将引擎放弃使用索引而进行全表扫描;
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num = 10 or num = 20 可以这样查间:select id from t where num = 10 union all select id from t where num = 20
in和notin也要慎用,否则会导致全表扫描,如:selectidfromtwherenumin(1,2,3)对于连续的数值,能用between就不要用in了:selectidfromtwherenumbetween1and3;
下面的查询也将导致全表扫描:select id from t where name like '%abc%'
如果在where子句中使用参数,也会导致全表扫描因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项如下面语句将进行全表扫描:selectidfromtwherenum=@num可以改为强制查询使用索引:selectidfromtwith(index(索引名)wherenum=@num;
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。 如:select id from t where num/2 = 100 应改为:select id from t where num = 100*2
应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描;
如:select id from t where substring(name,1,3) = ‘abc’ - name 以 abc 开头的 id
select id from t where datediff(day,createdate,‘2005-11-30’) = 0 - ‘2005-11-30’ 生成的 id
应改为:select id from t where name like ‘abc%’ ,
select id from t where createdate = ‘2005-11-30’ and createdate < ‘2005-12-1’ 不要在 where 子句中的 " = " 左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
如需要生成一个空表结构:select col1,col2 intot from t where1 = 0 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:create tablet(...)
很多时候用exists代替in是一个好的选择:;
select num from a where num in(select num from b)
用下面的语句替换:select num from a where exists(select 1 from b where num = a.num)
任何地方都不要使用 select from t,用具体的字段列表代替 "" ,不要返回用不到的任何字段。
尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写;
尽量避免向客户返回大数据量,若数据量过大,应该考虑相应需求是否合理。
尽量避免大事务操作,提高系统并发能力;
物理优化方面
说下你怎么使用索引的?使用索引的好处和坏处?
内连接:
指主表,从表中符合连接条件的记录全部显示
左连接:
外连接方式,主要是显示主表,从表中符合连接条件的记录,并且主表中所有不符合连接条件的记录也要显示。
右连接:
外连接方式,主要是显示主表,从表中所有符合连接条件的记录,并且从表中不符合的记录也要显示。
length 长度、lower 小写、upper 大写、to_date 转化日期、to_char 转化字符、to_number 转化数字、Ltrim 去左边空格、rtrim 去右边空格、substr 截取字符串、add month 增加或减掉月份
存储过程:
函数:
与存储过程相似,函数可以没有参数,但是一定需要一个返回值
游标:
游标类以指针,游标可以执行多个不相关的操作,如果希望当产生了结果集后,对结果集中的数据进行多种不相关的数据操作
Oracle的存储过程跟函数你写没有?项目中用到没有?怎么用的?
简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行
解决办法:
查找出被锁的表
java select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id a.object_id;
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id b.sid order by b.logon_time;
杀进程中的会话
java alter system kill session "sid,serial#";
java set autot on explain plan set statement_id =&item_id for &sql select from table(dbms_xplan.display);
java select sql_text from v$sql where disk_reads 1000 or (executions 0 and buffer_gets/executions 30000);
方法1. 导入/导出的是二进制的数据
方法2. PLSQL 导入/导出的是 SQL 语句的文本文件
java
create view 视图名 as select 列名 [别名] ... from 表 [unio [all] select ... ]]
好处:
Oracle 锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
2.按锁级别划分,可分为共享锁与排它锁
共享锁:
共享锁使一个事务对特定数据库资源进行共享访问一一另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计 + 共享锁容易造成死锁或数据更新丢失。
排它锁:
事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3.按操作划分,可分为 DML 锁、DDL 锁。DML 锁又可以分为,行锁、表锁、死锁
DML锁:
java 如事务 1 在表A行记录3 中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务;1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。
死锁一般是因拙劣的事务设计而产生,死锁只能使用 SQL 下:alter system kill session "sid,serial#"; 或者使用相关操作系统 kill 进程的命令,如 UNlX 下 kill -9 sid ,或者使用其它工具杀掉死锁进程。
DDL锁:
DDL锁又可以分为:
排它 DDL 锁、共享 DDL 锁、分析锁
内部闩锁:这是 ORACLE 中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE 首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。
宏观上:
微观上
从数据类型,数据库的结构等等回答
创建标准索引: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建组合索引: CREATE INDEX 索引名 ON 表名(列名1,列名2)TABLESPACE 表空间名;
创建反向键索引: CREATE INDEX 索引名 ON 表名(列名)reverse TABLESPACE 表空间名;
索引使用原则:
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替
频繁 DML 的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
优点:
缺点:
java
SELECT DBTIMEZONE FROM DUAL;
GLOBAL_NAMES 指明联接数据库的方式。如果这个参数设置为 TRUE ,在建立数据库链接时就必须用相同的名字连结远程数据库
WRAP
function 和 procedure 是 PL/SQL 代码的集合,通常为了完成一个任务。
procedure 不需要返回任何值而 function 将返回一个值
Package 是为了完成个商业功能的一组 function 和 proceudre 的集合
TABLE Function 是通过 PL/SQL 逻辑返回一组纪录,用于普通的表/视图。他们也用于 pipeline 和 ETL 过程。
Buffer Cache Advice,Segment Level Statistics,Timed Statistics
unix $ORACLE_HOME/rdbms/audit Windows the event viewer
Materialized views 用于减少那些汇总,集合和分组的信息的集合数量。它们通 常适合于数据仓库和 DSS 系统。
PMON
The Job Queue Processes.
\V SESSION_WAIT
Redo Logs 是用于存放数据库数据改动状况的物理和逻辑结构。可以用来修复数据库
ALTER SYSTEM SWITCH LOGFILE;
你可以使用 Logminer 或 Streams
Coalescing 针对于字典管理的 tablespace 进行碎片整理,将临近的小 extent合并成单个的大extent
A temporary tablespace 用于临时对象例如排序结构而 tablespaces 用来存储那些'真实'的对象(例如表,回滚段等)
SYSTEM tablespace.
CONNECT
ALTER TABLESPACE ALTER DATABASE DATAFILE DBA DATA FILES DBA FREE SPACE auditing ALTER INDEX Partition将大表和索引分割成更小,易于管理的分区。 SHOW ERRORS ANALYZE 解答: DBMS SESSION.SET_SQL_TRACE ALTER SESSION SET SOL_TRACE = TRUE; 这两个 ORACLE 工具都是用来将数据导入数据库的。 区别是: IMPORT 工具只能处理 由另一个 ORACLE 工具 EXPORT 生成的数据。而 SQL*LOADER 可以导入不同的 ASCII 格式的数据源 TNSNAMES.ORA and SQLNET.ORA Oracle Forms 是用于创建与 Oracle 数据库交互的软件产品。它有一个lDE,包括一个属性表,对象导航器和使用 PL/SQL 的代码编辑器。 Oracle表单包含: 客户端:客户端发送HTTP请求 在Oracle Form's Services中,包括的功能包括:与 Oracle Access Manager 集成 计划表格运行预备 增强的网络统计报告 支持Unicode列 guiMode配置参数 表单指标代理 支持图像项目和图标按钮中的URL Oracle 真正的用户体验洞察 CALL FORM:它启动一个新窗体并传递控件 New FORM:它终止当前窗体并用指定的新窗体替换它 Oracle Forms配置文件包括: 基本HTML文件(base.htm,basejini..htm,basejpi.htm baseie.htm) ENV CFG DEVLOBER 记录组列名的最大长度不能超过30个字符。 不同类型的记录组包括: 查询记录组 表单打开时,触发序列 预成型 预块 预录 前文项 实例 当新形式的实例 当新块实例 当新记录实例 当新项目实例 当验证的LOV设置为True时,Oracle Forms将文本项的当前值与LOV中显示的第一列中的值进行比较。LOV是列表项的属性。列表项只能有一列,而lov可以有一个或多个列 我们可以通过在全局值中传递返回值并使用代码中的全局值,将相同的LOV用于2列。\ 报表 6i 中使用了绑定变量来替换 select 语句中的单个参数。 要遍历指定块中的项目和记录可以使用NEXT_FIELD来迭代特定块中的项,并且NEXT RECORD遍历块中的记录。 不,不可能将FMX转换或反向回到FMB文件,以确保它们不会丢失。 是的,可以通过使用内置的FORMS_DDL或通过从表单调用DBNS_SQL数据库包从表单执行动态SQL。 pctused与pctfree控制数据块是否出现在freelist中,pctfree控制数据块中保留用于update的空间,当数据块中的free space小于pctfree设置的空间时,该数据块从freelist中去掉当块由于dml操作free space大于pct used设置的空间时,该数据库块将被添加在freelist链表中。 table创建时,默认创建了一个data segment,每个datasegment含有minextents指定的extents数,每个extent据据表空间的存储参数分配一定数量的blocks 一个tablespace可以有个或多个datafile,每个datafile只能在一个tablespace内,table中的数据,通过hash算法分布在tablespace中的各个datafile中,tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。 本地管理表空间(LocallyManaged Tablespace简称LMT),8i以后出现的一种新的表空间的管理模式,通过位图来管理表空间的空间使用。字典管理表空间(Dictionary-ManagedTablespace简称DMT)8i以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间的空间使用。动段空间管理(ASSM),它首次出现在Oracle920里有了ASSM,链接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap ManagedSegments(BMB 段) 事务回滚: 当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。 记录数据库事务,最大限度地保证数据的一致性与安全性 SGA:db_cache/shared_pool/large_pool/java_pooldb_cache: 数据库缓存(BlockBuffer)对于Oracle数据库的运转和性能起着非常关键的作用,它占据Oracle数据库SGA(系统共享内存区)的主要部分。Oracle数据库通过使用LRU算法,将最近访问的数据块存放到缓存中,从而优化对磁盘数据的访问。 数据写进程(dbwr):负责将更改的数据从数据库缓冲区高速缓存写入数据文件。74.如何变动数据文件的大小?
75.哪个VMEW用来检意数据文件的大小?
76.哪个VIEW用来判断tablespace的剩余空间
77.如何判断谁往表里增加了一条纪录?
78.如何重构索引?
79.解释什么是Partitioning(分区)以及它的优点。
80.你刚刚编译了一个 PL/SQL Package 但是有错误报道,如何显示出错信息?
81.如何搜集表的各种状态数据?
The ANALYZE command82.如何启动 SESSION 级别的 TRACE
83.用于网络连接的 2 个文件?
84.解释什么是 Oracle Forms ?
85.解释 Oracle 表单服务组件包括什么?
窗口监听器Servlet:它启动,停止并与窗体运行进程通信
表单运行过程:它执行特定表单应用程序中包含的代码
数据库:从数据库中获取的数据86.提及 11g 版本 2 中 Oracle Forms Services 中引入的新功能是什么?
87.解释CALL_FORM,NEW_FORM和OPEN_FORM之间有什么区别?
OPEN FORM:打开指定的新表单,而不更换或暂停父表单。88.列出0 racle Forms配置文件?
89.在Oracle Forms Report中,Record组列的最大长度是多少?什么是不同类型的记录组?
状态记录组
非查询记录组90.提示窗体中触发的顺序是什么?
91.提到一个项目的“验证LOV”属性?提到lov和list项目有什么区别?
92.说明如何使用相同的LOV2列?
93.什么是绑定变量?
94.说明如何在指定的块中迭代项目和记录?
95.说明你可以将FMX转换或反向回到FMB文件吗?
96.可以从表单执行动态SQL吗?
97.pctused and pctfree表示什么含义有什么作用?
98.简单描述table/sment/extent/blok之间的关系?
99.描述tablespace和datafile之间的关系
100.本地管理表空间和字典管理表空间的特点,ASSM有什么特点?
101.回滚段的作用是什么
事务恢复: 当事务正在处理的时候,例程失败,回滚段的信息保存在undo表空间中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。
102.日志的作用是什么
重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复,一个数据库至少需要两个重做日志文件
归档日志文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。103.SGA主要有那些部分,主要作用是什么?
shared pool:
共享池的大小对于Oracle性能来说都是很重要的。 共享池中保存数据字典高速缓冲和完全解析或编译的的PL/SQL块和SQL语句及控制结构。
large_pool:
使用MTS配置时,因为要在SGA中分配UGA来保持用户的会话,就是用Large_poor来保持这个会话内存使用RMAN做备份的时候,要使用Large_pool这个内存结构来做磁盘/O缓存器。
java pool:
为javaprocedure预备的内存区域,如果没有使用java_proc,,java_pool不是必须的。104. oracle系统进程主要有哪些,作用是什么
日志写进程(lgwr):将重做日志缓冲区中的更改写入在线重做日志文件。