Postgresql 数据库导入导出 物理VS逻辑 集合

a7470896dc2ed76ce3544682f0f0f878.png

PostgreSQL 数据的导入导出本身并没有特别高的技术要求,属于日常操作,但熟悉导入导出以及选择数据导入导出的方式还是有点思考空间的。怎么导出数据的方式更稳妥,更适应业务的需求。下面就先总结数据导入导出中的数据导出的一部分方式和命令的实例,其中一些也是我在总结中发现的,例如COPY 的方式还可以有加速的方式,有时候觉得简单,和简单是两码事。

PostgreSQL  数据导入导出主要分为两大类

1  逻辑导入导出

2  物理导入导出

1  逻辑导入导出特点:

逻辑导出特点主要有以下几点

1  保证导出数据的一致性

2  在数据库正在被访问的情况下,逻辑数据导出不会影响正在被访问的数据正常的操作,不会阻塞读写操作  (并不指性能部分)

3  可以进行独立的某一个数据库的导出,也可以进行整体INSTANCE 下所有数据库的导出

4  导出的语句可以生成为可以阅读的SQL语句,也可以对生成的数据进行打包,成为tar 格式

5  逻辑导出的数据对PG的恢复的数据库版本没有要求,适合不同版本的PG进行数据的迁移的导入和导出

6  逻辑导出包含整体数据库中的OBJECT 以及表结构等信息,逻辑导出可以单独导出表结构或者数据。

7  逻辑导出中可以包含copy 命令或 逻辑insert 语句

2  物理导入导出特点:

物理导出特点主要有以下几点

1   物理复制是在表和标准文件系统文件之间移动数据,数据移动速度依赖与硬件本身

2   可以将单列数据进行数据迁移

3   数据的迁出目的地必须操作数据库的LINUX账号必须有目的地的写入权限

4   数据导入的过程中程序使用的是标准的数据STDOUT STDIN 模式

5   物理导出仅仅涉及数据的导出

3   物理导入导出和逻辑导入导出适应场景:

1   逻辑导入导出适合表数据量较少的表,并且适应与不同版本PG之间的数据导入导出

2   逻辑导入导出适合修改部分数据的导出,如对导出数据的修改,在讲数据导入,在导入的过程中就将修改后的数据导入

3   逻辑导入导出适合在业务工作期间,对表进行数据的导出或导入,可以最大化避免系统工作中的影响

4   物理导入导出主要应用场景为停机期间的大量数据的导出和导入,导出和导入的速度快,导出导入数据的性能上线为硬件系统的上线。

5   copy 的方式可以通过条件过滤的方式对导出的数据进行选择

6   copy 的方式可以通过binary 模式进一步提高数据导出的速度

命令操作与注意事项

命令:

1  逻辑导出

导出 postgres 数据库表结构以及其他OBJECT 和数据,到指定的 /home/postgres/backup.sql 文件中,其中数据使用copy方式呈现在导出文件中

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin > /home/postgres/backup.sql

ad8609eaec50cd9f3384f04f9a391793.png

2  导出postgresql 中POSTGRES数据库中表的数据 到指定的 /home/postgres/backup.sql 文件中,其中数据使用copy方式呈现,其中导出文件中并不包含表结构文件

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin -a > /home/postgres/backup.sql

84b30083815a5d47680d3164f8b427d4.png

3   导出数据时添加删除语句,如目的地有同名表或OBJECT 将先进行清理后,在创建新表并灌入数据,此方式与 -a 单纯导出数据模式冲突,择一

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -c > /home/postgres/backup.sql

25a200813eaf21cba0455b84a6fa34f8.png

4  导出数据包含建库命令,命令中包含重新连接数据的命令

 pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -C > /home/postgres/backup.sql

e9cd256df3cdf2d1ed4e6e98de4c26c6.png

5  导出数据通过目录的方式,并且使用多线程进行导出  使用多线程的方式是,必须使用 Fd 模式  目录模式,会生成多个压缩文件

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -Fd  -j 5 -f /home/postgres/backup

9518e4e672b4f550781d60829f55ae45.png

6  导出数据通过tar包的方式,直接进行流方式压缩, 对比普通方式,压缩方式时间长,根据数据的不同,占用的磁盘空间低

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -Ft  | gzip > backup.tar.gz

6c4e1656aace731211d14466e978e93f.png

7  导出表结构,以及其他数据库中的object 

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -s  -f /home/postgres/backup.sql

5430c9d13fe9c6ad7ce12eaa961dca37.png

8 导出特定表和表结构

pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -s -t pgbench_accounts -f /home/postgres/backup.sql

92f0a4b569cfe2aee3c69002c7f01055.png

2   物理方式数据导出

1  通过COPY 方式直接导出数据

copy pgbench_accounts to '/home/postgres/backup.data';

