Jika Anda baik-baik saja dengan menginstal DBeaver, ia memiliki cara yang sangat sederhana untuk mentransfer antara dua basis data yang terhubung. Cukup klik kanan tabel sumber dan pilih Ekspor Data, targetkan tabel Database dan tetapkan target sebagai database tujuan.
rovyko
Jawaban:
311
Ekstrak tabel dan pipa langsung ke database target:
Catatan: Jika database lain sudah menyiapkan tabel, Anda harus menggunakan -abendera untuk mengimpor data saja, jika tidak, Anda akan melihat kesalahan aneh seperti "Kehabisan memori":
Bagaimana ini akan bekerja untuk tautan remote-db? Misalnya, saya harus membuang dari lokasi yang berbeda.
curlyreggie
17
@curlyreggie belum mencoba ini, tapi saya tidak melihat alasan mengapa itu tidak berhasil. Coba tambahkan spesifik pengguna dan server ke perintah, seperti sopg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
thomax
2
Anda dapat mencoba ini: "pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server"
Hua Zhang
18
perhatikan bahwa jika database lain sudah memiliki tabel diatur, Anda harus menggunakan -abendera hanya untuk data . yaitu pg_dump -a -t my_table my_db | psql target_db. Sementara saya di sini, Jika database Anda ada di server, saya merasa lebih mudah untuk hanya membuang database ke file dan kemudian scp file itu ke database, kemudian mengirim isi file ke psql. mis pg_dump -a -t my_table my_db > my_file.sqldan setelah meletakkan itu di server Anda ->psql my_other_db < my_file.sql
Nick Brady
3
@EamonnKenny untuk membuang meja case-sensitive, lakukan: pg_dump -t '"tableToCopy"' source_db | psql target_db. Perhatikan bahwa tanda kutip tunggal DAN ganda mengelilingi nama tabel
gilad mayani
105
Anda juga dapat menggunakan fungsionalitas cadangan di pgAdmin II. Ikuti saja langkah-langkah ini:
Di pgAdmin, klik kanan tabel yang ingin Anda pindahkan, pilih "Cadangan"
Pilih direktori untuk file output dan atur Format ke "plain"
Klik tab "Opsi Dump # 1", centang "Hanya data" atau "hanya Skema" (tergantung pada apa yang Anda lakukan)
Di bawah bagian Pertanyaan, klik "Gunakan Sisipan Kolom" dan "Perintah Sisipan Pengguna".
Klik tombol "Cadangan". Ini menghasilkan file .backup
Buka file baru ini menggunakan notepad. Anda akan melihat skrip sisipan yang diperlukan untuk tabel / data. Salin dan tempel ini ke halaman sql database baru di pgAdmin. Jalankan sebagai pgScript - Query-> Jalankan sebagai pgScript F6
Bekerja dengan baik dan dapat melakukan banyak tabel sekaligus.
Ini adalah solusi berbasis gui yang bagus untuk memindahkan data antar database. Terima kasih!
kgx
3
Anda dapat memilih beberapa tabel di bawah Objectsbagian. Pada OSX, klik tombol SQL atau dapatkan SQL Editormelalui Toolsmenu untuk menempel di SQL yang disalin dari file cadangan.
Aleck Landgraf
berhasil, terima kasih. Sangat lambat meskipun di meja besar .. adakah cara yang lebih baik untuk mempercepatnya? (seperti mengabaikan kunci asing atau sesuatu?)
Tidak perlu ekspor, PGPASSWORD=password1 psql -U ...maka Anda bahkan tidak perlu subkulit eksplisit! Biasanya, Anda ingin melakukan beberapa hal untuk mengatur terlebih dahulu, jadi subshell mungkin diperlukan. Juga, kata sandi tidak akan diekspor ke proses selanjutnya. Terima kasih!
Penebusan Terbatas
1
@LimitedAtonement Sebenarnya Anda benar, ekspor dan subkulit tidak perlu. Itu hanya bagian dari skrip yang lebih rumit, dan bahkan saya tidak mencoba tanpa ekspor dan subkulit, jadi, saya memberikannya hanya untuk jujur dan memberikan solusi yang berhasil
Alexey Sviridov
Tabel harus ada di DB tujuan. Untuk membuatnya, cobapg_dump -t '<table_name>' --schema-only
Jawaban ini bagus karena memungkinkan seseorang untuk memfilter baris yang disalin (tambahkan klausa WHERE dalam argumen ke-2 dblink). Namun, kita perlu secara eksplisit tentang nama kolom (Postgres 9.4) dengan sesuatu seperti: 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 berarti lokal, r adalah remote. Escape tanda kutip tunggal. Berikan jenis col.)
hamx0r
14
Gunakan pg_dump untuk membuang data tabel, dan kemudian mengembalikannya dengan psql.
Apa yang saya lakukan salah? pg_dump -t "tablename" dbName --role "postgres"> db.sql "postgres" adalah pengguna yang saya coba atur perannya. Itu masih memberi saya "Akses ditolak".
nix
Apakah Anda memiliki izin untuk menulis file db.sql?
pcent
Bagaimana cara saya memeriksa izin apa yang saya miliki?
nix
Utas ini sudah tua, tetapi bagi siapa pun yang memiliki masalah, coba gunakan menu 'Alat -> Cadangan' di PgAdminIII, yang sepertinya mengatasi masalah izin.
John
13
Jika Anda memiliki kedua server jauh maka Anda dapat mengikuti ini:
Saya mencobanya. Ini tidak berfungsi karena Anda hanya dapat memberikan kata sandi pertama.
maks
1
@max dapat Anda lakukan export PGPASSWORD=<passw>sebelum menjalankan perintah
lukaszzenko
4
Saya mencoba beberapa solusi di sini dan mereka sangat membantu. Dalam pengalaman saya solusi terbaik adalah dengan menggunakan baris perintah psql , tetapi kadang-kadang saya tidak merasa ingin menggunakan baris perintah psql. Jadi, inilah solusi lain untuk pgAdminIII
createtable table1 as(select t1.*from dblink('dbname=dbSource user=user1 password=passwordUser1','select * from table1')as t1(
fieldName1 as bigserial,
fieldName2 as text,
fieldName3 asdoubleprecision))
Masalah dengan metode ini adalah bahwa nama bidang dan jenis tabel yang ingin Anda salin harus ditulis.
Mengingat Anda memiliki tabel ddl yang sama di kedua dbs, Anda dapat meretasnya dari stdout dan stdin sebagai berikut:
# 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"
Apakah ada kemungkinan saya bisa menyebutkan nama tabel database target?
Piyush S. Wanare
2
Anda harus menggunakan DbLink untuk menyalin satu tabel data ke tabel lain di database yang berbeda. Anda harus menginstal dan mengkonfigurasi ekstensi DbLink untuk menjalankan kueri basis data lintas.
Jika kedua DB (dari & ke) dilindungi kata sandi, di terminal skenario tidak akan meminta kata sandi untuk kedua DB, prompt kata sandi hanya akan muncul sekali. Jadi, untuk memperbaikinya, berikan kata sandi beserta perintahnya.
Jika Anda menjalankan pgAdmin (Cadangan:, pg_dumpPulihkan:) pg_restoredari Windows, ia akan mencoba menampilkan file secara default ke c:\Windows\System32dan itulah sebabnya Anda akan mendapatkan kesalahan Izin Izin / Akses dan bukan karena postgres pengguna tidak cukup tinggi. Jalankan pgAdmin sebagai Administrator atau cukup pilih lokasi untuk output selain folder sistem Windows.
Sebagai alternatif, Anda juga bisa mengekspos tabel jauh Anda sebagai tabel lokal menggunakan ekstensi pembungkus data asing. Anda kemudian dapat memasukkan ke dalam tabel Anda dengan memilih dari tabel di basis data jauh. Satu-satunya downside adalah bahwa itu tidak terlalu cepat.
Jawaban:
Ekstrak tabel dan pipa langsung ke database target:
Catatan: Jika database lain sudah menyiapkan tabel, Anda harus menggunakan
-a
bendera untuk mengimpor data saja, jika tidak, Anda akan melihat kesalahan aneh seperti "Kehabisan memori":sumber
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
bendera hanya untuk data . yaitupg_dump -a -t my_table my_db | psql target_db
. Sementara saya di sini, Jika database Anda ada di server, saya merasa lebih mudah untuk hanya membuang database ke file dan kemudian scp file itu ke database, kemudian mengirim isi file ke psql. mispg_dump -a -t my_table my_db > my_file.sql
dan setelah meletakkan itu di server Anda ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Perhatikan bahwa tanda kutip tunggal DAN ganda mengelilingi nama tabelAnda juga dapat menggunakan fungsionalitas cadangan di pgAdmin II. Ikuti saja langkah-langkah ini:
Bekerja dengan baik dan dapat melakukan banyak tabel sekaligus.
sumber
Objects
bagian. Pada OSX, klik tombol SQL atau dapatkanSQL Editor
melaluiTools
menu untuk menempel di SQL yang disalin dari file cadangan.Menggunakan dblink akan lebih mudah!
sumber
Menggunakan psql, pada host linux yang memiliki konektivitas ke kedua server
sumber
PGPASSWORD=password1 psql -U ...
maka Anda bahkan tidak perlu subkulit eksplisit! Biasanya, Anda ingin melakukan beberapa hal untuk mengatur terlebih dahulu, jadi subshell mungkin diperlukan. Juga, kata sandi tidak akan diekspor ke proses selanjutnya. Terima kasih!pg_dump -t '<table_name>' --schema-only
Pertama install dblink
Kemudian, Anda akan melakukan sesuatu seperti:
sumber
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 berarti lokal, r adalah remote. Escape tanda kutip tunggal. Berikan jenis col.)Gunakan pg_dump untuk membuang data tabel, dan kemudian mengembalikannya dengan psql.
sumber
Jika Anda memiliki kedua server jauh maka Anda dapat mengikuti ini:
Ini akan menyalin tabel sumber database yang disebutkan ke dalam tabel bernama database target yang sama, jika Anda sudah memiliki skema.
sumber
Anda dapat melakukan hal berikut:
sumber
Inilah yang bekerja untuk saya. Pembuangan pertama ke file:
lalu muat file yang dibuang:
sumber
Untuk memindahkan tabel dari database A ke basis data B di pengaturan lokal Anda, gunakan perintah berikut:
sumber
export PGPASSWORD=<passw>
sebelum menjalankan perintahSaya mencoba beberapa solusi di sini dan mereka sangat membantu. Dalam pengalaman saya solusi terbaik adalah dengan menggunakan baris perintah psql , tetapi kadang-kadang saya tidak merasa ingin menggunakan baris perintah psql. Jadi, inilah solusi lain untuk pgAdminIII
Masalah dengan metode ini adalah bahwa nama bidang dan jenis tabel yang ingin Anda salin harus ditulis.
sumber
pg_dump
tidak bekerja selalu.Mengingat Anda memiliki tabel ddl yang sama di kedua dbs, Anda dapat meretasnya dari stdout dan stdin sebagai berikut:
sumber
Sama seperti jawaban oleh user5542464 dan Piyush S. Wanare tetapi dibagi dalam dua langkah:
jika tidak, pipa akan menanyakan dua kata sandi secara bersamaan.
sumber
Anda harus menggunakan DbLink untuk menyalin satu tabel data ke tabel lain di database yang berbeda. Anda harus menginstal dan mengkonfigurasi ekstensi DbLink untuk menjalankan kueri basis data lintas.
Saya sudah membuat posting terperinci tentang topik ini. Silakan kunjungi tautan ini
sumber
Periksa skrip python ini
sumber
Jika kedua DB (dari & ke) dilindungi kata sandi, di terminal skenario tidak akan meminta kata sandi untuk kedua DB, prompt kata sandi hanya akan muncul sekali. Jadi, untuk memperbaikinya, berikan kata sandi beserta perintahnya.
sumber
Saya menggunakan DataGrip (By Intellij Idea). dan sangat mudah menyalin data dari satu tabel (dalam database yang berbeda ke yang lain).
Pertama, pastikan Anda terhubung dengan kedua DataSources di Data Grip.
Pilih Source Table dan tekan F5 atau (Klik kanan -> Select Copy Table to.)
Ini akan menampilkan daftar semua tabel (Anda juga dapat mencari menggunakan nama tabel di jendela sembulan). Cukup pilih target Anda dan tekan OK.
DataGrip akan menangani segalanya untuk Anda.
sumber
Jika Anda menjalankan pgAdmin (Cadangan:,
pg_dump
Pulihkan:)pg_restore
dari Windows, ia akan mencoba menampilkan file secara default kec:\Windows\System32
dan itulah sebabnya Anda akan mendapatkan kesalahan Izin Izin / Akses dan bukan karena postgres pengguna tidak cukup tinggi. Jalankan pgAdmin sebagai Administrator atau cukup pilih lokasi untuk output selain folder sistem Windows.sumber
Sebagai alternatif, Anda juga bisa mengekspos tabel jauh Anda sebagai tabel lokal menggunakan ekstensi pembungkus data asing. Anda kemudian dapat memasukkan ke dalam tabel Anda dengan memilih dari tabel di basis data jauh. Satu-satunya downside adalah bahwa itu tidak terlalu cepat.
sumber