[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference orarep::nomahs::dbstars

Title:DBSTARS Conference
Moderator:BROKE::BASTINE
Created:Wed Feb 02 1994
Last Modified:Thu Jun 05 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:791
Total number of notes:1521

756.0. "-DDAL-E-SUPP, -RDMS-F-INDNOTEXI" by BROKE::BITHER () Wed Apr 02 1997 10:57

From:	BROKE::BITHER       "Please reply to [email protected]"  2-APR-1997 09:34:40.37
To:	PROTEAU
CC:	BITHER
Subj:	resolved ddd issue but still one outstanding question (really 2!),thx

Hi Claude,

I had a ddd customer with a problem which we have since resolved.  Just
wanted to run by you and make sure it's expected behavior.  Also I had
one question about it.  

Customer had 6 replication transfers that all needed to be reinitialized.
5 ran fine and one failed w/the following in the log file:

Leaf#01 BgrOnly RDB$RELATION_FIELDS Card=629
  BgrNdx1 RDB$RFR_REL_NAME_FLD_ID_NDX [1:1] Fan=8
13:36:21  %DDAL-I-DELETINDX, deleting index DDAL$DBKEY_INDEX1_2
-----  1-APR-1997 13:36:22.56 ----- Error           -------------------------
%DDAL-E-ERRACCDSTDB, error occurred accessing the destination database
-DDAL-E-SUPP, %RDB-E-NO_META_UPDATE, metadata update failed
-DDAL-E-SUPP, -RDMS-F-INDNOTEXI, index DDAL$DBKEY_INDEX1_2 does not exist in
 this database

Turns out the customer had dropped the table in the target database BEFORE
running the reinitialization.  As a consequence, the ddal$dbkey_index1_2
on the ddal$dbkey column for the table was no longer defined.  I gave him
two workarounds:

  1.  Recreate the table in the target including the ddal$dbkey column
and recreate index ddal$dbkey_index1_2 on this column, OR
  2.  Drop the transfer, redefine and run it.

He tried #1 and it worked.  My question is:

  Is this expected behavior for a reinitialized transfer? That is, if you
are going to reinitialize, does the transfer count on the table and index
being there in order to run so it can drop it, AND where does this
index information come from?  I was looking for the information in
the ddal system tables in the transfer and source db but couldn't find it.

Thanks, Diane

T.RTitleUserPersonal
Name
DateLines
756.1answerBROKE::BITHERWed Apr 02 1997 10:5834
I will write this article later today.

From:	BROKE::PROTEAU      "DTN 381-2725"  2-APR-1997 09:56:21.22
To:	BITHER
CC:	
Subj:	The owner table entries were not deleted


Diane,

Yes this is expected behavior.  This is a transfer to an existing database.
When the transfer is reexecuted after a REINITIALIZE, ROR needs to delete the
data in the target tables so that it can replace the data with a new batch from
the source database.  Deleting and reinserting goes much faster if you don't
have indexes to constantly update.  So ROR drops indexes on the target tables.

The ROR logic could be smarter and this avoid the error your customer saw.
Very roughly the transfer is executed with these steps:

1) Drop indexes on the target tables
2) Delete data in the target tables
3) Transfer new data into the target tables
4) Recreate the indexes

ROR does not actually check the Rdb system tables to see if the indexes still
exist (nor if the tables still exist for that matter).  It assumes they do.
If a customer deletes them, that's an error.  ROR gets its index names in dif-
ferent ways depending on the method of transfer.  For shared write transfers
(which I presume this is not) it looks up the names in a DDAL$INDEXES table.
For other transfer methods, it looks up the index name in the RDBVMS$TRANSFER_
OWNER table or the DDAL$TRANSFER_OWNER table.  When the customer dropped the
index and table, s/he probably forgot do drop the entries in the owner table.

Claude
756.23 workaroundsBROKE::BITHERWed Apr 02 1997 11:5024
So actually 3 workarounds:
For replication update transfers:

1.  recreate table and index
2.  drop and redefine transfer
3.  when drop table - also delete columns in rdbvms$transfer_owner (Rdb)
or ddal$transfer_owner (all other dbs) tables in transfer database.



SQL> select * from RDBVMS$TRANSFER_OWNER
cont> ;
 RDBVMS$TRANSFER_OWNER_ID   RDBVMS$TRANSFER_OBJECT_NAME
   RDBVMS$TRANSFER_OBJECT_TYPE
                        1   KIDS
                             1

                        1   DDAL$DBKEY_INDEX1_1
                             3

2 rows selected
SQL> delete from RDBVMS$TRANSFER_OWNER where RDBVMS$TRANSFER_OWNER_ID=1;
2 rows deleted