Recreating indices safely

Started by Denis Perchineover 24 years ago4 messagesgeneral
Jump to latest
#1Denis Perchine
dyp@perchine.com

Hello,

I have quite strange problem with 7.1.3.
The problem is that when I try to recreate indices in working system
(it is needed as updates are quite intensive, and you need to make indices
smaller) I realise that some queries using these indices are failed.

They are failed with error something like can not find relation <oid>.
This is understandable. Query was prepared, all oids was fixed, and between
query prepare, and execution I drop the index (I create a new one, and drop an old
one afterwards). As far as I can understand drop index should obtain exclusive lock
on table it is created on. Is it correct? The only explanation I can find is that this lock
is not obtained.

Any suggestions/comments/ideas?

BTW, using begin; lock table; create index;drop index;commit; is not working, as
create index can not detect that table is already locked by current transaction, and tries to lock it again...
This is also bug IMHO.

--
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Denis Perchine (#1)
Re: Recreating indices safely

Denis Perchine <dyp@perchine.com> writes:

BTW, using begin; lock table; create index;drop index;commit; is not working,

??

regression=# create table foo (f1 text);
CREATE
regression=# create index fooi1 on foo(f1);
CREATE
regression=# begin;
BEGIN
regression=# lock table foo;
LOCK TABLE
regression=# create index fooi2 on foo(f1);
CREATE
regression=# drop index fooi1;
DROP
regression=# end;
COMMIT

Please define "not working".

regards, tom lane

#3Denis Perchine
dyp@perchine.com
In reply to: Tom Lane (#2)
Re: Recreating indices safely

On Wednesday 19 September 2001 11:25, Tom Lane wrote:

Denis Perchine <dyp@perchine.com> writes:

BTW, using begin; lock table; create index;drop index;commit; is not
working,

??

regression=# create table foo (f1 text);
CREATE
regression=# create index fooi1 on foo(f1);
CREATE
regression=# begin;
BEGIN
regression=# lock table foo;
LOCK TABLE
regression=# create index fooi2 on foo(f1);
CREATE
regression=# drop index fooi1;
DROP
regression=# end;
COMMIT

Please define "not working".

Hmmm... I got deadlock detected... Something was interfered as well...

--
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------

#4Denis Perchine
dyp@perchine.com
In reply to: Tom Lane (#2)
Re: Recreating indices safely

On Wednesday 19 September 2001 11:25, Tom Lane wrote:

Denis Perchine <dyp@perchine.com> writes:

BTW, using begin; lock table; create index;drop index;commit; is not
working,

??

regression=# create table foo (f1 text);
CREATE
regression=# create index fooi1 on foo(f1);
CREATE
regression=# begin;
BEGIN
regression=# lock table foo;
LOCK TABLE
regression=# create index fooi2 on foo(f1);
CREATE
regression=# drop index fooi1;
DROP
regression=# end;
COMMIT

Please define "not working".

Hmmm... I got deadlock detected... Something was interfered as well...

BTW, also sometimes I get the following message which really intrigues me.

ERROR: Index 8734149 does not exist

When I restart my application it just disappears... Is it possible, that backends loose
information about updated indices? And how can I debug/detect this?

--
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: http://www.perchine.com/dyp/
FidoNet: 2:5000/120.5
----------------------------------