ALTER TABLESPACE ... MOVE ALL TO ...

Started by Stephen Frostabout 12 years ago14 messageshackers
Jump to latest
#1Stephen Frost
sfrost@snowman.net

Greetings,

It's a day late and I'm a dollar short, but attached is a (very) minor
patch to allow users to more easily move their various objects from
one tablespace to another. Included are docs and a regression test;
I'm happy to improve on both should folks send me suggestions.

As we use tablespaces quite a bit, this can be extremely handy for us
and I expect others will find it useful too.

Thoughts?

Thanks,

Stephen

Attachments:

alt_tblspc_move_all.patchtext/x-diff; charset=us-asciiDownload+269-16
#2Robert Haas
robertmhaas@gmail.com
In reply to: Stephen Frost (#1)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On Thu, Jan 16, 2014 at 4:37 PM, Stephen Frost <sfrost@snowman.net> wrote:

Greetings,

It's a day late and I'm a dollar short, but attached is a (very) minor
patch to allow users to more easily move their various objects from
one tablespace to another. Included are docs and a regression test;
I'm happy to improve on both should folks send me suggestions.

As we use tablespaces quite a bit, this can be extremely handy for us
and I expect others will find it useful too.

Thoughts?

Don't be late next time?

I did look this over and it seems fine.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Simon Riggs
simon@2ndQuadrant.com
In reply to: Stephen Frost (#1)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On 16 January 2014 22:37, Stephen Frost <sfrost@snowman.net> wrote:

allow users to more easily move their various objects from
one tablespace to another. Included are docs and a regression test;
I'm happy to improve on both should folks send me suggestions.

Sounds good.

The command uses the word ALL but then less than all objects, i.e.
only moves objects that are owned by the user.

I would like to see two variants of this...

ALL ... which attempts to move all objects and fails if it doesn't own
everything
ALL OWNED ... which moves only objects that it owns, and ignores others

i.e. ALL should mean all

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Stephen Frost
sfrost@snowman.net
In reply to: Simon Riggs (#3)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

* Simon Riggs (simon@2ndQuadrant.com) wrote:

The command uses the word ALL but then less than all objects, i.e.
only moves objects that are owned by the user.

My thinking was that it was "all" from that user's perspective.

I would like to see two variants of this...

ALL ... which attempts to move all objects and fails if it doesn't own
everything
ALL OWNED ... which moves only objects that it owns, and ignores others

I could add that, though it feels like the next request would be to
allow a specific role to be passed in (ie: move all of *this* user's
objects) and I'm not sure we really need to go to that level. It
doesn't seem like there's really much point in having two options
either- "ALL OWNED" run by the superuser would be identical to "ALL" and
normal users would have zero use for just "ALL" because it would either
be identical to "ALL OWNED" or it would fail with a permission denied
error.

If an extra noise word to clarify what is happening would be useful,
then I could simply require "OWNED" as well, but I'm not particularly
thrilled with that option, also ...

i.e. ALL should mean all

This is a bit of a non-starter when it comes to tablespaces anyway- we
can't move another database's objects and so even if it was "ALL", it
may only be moving a subset of the objects in the tablespace (namely
those which are in the current database). I don't see it being an
improvement to require "IN CURRENT DATABASE ALL OWNED" even though it
would be more accurate.

Thanks,

Stephen

#5Simon Riggs
simon@2ndQuadrant.com
In reply to: Stephen Frost (#4)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On 20 January 2014 14:24, Stephen Frost <sfrost@snowman.net> wrote:

* Simon Riggs (simon@2ndQuadrant.com) wrote:

The command uses the word ALL but then less than all objects, i.e.
only moves objects that are owned by the user.

My thinking was that it was "all" from that user's perspective.

I would like to see two variants of this...

ALL ... which attempts to move all objects and fails if it doesn't own
everything
ALL OWNED ... which moves only objects that it owns, and ignores others

I could add that, though it feels like the next request would be to
allow a specific role to be passed in (ie: move all of *this* user's
objects) and I'm not sure we really need to go to that level. It
doesn't seem like there's really much point in having two options
either- "ALL OWNED" run by the superuser would be identical to "ALL" and
normal users would have zero use for just "ALL" because it would either
be identical to "ALL OWNED" or it would fail with a permission denied
error.

If an extra noise word to clarify what is happening would be useful,
then I could simply require "OWNED" as well, but I'm not particularly
thrilled with that option, also ...

i.e. ALL should mean all

This is a bit of a non-starter when it comes to tablespaces anyway- we
can't move another database's objects and so even if it was "ALL", it
may only be moving a subset of the objects in the tablespace (namely
those which are in the current database). I don't see it being an
improvement to require "IN CURRENT DATABASE ALL OWNED" even though it
would be more accurate.

Not a good argument since IN CURRENT DATABASE applies to all SQL
commands, so would clearly be unnecessary.

At the moment, ALL does not include all objects. It's a POLA violation
to have a command affect just some objects and not others. That is
especially confusing when the command run as Superuser *will* move all
objects and a RC of zero has different meaning dependent upon who the
user is that executes the command.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Stephen Frost
sfrost@snowman.net
In reply to: Simon Riggs (#5)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

* Simon Riggs (simon@2ndQuadrant.com) wrote:

Not a good argument since IN CURRENT DATABASE applies to all SQL
commands, so would clearly be unnecessary.

I suppose it depends on how you're looking at it.

ALTER TABLESPACE ... RENAME, for example, updates a shared catalog and
therefore the change is seen across all databases. That's not exactly
"IN CURRENT DATABASE".

At the moment, ALL does not include all objects. It's a POLA violation
to have a command affect just some objects and not others. That is
especially confusing when the command run as Superuser *will* move all
objects and a RC of zero has different meaning dependent upon who the
user is that executes the command.

So you're still looking for an 'OWNED' noise word to be added? Also, I
did add the ability to specify types of objects (it's often that we'll
have a "INDEXES" tablespace, so this made sense), so how about:

ALTER TABLESPACE name MOVE OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE TABLES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE INDEXES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE MATERIALIZED VIEWS OWNED TO name opt_nowait

Removing the 'ALL' entirely?

Should there be an "OWNED BY name_list" option also, since that's how we
use 'OWNED' elsewhere? Should the use of "OWNED" elsewhere (eg:
REASSIGN OWNED BY) also support just 'OWNED' to mean the current role
(I'm not entirely sure how much sense that makes, but figured I'd ask).

Thanks,

Stephen

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stephen Frost (#6)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

Stephen Frost <sfrost@snowman.net> writes:

So you're still looking for an 'OWNED' noise word to be added? Also, I
did add the ability to specify types of objects (it's often that we'll
have a "INDEXES" tablespace, so this made sense), so how about:

ALTER TABLESPACE name MOVE OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE TABLES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE INDEXES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE MATERIALIZED VIEWS OWNED TO name opt_nowait

Removing the 'ALL' entirely?

What if you're a superuser and you want to move everybody's objects
(perhaps in preparation for dropping the tablespace)? I think there's
value in both the ALL and OWNED forms.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Simon Riggs
simon@2ndQuadrant.com
In reply to: Stephen Frost (#6)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On 20 January 2014 15:46, Stephen Frost <sfrost@snowman.net> wrote:

So you're still looking for an 'OWNED' noise word to be added?

To clarify what the command is actually doing.

Also, I
did add the ability to specify types of objects (it's often that we'll
have a "INDEXES" tablespace, so this made sense), so how about:

ALTER TABLESPACE name MOVE OWNED TO name opt_nowait

The ALL seems to have value. "MOVE ALL OWNED TO" sounds better.

ALTER TABLESPACE name MOVE TABLES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE INDEXES OWNED TO name opt_nowait

On those two, I think the docs need to be clearer that we mean that
TABLES means tables, and yes we leave the indexes behind. Or that
INDEXES means "and we leave the tables behind. This is intended to
more easily separate tables and indexes into their own tablespaces."
or similar.

ALTER TABLESPACE name MOVE MATERIALIZED VIEWS OWNED TO name opt_nowait

Removing the 'ALL' entirely?

Should there be an "OWNED BY name_list" option also, since that's how we
use 'OWNED' elsewhere? Should the use of "OWNED" elsewhere (eg:
REASSIGN OWNED BY) also support just 'OWNED' to mean the current role
(I'm not entirely sure how much sense that makes, but figured I'd ask).

Maybe.

I'm not clamouring for squeezing additional goodies from you, just to
make a small change to avoid later confusion (for ALL users ;-) )

Good feature, thanks for working on it.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Stephen Frost
sfrost@snowman.net
In reply to: Tom Lane (#7)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

* Tom Lane (tgl@sss.pgh.pa.us) wrote:

What if you're a superuser and you want to move everybody's objects
(perhaps in preparation for dropping the tablespace)? I think there's
value in both the ALL and OWNED forms.

A superuser is considered to 'own' all objects and so 'ALL' and 'OWNED'
above would be the same when issued by a superuser, in the current
implementation.

Looking at DROP OWNED and REASSIGN OWNED, they operate at the more
specific level of "OWNED" == "relowner" rather than if the role is
considered an 'owner' of the object through role membership, as you are
implying above.

As such, I'll rework this to be more in-line with the existing OWNED BY
semantics of REASSIGN OWNED BY and DROP OWNED BY, which means we'd have:

ALTER TABLESPACE name MOVE [ ALL | OWNED [ BY reluser ] ]
[ TABLES | INDEXES | MATERIALIZED VIEWS ] TO name opt_nowait

eg:

ALTER TABLESPACE tblspc1 MOVE ALL TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE TABLES OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE ALL OWNED BY myrole TO tblspc2;

Thoughts?

Thanks,

Stephen

#10Stephen Frost
sfrost@snowman.net
In reply to: Simon Riggs (#8)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

* Simon Riggs (simon@2ndQuadrant.com) wrote:

ALTER TABLESPACE name MOVE OWNED TO name opt_nowait

The ALL seems to have value. "MOVE ALL OWNED TO" sounds better.

I could go either way on this, really.

ALTER TABLESPACE name MOVE TABLES OWNED TO name opt_nowait
ALTER TABLESPACE name MOVE INDEXES OWNED TO name opt_nowait

On those two, I think the docs need to be clearer that we mean that
TABLES means tables, and yes we leave the indexes behind. Or that
INDEXES means "and we leave the tables behind. This is intended to
more easily separate tables and indexes into their own tablespaces."
or similar.

Sure, I can certainly improve the documentation on that.

I'm not clamouring for squeezing additional goodies from you, just to
make a small change to avoid later confusion (for ALL users ;-) )

:) What are your thoughts on what I just proposed to Tom?

Good feature, thanks for working on it.

Thanks!

Stephen

#11Simon Riggs
simon@2ndQuadrant.com
In reply to: Stephen Frost (#9)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On 20 January 2014 17:00, Stephen Frost <sfrost@snowman.net> wrote:

* Tom Lane (tgl@sss.pgh.pa.us) wrote:

What if you're a superuser and you want to move everybody's objects
(perhaps in preparation for dropping the tablespace)? I think there's
value in both the ALL and OWNED forms.

A superuser is considered to 'own' all objects and so 'ALL' and 'OWNED'
above would be the same when issued by a superuser, in the current
implementation.

Looking at DROP OWNED and REASSIGN OWNED, they operate at the more
specific level of "OWNED" == "relowner" rather than if the role is
considered an 'owner' of the object through role membership, as you are
implying above.

As such, I'll rework this to be more in-line with the existing OWNED BY
semantics of REASSIGN OWNED BY and DROP OWNED BY, which means we'd have:

ALTER TABLESPACE name MOVE [ ALL | OWNED [ BY reluser ] ]
[ TABLES | INDEXES | MATERIALIZED VIEWS ] TO name opt_nowait

eg:

ALTER TABLESPACE tblspc1 MOVE ALL TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE TABLES OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE ALL OWNED BY myrole TO tblspc2;

Sounds great, thanks.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Fujii Masao
masao.fujii@gmail.com
In reply to: Simon Riggs (#11)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On Tue, Jan 21, 2014 at 1:33 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 20 January 2014 17:00, Stephen Frost <sfrost@snowman.net> wrote:

* Tom Lane (tgl@sss.pgh.pa.us) wrote:

What if you're a superuser and you want to move everybody's objects
(perhaps in preparation for dropping the tablespace)? I think there's
value in both the ALL and OWNED forms.

A superuser is considered to 'own' all objects and so 'ALL' and 'OWNED'
above would be the same when issued by a superuser, in the current
implementation.

Looking at DROP OWNED and REASSIGN OWNED, they operate at the more
specific level of "OWNED" == "relowner" rather than if the role is
considered an 'owner' of the object through role membership, as you are
implying above.

As such, I'll rework this to be more in-line with the existing OWNED BY
semantics of REASSIGN OWNED BY and DROP OWNED BY, which means we'd have:

ALTER TABLESPACE name MOVE [ ALL | OWNED [ BY reluser ] ]
[ TABLES | INDEXES | MATERIALIZED VIEWS ] TO name opt_nowait

eg:

ALTER TABLESPACE tblspc1 MOVE ALL TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE TABLES OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE ALL OWNED BY myrole TO tblspc2;

Sounds great, thanks.

We should add the tab-completion for ALTER TABLESPACE MOVE?
Attached does that.

Regards,

--
Fujii Masao

Attachments:

alter_tablespace_move_tab_complete_v1.patchtext/x-patch; charset=US-ASCII; name=alter_tablespace_move_tab_complete_v1.patchDownload+30-9
#13Fujii Masao
masao.fujii@gmail.com
In reply to: Fujii Masao (#12)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

On Thu, Jan 30, 2014 at 8:47 PM, Fujii Masao <masao.fujii@gmail.com> wrote:

On Tue, Jan 21, 2014 at 1:33 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 20 January 2014 17:00, Stephen Frost <sfrost@snowman.net> wrote:

* Tom Lane (tgl@sss.pgh.pa.us) wrote:

What if you're a superuser and you want to move everybody's objects
(perhaps in preparation for dropping the tablespace)? I think there's
value in both the ALL and OWNED forms.

A superuser is considered to 'own' all objects and so 'ALL' and 'OWNED'
above would be the same when issued by a superuser, in the current
implementation.

Looking at DROP OWNED and REASSIGN OWNED, they operate at the more
specific level of "OWNED" == "relowner" rather than if the role is
considered an 'owner' of the object through role membership, as you are
implying above.

As such, I'll rework this to be more in-line with the existing OWNED BY
semantics of REASSIGN OWNED BY and DROP OWNED BY, which means we'd have:

ALTER TABLESPACE name MOVE [ ALL | OWNED [ BY reluser ] ]
[ TABLES | INDEXES | MATERIALIZED VIEWS ] TO name opt_nowait

eg:

ALTER TABLESPACE tblspc1 MOVE ALL TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE TABLES OWNED BY myrole TO tblspc2;
ALTER TABLESPACE tblspc1 MOVE ALL OWNED BY myrole TO tblspc2;

Sounds great, thanks.

We should add the tab-completion for ALTER TABLESPACE MOVE?
Attached does that.

Committed.

Regards,

--
Fujii Masao

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#14Stephen Frost
sfrost@snowman.net
In reply to: Fujii Masao (#13)
Re: ALTER TABLESPACE ... MOVE ALL TO ...

* Fujii Masao (masao.fujii@gmail.com) wrote:

We should add the tab-completion for ALTER TABLESPACE MOVE?
Attached does that.

Committed.

Thanks! I had planned to get to it, but appreciate your handling of it.

Stephen