Поделиться через


Полный вакуум с помощью 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 команду, указав имя таблицы или индекс, который требуется оптимизировать. Расширение получает блокировки таблицы или индекса, чтобы предотвратить выполнение других операций во время оптимизации. Он удаляет большие двоичные объекты и реорганизует данные более эффективно.

Как работает полная перепаковка таблицы

Чтобы выполнить перепаковку полной таблицы, расширение выполняет следующие действия.

  1. Создает таблицу журналов для записи изменений, внесенных в исходную таблицу.
  2. Добавляет триггер в исходную таблицу, ведение журнала INSERTs, UPDATEs и DELETEs в таблицу журналов.
  3. Создает новую таблицу, содержащую все строки в исходной таблице.
  4. Создает индексы в новой таблице.
  5. Применяет все изменения, записанные в таблице журнала, к новой таблице.
  6. Переключает исходные и новые таблицы, включая индексы и всплываемые таблицы.
  7. Удаляет исходную таблицу.

Во время этих действий pg_repack сохраняется только блокировка эксклюзивного доступа в течение короткого периода, во время начальной установки (шаги 1 и 2) и снова во время окончательного этапа переключения и удаления (шаги 6 и 7). В течение остального времени необходимо хранить блокировку общего доступа в исходной таблице, pg_repack позволяя INSERTs, UPDATEs и DELETEs продолжаться как обычно.

Ограничения

pg_repack имеет некоторые ограничения, которые следует учитывать перед его использованием:

  • Целевая таблица должна иметь первичный ключ или уникальный индекс в столбце NOT NULL для успешной операции.
  • Во время pg_repack выполнения вы не сможете выполнять какие-либо команды языка определения данных (DDL) в целевых таблицах, за исключением ВАКУУМа или АНАЛИЗА. Чтобы обеспечить применение этих ограничений, pg_repack удерживает блокировку общего доступа в целевой таблице во время полного перепаковки таблицы.

Настройка

Необходимые компоненты

  1. 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 и базой данных с помощью следующей команды.

  1. Используя клиент вашего предпочтения, подключитесь к База данных Azure для PostgreSQL гибкому экземпляру сервера. В этом примере используется psql.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. Найдите версию расширения, pg_repack установленную в базе данных.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. Версия расширения должна соответствовать версии клиентского приложения, которую можно проверить, выполнив следующую команду:

    azureuser@azureuser:~$ pg_repack --version
    
  4. Запустите 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 имеет код клиентского приложения, который знает, как взаимодействовать с элементами программирования, реализованными в расширении. Это клиентское приложение призвано упростить взаимодействие с различными интерфейсами, которые отображаются расширением на стороне сервера. Он предлагает пользователю некоторые параметры командной строки, которые проще понять. Клиентское приложение не используется без расширения, созданного в базе данных, на которую он указывает. Расширение на стороне сервера будет полностью функциональным, но пользователю потребуется понять сложный шаблон взаимодействия. Этот шаблон состоит в выполнении запросов для получения данных, которые используются в качестве входных данных для функций, реализованных расширением, и т. д.