Tôi đang cố gắng sao chép toàn bộ bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác trong Postgres. Bất kỳ đề xuất?
Tôi đang cố gắng sao chép toàn bộ bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác trong Postgres. Bất kỳ đề xuất?
Câu trả lời:
Trích xuất bảng và dẫn nó trực tiếp đến cơ sở dữ liệu đích:
pg_dump -t table_to_copy source_db | psql target_db
Lưu ý: Nếu cơ sở dữ liệu khác đã có bảng được thiết lập, bạn chỉ nên sử dụng -a
cờ để nhập dữ liệu, nếu không bạn có thể thấy các lỗi lạ như "Hết bộ nhớ":
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
cờ cho dữ liệu . tức pg_dump -a -t my_table my_db | psql target_db
. Khi tôi ở đây, Nếu cơ sở dữ liệu của bạn ở trên một máy chủ, tôi thấy việc chuyển cơ sở dữ liệu vào một tệp và sau đó quét tệp đó vào cơ sở dữ liệu, sau đó gửi nội dung của tệp tới psql. ví dụ pg_dump -a -t my_table my_db > my_file.sql
và sau khi đưa nó lên máy chủ của bạn ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Lưu ý rằng dấu ngoặc đơn VÀ kép bao quanh tên bảng
Bạn cũng có thể sử dụng chức năng sao lưu trong pgAdmin II. Chỉ cần làm theo các bước sau:
Hoạt động tốt và có thể làm nhiều bảng cùng một lúc.
Objects
phần. Trên OSX, nhấp vào nút SQL hoặc lấy SQL Editor
thông qua Tools
menu để dán vào SQL được sao chép từ tệp sao lưu.
Sử dụng dblink sẽ thuận tiện hơn!
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);
Sử dụng psql, trên máy chủ linux có kết nối với cả hai máy chủ
( 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 ...
sau đó bạn thậm chí không cần subshells rõ ràng! Thông thường, bạn sẽ muốn thực hiện một vài điều cần thiết lập trước tiên, vì vậy dù sao đi nữa, có thể cần phải có các lớp con. Ngoài ra, mật khẩu sẽ không được xuất sang các quy trình tiếp theo. Cảm ơn!
pg_dump -t '<table_name>' --schema-only
Đầu tiên cài đặt dblink
Sau đó, bạn sẽ làm một cái gì đó như:
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 có nghĩa là địa phương, r là từ xa. Thoát dấu ngoặc đơn. Cung cấp các loại col.)
Sử dụng pg_dump để kết xuất dữ liệu bảng, sau đó khôi phục nó bằng psql.
Nếu bạn có cả máy chủ từ xa thì bạn có thể làm theo điều này:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Nó sẽ sao chép bảng Cơ sở dữ liệu nguồn được đề cập vào cùng bảng được đặt tên của cơ sở dữ liệu đích, nếu bạn đã có lược đồ hiện có.
Bạn có thể làm như sau:
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>
Để di chuyển bảng từ cơ sở dữ liệu A sang cơ sở dữ liệu B tại thiết lập cục bộ của bạn, hãy sử dụng lệnh sau:
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>
trước khi chạy lệnh
Tôi đã thử một số giải pháp ở đây và chúng thực sự hữu ích. Theo kinh nghiệm của tôi, giải pháp tốt nhất là sử dụng dòng lệnh psql , nhưng đôi khi tôi không cảm thấy thích sử dụng dòng lệnh psql. Vì vậy, đây là một giải pháp khác cho 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
)
)
Vấn đề với phương pháp này là tên của các trường và loại bảng mà bạn muốn sao chép phải được viết.
pg_dump
không hoạt động luôn.
Cho rằng bạn có cùng một bảng ddl trong cả hai dbs, bạn có thể hack nó từ thiết bị xuất chuẩn và stdin như sau:
# 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"
Giống như câu trả lời của người dùng5542464 và Piyush S. Wanare nhưng được chia thành hai bước:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
nếu không thì đường ống hỏi hai mật khẩu cùng một lúc.
Bạn phải sử dụng DbLink để sao chép một dữ liệu bảng vào một bảng khác tại cơ sở dữ liệu khác nhau. Bạn phải cài đặt và định cấu hình tiện ích mở rộng DbLink để thực hiện truy vấn cơ sở dữ liệu chéo.
Tôi đã tạo ra bài viết chi tiết về chủ đề này. Vui lòng truy cập liên kết này
Kiểm tra kịch bản python này
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);
Nếu cả hai DB (từ & đến) được bảo vệ bằng mật khẩu, trong thiết bị đầu cuối kịch bản đó sẽ không yêu cầu mật khẩu cho cả hai DB, lời nhắc mật khẩu sẽ chỉ xuất hiện một lần. Vì vậy, để khắc phục điều này, hãy chuyển mật khẩu cùng với các lệnh.
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
Tôi đã sử dụng DataGrip (Theo Intellij Idea). và nó rất dễ dàng sao chép dữ liệu từ một bảng (trong cơ sở dữ liệu khác nhau sang bảng khác).
Trước tiên, hãy đảm bảo bạn được kết nối với cả DataSource trong Data Grip.
Chọn Bảng nguồn và nhấn F5 hoặc (Nhấp chuột phải -> Chọn Sao chép bảng vào.)
Điều này sẽ hiển thị cho bạn một danh sách tất cả các bảng (bạn cũng có thể tìm kiếm bằng tên bảng trong cửa sổ bật lên). Chỉ cần chọn mục tiêu của bạn và nhấn OK.
DataGrip sẽ xử lý mọi thứ khác cho bạn.
Nếu bạn chạy pgAdmin (Sao lưu:, pg_dump
Khôi phục pg_restore
:) từ Windows, nó sẽ cố gắng xuất tệp theo mặc định c:\Windows\System32
và đó là lý do tại sao bạn sẽ gặp phải lỗi từ chối Quyền truy cập / Quyền truy cập và không phải vì độ trễ của người dùng không đủ cao. Chạy pgAdmin với tư cách Quản trị viên hoặc chỉ chọn một vị trí cho đầu ra không phải là thư mục hệ thống của Windows.
Thay vào đó, bạn cũng có thể hiển thị các bảng từ xa của mình dưới dạng các bảng cục bộ bằng cách sử dụng tiện ích mở rộng trình bao bọc dữ liệu nước ngoài. Sau đó, bạn có thể chèn vào các bảng của mình bằng cách chọn từ các bảng trong cơ sở dữ liệu từ xa. Nhược điểm duy nhất là nó không quá nhanh.