通过STANDBY数据库实现读写分离时索引过多的问题
Oracle 11g的物理STANDBY数据库可以只读打开并实时应用,可以满足很多应用更改为读写分离的架构。但业务上将主库主要做DML操作,备库上做SELECT操作,可能存在的一个问题就是,备库上的SELECT可能需要大量的索引,而这些索引在主库上实际是没有意义的,并且还影响主库DML操作的性能和日志量。但物理STANDBY只能通过在主库上建索引后同步到备库上,备库自己是无法新建索引的。这种情况就可以发挥逻辑STANDBY的优势了。
数据库的GUARD STATUS分为三种:NONE,STANDBY和ALL.默认逻辑STANDBY数据库的GUARD STATUS是ALL,可通过SELECT GUARD_STATUS FROM V$DATABASE查看,可通过ALTER DATABASE GUARD ALL/STANDBY/NONE进行调整。GUARD STATUS为ALL,可以防止数据库中的所有对象被修改,也就是只能通过SQL APPLY进行应用;GUARD STATUS为STANDBY,用户不能修改SQL APPLY进行应用的表,但可以自己创建新表并进行相关的DDL/DML操作;GUARD STATUS为NONE,用户可以随便修改任何表,只要具有权限即可。
针对备库的SELECT操作需要大量索引的问题,通过逻辑STANDBY实现就简单了,只需将GUARD STATUS修改为NONE,然后在备库上建索引即可。
个人建议:
1.不要在原始的用户下建索引,可以新建一个用户,在新建的用户上建原始用户表上的索引,这样便于区分。
2.一般不要在备库上建唯一索引或其它约束,防止SQL APPLY无法应用。
3.对于需要对原始数据进行二次处理的需求,也可以通过在逻辑STADNBY上新建用户进行处理。