Полный вакуум с помощью pg_repack в База данных Azure для PostgreSQL — гибкий сервер
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер
В этой статье вы узнаете, как удалить pg_repack
большие двоичные объекты и повысить производительность База данных Azure для PostgreSQL гибкого сервера. Раздувание — это возникновение ненужных данных, накапливающихся в таблицах и индексах из-за частого обновления и удаления. Большой двоичный объект может привести к росту размера базы данных, чем ожидалось, и это может серьезно повлиять на производительность некоторых запросов. Используйте pg_repack
для восстановления пустого пространства и более эффективной реорганизации данных.
Что такое pg_repack?
pg_repack
— это расширение PostgreSQL, которое удаляет большие двоичные объекты из таблиц и индексов и реорганизует их более эффективно. pg_repack
работает путем создания новой копии целевой таблицы или индекса, применения любых изменений, произошедших во время процесса, а затем переключения старых и новых версий атомарно. pg_repack
не требует простоя или монопольных блокировок доступа к обработанной таблице или индексу, за исключением краткого периода в начале и в конце операции. Вы можете использовать pg_repack
для оптимизации любой таблицы или индекса в База данных Azure для PostgreSQL гибких баз данных сервера.
Как использовать pg_repack?
Чтобы использоватьpg_repack
, необходимо установить расширение в гибкой базе данных сервера База данных Azure для PostgreSQL, а затем выполнить pg_repack
команду, указав имя таблицы или индекс, который требуется оптимизировать. Расширение получает блокировки таблицы или индекса, чтобы предотвратить выполнение других операций во время оптимизации. Он удаляет большие двоичные объекты и реорганизует данные более эффективно.
Как работает полная перепаковка таблицы
Чтобы выполнить перепаковку полной таблицы, расширение выполняет следующие действия.
- Создает таблицу журналов для записи изменений, внесенных в исходную таблицу.
- Добавляет триггер в исходную таблицу, ведение журнала INSERTs, UPDATEs и DELETEs в таблицу журналов.
- Создает новую таблицу, содержащую все строки в исходной таблице.
- Создает индексы в новой таблице.
- Применяет все изменения, записанные в таблице журнала, к новой таблице.
- Переключает исходные и новые таблицы, включая индексы и всплываемые таблицы.
- Удаляет исходную таблицу.
Во время этих действий pg_repack
сохраняется только блокировка эксклюзивного доступа в течение короткого периода, во время начальной установки (шаги 1 и 2) и снова во время окончательного этапа переключения и удаления (шаги 6 и 7). В течение остального времени необходимо хранить блокировку общего доступа в исходной таблице, pg_repack
позволяя INSERTs, UPDATEs и DELETEs продолжаться как обычно.
Ограничения
pg_repack
имеет некоторые ограничения, которые следует учитывать перед его использованием:
- Целевая таблица должна иметь первичный ключ или уникальный индекс в столбце NOT NULL для успешной операции.
- Во время
pg_repack
выполнения вы не сможете выполнять какие-либо команды языка определения данных (DDL) в целевых таблицах, за исключением ВАКУУМа или АНАЛИЗА. Чтобы обеспечить применение этих ограничений,pg_repack
удерживает блокировку общего доступа в целевой таблице во время полного перепаковки таблицы.
Настройка
Необходимые компоненты
pg_repack
Настройте расширение, указав список разрешений и создав расширение.
Создание клиентского приложения pg_repack
Для использования этого расширения требуется клиентское приложение, которое можно создать и установить в экземпляре Ubuntu.
Чтобы установить версию 1.4.7 pg_repack
, выполните следующий сценарий bash на компьютере Ubuntu.
# Create the file repository configuration
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists
sudo apt-get update
# Install required packages to build the code
sudo apt-get install -y postgresql-server-dev-14 unzip make gcc libssl-dev liblz4-dev zlib1g-dev libreadline-dev libzstd-dev
# Download compressed version of build tree for version 1.4.7 of pg_repack
wget 'https://api.pgxn.org/dist/pg_repack/1.4.7/pg_repack-1.4.7.zip'
# Uncompress build tree
unzip pg_repack-1.4.7.zip
# Set current directory to where build tree was uncompressed
cd pg_repack-1.4.7
# Build code
sudo make
# Copy resulting binaries to /usr/local/bin
sudo cp bin/pg_repack /usr/local/bin
# Run pg_repack to check its version
pg_repack --version
Использование pg_repack
Пример запуска pg_repack
в таблице с именем info в общедоступной схеме в База данных Azure для PostgreSQL гибком экземпляре сервера с конечной точкой pgserver.postgres.database.azure.com, именем пользователя azureuser и базой данных с помощью следующей команды.
Используя клиент вашего предпочтения, подключитесь к База данных Azure для PostgreSQL гибкому экземпляру сервера. В этом примере используется psql.
psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
Найдите версию расширения,
pg_repack
установленную в базе данных.SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
Версия расширения должна соответствовать версии клиентского приложения, которую можно проверить, выполнив следующую команду:
azureuser@azureuser:~$ pg_repack --version
Запустите
pg_repack
клиент к таблице под названием сведения , которые существуют в базе данных foo.pg_repack --host=<server>.postgres.database.azure.com --username=<user> --dbname=<database> --table=info --jobs=2 --no-kill-backend --no-superuser-check
параметры pg_repack
Полезные pg_repack
варианты рабочих нагрузок:
-k
,--no-superuser-check
: пропуск проверок суперпользователя в клиенте. Этот параметр полезен для использованияpg_repack
на платформах, поддерживающих его запуск как не суперпользователей, таких как База данных Azure для PostgreSQL гибкие экземпляры сервера.-j
:--jobs
создайте указанное число дополнительных подключений для База данных Azure для PostgreSQL гибкого сервера и используйте эти дополнительные подключения для параллелизации перестроения индексов в каждой таблице. Параллельные сборки индекса поддерживаются только для перепаковки полной таблицы.--index
или--only
параметры индексов. Если у вашего База данных Azure для PostgreSQL гибкого экземпляра сервера есть дополнительные ядра и доступные диски ввода-вывода, это может быть полезным способом ускоренияpg_repack
работы.-D
.--no-kill-backend
Вместо убийства внутренних клиентов, выполняющих блокирующие запросы, пропустите перепаковку таблицы, если блокировка не может быть получена после ожидания указанного времени.--wait-timeout
По умолчанию--wait-timeout
установлено значение 60 секунд. Значение параметра по умолчанию —false
.-E LEVEL
,--elevel=LEVEL
: выберите уровень вывода сообщения изDEBUG
,INFO
,NOTICE
,WARNING
,ERROR
,LOG
,FATAL
иPANIC
. Значение по умолчанию —INFO
.
Чтобы понять все параметры, ознакомьтесь с документацией по pg_repack.
Вопросы и ответы
Является ли pg_repack расширение или исполняемый файл на стороне клиента, например psql или pg_dump?
pg_repack на самом деле оба. pg_repack/lib содержит код для расширения, включая созданную схему и артефакты SQL, а библиотека C реализует код нескольких этих функций.
С другой стороны, pg_repack/bin имеет код клиентского приложения, который знает, как взаимодействовать с элементами программирования, реализованными в расширении. Это клиентское приложение призвано упростить взаимодействие с различными интерфейсами, которые отображаются расширением на стороне сервера. Он предлагает пользователю некоторые параметры командной строки, которые проще понять. Клиентское приложение не используется без расширения, созданного в базе данных, на которую он указывает. Расширение на стороне сервера будет полностью функциональным, но пользователю потребуется понять сложный шаблон взаимодействия. Этот шаблон состоит в выполнении запросов для получения данных, которые используются в качестве входных данных для функций, реализованных расширением, и т. д.