Welcome 微信登录

首页 / 数据库 / MySQL / 关于dual表的破坏性测试

关于dual表的破坏性测试,既然是破坏性测试,就需要确定这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦运行就会导致整个业务系统崩溃。
 比如说我们拿dual表开刀,这个表是一个dummy表,里面的内容没有特定的意义,就是为了存在而存在。但是一旦这个表出现问题,所有相关的基础操作都会受到影响,后果不敢想象。
 来简单模拟一下,在个人的机器上开始做下面的尝试,drop 表dualSQL> show user
 USER is "SYS"
 SQL>
 SQL> show parameter insta
 NAME                                TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
 active_instance_count                integer
 cluster_database_instances          integer    1
 instance_groups                      string
 instance_name                        string      TEST01
 instance_number                      integer    0
 instance_type                        string      RDBMS
 open_links_per_instance              integer    4
 parallel_instance_group              string
 parallel_server_instances            integer    1
 SQL> drop table dual;  --运行这个命令也没有出现任何的问题
Table dropped.SQL> select count(*)from dual;  --但是一旦开始尝试查询操作就会报出1775的错误。
select count(*)from dual
                    *
 ERROR at line 1:
 ORA-01775: looping chain of synonymsSQL> select *from dual;              --再次尝试,问题依旧,可以想象在线业务系统出现这个问题是致命的影响。
select *from dual
              *
 ERROR at line 1:
 ORA-01775: looping chain of synonyms
--如果没有尝试重启数据库的情况下,完全可以采用如下的方式来解决,我们可以完全重建表dual,插入dummy的数据SQL> CREATE TABLE "SYS"."DUAL" 
            (      "DUMMY" VARCHAR2(1)
            ) TABLESPACE "SYSTEM" ;
 Table created.SQL> GRANT SELECT ON "SYS"."DUAL" TO PUBLIC WITH GRANT OPTION;
 Grant succeeded.SQL> select *from dual;
 no rows selectedSQL> insert into dual values("X");
 1 row created.SQL> commit;
 Commit complete.SQL> select *from dual; --简单的验证,会发现问题似乎解决了。
D
 -
 XSQL> select sysdate from dual;  --尝试使用dual来查询时间,也没有发现问题。SYSDATE
 ------------------
 20-NOV-14
这个时候可以查看相关的sys下的失效对象,会发现受到影响的还不少,这个时候可以重新编译。SQL> select object_name,owner ,object_type from dba_objects where status="INVALID"
 OBJECT_NAME                    OWNER                          OBJECT_TYPE
 ------------------------------ ------------------------------ -------------------
 AQ$_ALERT_QT_V                SYS                            EVALUATION CONTEXT
 ALERT_QUE_R                    SYS                            RULE SET
 ALERT_QUE_N                    SYS                            RULE SET
 DBMS_RCVMAN                    SYS                            PACKAGE BODY
 DBMS_BACKUP_RESTORE            SYS                            PACKAGE BODY
 DBMS_CDC_UTILITY              SYS                            PACKAGE BODY
 DBMS_CDC_ISUBSCRIBE            SYS                            PACKAGE BODY
 AQ$_AQ$_MEM_MC_V              SYS                            EVALUATION CONTEXT
 AQ$_AQ_PROP_TABLE_V            SYS                            EVALUATION CONTEXT
 AQ_PROP_NOTIFY_R              SYS                            RULE SET
 AQ_PROP_NOTIFY_N              SYS                            RULE SETOBJECT_NAME                    OWNER                          OBJECT_TYPE
 ------------------------------ ------------------------------ -------------------
 ALERT_QUE$1                    SYS                            RULE SET
 ALERT_QUE$1                    SYS                            RULE
 AQ$_KUPC$DATAPUMP_QUETAB_V    SYS                            EVALUATION CONTEXT
 DBMS_AW_EXP                    SYS                            PACKAGE BODY
 DBMS_AW_STATS                  SYS                            PACKAGE BODY
 STREAMS$_EVALUATION_CONTEXT    SYS                            EVALUATION CONTEXT
 AQ$_SYS$SERVICE_METRICS_TAB_V  SYS                            EVALUATION CONTEXT
 SYS$SERVICE_METRICS_R          SYS                            RULE SET
 SYS$SERVICE_METRICS_N          SYS                            RULE SET
 MGMT_RESPONSE                  DBSNMP                        PACKAGE BODY
 DBMS_JDM_INTERNAL              SYS                            PACKAGE BODYOBJECT_NAME                    OWNER                          OBJECT_TYPE
 ------------------------------ ------------------------------ -------------------
 AQ$_KUPC$DATAPUMP_QUETAB_1_V  SYS                            EVALUATION CONTEXT
 SQL>@?/rdbms/admin/utlrp.sql如果不幸的是我们在出现问题的时候尝试重启数据库,就会发现数据库就起不来了。
