Postgresql

是否使用 pg_restore 傳輸索引

  • December 16, 2015

我看到其他問題的答案是否定的(即索引不會隨標準轉移pg_restore)。但是,它看起來像是在我最近的轉儲/恢復中發生的,我不確定它是否真的轉移了。

我將我的數據庫從 PostgreSQL 9.3 遷移到 9.4.5 並使用轉儲/恢復來執行此操作。

以下是使用的命令:

sudo -u postgres pg_dump -h localhost -p 5432 -d nominatim -F d -f dump/postgres/backup -j 20
sudo -u postgres pg_restore --create --dbname=nominatim --exit-on-error -h localhost -p 5432 -F d -j 7 dump/postgres/backup

轉儲和還原成功(沒有錯誤)。

我在執行還原時將 autovacuum 設置為關閉,因此我analyze在 psql 中執行(無參數)並連接到已還原的數據庫。

我注意到的第一件事是,在 9.3 下,數據目錄佔用了大約 860GB,而在 9.4 下,它佔用了大約 680GB。9.4 效率更高嗎?

我注意到的第二件事是我看到了數據庫中的索引:

nominatim=# \d country_name
                  Table "public.country_name"
           Column             |         Type         | Modifiers 
-------------------------------+---------------------------------    
country_code                  | character varying(2) |   
name                          | hstore               |   
country_default_language_code | character varying(2) |   
partition                     | integer              |  

Indexes:
       "idx_country_name_country_code" btree (country_code)


nominatim=# \d idx_country_name_country_code
   Index "public.idx_country_name_country_code"
   Column    |         Type         |  Definition  
--------------+----------------------+--------------
country_code | character varying(2) | country_code

btree, for table "public.country_name"


nominatim=# select * from pg_indexes where tablename = 'country_name';
schemaname |  tablename   |           indexname           | tablespace |                                       indexdef                                        
------------+--------------+-------------------------------+------------+---------------------------------------------------------------------------------------
public     | country_name | idx_country_name_country_code |            | CREATE INDEX idx_country_name_country_code ON country_name USING btree (country_code)
(1 row)

我是否仍然需要重新編制索引,或者我的索引是否以某種方式或其他方式完成了,或者我所看到的只是索引定義?任何關於更好地管理轉儲/恢復、檢查我的索引等的進一步提示肯定會受到讚賞。

是否使用 pg_restore 傳輸索引?

我看到其他問題的答案是否定的(即索引不會通過標準 pg_restore 轉移)

這似乎是一種誤解。索引本身(包含所有數據)不在轉儲中。只是重新創建它的命令。因此,索引被“轉移”了,但實際上,它們是在原始條件下重新創建的,沒有任何膨脹或死元組

我還需要重新索引嗎?

不會。還原後,您的所有索引都處於完美狀態。不需要REINDEX但是,正如“恢復轉儲”一章的手冊中所建議的那樣ANALYZE,這是有道理的:

恢復備份後,明智的做法是ANALYZE在每個數據庫上執行,這樣查詢優化器就有有用的統計資訊;

最後:

9.4 效率更高嗎?

不,一般不會。好吧,GIN 索引的大小已經大大減少了。但是您看到的很可能是從所有表和索引(包括系統表)中消除膨脹的效果。

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