Send netdisco-users mailing list submissions to
        netdisco-users@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.sourceforge.net/lists/listinfo/netdisco-users
or, via email, send a message with subject or body 'help' to
        netdisco-users-requ...@lists.sourceforge.net

You can reach the person managing the list at
        netdisco-users-ow...@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than "Re: Contents of netdisco-users digest..."
Today's Topics:

   1. Re: [EXTERNAL] Re: How to copy postgresql when Docker'izing
      (Eric Bates)
--- Begin Message ---
Yes, thank you.

It's working! w00t!

For the mailing list archive record, here is how I managed it. To some extent, 
this will not necessarily be accurate with later versions; but the gist should 
be the same. Note also that while I'm quite familiar with MariaDB, I have 
little experience with postgresql; so this can certainly be improved upon.

The docker version of postgresql is 13.2 while the Ubuntu version is 16; so 
most of the pain occurs because you cannot really downgrade postgres data. 
Google is not much help searching for strings like "downgrade postgres x to 
postgres y." With good reason.

You cannot rsync the data files (incompatible versions) and you can only use 
the ASCII version of a dump because you're going to have to edit the newer 
version 16 dump before the older version 13 will import it without errors.

I did all the db manipulation with only the netdisco-postgresql container 
running (specify netdisco-postgresql in your "docker compose up" command so 
that the other 2 containers (there is a 4th container, but netdisco-do doesn't 
start automatically) don't also start and attempt to connect to the postgres.

  *   dump your existing netdisco database
pg_dump --clean --create -d netdisco -f netdisco_dump_v4_ascii.sql
  *   copy the dump to your container (I put it in the "pgdata" folder) and 
open it in an editor.
  *   Find the line that begins with "CREATE DATABASE" and delete the text 
string "LOCALE_PROVIDER = libc". That is an option which postgresql v13 simply 
doesn't grok.
  *   Thanks to Christian's excellent help, I then deleted the existing 
"netdisco" database in the container explicitly. There is a "DROP DATABASE" 
command at the beginning of the sql dump due to the "--clean" option; but it's 
not clear that it's being executed. The only time I tried I still had the bogus 
"LOCALE_PROVIDER = libc" flag in the CREATE command; so it's possible that that 
error had something to do with the non-DROP. Here's how to do it manually:
docker exec netdisco-postgresql psql -U postgres postgres

postgres=# drop database netdisco;
And finally hit [ctrl]-d to end the session.

  *   Now, with the text edit and the pre-deleted database, the import is more 
likely to succeed. Reports on Reddit and whatnot suggest that performing the 
import within the container is faster than importing from outside the 
container; but my netdisco database wasn't big enough to take more than a few 
seconds anyway. But here are the two different techniques:
     *

external:
docker exec netdisco-postgresql psql -U postgres postgres < 
./appdata/pgdata/netdisco-backup.sql

     *   internal:
docker exec -ti netdisco-postgresql bash
bash# psql -U postgres postgres < /var/lib/postgresql/data/netdisco-backup.sql
  *   Copy in your deployment.yml to the config folder
Note that cloning your netdisco db does not include postgres authentication. So 
you might have to edit deployment.yml with a new password. There is a 
"netdisco" user already configured in the db as distributed with the 
netdisco-postgresql with a password of 'netdisco'; so you can use that or you 
can use the above psql prompt command and change the password to match your 
deployment.yml.
Not sure about this, but it appears that "hostname" for the postgresql 
parameters should remain commented out in spite of the fact that netdisco needs 
to reach the host name 'netdisco-postgresql'. Presumably this is because the 
environment variable NETDISCO_DB_HOST set in the compose file will override it?
  *   Now it's safe to start up the netdisco-web and netdisco-backend 
containers.
  *   check your logs (I like dozzle to see netdisco-web). Hopefully there are 
no errors.

Thanks again for the help.

On 4/10/25 15:09, Christian Ramseyer wrote:

This email originated outside of WHOI. Please use caution if clicking on links 
or opening attachments.

Yes --clean and --create is even better. I suspect the drop database
fails because the other containers in the docker-compose have
connections open, or because you are connected to it yourself.

I'd try explicitly only starting the one container, initially connect to
the "postgres" db instead of netdisco, drop netdisco manually, then load
the dump from there:

  docker-compose up -d
  docker-compose stop
  docker-compose start netdisco-postgresql
  docker-compose exec netdisco-postgresql psql -U postgres postgres

  postgres=# drop database netdisco;
  DROP DATABASE
  CTRL-D to exit

# now you are sure to load into an empty db, you can also just read the
file from the host with redirection like so:

docker-compose exec -T netdisco-postgresql psql -U postgres postgres <
../netdisco-backup.sql

Good luck!

PS the unsupported version (1.15) refers to the archive file format
pg_dump -Fc but I wouldn't bother with that. The plain text dump should
work fine.


On 10.04.2025 20:50, Eric Bates wrote:


Thank you.

Tried using both --clean and --create. It doesn't help. Not even clear
that the two sets of error messages even differ. It's quite confusing
because even tho there is a "DROP netdisco" at the beginning of the dump
file; I still get the "already exists" errors.

Also tried using -Fc and pg_restore instead of redirecting the dump file
to psql. Similar to the rsync attempt pg_restore refuses to run because
of the postgresql version difference:

bash-5.1# pg_restore -d netdisco /var/lib/postgresql/data/netdisco_dump.sql
pg_restore: error: unsupported version (1.15) in file header

That's also kind of confusing because the netdisco-postgresql version is
13.2 and the Ubuntu version is 16. No idea where "1.15" is coming from.

On 4/10/25 13:11, Christian Ramseyer wrote:


This email originated outside of WHOI. Please use caution if clicking on links 
or opening attachments.

If you just run pg_dump with -c, it will include drops for all the
objects first and your restore should work a lot better.

Cheers
Christian

On 10.04.2025 15:11, Eric Bates wrote:


Thanks for this amazing program.


We're trying to migrate our Netdisco from a "standard" Ubuntu install to
a Docker container and I'm stuck trying to copy the postgres data.

Ubuntu currently installs postgres 16 and the netdisco-postgresql image
is postgres 13; so, unfortunately, I can't simply rsync the postgresql
data directory. Doing so results in the following postgres error:

netdisco-postgresql  | 2025-04-10 12:52:43.716 UTC [1] FATAL:  database
files are incompatible with server
netdisco-postgresql  | 2025-04-10 12:52:43.716 UTC [1] DETAIL: The data
directory was initialized by PostgreSQL version 16, which is not
compatible with this version 13.4.

So I dumped the data from the existing netdisco:

pg_dump -Unetdisco -W netdisco > netdisco.sql

copied the file into the container's pgdata folder. Fired up just the
postgres image and shelled in:

$ docker compose -f compose-netdisco.yaml up netdisco-postgresql -d
[+] Running 1/1
     ✔ Container netdisco-postgresql
Started                                               0.2s

$ docker exec -it netdisco-postgresql bash
bash-5.1#

Finally I attempted to restore the copied data within the container:

bash-5.1# psql -Unetdisco netdisco < /var/lib/postgresql/data/netdisco.sql

The difficulty at this stage is that the restore attempt generates
dozens of errors. Many of them are of the "already exists" variety; so I
don't think I need to worry about them:

ERROR:  relation "user_log" already exists

However, there are other errors which look more serious (a small sample):

ERROR:  column "leaf" of relation "device_browser" does not exist
invalid command \.

ERROR:  multiple primary keys for table "admin" are not allowed
ERROR:  multiple primary keys for table "community" are not allowed

etc.

Is there a recommended way to copy the postgres?

Thanks for your time.



_______________________________________________
Netdisco mailing list
netdisco-users@lists.sourceforge.net<mailto:netdisco-users@lists.sourceforge.net>
https://sourceforge.net/p/netdisco/mailman/netdisco-users/


--
Christian Ramseyer, netnea ag
Network Management. Security. OpenSource.
https://www.netnea.com/
Phone: +41 79 644 77 64




--
Christian Ramseyer, netnea ag
Network Management. Security. OpenSource.
https://www.netnea.com/
Phone: +41 79 644 77 64




Attachment: smime.p7m
Description: smime.p7m


--- End Message ---
_______________________________________________
Netdisco mailing list - Digest Mode
netdisco-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/netdisco-users

Reply via email to