| PG_UPGRADE(1) | PostgreSQL 18.6 Documentation | PG_UPGRADE(1) |
نام (NAME)
pg_upgrade - ارتقای یک نمونه سرور PostgreSQL
خلاصه دستور (SYNOPSIS)
pg_upgrade -b oldbindir [-B newbindir] -d oldconfigdir -D newconfigdir [option...]
توضیحات (DESCRIPTION)
دستور pg_upgrade (که سابقاً pg_migrator نامیده میشد) این امکان را فراهم میکند که دادههای ذخیرهشده در فایلهای دادهٔ PostgreSQL بدون نیاز به عملیات معمول تخلیه/بازیابی (dump/restore) برای ارتقای نسخههای اصلی (major)، به یک نسخهٔ اصلی بالاتر از PostgreSQL ارتقا یابند؛ برای مثال از 12.14 به 13.10 یا از 14.9 به 15.5. استفاده از این ابزار برای ارتقای نسخههای فرعی (minor) لازم نیست؛ مانند ارتقا از 12.7 به 12.8 یا از 14.1 به 14.5.
انتشارهای اصلی PostgreSQL مرتباً قابلیتهای جدیدی اضافه میکنند که اغلب ساختار جدولهای سیستمی را تغییر میدهد، اما قالب درونی ذخیرهسازی دادهها بهندرت دستخوش تغییر میشود. pg_upgrade با بهرهگیری از این ویژگی، از طریق ساخت جدولهای سیستمی جدید و بازاستفادهٔ ساده از فایلهای دادهٔ کاربر قدیمی، ارتقاهایی سریع را به انجام میرساند. اگر یک انتشار اصلی در آینده قالب ذخیرهسازی دادهها را بهگونهای تغییر دهد که قالب دادهٔ قدیمی غیرقابلخواندن شود، pg_upgrade برای چنین ارتقاهایی قابلاستفاده نخواهد بود. (جامعهٔ توسعهدهندگان تلاش خواهد کرد تا از بروز چنین وضعیتی جلوگیری کند.)
ابزار pg_upgrade تمام تلاش خود را به کار میبندد تا مطمئن شود کلاسترهای قدیمی و جدید از نظر باینری سازگار هستند؛ برای نمونه، با بررسی سازگاری تنظیمات زمان کامپایل، از جمله باینریهای 32/64-bit. بسیار مهم است که هرگونه ماژول خارجی نیز سازگاری باینری داشته باشد، هرچند که این موضوع توسط pg_upgrade قابل بررسی نیست.
ابزار pg_upgrade از ارتقا از نسخهٔ 9.2.X و بالاتر به نسخهٔ اصلی کنونی PostgreSQL، شامل نسخههای snapshot و beta پشتیبانی میکند.
هشدار
ارتقای یک کلاستر باعث میشود که مقصد کدهای دلخواه به انتخاب مدیران سیستم (superusers) مبدأ را اجرا کند. پیش از ارتقا اطمینان حاصل کنید که مدیران سیستم مبدأ مورد اعتماد هستند.
گزینهها (OPTIONS)
pg_upgrade آرگومانهای خط فرمان زیر را میپذیرد:
-b bindir
--old-bindir=bindir
-B bindir
--new-bindir=bindir
-c
--check
-d configdir
--old-datadir=configdir
-D configdir
--new-datadir=configdir
-j njobs
--jobs=njobs
-k
--link
-N
--no-sync
-o options
--old-options options
-O options
--new-options options
-p port
--old-port=port
-P port
--new-port=port
-r
--retain
--socketdir=dir
-U username
--username=username
-v
--verbose
-V
--version
--clone
شبیهسازی فایل فقط در برخی از سیستمهای عامل و سیستمهای فایل پشتیبانی میشود. اگر انتخاب شود اما پشتیبانی نشود، اجرای pg_upgrade با خطا مواجه خواهد شد. در حال حاضر، این قابلیت در Linux (هسته 4.5 یا جدیدتر) با Btrfs و XFS (در سیستمهای فایلی که با پشتیبانی از reflink ایجاد شدهاند)، و در macOS با APFS پشتیبانی میشود.
--copy
--copy-file-range
--no-statistics
--set-char-signedness=option
در زبان C، علامتدار بودن پیشفرض نوع char (در صورتی که صراحتاً مشخص نشده باشد) در بسترهای مختلف متفاوت است. برای مثال، char در پردازندههای x86 بهطور پیشفرض signed char است اما در پردازندههای ARM بهطور پیشفرض unsigned char است.
از PostgreSQL 18 به بعد، کلاسترهای پایگاه داده تنظیمات علامتدار بودن پیشفرض char مختص به خود را نگه میدارند، که میتواند برای اطمینان از رفتار سازگار در بسترهایی با علامتدار بودن پیشفرض متفاوت char استفاده شود. بهطور پیشفرض، pg_upgrade هنگام ارتقا از یک کلاستر موجود، تنظیمات علامتدار بودن char را حفظ میکند. با این حال، هنگام ارتقا از PostgreSQL 17 یا قبلتر، pg_upgrade علامتدار بودن char پلتفرمی را اعمال میکند که روی آن ساخته شده است.
این گزینه به شما اجازه میدهد تا علامتدار بودن پیشفرض char را بهطور صریح برای کلاستر جدید تنظیم کنید و مقادیر موروثی را بازنویسی نمایید. دو سناریوی مشخص وجود دارد که این گزینه در آنها کاربرد دارد:
--swap
با این حال، این حالت فایلهای زائد زیادی را در کلاستر قدیمی ایجاد میکند، که در صورت استفاده از --sync-method=syncfs میتواند مرحله همگامسازی فایل را طولانی کند. بنابراین، توصیه میشود به همراه --swap از --sync-method=fsync استفاده شود.
علاوه بر این، بهمحض آغاز مرحله انتقال فایل، کلاستر قدیمی بهطور برگشتناپذیری تغییر خواهد کرد و بنابراین راهاندازی مجدد آن دیگر ایمن نخواهد بود. برای جزئیات به Step 17 مراجعه کنید.
--sync-method=method
در Linux، میتوان بهجای آن از syncfs استفاده کرد تا از سیستمعامل خواسته شود کل سیستمهای فایلی را که شامل دایرکتوری داده کلاستر ارتقایافته، فایلهای WAL آن و هر tablespace هستند، همگامسازی کند. برای کسب اطلاعات درباره هشدارهایی که باید هنگام استفاده از syncfs در نظر داشته باشید، به recovery_init_sync_method مراجعه کنید.
در صورت استفاده از --no-sync این گزینه هیچ تأثیری ندارد.
-?
--help
مراحل انجام ارتقا با استفاده از pg_upgrade به شرح زیر است:
نکته
مراحل ارتقای خوشههای رونوشتبرداری منطقی (logical replication clusters) در اینجا پوشش داده نشده است؛ برای جزئیات به Section 29.13 مراجعه کنید.
اگر دایرکتوری نصب شما مختص به نسخه نیست، برای مثال /usr/local/pgsql، لازم است دایرکتوری نصب فعلی PostgreSQL را جابهجا کنید تا با نصب نسخه جدید PostgreSQL تداخلی نداشته باشد. به محض اینکه سرور فعلی PostgreSQL متوقف شد، تغییر نام دایرکتوری نصب PostgreSQL بلامانع است؛ با فرض اینکه دایرکتوری قدیمی /usr/local/pgsql است، میتوانید:
mv /usr/local/pgsql /usr/local/pgsql.old
را برای تغییر نام دایرکتوری اجرا کنید.
برای نصب از سورس، اگر میخواهید سرور جدید را در مکانی سفارشی نصب کنید، از متغیر prefix استفاده نمایید:
make prefix=/usr/local/pgsql.new install
pg_ctl -D /opt/PostgreSQL/12 stop pg_ctl -D /opt/PostgreSQL/18 stop
NET STOP postgresql-12 NET STOP postgresql-18
سرورهای standby مبتنی بر streaming replication و log-shipping در طول این خاموشسازی باید در حال اجرا باشند تا تمام تغییرات را دریافت کنند.
اگر از حالت link استفاده کنید، ارتقا بسیار سریعتر خواهد بود (بدون کپی فایل) و فضای دیسک کمتری استفاده خواهد شد، اما پس از اینکه سرور جدید را بعد از ارتقا راهاندازی کردید، دیگر به کلاستر قدیمی خود دسترسی نخواهید داشت. حالت link همچنین نیاز دارد که دایرکتوریهای دادهٔ کلاستر قدیمی و جدید در یک فایل سیستم قرار داشته باشند. (Tablespaceها و pg_wal میتوانند در فایل سیستمهای متفاوتی باشند.) حالت clone همان مزایای سرعت و فضای دیسک را فراهم میکند اما باعث نمیشود که کلاستر قدیمی پس از راهاندازی کلاستر جدید غیرقابلاستفاده شود. حالت clone نیز نیازمند آن است که دایرکتوریهای دادهٔ قدیمی و جدید در یک فایل سیستم باشند. این حالت فقط روی سیستمعاملها و فایل سیستمهای خاصی در دسترس است. حالت swap در صورت وجود relationهای بسیار ممکن است سریعترین باشد، اما بهمحض شروع مرحلهٔ انتقال فایل، دیگر به کلاستر قدیمی خود دسترسی نخواهید داشت. حالت swap نیز مستلزم آن است که دایرکتوریهای دادهٔ کلاستر قدیمی و جدید در یک فایل سیستم باشند.
تنظیم --jobs روی ۲ یا بالاتر به pg_upgrade اجازه میدهد چندین پایگاه داده و tablespace را بهصورت موازی پردازش کند. یک نقطه شروع مناسب، تعداد هستههای CPU در سیستم است. این گزینه میتواند زمان ارتقا را برای سرورهای دارای چند پایگاه داده و چند tablespace بهمیزان چشمگیری کاهش دهد.
برای کاربران Windows، باید با یک حساب دارای دسترسی مدیریتی (administrative) وارد شده باشید، و سپس pg_upgrade را با دایرکتوریهای داخل کوتیشن اجرا کنید، مانند:
pg_upgrade.exe
--old-datadir "C:/Program Files/PostgreSQL/12/data"
--new-datadir "C:/Program Files/PostgreSQL/18/data"
--old-bindir "C:/Program Files/PostgreSQL/12/bin"
--new-bindir "C:/Program Files/PostgreSQL/18/bin"
پس از شروع، pg_upgrade سازگاری دو کلاستر را بررسی میکند و سپس ارتقا را انجام میدهد. میتوانید از pg_upgrade --check برای انجام صرفاً بررسیها استفاده کنید، حتی اگر سرور قدیمی هنوز در حال اجرا باشد. pg_upgrade --check همچنین هرگونه تنظیمات دستی که باید بعد از ارتقا انجام دهید را مشخص خواهد کرد. اگر قصد دارید از حالت link، clone، copy-file-range یا swap استفاده کنید، باید از گزینهٔ --link، --clone، --copy-file-range، یا --swap به همراه --check استفاده کنید تا بررسیهای ویژهٔ آن حالت فعال شوند. pg_upgrade به مجوز نوشتن در دایرکتوری فعلی نیاز دارد.
بدیهی است که هیچکس نباید در طول فرایند ارتقا به کلاسترها دسترسی داشته باشد. pg_upgrade بهطور پیشفرض سرورها را روی پورت 50432 اجرا میکند تا از اتصالات ناخواسته کلاینتها جلوگیری شود. هنگام ارتقا میتوانید از یک شماره پورت یکسان برای هر دو کلاستر استفاده کنید، زیرا کلاسترهای قدیمی و جدید بهطور همزمان در حال اجرا نخواهند بود. با این حال، هنگام بررسی یک سرور قدیمی در حال اجرا، شماره پورتهای قدیم و جدید باید متفاوت باشند.
اگر هنگام بازیابی شمای پایگاه داده خطایی رخ دهد، pg_upgrade خارج خواهد شد و شما باید مطابق با آنچه در Step 17 در زیر آمده است به کلاستر قدیمی بازگردید. برای امتحان مجدد pg_upgrade، باید کلاستر قدیمی را اصلاح کنید تا بازیابی شمای pg_upgrade با موفقیت انجام شود. اگر مشکل ناشی از یک ماژول contrib باشد، ممکن است لازم باشد ماژول contrib را از کلاستر قدیمی حذف نصب کنید و پس از ارتقا آن را در کلاستر جدید نصب کنید، به شرطی که از آن ماژول برای ذخیره دادههای کاربر استفاده نشده باشد.
اگر از حالت link استفاده نکردهاید، ابزار rsync را ندارید یا نمیخواهید از آن استفاده کنید، یا راهحل سادهتری میخواهید، از دستورالعملهای این بخش صرفنظر کنید و صرفاً پس از اتمام pg_upgrade و راهاندازی primary جدید، سرورهای standby را از نو ایجاد کنید.
rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster new_cluster remote_dir
که در آن old_cluster و new_cluster نسبت به دایرکتوری جاری در primary هستند، و remote_dir در سرور standby بالاتر از دایرکتوریهای خوشههای قدیمی و جدید قرار دارد. ساختار دایرکتوری زیر دایرکتوریهای مشخصشده در primary و standbyها باید یکسان باشد. برای جزئیات مربوط به تعیین دایرکتوری دوردست (remote)، صفحه راهنمای rsync را بررسی کنید، به عنوان مثال:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/12 \
/opt/PostgreSQL/18 standby.example.com:/opt/PostgreSQL
میتوانید با استفاده از گزینهٔ --dry-run در rsync بررسی کنید که این دستور چه کاری انجام خواهد داد. در حالی که rsync باید دستکم برای یک standby روی primary اجرا شود، اما تا زمانی که standby ارتقایافته راهاندازی نشده باشد، اجرای rsync روی یک standby ارتقایافته برای ارتقای سایر standbyها نیز امکانپذیر است.
کاری که این عمل انجام میدهد، ثبت پیوندهایی است که توسط حالت link در pg_upgrade ایجاد شدهاند و فایلهای موجود در خوشههای قدیمی و جدید را در سرور primary به یکدیگر پیوند میدهند. سپس فایلهای متناظر را در خوشه قدیمی standby پیدا کرده و پیوندهایی برای آنها در خوشه جدید standby ایجاد میکند. فایلهایی که در primary پیوند داده نشده بودند از primary به standby کپی میشوند. (این فایلها معمولاً کوچک هستند.) این سازوکار ارتقای سریع standby را فراهم میکند. متأسفانه، rsync فایلهای مرتبط با جدولهای temporary و unlogged را به صورت غیرضروری کپی میکند زیرا این فایلها معمولاً در سرورهای standby وجود ندارند.
اگر tablespace دارید، باید دستور rsync مشابهی را برای دایرکتوری هر tablespace اجرا کنید، به عنوان مثال:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_12_201909212 \
/vol1/pg_tblsp/PG_18_202307071 standby.example.com:/vol1/pg_tblsp
اگر pg_wal را به خارج از دایرکتوریهای داده منتقل کردهاید، rsync باید روی آن دایرکتوریها نیز اجرا شود.
psql --username=postgres --file=script.sql postgres
اسکریپتها را میتوان به هر ترتیبی اجرا کرد و پس از اجرا میتوان آنها را حذف نمود.
احتیاط
بهطور کلی، دسترسی به جدولهایی که در اسکریپتهای بازسازی (rebuild) به آنها ارجاع داده شده است تا پیش از اتمام کامل اجرای آن اسکریپتها ناامن است؛ انجام این کار میتواند منجر به نتایج نادرست یا افت کارایی شود. جدولهایی که در اسکریپتهای بازسازی ارجاع داده نشدهاند بلافاصله قابل دسترسی هستند.
از آنجا که همهٔ آمارها توسط pg_upgrade منتقل نمیشوند، در پایان ارتقا از شما خواسته میشود تا دستوراتی را برای بازتولید آن اطلاعات اجرا کنید. ممکن است نیاز باشد پارامترهای اتصال را برای تطابق با کلاستر جدید خود تنظیم کنید.
ابتدا از vacuumdb --all --analyze-in-stages --missing-stats-only برای تولید سریع حداقل آمارهای بهینهساز برای رابطههای فاقد آمار استفاده کنید. سپس از vacuumdb --all --analyze-only استفاده کنید تا مطمئن شوید همهٔ رابطهها دارای آمارهای تجمعی بهروز شده برای راهاندازی vacuum و analyze هستند. برای هر دو دستور، استفاده از --jobs میتواند سرعت کار را بالا ببرد. اگر vacuum_cost_delay روی یک مقدار غیرصفر تنظیم شده باشد، میتوان آن را با استفاده از PGOPTIONS نادیده گرفت تا تولید آمار تسریع شود، به عنوان مثال: PGOPTIONS='-c vacuum_cost_delay=0' vacuumdb ....
برخی متغیرهای محیطی میتوانند برای فراهم کردن مقادیر پیشفرض گزینههای خط فرمان استفاده شوند:
PGBINOLD
PGBINNEW
PGDATAOLD
PGDATANEW
PGPORTOLD
PGPORTNEW
PGSOCKETDIR
PGUSER
نکات (NOTES)
دستور pg_upgrade فایلهای کاری گوناگونی ایجاد میکند، مانند دامپهای اسکیما، که درون pg_upgrade_output.d در دایرکتوری کلاستر جدید ذخیره میشوند. هر بار اجرا یک زیردایرکتوری جدید ایجاد میکند که بر اساس برچسب زمانی با قالب استاندارد ISO 8601 (%Y%m%dT%H%M%S) نامگذاری شده است، جایی که تمام فایلهای تولیدشدهٔ آن ذخیره میشوند. در صورتی که pg_upgrade با موفقیت به پایان برسد، pg_upgrade_output.d و فایلهای موجود در آن بهطور خودکار حذف خواهند شد؛ اما در صورت بروز مشکل، فایلهای موجود در آنجا ممکن است اطلاعات مفیدی برای اشکالزدایی فراهم کنند.
دستور pg_upgrade فرایندهای postmaster کوتاهمدتی را در دایرکتوریهای دادههای قدیمی و جدید راهاندازی میکند. فایلهای موقت سوکت یونیکس برای ارتباط با این postmasterها، بهطور پیشفرض در دایرکتوری کاری فعلی ایجاد میشوند. در برخی شرایط ممکن است نام مسیر دایرکتوری فعلی طولانیتر از آن باشد که یک نام سوکت معتبر بهشمار آید. در این حالت میتوانید از گزینهٔ -s برای قرار دادن فایلهای سوکت در دایرکتوری دیگری با نام مسیر کوتاهتر استفاده کنید. برای امنیت، مطمئن شوید که آن دایرکتوری برای هیچ کاربر دیگری قابل خواندن یا نوشتن نباشد. (این ویژگی در Windows پشتیبانی نمیشود.)
تمام موارد شکست، بازسازی و نمایهسازی مجدد (reindex) در صورتی که بر روی نصب شما تأثیر بگذارند، توسط pg_upgrade گزارش خواهند شد؛ اسکریپتهای پس از ارتقا برای بازسازی جدولها و ایندکسها بهطور خودکار تولید خواهند شد. اگر در حال خودکارسازی ارتقای کلاسترهای متعددی هستید، درمییابید که کلاسترهایی با اسکیماهای پایگاهدادهٔ یکسان، به مراحل پس از ارتقای مشابهی برای همهٔ کلاسترها نیاز دارند؛ این به این دلیل است که مراحل پس از ارتقا مبتنی بر اسکیماهای پایگاهداده هستند، و نه دادههای کاربر.
برای آزمایش استقرار، یک رونوشتِ فقط اسکیما از کلاستر قدیمی ایجاد کنید، دادههای صوری درون آن درج نمایید، و آن را ارتقا دهید.
دستور pg_upgrade از ارتقای پایگاههای دادهای که ستونهای جدول آنها از این انواع دادههای سیستمی reg* ارجاعدهنده به OID استفاده میکنند، پشتیبانی نمیکند:
اگر میخواهید از حالت پیوند (link mode) استفاده کنید و مایل نیستید با راهاندازی کلاستر جدید، کلاستر قدیمی دستخوش تغییر شود، استفاده از حالت کلون (clone mode) را در نظر بگیرید. در صورتی که این قابلیت در دسترس نیست، یک رونوشت از کلاستر قدیمی بگیرید و آن را در حالت پیوند ارتقا دهید. برای ایجاد یک نسخهٔ معتبر از کلاستر قدیمی، در حالی که سرور در حال اجراست از rsync برای ایجاد یک نسخهٔ ناهمگام (dirty copy) از کلاستر قدیمی استفاده کنید، سپس سرور قدیمی را خاموش کرده و مجدداً دستور rsync --checksum را اجرا نمایید تا نسخهٔ رونوشت با اعمال تغییرات، یکدست و همگام شود. (استفاده از گزینهٔ --checksum ضروری است چرا که rsync تنها از دقت زمانی یک ثانیهای برای زمان ویرایش فایلها برخوردار است.) ممکن است بخواهید برخی فایلها، مانند postmaster.pid، را همانطور که در Section 25.3.4 مستند شده است، مستثنی کنید. اگر فایلسیستم شما از اسنپشاتهای فایلسیستم یا کپی فایلهای copy-on-write پشتیبانی میکند، میتوانید از آن برای پشتیبانگیری از کلاستر قدیمی و tablespaceها استفاده کنید، اگرچه اسنپشات و کپیها باید همزمان یا در زمان متوقف بودن سرور پایگاهداده ایجاد شوند..SH "همچنین ببینید (SEE ALSO)" initdb(1), pg_ctl(1), pg_dump(1), postgres(1)
| 2026 | PostgreSQL 18.6 |