f9ff8543b2cf2f577b41834c796b3ac4.png

导出数据速度 2000万行在 11秒左右 (与整体的系统硬件有关,此硬件为CPU 2CORE  SSD 磁盘 8G memory)

2  通过copy 的方式导出特定的条件的字段记录

copy (select aid,bid from pgbench_accounts where aid < 100) to '/home/postgres/backup.data' ;

28969789c89726ae9087bd7399b19377.png

3  通过binary 模式来导出数据记录,加速导出速度

copy pgbench_accounts to '/home/postgres/backup.data' with binary;

示例中对比同样的数据量,不同模式下binary 节省时间25%

fc279630ee817c64bc45df9a929faea7.png

4   对导出的数据的特定的分隔符进行设定,通过 DELIMITER  设定分隔符,此选项不能使用binary 方式

copy pgbench_accounts to '/home/postgres/backup.data' DELIMITER '|';

ccaf8cde52a44d1e6e4c028c90ef4fb7.png

fe29317826d89cbe907fd2803e925b05.png

5  导出数据使用CSV 格式并且带有页头的模式,其中数据格式分为几类   text ,  csv  , binary  , text 为默认的导出数据的模式

copy pgbench_accounts to '/home/postgres/backup.data' DELIMITER '|' CSV  header;

d08066affa10622dd568468a6e46618e.png

9a21998b295c6a0ba6f59d01b0726ffb.png

6  使用copy 方式导出数据时,进行数据的压缩  (使用psql 的外部命令执行方式标准 stdout 将数据直接压缩生成文件)

psql -q -c "\copy (select * from pgbench_accounts limit 3) to stdout"\ | gzip > backup.data.gz

3cd47859a3d47bb60f3753fe16d18e0e.png

数据导入

数据的导入也分别根据数据导出的三种形式分别对待

主要的方式有

1  使用psql 命令直接执行导出逻辑SQL文件

2  使用pg_restore 导出 pg_dump 导出的封装格式的数据

3  使用copy from 方式 导入copy to 方式的数据

1  逻辑导入, 根据逻辑导出的数据的不同,数据的导入的方法也是不同的。其中逻辑导出的数据可以通过pg_restore的方式将数据导入进数据库内。

下面我们根据不同的数据导出方式,来去将数据导入回去

1   恢复纯SQL 方式的导出的SQL 逻辑文件 

psql -Uadmin -p 5432 -d postgres < /home/postgres/backup.sql

导出语句

(pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin > /home/postgres/backup.sql)

下图为导入数据时的CPU 内存 磁盘工作情况

c049b705435136c3ef95344f8bbc4a52.png

2  导出数据时不包含表结构,数据以copy 模式呈现,导入数据时注意数据库表结构应以建立,数据灌入的方式与COPY无异

psql -Uadmin -p 5432 -d postgres < /home/postgres/backup.sql

1436f400102785031f65b81f7109a350.png

936f8086e887fe75394a62ad5deb7d7d.png

3   通过pg_dump 中的 Fd 方式 加并行的方式导出的数据,也可以通过pg_restore 的方式将数据并行的倒回到数据库中

pg_restore -d postgres -e -Fd --jobs=5 /home/postgres/backup

对应的数据导出方式(pg_dump -d postgres -h 192.168.198.100 -p 5432 -U admin  -Fd  -j 5 -f /home/postgres/backup)

此方式的有点为导入数据时可以使用并行的方式将数据导入,速度比其他逻辑读取方式有优势,但需要注意本身的主机的CPU的核心数

-e  参数为导出是如果遇到错误,会停止,默认pg_restore 导出数据是遇到错误是不会停止的

e6bbd63e019cbaad492d02b3564fcdf0.png

4  通过copy from 来导入纯数据

copy pgbench_accounts from '/home/postgres/backup.data';

2000万数据导入数据库中的速度在1分06秒

875d5ea55bdbb653449eb5af6b33f9cd.png

07a9bd4683f3050c09947add09c4ca69.png

5  copy 导入通过binary 方式导出的数据

copy pgbench_accounts from '/home/postgres/backup.data' with binary;

7f9d67d473744f04465421bec7826868.png

4110d2ef7d2befcade95fac5257248c2.png

数据导出主要考虑以下几点 

1   导出导入数据的速度,这里以copy 的方式速度为最快,同时通过pg_dump -a 方式导出的数据也为copy方式

2   通过copy 导出数据的方式中,如果涉及的表数量较多,可以同时运行多个表的数据导出,最大化的利用当下的硬件资源

     或通过pg_dump  Fd 模式下的  -j 的模式最大化利用CPU 的多线程的工作模式

3   导入数据时,也可以通过 copy from 的模式同时导入多个数据表,加快导入的速度  或通过pg_restore 模式下的 -j 方式并行利用CPU 加快逻辑数据的导入速度

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值