SQL> drop table dual;
 Table dropped.SQL> select sysdate from dual;
 select sysdate from dual
                    *
 ERROR at line 1:
 ORA-01775: looping chain of synonymsSQL> shutdown immediate
 Database closed.
 Database dismounted.
 Oracle instance shut down.
 SQL> startup
 ORACLE instance started.Total System Global Area  313159680 bytes
 Fixed Size                  2227944 bytes
 Variable Size            255852824 bytes
 Database Buffers          50331648 bytes
 Redo Buffers                4747264 bytes
 Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-01775: looping chain of synonyms
Process ID: 434
Session ID: 237 Serial number: 5alert日志中的相关内容如下:
Undo initialization finished serial:0 start:236214754 end:236215144 diff:390 (3 seconds)
 Verifying file header compatibility for 11g tablespace encryption..
 Verifying 11g file header compatibility for tablespace encryption completed
 SMON: enabling tx recovery
 Database Characterset is AL32UTF8
 No Resource Manager plan active
 Errors in file /u03/ora11g/diag/rdbms/test01/TEST01/trace/TEST01_ora_434.trc:
 ORA-01775: looping chain of synonyms
 Errors in file /u03/ora11g/diag/rdbms/test01/TEST01/trace/TEST01_ora_434.trc:
 ORA-01775: looping chain of synonyms
 Error 1775 happened during db open, shutting down database
 USER (ospid: 434): terminating the instance due to error 1775
 Instance terminated by USER, pid = 434
 ORA-1092 signalled during: ALTER DATABASE OPEN...
 opiodr aborting process unknown ospid (434) as a result of ORA-1092
 Thu Nov 20 06:31:13 2014
 ORA-1092 : opitsk aborting process
 Thu Nov 20 06:32:02 2014日志中???到的trace 文件的内容如下:*** 2014-11-20 06:31:11.920
 *** SESSION ID:(237.5) 2014-11-20 06:31:11.920
 *** CLIENT ID:() 2014-11-20 06:31:11.920
 *** SERVICE NAME:(SYS$USERS) 2014-11-20 06:31:11.920
 *** MODULE NAME:(sqlplus@rac1 (TNS V1-V3)) 2014-11-20 06:31:11.920
 *** ACTION NAME:() 2014-11-20 06:31:11.920
 
 ORA-01775: looping chain of synonyms
 ORA-01775: looping chain of synonyms*** 2014-11-20 06:31:11.947
 USER (ospid: 434): terminating the instance due to error 1775如果确实知道问题的原因就轻车熟路的解决了,要不还需要费一番周折,开启一些更为详尽的trace来排查。
 这个错误和数据库参数replication_dependency_tracking有关,默认是TRUE,我们需要暂时绕过这个校验,先把库启动起来,然后重建表dual就可以了。在修复以后,重启数据库恢复replication_dependency_tracking的默认值TRUESQL> show parameter trackNAME                                TYPE
 ------------------------------------ ---------------------------------
 VALUE
 ------------------------------
 db_unrecoverable_scn_tracking        boolean
 TRUE
replication_dependency_tracking      boolean
TRUE
 SQL> alter system set replication_dependency_tracking=false;
 alter system set replication_dependency_tracking=false
                  *
 ERROR at line 1:
 ORA-02095: specified initialization parameter cannot be modifiedSQL>  alter system set replication_dependency_tracking=false scope=spfile;
 System altered.SQL> shutdown immediate
 ORA-01507: database not mountedORACLE instance shut down.
 SQL> startup
 ORACLE instance started.Total System Global Area  313159680 bytes
 Fixed Size                  2227944 bytes
 Variable Size            255852824 bytes
 Database Buffers          50331648 bytes
 Redo Buffers                4747264 bytes
 Database mounted.
Database opened.
 SQL>SQL> select sysdate from dual;  --启动起来之后尝试,会发现问题没有修复,我们需要重建表dual
 select sysdate from dual
                    *
 ERROR at line 1:
 ORA-01775: looping chain of synonymsSQL>  CREATE TABLE "SYS"."DUAL"
  2            (      "DUMMY" VARCHAR2(1)
  3            ) TABLESPACE "SYSTEM" ;
 Table created.SQL> GRANT SELECT ON "SYS"."DUAL" TO PUBLIC WITH GRANT OPTION;
 Grant succeeded.SQL> insert into dual values("X");
 1 row created.SQL> commit;
 Commit complete.SQL> select sysdate from dual;  --修复以后问题似乎就解决了。
SYSDATE
 ------------------
 20-NOV-14SQL> show parameter track
 NAME                                TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
 db_unrecoverable_scn_tracking        boolean    TRUE
replication_dependency_tracking      boolean    FALSESQL> alter system set replication_dependency_tracking=TRUE scope=spfile;
 System altered.SQL> shutdown immediate
 Database closed.
 Database dismounted.
 ORACLE instance shut down.
 SQL> startup
 ORACLE instance started.Total System Global Area  313159680 bytes
 Fixed Size                  2227944 bytes
 Variable Size            255852824 bytes
 Database Buffers          50331648 bytes
 Redo Buffers                4747264 bytes
 Database mounted.
 Database opened.
 SQL> select sysdate from dual;
 SYSDATE
 ------------------
 20-NOV-14
然后可以重新编译失效对象,这个问题的解决就告一段落了。在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址