Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы узнаете, как удалить 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.5.1 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.5.1 of pg_repack
wget 'https://api.pgxn.org/dist/pg_repack/1.5.1/pg_repack-1.5.1.zip'
# Uncompress build tree
unzip pg_repack-1.5.1.zip
# Set current directory to where build tree was uncompressed
cd pg_repack-1.5.1
# 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 имеет код клиентского приложения, который знает, как взаимодействовать с элементами программирования, реализованными в расширении. Это клиентское приложение призвано упростить взаимодействие с различными интерфейсами, которые отображаются расширением на стороне сервера. Он предлагает пользователю некоторые параметры командной строки, которые проще понять. Клиентское приложение не используется без расширения, созданного в базе данных, на которую он указывает. Расширение на стороне сервера будет полностью функциональным, но пользователю потребуется понять сложный шаблон взаимодействия. Этот шаблон состоит в выполнении запросов для получения данных, которые используются в качестве входных данных для функций, реализованных расширением, и т. д.