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