0

We had an EC2 instance running PostgreSQL. We created a new EBS volume for our more important DBs and stored them on the new volume by creating new tables spaces and setting their location. The system DBs were left in the default tablespace and location. Unfortunately the instance was accidentally terminated. We are trying to restore PostgreSQL with the databases.

The databases were on the EBS volume. We have spun up a new instance and have mounted the EBS volume and we can see the files. Is there any way we can get our files back?

András Váczi
31.8k13 gold badges103 silver badges152 bronze badges
asked Dec 20, 2017 at 14:17
2
  • If you don't have PostgreSQL running on your new instance, install/start it. Then it should be fairly easy to set data_directory to your EBS volume mount. Also, what do you mean by VM? Commented Dec 20, 2017 at 14:34
  • @dezso We tried that, it didn't work. by VM I mean AWS EC2 VM. I think that might not work because when we created the database we used a different tablespace. (I remember we used a different location). All the system databases were left in the standard installation location. Commented Dec 20, 2017 at 14:46

1 Answer 1

2

As dezso said, its easy to change the data directory.

But I did a small PoC for this. So its possible to use existing physical files to another Postgresql.

Limitations

  • The new PostgreSQL should be the same version.
  • New PostgreSQL data directory and custom tablespace directory should be same.

My Postgresql config:

  • OS: Ubuntu 16.04
  • Postgresql 9.4

Install and config a sample database

apt-get install postgresql-9.4
mkdir /opt/pgdata
chown -R postgres:postgres /opt/pgdata
--in psql
create tablespace db LOCATION '/opt/pgdata/';
create database bhuvi with tablespace db;
\c bhuvi
create table test (id int);
insert into test values (1),(2),(3),(4),(5);
bhuvi=# select * from test;
 id
----
 1
 2
 3
 4
 5
(5 rows)

Remove the PostgreSQL

--take a copy of Data direcory and table space directory
cp -R /var/lib/postgresql/9.4/main/ /opt
cp -R /opt/pgdata /opt/pgdata_bak
--clean up postgresql
apt-get remove --purge postgresql-9.4
apt-get autoclean
apt-get autoremove
rm -rf /etc/postgresql
rm -rf /var/lib/postgresql/
rm -rf /var/log/postgresql/
rm -rf /opt/pgdata 

Fresh install and Replace old data and Tablespace directories

-- Reinstall
apt-get install postgresql-9.4
service postgresql stop
rm -rf /var/log/postgresql/9.4/main/
cp -R /opt/main /var/log/postgresql/9.4/
cp -R /opt/pgdata_bak /opt/pgdata
chown -R postgres:postgres /var/log/postgresql/9.4/main/
chown -R postgres:postgres /opt/pgdata
service postgresql start

Now check the new Postgresql

--in psql
\l+
 Name | Owner | Encoding |
-----------+----------+----------+
 bhuvi | postgres | UTF8 |
 postgres | postgres | UTF8 |
 template0 | postgres | UTF8 |
 | | |
 template1 | postgres | UTF8 |
 | | |
bhuvi=# \dt
 List of relations
 Schema | Name | Type | Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)
bhuvi=# select * from test ;
 id
----
 1
 2
 3
 4
 5
(5 rows)
answered Dec 20, 2017 at 17:52
3
  • The data_directory was in the standard directory on the VM. /var/postgres/9.3/ and the tablespace I created on the EBS volume and mounted it t /data/dbs. In the limitations, are you saying that the limitation was the existing setup, or that the new setup the data_directory and tablespace must be in the same dir. We have no control over previous, but I am happy to move to new layout. EDIT: Sorry I see you said new. Read too quickly Commented Dec 20, 2017 at 19:19
  • In your sample I see you are copying over what you originally had in the data_directory. We no longer have access to the original data directory, only the files in the new tablespace. If we installed a brand new Postgres and then just copied the tablespace files in the new data directory should that work? Commented Dec 20, 2017 at 19:22
  • I did on more PoC, I'll update the answer, Its possible Commented Dec 21, 2017 at 5:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.