Postgresql

使用數百萬條 INSERT 語句導入大型 SQL 轉儲

  • October 25, 2021

我需要將一個大.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: -
--

這是我獲取數據的唯一方法。完整的文件大約有。38,000,000 行。如何加快導入速度?

此轉儲被轉儲為單獨的語句(帶有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

這被記錄為緩慢(來自man pg_dump

--inserts將數據轉儲為INSERT命令(而不是COPY)。這會使恢復非常緩慢;它主要用於製作可以載入到非 PostgreSQL 數據庫的轉儲。但是,由於此選項為每一行生成一個單獨的命令,因此重新載入行時的錯誤只會導致該行失去,而不是整個表內容。請注意,如果您重新排列了列順序,還原可能會完全失敗。該--column-inserts選項對列順序更改是安全的,儘管速度更慢。

這就是為什麼它這麼慢。你要做的是關閉一些持久性設置,特別是synchronous_commit,雖然fsync也會有所幫助

您可以通過在執行\i file.sql.

SET synchronous_commit TO off;

這將大大加快速度。完成後不要忘記重新打開耐用性選項。我敢打賭它會在你設置好幾個小時後完成。如果您需要更高的速度,請毫不猶豫地關閉fsyncfull_page_writes打開集群,直到您獲取數據——儘管如果數據庫中有您需要的數據,或者如果它是生產環境,我不會這樣做。最後一點,如果您需要速度並且這是一個生產數據庫,您可以在自己的副本上全力以赴,並使用預設選項轉儲它pg_dump,您將能夠更快地載入。

引用自:https://dba.stackexchange.com/questions/216183