:用 createdb -T 模板機制快速復(fù)制本地 PostgreSQL 數(shù)據(jù)庫)
文檔教程知識庫【免費下載鏈接】til:memo: Today I Learned項目地址https://gitcode.com/gh_mirrors/ti/til點擊查看免費下載PostgreSQL 提供了一條足以秒殺 dump/restore 的本地數(shù)據(jù)庫復(fù)制路徑createdb -T模板復(fù)制。本指南以 til 倉庫中的 duplicate-a-local-database 筆記為骨架講解如何在不導(dǎo)出、不導(dǎo)入任何數(shù)據(jù)文件的情況下通過模板機制瞬間克隆出包含完整 schema 與數(shù)據(jù)的全新數(shù)據(jù)庫并深入其底層原理template0/template1、所有者指定技巧以及與pg_dump方案的取舍。讀完你就能用一條命令完成本地庫復(fù)制并知道何時該改用 dump/restore。一條命令完成本地數(shù)據(jù)庫復(fù)制當(dāng)源數(shù)據(jù)庫就在本機、且沒有跨服務(wù)器或跨版本遷移需求時完全不需要經(jīng)歷dump → 新建空庫 → restore三步。PostgreSQL 自帶的createdb命令內(nèi)置了基于模板的復(fù)制能力$ createdb -O ownername -T originaldb newdb命令執(zhí)行后PostgreSQL 會在當(dāng)前集群內(nèi)創(chuàng)建一個名為newdb的新數(shù)據(jù)庫其 schema 與數(shù)據(jù)全部來自originaldb。整個操作在服務(wù)端完成數(shù)據(jù)無需經(jīng)過客戶端中轉(zhuǎn)因此對大庫也幾乎只受磁盤 I/O 限制。參數(shù)含義拆解-T originaldb--template指定以哪個數(shù)據(jù)庫作為模板。這是本命令的核心PostgreSQL 會完整復(fù)制該庫的 schema 和數(shù)據(jù)到新庫。-O ownername--owner指定新數(shù)據(jù)庫的所有者owner不傳則默認(rèn)使用執(zhí)行命令的操作系統(tǒng)用戶。newdb要創(chuàng)建的新數(shù)據(jù)庫名稱位置參數(shù)。原理一切數(shù)據(jù)庫都誕生自模板這條命令之所以成立是因為 PostgreSQL 的CREATE DATABASE本質(zhì)上就是從模板克隆。正如 til 倉庫中的 create-database-uses-template1 筆記所記錄的每次create database除非顯式指定PostgreSQL 默認(rèn)都會克隆template1。每個 PostgreSQL 集群啟動時都自帶兩個模板庫可通過以下查詢驗證select datname from pg_database where datistemplate true; datname ----------- template1 template0 (2 rows)template1默認(rèn)模板createdb newdb不指定-T時實際上克隆的就是它??梢詫λ鼒?zhí)行\(zhòng)c template1連接并修改——比如把某個擴展、函數(shù)或公共 schema 放進去之后創(chuàng)建的每一個新庫都會自動繼承。template0template1的原始備份副本無法連接、無法修改專用于在 template1 被改壞時作為恢復(fù)兜底。所以createdb -T originaldb newdb只是把默認(rèn)的template1換成了你自己的庫克隆邏輯完全一致區(qū)別只在于模板來源。當(dāng)你不希望新庫繼承 template1 中的自定義內(nèi)容時也可以顯式用-T template0創(chuàng)建干凈的庫。-O把新庫交給正確的所有者-O直接對應(yīng) SQL 語法中的CREATE DATABASE ... OWNER ...。在本地開發(fā)場景新庫的所有者通常應(yīng)設(shè)為當(dāng)前 Unix 用戶這樣你現(xiàn)有的本地角色才能順暢讀寫新庫如果復(fù)制出來的庫所有者是他人角色本地連接時很可能遇到權(quán)限不足的問題。如果需要先確認(rèn)目標(biāo)角色是否存在比如自動化腳本里先查后建til 倉庫的 check-if-user-role-exists-for-database 筆記給出了可腳本化的寫法psql postgres -tXAc SELECT 1 FROM pg_roles WHERE rolnamedev \ | grep -q 1 \ || createuser --interactive devcreatedb與createuser同屬 PostgreSQL 客戶端工具族配合使用即可在復(fù)制數(shù)據(jù)庫前把角色體系準(zhǔn)備妥當(dāng)。模板復(fù)制 vs. pg_dump如何選模板復(fù)制并非萬能它與 dump-and-restore-a-database 筆記中的pg_dump/pg_restore方案各有適用場景維度createdb -T模板復(fù)制pg_dump -Fcpg_restore適用場景源庫與目標(biāo)庫同機、同集群跨服務(wù)器、跨版本、需歸檔備份數(shù)據(jù)通道服務(wù)端文件系統(tǒng)級拷貝不經(jīng)客戶端數(shù)據(jù)序列化到 dump 文件再反序列化額外產(chǎn)物無產(chǎn)生.dump文件典型命令createdb -O owner -T src dstpg_dump -Fc my_db my_db.dump后createdb my_new_db pg_restore -d my_new_db my_db.dump角色依賴源庫內(nèi)角色信息隨模板保留restore 時需保證依賴角色已存在于目標(biāo)集群需要重點指出的是pg_dump的 dump 文件本身不包含角色定義恢復(fù)時若目標(biāo)集群缺少相應(yīng)角色會失敗需要先用createuser補齊而模板復(fù)制發(fā)生在同一集群內(nèi)角色體系天然一致無需額外處理。另外當(dāng)源庫正被活躍連接占用時PostgreSQL 會拒絕以它作為模板創(chuàng)建新庫模板克隆要求源庫處于空閑一致狀態(tài)。因此復(fù)制前請確保源庫沒有進行中的寫入會話若確需拷貝正在使用的庫則應(yīng)退回到pg_dump方案它通過一致性快照讀取數(shù)據(jù)不受活動連接影響。復(fù)制結(jié)果的獨立性與其他實操提示復(fù)制出的新庫完全獨立newdb與originaldb只是長相一致的兩個庫后續(xù)對任一方的修改互不影響模板關(guān)系僅存在于創(chuàng)建瞬間不會形成持續(xù)同步。復(fù)制不帶走連接級設(shè)置當(dāng)前會話的臨時配置如search_path的會話級修改不會進入新庫新庫繼承的是源庫中持久化的對象定義與數(shù)據(jù)。查看復(fù)制結(jié)果用psql的\l元命令即可列出所有數(shù)據(jù)庫及其大小驗證newdb是否如期出現(xiàn)也可參考 check-the-size-of-databases-in-a-cluster 筆記中的 SQL 查詢來核對體積。集群整體遷移仍需 pg_dumpall如果目標(biāo)是重裝 PostgreSQL、整體搬遷整個集群含角色、權(quán)限模板復(fù)制無法勝任應(yīng)改用 dump-all-databases-to-a-sql-file 筆記中的pg_dumpall并通過--exclude-databasetemplate*排除隨安裝自帶的模板庫。小結(jié)createdb -O ownername -T originaldb newdb是本地 PostgreSQL 開發(fā)中最高效的復(fù)制庫手段它借力模板克隆機制在服務(wù)端一步完成 schema 與數(shù)據(jù)的全量復(fù)制省去了 dump/restore 的序列化開銷與中間文件。理解 template0/template1 的分工、正確設(shè)置-O所有者、并清楚它與pg_dump的邊界就能在任何想要一個一模一樣的新庫的場景下做出正確選擇——同機克隆用-T跨機遷移用 dump/restore。贊分享文檔教程知識庫【免費下載鏈接】til:memo: Today I Learned項目地址https://gitcode.com/gh_mirrors/ti/til點擊查看免費下載相關(guān)推薦TIL 實戰(zhàn)用 pg_database_size() 獲取 PostgreSQL 數(shù)據(jù)庫磁盤占用TIL 實戰(zhàn)用 pg_database_size 獲取 PostgreSQL 數(shù)據(jù)庫磁盤占用 在 PostgreSQL 日常運維中快速獲知某個數(shù)據(jù)庫到底占用文檔教程知識庫PostgreSQL 模板數(shù)據(jù)庫機制CREATE DATABASE 為何默認(rèn)克隆 template1PostgreSQL 模板數(shù)據(jù)庫機制CREATE DATABASE 為何默認(rèn)克隆 template1 導(dǎo)讀 在 PostgreSQL 中執(zhí)行 CREATE D文檔教程知識庫終極PostgreSQL數(shù)據(jù)復(fù)制實戰(zhàn)pg_replicate完全指南終極PostgreSQL數(shù)據(jù)復(fù)制實戰(zhàn)pg_replicate完全指南 pg_replicate是一個基于Rust構(gòu)建的PostgreSQL數(shù)據(jù)復(fù)制工具它利用創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考