1、实例和 SID 的关系是什么?
经常有人问 SID 是什么?在 Oracle 系统中 SID 是一个经常出现的变量,如环境变量
ORACLE_SID, 初始化文件 initSID.ora,那究竟什么是 SID 呢?其实 SID 就是 Oracle 实
例的标识,不同的 SID 对应不同的内存缓冲(SGA)和不同的后台进程。这样一来我们就可以
得当在一台物理的服务器上可以有多个 SID 的数据库实例。
2、Oracle 数据库和实例的关系是什么?
数据库是由物理文件和存取数据文件的实例组成,当存取数据文件的实例是一个的时候,数据库被称做单节点数据库。这是我们看到的最多的数据库形式。当然还有一种多节点数据库,就是一个以上的实例共同访问一个数据库(或者说共同访问一组数据文件), 更好的提供稳定性和并行处理能力。这在 8i 中被称为 OPS(Oracle Parallel Server ),在 Oracle9i 中被称为 RAC(real application cluster)。在这种数据库中。两个/多个实例分别在不同服务器上,所有 Oracle 数据文件在共享的磁盘阵列上,多个服务器上的实例可以同时工作,他们通过一个内部的网络进行通信。如果一台服务器不能提供服务的话,另一台会接管它的工作,特别是在关键的业务有很大的潜力。
3、在运行的数据库中数据文件中是不是可能存在没有被提交的数据?
这是可能存在的,因为用户数据文件的数据是由 DBWR 写入的,DBWR 是一个很底层
的后台进程,不负责与用户交互。用户的交互是由 LGWR 完成的。
4、在问题 3 中,如果存在没有写入的数据,那么机器突然断电,数据完整性会不会损坏?
不会的,因为数据库的完整性是 LGWR 来保证的,而且 ORACLE 保证了 DBWR 写入
数据文件的任何修改已经被记录在重做日志文件中。当系统再次启动的时候,通过读取重做
日志文件就可以知道那些数据没有被提交。这时候 ORACLE 会自动回滚那些数据。所以说
联机日志的损坏,特别是当前联机日志的损坏,对数据库的影响是巨大的,可能会导致数据
库的不完整。
5、数据文件损坏会丢失数据吗?
可以这么说,如果你有备份和归档,就不会。因为所有对数据修改的记录都在重做日志
中有记录,所以不会丢失数据,你只要恢复以前的备份再用归档日志文件恢复和当前的在线
重做日志就可以恢复所有数据。
6、在线重做日志损坏会丢失数据吗?
以上说了,在线日志对数据库的损坏是极大的,所以不仅可能丢失数据,还可能引起数
据库的不同步。在重做日志中的所有 commit 的记录都会丢失,这也是 Oracle 为什么要对在
线重做日志文件做镜像的原因。任何的数据丢失都是不允许的。
7、我在事务能不能指定不写回滚段?
不可以的,写回滚段是 ORACLE 保证一致性读和事务一致性的根本。回滚段是高写入
段,建议把它放到单独的设备上来。
对于 DDL 语句,如 DROP,TRUNCATE 却可以不写回滚段(没有 UNDO 信息),所以对
于整个表的删除,如果数据量比较大,建议用 Truncate Table 的方法。
不写联机日志也是不可能的,但可以在某些特定操作中,可以写很少的联机日志,如以
NOLOGGING 的方式通过 Create table tablename as select 创建表,或以 Append 的方式 Insert
数据到表,或直接载入等操作。