使用数百万条 INSERT 语句导入大型 SQL 转储

dev*_*dre 8 postgresql performance import pg-dump postgresql-performance

我需要将一个大.sql文件(解压时为 8.1GB)导入 PostgreSQL。我尝试使用,\i /path/to/file.sql但它太慢了。

如何加快进口?我需要每周导入这些数据。

第一个2000行可以在这里找到,而压缩的1点GB转储可以在这里找到

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.3
-- Dumped by pg_dump version 9.5.2

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: rpo; Type: SCHEMA; Schema: -; Owner: -
--
Run Code Online (Sandbox Code Playgroud)

这是我获取数据的唯一途径。完整的文件有大约。38,000,000 行。如何加快导入速度?

Eva*_*oll 14

此转储被转储为单独的语句(带有pg_dump --inserts

INSERT INTO esa2010_codes VALUES (11002, 'Národn
INSERT INTO esa2010_codes VALUES (11003, 'Nefina
INSERT INTO esa2010_codes VALUES (12502, 'Národn
INSERT INTO esa2010_codes VALUES (11001, 'Verejn
INSERT INTO esa2010_codes VALUES (12602, 'Národn
INSERT INTO esa2010_codes VALUES (12603, 'Finan?
INSERT INTO esa2010_codes VALUES (12503, 'Ostatn
Run Code Online (Sandbox Code Playgroud)

这被记录为缓慢(来自man pg_dump

--inserts将数据转储为INSERT命令(而不是COPY)。这将使恢复非常缓慢;它主要用于制作可以加载到非 PostgreSQL 数据库中的转储。但是,由于此选项为每一行生成一个单独的命令,因此重新加载行时出错只会导致丢失该行而不是整个表内容。请注意,如果您重新排列了列顺序,则还原可能会完全失败。该--column-inserts选项对于列顺序更改是安全的,尽管速度更慢。

这就是为什么它这么慢。你要做的是关闭一些持久性设置,特别是synchronous_commit,虽然fsync也会有所帮助

您可以通过在运行\i file.sql.

SET synchronous_commit TO off;
Run Code Online (Sandbox Code Playgroud)

这将大大加快它的速度。完成后不要忘记重新打开耐久性选项。我敢打赌,在你设置好之后,它会在几个小时内完成。如果您需要更高的速度fsync,请full_page_writes在获取数据之前毫不犹豫地关闭和打开集群——尽管如果数据库中有您需要的数据,或者它是生产数据,我不会这样做。最后要注意的是,如果您需要速度并且这是一个生产数据库,您可以全力以赴使用您自己的副本并使用默认选项转储它 by pg_dump,您将能够更快地加载它。