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