备份 PostgreSQL 数据库的样本

7 postgresql

是否可以PostgreSQL仅使用一小部分数据(每个表中的 1000 行)来备份数据库?

我可以使用pg_dump. 在某些情况下,我需要具有最少数据的数据库。

pg_dump --host=localhost --port=5432 --username=postgres --password 
        --column-inserts --schema=test  testdb > test_backup.sql
Run Code Online (Sandbox Code Playgroud)

如何修改上述命令以备份 1000 条数据?

小智 5

我遇到了类似的问题,我想将几​​个表中的最新行从一个数据库复制到另一台服务器上托管的另一个数据库,最后我编写了一个 bash 脚本,该脚本执行命令,pg_dump然后执行各种psql命令:

#!/bin/bash
declare -a arr=("my_table_1" "my_table_2" "my_table_3")
startdate=2014-12-01
enddate=2014-12-30
for table in  "${arr[@]}"
do
    echo -e \\n$table\\n$(for each in $(seq 1 ${#table}); do printf "-"; done)
    pg_dump -h host_name_1 --schema-only -t $table db_name_1 -U my_username -c | psql -h host_name_2 -U my_username db_name_2
    psql -h host_name_1 -U my_username db_name_1 -c "\copy (select * from $table where date >='$startdate' and date <='$enddate' order by date desc) to '/tmp/data.csv' csv header;"
    psql -h host_name_2 -U my_username db_name_2 -c "\copy $table from '/tmp/data.csv' csv header"
done
Run Code Online (Sandbox Code Playgroud)

循环体中逐行:

  1. echo只是一个漂亮的修饰:它打印表的名称并像标题一样在其下划线,
  2. pg_dump命令生成一些 SQL 来从源复制表模式,并执行更多 SQL 内务命令(例如,该-c标志意味着 SQL 将包含一个在创建表之前先删除该表的命令),并且该 SQL 通过管道传输|psql指向目标(您可以尝试仅运行pg_dump命令行中的部分,pg_dump -h host_name_1 --schema-only -t $table db_name_1 -U my_username -c并查看它生成的 SQL),
  3. 下一psql行将源数据库中的表复制到 csv 文件中,
  4. 该 csv 文件的最终psql副本到目标数据库中的表中。


小智 1

仅通过命令无法实现此目的pg_dump

您可以通过以下方式做到这一点:

仅转储整个数据库的结构,并使用命令copy从each表中保存1000行。

例如:仅转储结构:

pg_dump --host=localhost --port=5432 --username=postgres --password --schema-only  testdb > test_backup.sql
Run Code Online (Sandbox Code Playgroud)

以及从存储过程调用的复制命令列表:

CREATE OR REPLACE FUNCTION _save_top_1000_row_tables(chemin file_path)
 RETURNS character varying AS
$BODY$declare 
_temps timestamp without time zone;
begin
execute 'copy (SELECT * FROM table1 limit 1000 offset 0) TO ''' || file_path||'table1.txt'''; 
execute 'copy (SELECT * FROM table2 limit 1000 offset 0) TO ''' || file_path||'table2.txt'''; 
execute 'copy (SELECT * FROM table3 limit 1000 offset 0) TO ''' || file_path||'table3.txt'''; 

return ('OK');
end;$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;   
Run Code Online (Sandbox Code Playgroud)

参考文献: 转储复制