Skip to content

Обновление PostgreSQL с 9.6 до 17 с помощью pg_upgrade

SHRIDHAR KHANAL: Upgrading PostgreSQL 9.6 to 17 with pg_upgrade


При обновлении между основными версиями PostgreSQL есть несколько способов. Дамп и восстановление (dump/restore) — самый простой с точки зрения понимания, но время простоя растёт прямо пропорционально размеру базы данных, поэтому для всего, что больше нескольких терабайт, этот вариант не подходит. Логическая репликация позволяет добиться почти нулевого времени простоя, но она работает только начиная с PostgreSQL 10; если ваш исходный кластер работает на версии ниже 10, этот путь в нативном виде недоступен. Остаётся pg_upgrade — инструмент, поддерживаемый сообществом для обновления основных версий «на месте». С флагом –link он создаёт жёсткие ссылки вместо копирования файлов данных, поэтому сам шаг обновления остаётся быстрым, независимо от размера базы данных.


Эта статья основан на обновлении с версии 9.6 до 17 на Ubuntu с использованием pg_upgrade. Я проведу вас через каждый этап, отмечу моменты, которые застают людей врасплох, и поделюсь проверочными запросами, которые мы выполняем после завершения обновления.

Продолжить чтение "Обновление PostgreSQL с 9.6 до 17 с помощью pg_upgrade"

Всё о GUC по порядку: extra_float_digits

Автор: Christophe Pettus: All Your GUCs in a Row: extra_float_digits


extra_float_digits — это настройка, чья задача изменилась под ней. На протяжении большей части истории PostgreSQL она принуждала к выбору между выводом чисел с плавающей точкой, который был удобен для чтения, и выводом, который был абсолютно точным, и нельзя было иметь и то, и другое. Начиная с PostgreSQL 12 вам больше не нужно выбирать, поэтому параметр, к которому вы, возможно, привыкли прибегать, теперь вам редко понадобится.


Продолжить чтение "Всё о GUC по порядку: extra_float_digits"

Всё о GUC по порядку: external_pid_file

Christophe Pettus: All Your GUCs in a Row: external_pid_file


PostgreSQL уже записывает PID-файл. Каждый раз при запуске postmaster он помещает postmaster.pid в каталог данных и удаляет его при чистом завершении работы. Этот файл является блокировкой, которая предотвращает запуск второго postmaster с тем же каталогом данных, и содержит восемь строк с деталями работающего экземпляра: PID, каталог данных, время запуска, порт, каталог сокетов и так далее. external_pid_file не заменяет его. Он просит postmaster записать второй, гораздо меньший файл в другом месте.

Продолжить чтение "Всё о GUC по порядку: external_pid_file"

Новости за 2026-08-22 - 2026-08-28

§ Лидеры недели

	Участник		w_sel	all_sel	select	dml	Всего	Рейтинг
Цыбин А.В. (magicdragon) 4 34 8 6 14 1799
Виноградова С.М. (Tigra1) 2 152 6 0 6 151
Скоков Б.С. (leks$$) 3 44 5 0 5 1182

§ Претенденты на попадание в TOP 100

Рейтинг	 Участник (решенные задачи, время в днях)
151 Tigra1 (152, 29.339)
Продолжить чтение "Новости за 2026-08-22 - 2026-08-28"

Новости за 2026-08-22 - 2026-08-28

§ Лидеры недели

	Участник		w_sel	all_sel	select	dml	Всего	Рейтинг
Цыбин А.В. (magicdragon) 4 34 8 6 14 1799
Виноградова С.М. (Tigra1) 2 152 6 0 6 151
Скоков Б.С. (leks$$) 3 44 5 0 5 1182

§ Претенденты на попадание в TOP 100

Рейтинг	 Участник (решенные задачи, время в днях)
151 Tigra1 (152, 29.339)
Продолжить чтение "Новости за 2026-08-22 - 2026-08-28"

Всё о GUC по порядку: extension_control_path

Christophe Pettus: All Your GUCs in a Row: extension_control_path


На протяжении всей истории PostgreSQL до настоящего момента расширение должно было находиться ровно в одном месте. CREATE EXTENSION foo читал foo.control из встроенного каталога расширений, на который указывает pg_config --sharedir, и нигде больше не искал. Если вы хотели, чтобы расширение было доступно, его файлы должны были находиться в этом каталоге, что на практике означало установку от root в системное дерево или встраивание в образ. extension_control_path, новый в PostgreSQL 18, отменяет это допущение.

Продолжить чтение "Всё о GUC по порядку: extension_control_path"

7 ошибок Python, которые делают ваш код медленным (и как их исправить)

Пересказ статьи Sarikasharma. 7 Python Mistakes That Make Your Code Slow (And How to Fix Them)


Когда люди говорят, что Python медленный, они обычно обвиняют язык.

В действительности это часто зависит от того, как мы пишем код.

Python является выразительным, читабельным и мощным. Но небольшие ошибки в структуре и обработке данных могут незаметно влиять на производительность...особенно в серверных системах или приложениях с большим объемом данных.

Вот семь распространенных ошибок Python, которые делают ваш код медленней, чем он мог бы быть, и то, как их исправить.
Продолжить чтение "7 ошибок Python, которые делают ваш код медленным (и как их исправить)"

Всё о GUC по порядку: exit_on_error

Автор: Christophe Pettus, All Your GUCs in a Row: exit_on_error


PostgreSQL сортирует свои проблемы по степени серьёзности. ERROR прерывает текущий оператор и откатывает транзакцию, но сессия продолжает жить; вы выполняете ROLLBACK и продолжаете работать. FATAL завершает сессию, разрывая это одно подключение, пока сервер работает дальше. PANIC останавливает весь сервер. В нормальной работе граница между «ваш оператор не выполнился» и «ваше подключение потеряно» проходит между ERROR и FATAL, и почти всё, что идёт не так в повседневном SQL — опечатка, нарушение ограничения, деление на ноль — является всего лишь ERROR.

