Próbuję skopiować całą tabelę z jednej bazy danych do innej w Postgres. Jakieś sugestie?
Próbuję skopiować całą tabelę z jednej bazy danych do innej w Postgres. Jakieś sugestie?
Odpowiedzi:
Wyodrębnij tabelę i potokuj ją bezpośrednio do docelowej bazy danych:
pg_dump -t table_to_copy source_db | psql target_db
Uwaga: jeśli inna baza danych ma już skonfigurowaną tabelę, powinieneś użyć -a
flagi do importowania tylko danych, w przeciwnym razie możesz zobaczyć dziwne błędy, takie jak „Brak pamięci”:
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
flagi tylko do danych . tj pg_dump -a -t my_table my_db | psql target_db
. Skoro już tu jestem, jeśli twoja baza danych znajduje się na serwerze, łatwiej mi po prostu zrzucić bazę danych do pliku, a następnie przesłać ten plik do bazy danych, a następnie wysłać zawartość pliku do psql. np. pg_dump -a -t my_table my_db > my_file.sql
i po umieszczeniu tego na serwerze ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Zauważ, że pojedyncze i podwójne cudzysłowy otaczają nazwę tabeli
Możesz także użyć funkcji tworzenia kopii zapasowych w pgAdmin II. Wystarczy wykonać następujące kroki:
Działa dobrze i może wykonywać wiele tabel jednocześnie.
Objects
sekcji możesz wybrać wiele tabel . W systemie OSX kliknij przycisk SQL lub skorzystaj SQL Editor
z Tools
menu, aby wkleić SQL skopiowany z pliku kopii zapasowej.
Korzystanie z dblink byłoby wygodniejsze!
truncate table tableA;
insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
'select a,b from tableA')
as t1(a text,b text);
Za pomocą psql na hoście Linux, który ma łączność z obydwoma serwerami
( export PGPASSWORD=password1
psql -U user1 -h host1 database1 \
-c "copy (select field1,field2 from table1) to stdout with csv" ) \
|
( export PGPASSWORD=password2
psql -U user2 -h host2 database2 \
-c "copy table2 (field1, field2) from stdin csv" )
PGPASSWORD=password1 psql -U ...
więc nie potrzebujesz nawet jawnych podpowłok! Zwykle najpierw musisz zrobić kilka rzeczy, aby skonfigurować, więc podpowłoki mogą być konieczne. Ponadto hasła nie będą eksportowane do kolejnych procesów. Dzięki!
pg_dump -t '<table_name>' --schema-only
Najpierw zainstaluj dblink
Następnie zrobiłbyś coś takiego:
INSERT INTO t2 select * from
dblink('host=1.2.3.4
user=*****
password=******
dbname=D1', 'select * t1') tt(
id int,
col_1 character varying,
col_2 character varying,
col_3 int,
col_4 varchar
);
INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));
(l oznacza lokalny, r jest zdalny.
Użyj pg_dump, aby zrzucić dane tabeli, a następnie przywróć je za pomocą psql.
Jeśli masz oba serwery zdalne, możesz wykonać następujące czynności:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Skopiuje wspomnianą tabelę źródłowej bazy danych do tej samej nazwanej tabeli docelowej bazy danych, jeśli masz już istniejący schemat.
Możesz wykonać następujące czynności:
pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>
Aby przenieść tabelę z bazy danych A do bazy danych B w konfiguracji lokalnej, użyj następującego polecenia:
pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2
export PGPASSWORD=<passw>
przed uruchomieniem polecenia
Wypróbowałem tutaj niektóre rozwiązania, które były bardzo pomocne. Z mojego doświadczenia wynika, że najlepszym rozwiązaniem jest użycie wiersza polecenia psql , ale czasami nie mam ochoty używać wiersza polecenia psql. Oto kolejne rozwiązanie dla pgAdminIII
create table table1 as(
select t1.*
from dblink(
'dbname=dbSource user=user1 password=passwordUser1',
'select * from table1'
) as t1(
fieldName1 as bigserial,
fieldName2 as text,
fieldName3 as double precision
)
)
Problem z tą metodą polega na tym, że należy wpisać nazwę pól i ich typy tabeli, którą chcesz skopiować.
pg_dump
nie zawsze działa.
Biorąc pod uwagę, że masz ten sam ddl tabeli w obu dbs, możesz zhakować go ze stdout i stdin w następujący sposób:
# grab the list of cols straight from bash
psql -d "$src_db" -t -c \
"SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_name='"$table_to_copy"'"
# ^^^ filter autogenerated cols if needed
psql -d "$src_db" -c \
"copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"
Takie same jak odpowiedzi użytkownika 5542464 i Piyush S. Wanare, ale podzielone na dwa etapy:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
w przeciwnym razie potok poprosi o dwa hasła w tym samym czasie.
Musisz użyć DbLink, aby skopiować dane jednej tabeli do innej tabeli w innej bazie danych. Musisz zainstalować i skonfigurować rozszerzenie DbLink, aby wykonać kwerendę między bazami danych.
Stworzyłem już szczegółowy post na ten temat. Proszę odwiedzić ten link
Sprawdź ten skrypt Pythona
python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);
Jeśli obie bazy danych (od & do) są chronione hasłem, w takim scenariuszu terminal nie poprosi o hasło dla obu baz danych, monit o podanie hasła pojawi się tylko raz. Aby to naprawić, podaj hasło wraz z poleceniami.
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
Korzystałem z DataGrip (autor: Intellij Idea). i bardzo łatwo było skopiować dane z jednej tabeli (z innej bazy danych do innej).
Najpierw upewnij się, że masz połączenie z obydwoma źródłami danych w Data Grip.
Wybierz opcję Tabela źródłowa i naciśnij klawisz F5 lub (kliknij prawym przyciskiem myszy -> Wybierz opcję Kopiuj tabelę do.)
Spowoduje to wyświetlenie listy wszystkich tabel (możesz także wyszukiwać, używając nazwy tabeli w wyskakującym oknie). Po prostu wybierz cel i naciśnij OK.
DataGrip zajmie się wszystkim za Ciebie.
Jeśli uruchomisz pgAdmin (Backup:, pg_dump
Restore :) w pg_restore
systemie Windows, spróbuje on domyślnie wypisać plik c:\Windows\System32
i dlatego pojawi się błąd odmowy uprawnień / dostępu, a nie dlatego, że postgres użytkownika nie jest wystarczająco podniesiony. Uruchom pgAdmin jako Administrator lub po prostu wybierz lokalizację wyjściową inną niż foldery systemowe Windows.
Alternatywnie możesz również udostępnić zdalne tabele jako tabele lokalne za pomocą rozszerzenia opakowania danych obcych. Następnie możesz wstawić do swoich tabel, wybierając z tabel w zdalnej bazie danych. Jedynym minusem jest to, że nie jest bardzo szybki.