Обсуждение: Problem Backing Up a DB
Hello,
I have a problem with backing up a database. The original db runs on a SuSE
ES 9 box in Unicode. Version 7.4.2
The recovery db is supposed to run on a windows xp box. The encoding is
UTF-8. Version 8.1
On the linux box I did:
pg_dumpall > outfile
On the windows box I did:
psql -f outfile authdb
Problem is when I reload the db in this manner the sequences for the id
column gets messed up ("user_auth_id2_seq"). The count starts from 1 again
when I insert a new row. :o(
For error output please see below. I already created the empty db authdb on
the recovery instance because otherwise an error is thrown.
Cheers,
Pete
C:\Programme\PostgreSQL\8.1\bin>psql -f C:/pgsqldump_20-04-07.sql authdb
Password:
You are now connected to database "template1".
psql:C:/pgsqldump_20-04-07.sql:11: ERROR: cannot delete from a view
HINT: You need an unconditional ON DELETE DO INSTEAD rule.
psql:C:/pgsqldump_20-04-07.sql:13: NOTICE: SYSID can no longer be specified
psql:C:/pgsqldump_20-04-07.sql:13: ERROR: role "admin" already exists
psql:C:/pgsqldump_20-04-07.sql:14: NOTICE: SYSID can no longer be specified
psql:C:/pgsqldump_20-04-07.sql:14: ERROR: role "foo" already exists
psql:C:/pgsqldump_20-04-07.sql:15: NOTICE: SYSID can no longer be specified
psql:C:/pgsqldump_20-04-07.sql:15: ERROR: role "www" already exists
psql:C:/pgsqldump_20-04-07.sql:22: ERROR: cannot delete from a view
HINT: You need an unconditional ON DELETE DO INSTEAD rule.
psql:C:/pgsqldump_20-04-07.sql:24: NOTICE: SYSID can no longer be specified
psql:C:/pgsqldump_20-04-07.sql:24: ERROR: role "www" already exists
psql:C:/pgsqldump_20-04-07.sql:25: ERROR: role "www" is a member of role
"www"
psql:C:/pgsqldump_20-04-07.sql:32: ERROR: database "authdb" already exists
You are now connected to database "authdb".
SET
SET
SET
REVOKE
GRANT
SET
SET
psql:C:/pgsqldump_20-04-07.sql:83: NOTICE: CREATE TABLE will create
implicit sequence "user_aut
umn "user_auth.id"
CREATE TABLE
REVOKE
GRANT
CREATE TABLE
CREATE TABLE
REVOKE
GRANT
SET
psql:C:/pgsqldump_20-04-07.sql:157: NOTICE: CREATE TABLE will create
implicit sequence "login_i
"login.id"
CREATE TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:173: NOTICE: CREATE TABLE will create
implicit sequence "antwort
lumn "antworten.id"
CREATE TABLE
psql:C:/pgsqldump_20-04-07.sql:188: NOTICE: CREATE TABLE will create
implicit sequence "beitrae
lumn "beitraege.id"
CREATE TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:203: NOTICE: CREATE TABLE will create
implicit sequence "user_lo
umn "user_log.id"
CREATE TABLE
REVOKE
SET
SET
SET
SET
SET
psql:C:/pgsqldump_20-04-07.sql:5010: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
table "user_auth"
ALTER TABLE
psql:C:/pgsqldump_20-04-07.sql:5019: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
le "contentlist_summary"
ALTER TABLE
psql:C:/pgsqldump_20-04-07.sql:5028: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
table "user_data"
ALTER TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:5039: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
ble "login"
ALTER TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:5050: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
for table "antworten"
ALTER TABLE
psql:C:/pgsqldump_20-04-07.sql:5059: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
for table "beitraege"
ALTER TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:5070: NOTICE: ALTER TABLE / ADD PRIMARY KEY
will create implicit
or table "user_log"
ALTER TABLE
SET
psql:C:/pgsqldump_20-04-07.sql:5080: ERROR: relation "user_auth_id2_seq"
does not exist
setval
--------
58
(1 row)
setval
--------
1
(1 row)
setval
--------
1
(1 row)
SET
setval
--------
28
(1 row)
SET
COMMENT
You are now connected to database "template1".
SET
SET
SET
REVOKE
GRANT
SET
COMMENT
SET
COMMENT
Peter Neu wrote:
> Hello,
>
> I have a problem with backing up a database. The original db runs on a SuSE
> ES 9 box in Unicode. Version 7.4.2
If you're keeping this installation, see about upgrading to the latest 7.4.x
> The recovery db is supposed to run on a windows xp box. The encoding is
> UTF-8. Version 8.1
>
> On the linux box I did:
> pg_dumpall > outfile
>
> On the windows box I did:
>
> psql -f outfile authdb
OK. First, it's always better to use a more recent pg_dump if possible.
If your linux box is accessible from the XP machine you can just do
something like:
C:\Program File\...\pg_dump -h <linux-box-name-or-ip> -U postgres -d
<dbname> -F c > mydb.dump
Secondly, you probably want to dump the single database and then any
users separately. Do this as a superuser (e.g. postgres) and use the
custom format (-F c) for maximum flexibility.
Then you can use pg_restore to restore to your target DB.
> Problem is when I reload the db in this manner the sequences for the id
> column gets messed up ("user_auth_id2_seq"). The count starts from 1 again
> when I insert a new row. :o(
>
> For error output please see below. I already created the empty db authdb on
> the recovery instance because otherwise an error is thrown.
pg_restore can create the DB for you.
Well, it looks like setval() is being called at least four times, and
two of those have values > 1.
> setval
> --------
> 58
> setval
> --------
> 1
> setval
> --------
> 1
> setval
> --------
> 28
Try a later version of pg_dump and see if that does the trick.
--
Richard Huxton
Archonet Ltd
Don't forget to cc: the mailing list. Peter Neu wrote: > Hello, > > thanks for the fast reply. This works. I don't really need the dumpall > because I usually just back up one db. > > I noticed the dump is now a binary file. Means that I will have to migrate > to 7.4.17 if this is the preferable release because 7.4.2 can't read the > binary file I suppose. Backup files in general don't work between versions. This is why you were having problems. However, pg_dump knows about older versions of the database and can read from them. If you want to transfer data from 7.4 to 8.1, use the pg_dump/pg_restore from 8.1. If you want to go backwards (8.1 to 7.4) you can't (in general - you can usually tweak an SQL file to get you there). The binary file can be used to generate your SQL with INSERTs or COPY commands as desired, or even do selective restores (--list/--use-list) direct to a database. > The windows box was just for testing purposes. The productive database will > run again on a linux machine if the current one fails. > > So, is this problem I encountered just happening because I switched from 7.x > to the 8.x release or is there a general problem with this particular > PostgreSQL release? A dump for one 7.4 database should transfer to another 7.4 database just fine. > The standby linux machine would also run 7.4.2 because it ships with SuSE ES > 9. Presumably ES9 includes bugfixes, so it must include a version later than 7.4.2 (or perhaps have its own numbering system for updates e.g. 7.4.2-11). If not, I'd suggest: 1. Cancelling your subscription for SuSE support and spending the money on a crate of good single-malt whisky(*) instead. The whisky will provide the same level of reliability for your database and is also more sociable. 2. Upgrade to 7.4.17 - that way you'll have the 15 different sets of bug fixes that the developers have provided. If you want to know what they all are, go here: http://www.postgresql.org/docs/7.4/static/release.html#RELEASE-7-4-17 Some of them are important to have, so you *do* want them. (*) Other beverages are available. If you do not partake of alcohol, consider a small artwork instead. HTH -- Richard Huxton Archonet Ltd