Продолжить чтение "Всё о GUC по порядку: exit_on_error"

Что означают .ready и .done, и почему WAL задерживается

Автор: Richard Yen, A practical guide to what .ready and .done mean, and why WAL sticks around


9:12 утра в понедельник. Кто-то из вашей команды открывает каталог pg_wal/archive_status/ во время паники по поводу хранилища и видит длинный список файлов, оканчивающихся на .ready. Возникает вопрос, который многие из нас задавали хотя бы раз: «Сломалась ли репликация?» Потоковые реплики всё ещё выглядят в основном нормально, но файлы .ready продолжают накапливаться, использование диска продолжает расти, и никто до конца не уверен, что на самом деле означают .ready и .done.


Что такое .ready и какие (если вообще какие) действия мне нужно предпринять? Давайте поговорим об этом сегодня.



Подсказка: Это о доставке WAL


Представьте доставку WAL как три независимых шага:



  1. Генерация WAL

  2. Транспортировка WAL

  3. Воспроизведение или потребление WAL



archive_command — это один из способов транспортировки. Потоковая репликация — другой. Обратите внимание, что логическая репликация также имеет канал транспортировки, но она транспортирует декодированные данные логических изменений, а не сырые файлы сегментов WAL.

Продолжить чтение "Что означают .ready и .done, и почему WAL задерживается"

Всё о GUC по порядку:

Christophe Pettus: All Your GUCs in a Row: event_triggers


Событийный триггер (event trigger) срабатывает на события базы данных, а не на изменения строк: на ddl_command_start, sql_drop, table_rewrite и, начиная с PostgreSQL 17, на login. Они используются для аудита DDL или наложения запрета на DDL, и они идут с хорошо известным способом выстрелить себе в ногу. Напишите триггер на ddl_command_start, функция которого вызывает исключение, и теперь каждая команда DDL в базе данных завершается ошибкой, включая DROP EVENT TRIGGER, который вы использовали бы для его удаления. Документация содержит ровно этот пример — функцию abort_any_command, настроенную на прерывание всего, предположительно для того, чтобы вы узнали форму ошибки, когда уже её совершили.



Продолжить чтение "Всё о GUC по порядку: "

Всё о GUC по порядку: event_source

Автор: Christophe Pettus: All Your GUCs in a Row: event_source


event_source — это параметр для Windows, что означает, что для большинства читающих это не делает ровно ничего. Если вы запускаете PostgreSQL на Linux или в управляемом сервисе, там нет журнала событий Windows, с которым он мог бы взаимодействовать, и эта строка навсегда остаётся со значением по умолчанию. То, что следует далее, предназначено для меньшинства пользователей Windows, и сводится к одному факту, который стоит знать.

Продолжить чтение "Всё о GUC по порядку: event_source"

Любопытный случай с display(df)

Пересказ статьи Karthik. The curious case of display(df)


Вы просто хотите посмотреть ваши данные. Вы быстро набираете display(df) в ячейке notebook и жмете Выполнить. Это кажется совершенно безобидно - кроме того, это всего лишь предварительный просмотр вашего фрейма данных, не так ли?

Но через несколько мгновений ваш кластер начинает вращаться, ячейка работает намного дольше, чем ожидалось, и ваш браузер может даже заикаться.

Хотя display() является фантастическим инструментом для интерактивного исследования, но, если слишком сильно полагаться на него, он может незаметно задушить ваши задания Apache Spark. Давайте заглянем под капот, чтобы точно выяснить, что происходит, когда вы вызываете display(), почему все замедляется, и как простое переключение на show() может радикально улучшить вашу производительность.
Продолжить чтение "Любопытный случай с display(df)"

VACUUM — это ложь (о ваших индексах)

Автор: Radim Marek: VACUUM Is a Lie (About Your Indexes)


Существует распространённое заблуждение, которое беспокоит большинство разработчиков, использующих PostgreSQL: настройте VACUUM или запустите VACUUM, и ваша база данных останется здоровой. Мёртвые кортежи будут очищены. Идентификаторы транзакций переработаны. Пространство освобождено. Дальнейших действий не требуется.


Но есть пара «грязных» секретов, о которых люди не знают. Первый из них заключается в том, что VACUUM лжёт вам о ваших индексах.

Продолжить чтение "VACUUM — это ложь (о ваших индексах)"

Всё о GUC по порядку: escape_string_warning

Автор: Christophe Pettus: All Your GUCs in a Row: escape_string_warning


escape_string_warning включён по умолчанию уже около двадцати лет, и на современном PostgreSQL, настроенном обычным образом, он никогда не скажет вам ни слова. Это не неисправность. Условие, о котором он предупреждает, перестало быть поведением по умолчанию в 2011 году.

Продолжить чтение "Всё о GUC по порядку: escape_string_warning"

Всё о GUC по порядку: enable_tidscan

Автор: Christophe Pettus: All Your GUCs in a Row: enable_tidscan


enable_tidscan — это параметр enable_*, который вы почти наверняка никогда не установите, и на этот раз это не предупреждение, а просто факт о том, как происходят сканирования TID. Вы не натыкаетесь на него случайно, как на последовательное сканирование или сортировку. Сканирование TID появляется только тогда, когда вы явно написали условие на ctid, поэтому тип плана, которым управляет этот параметр, появляется именно тогда, когда вы его запросили, и никак иначе.



(Для протокола: я за всю свою жизнь ни разу не видел узел tidscan.)


Продолжить чтение "Всё о GUC по порядку: enable_tidscan"