Postgresql
PostgreSQL:regclass/oid 列是否在備份中持續存在?
我有一個大表(審計),我在其中儲存模式和表的關係 ID。這可以通過使用 TG_RELID 的觸發器方便地填充。這也很方便,因為我可以對其進行索引,並且索引會比我分別儲存“模式”(文本)和“表”(文本)列並索引它們要小。此外,我可以使用它進行查詢,
WHERE relation_id = 'myschema:mytable'::regclass
並且它可以正常工作。我的問題是,就備份/恢復而言,這樣做是否“安全”(schema.table 在目標伺服器中是否具有相同的 regclass/oid 並且在源伺服器中是否存在?
還有什麼我應該注意的問題嗎?
我根本不會依賴 OID 的特定值來實現可移植性*。即使您嘗試了它並發現它可以與目前版本的 PostgreSQL 一起使用,但在較新的版本中它可能不*會這樣做。
如果您在源機器上備份數據庫並嘗試在已經有其他數據庫、模式等的另一台機器(或者通常是另一個PostgreSQL 數據庫集群)上恢復它。很可能是您的源的不同 OID正在使用的數據庫已經用於表示目標數據庫中的其他不同事物。
與 OID的
schema_name.table_name
對應關係由 PostgreSQL 在其係統表中處理。如果您需要等效的功能,並保證它的行為方式符合您的需要,而不是PostgreSQL 使用其內部 OID 的方式,我建議您實際上使用一個your_tables
表複製此行為,您可以在其中儲存任意id
(序列)和schema_name
,table_name
. 這樣,您的數據庫可以安全地備份和恢復,並且您可能會避免對任何較新的 postgreSQL 版本進行修改。您可能需要在觸發器中進行額外的查找,但將來可能會為您節省很多麻煩。