Важно: Данный раздел актуален для Платформы данных On-Premise.
Модуль Diskquota позволяет администраторам базы данных RT.WareHouse ограничивать объем дискового пространства, используемого схемами, ролями или табличными пространствами в базе данных.
После установки RT.WH выполните действие Install DiskQuota
При успешном выполнении, модуль будет зарегистрирован в БД
1. Разверните кластер RT.WH
2. На мастер узел установите пакет rt.diskquota
3. Создайте базу данных diskquota
. Модуль diskquota
использует эту базу данных для хранения списка баз данных, в которых модуль включен.
$ createdb diskquota;
4. Добавьте разделяемую библиотеку diskquota
в параметр конфигурации сервера базы данных RT.WareHouse shared_preload_libraries
и перезапустите базу данных RT.WareHouse. Обязательно сохраните предыдущую настройку конфигурационного параметра. Например:
$ gpconfig -s shared_preload_libraries
Values on all segments are consistent
GUC : shared_preload_libraries
Master value: auto_explain
Segment value: auto_explain
$ gpconfig -c shared_preload_libraries -v 'auto_explain,diskquota-2.2'
$ gpstop -ar
5. Зарегистрируйте расширение diskquota
в каждой базе данных, в которой вы хотите применить квоты использования диска. Вы можете зарегистрировать diskquota
не более чем в десяти базах данных.
$ psql -d testdb -c "CREATE EXTENSION diskquota"
6. Если вы регистрируете расширение diskquota
в базе данных, которая уже содержит данные, то необходимо инициализировать данные о размере таблицы diskquota
, выполнив в базе данных UDF diskquota.init_table_size_table()
. В базе данных с большим количеством файлов это может занять некоторое время. Модуль diskquota не может быть использован до завершения инициализации.
=# SELECT diskquota.init_table_size_table();
Примечание. Для работы diskquota необходимо выполнить UDF |
Использование диска для таблицы включает данные таблицы, индексы, тостовые (toast) таблицы и карту свободного пространства. Для таблиц, оптимизированных для добавления, в расчет включаются карта видимости и индексы, а также таблица каталога блоков.
Модуль diskquota позволяет администратору базы данных RT.WareHouse ограничить объем дискового пространства, используемого таблицами в схемах или принадлежащими ролям в 50 базах данных. Администратор также может использовать модуль для ограничения объема дискового пространства, используемого схемами и ролями, на основе каждого табличного пространства, а также для ограничения объема дискового пространства, используемого сегментом базы данных RT.WareHouse для табличного пространства.
Примечание. Для владельца системы базы данных RT.WareHouse (пользователя, создающего кластер RT.WareHouse) нельзя установить дисковую квоту на основе роли. |
С помощью модуля diskquota можно установить следующие квоты:
На активном мастере базы данных RT.WareHouse запускается один процесс diskquota
launcher. Процесс diskquota
launcher создает и запускает рабочий процесс diskquota
на мастере для каждой базы данных с поддержкой diskquota. Рабочий процесс отвечает за мониторинг использования диска табличными пространствами, схемами и ролями в целевой базе данных и взаимодействует с сегментами RT.WareHouse для получения размеров активных таблиц. Рабочий процесс также обеспечивает соблюдение квот, помещая табличные пространства, схемы и роли в список запрещенных при достижении ими квоты.
Когда формируется план запроса на добавление данных, а табличная область, схема или роль, в которую будут загружены данные, находится в списке denylist, diskquota
отменяет запрос до начала его выполнения и выдает сообщение об ошибке, свидетельствующее о превышении квоты.
Запрос, не добавляющий данные, например, простой запрос SELECT, всегда разрешен к выполнению, даже если табличное пространство, роль или схема находятся в списке запрещенных.
Diskquota может устанавливать как мягкие, так и жесткие ограничения на использование диска:
diskquota
всегда применяет мягкие ограничения. diskquota
проверяет квоты перед выполнением запроса. Если квоты не превышены на момент начала выполнения запроса, diskquota
разрешает его выполнение, даже если в итоге квота будет превышена.diskquota
также контролирует использование диска во время выполнения запроса. Если во время выполнения запроса превышена дисковая квота, diskquota
завершает запрос. Администраторы могут включить жесткое ограничение использования диска, установив параметр конфигурации сервера diskquota.hard_limit
, как описано в разделе Активация/деактивация применения жесткого ограничения использования диска (6.3).Существует некоторая задержка после достижения квоты перед добавлением схемы или роли в список запрещенных. Другие запросы могут добавить больше данных во время задержки. Задержка возникает из-за того, что процессы diskquota
, вычисляющие дисковое пространство, используемое каждой таблицей, запускаются периодически с паузой между выполнениями (по умолчанию две секунды). Задержка также возникает, когда использование диска падает ниже квоты из-за таких операций, как DROP, TRUNCATE или VACUUM FULL, которые удаляют данные. Администраторы могут изменить время между проверками дискового пространства, задав параметр конфигурации сервера diskquota.naptime
.
Diskquota может работать как в статическом, так и в динамическом режимах:
diskquota
, меньше или равно максимальному количеству рабочих процессов diskquota
, diskquota
работает в статическом режиме; он назначает фоновый рабочий процесс (bgworker) для мониторинга каждой базы данных, а процесс bgworker завершает работу только тогда, когда расширение diskquota
удаляется из базы данных.diskquota
, превышает максимальное количество рабочих процессов diskquota
, diskquota
работает в динамическом режиме. В динамическом режиме для каждой отслеживаемой базы данных каждые diskquota.naptime
секунд diskquota
создает процесс bgworker для сбора информации об использовании диска для базы данных, а затем останавливает процесс bgworker сразу после завершения сбора данных. В этом режиме diskquota
динамически запускает и останавливает процессы bgworker по мере необходимости для всех отслеживаемых баз данных. Администраторы могут изменить максимальное количество рабочих процессов, настроенных для diskquota
, задав параметр конфигурации сервера diskquota.max_workers
, как описано в разделе «Указание максимального количества активных рабочих процессов diskquota» (6.4).Если запрос невозможно выполнить из-за того, что табличное пространство, схема или роль занесены в черный список, администратор может увеличить превышенную квоту, чтобы разрешить выполнение запроса. Модуль предоставляет представления, которые можно использовать для поиска табличных пространств, схем или ролей, которые превысили свои ограничения.
Модуль diskquota предоставляет определяемые пользователем функции (UDF) и представления, которые можно использовать для управления и мониторинга использования дискового пространства при развертывании базы данных RT.WareHouse.
Функции и представления, предоставляемые модулем diskquota, доступны в схеме базы данных RT.WareHouse с именем diskquota
.
Примечание. Вам может потребоваться добавить имя схемы ( |
Определяемые пользователем функции, предоставляемые модулем, включают (Таблица 1):
Таблица 1 — Определяемые пользователем функции
Сигнатура функции | Описание |
---|---|
void init_table_size_table() | Изменяет размеры существующих таблиц в текущей базе данных. |
void set_role_quota( role_name text, quota text ) |
Задает дисковую квоту для определенной роли в текущей базе данных. Примечание: Дисковая квота на основе роли не может быть установлена для владельца системы базы данных RT.WareHouse. |
void set_role_tablespace_quota( role_name text, tablespace_name text, quota text ) |
Задает дисковую квоту для определенной комбинации роли и табличного пространства в текущей базе данных. Примечание: Дисковая квота на основе роли не может быть установлена для владельца системы базы данных RT.WareHouse. |
void set_schema_quota( schema_name text, quota text ) | Задает дисковую квоту для определенной схемы в текущей базе данных. |
void set_schema_tablespace_quota( schema_name text, tablespace_name text, quota text ) | Задает дисковую квоту для определенной комбинации схемы и табличного пространства в текущей базе данных. |
void set_per_segment_quota (текст tablespace_name, отношение float4) | Устанавливает дисковую квоту на сегмент для табличного пространства в текущей базе данных. |
void pause() | Указывает модулю продолжить подсчет использования диска для текущей базы данных, но приостановить и перестать выдавать ошибку при превышении предела. |
void resume() | Указывает модулю возобновить выдачу ошибки при превышении лимита использования диска в текущей базе данных. |
status() RETURNS table | Отображает версии двоичного файла diskquota и схемы, а также состояние принудительного ограничения использования мягкого и жесткого диска в текущей базе данных. |
Представления, доступные в модуле diskquota, включают (Таблица 2):
Таблица 2 — Представления, доступные в модуле diskquota
Имя представления | Описание |
---|---|
show_fast_database_size_view | Отображает использование дискового пространства в текущей базе данных. |
show_fast_role_quota_view | Список активных квот для ролей в текущей базе данных. |
show_fast_role_tablespace_quota_view | Список активных квот для ролей на табличное пространство в текущей базе данных. |
show_fast_schema_quota_view | Список активных квот для схем в текущей базе данных. |
show_fast_schema_tablespace_quota_view | Перечисляет активные квоты для схем на табличное пространство в текущей базе данных. |
show_segment_ratio_quota_view | Отображает соотношение дисковых квот на сегмент для любых квот табличного пространства на сегмент, установленных в текущей базе данных. |
diskquota
предоставляет параметры конфигурации сервера, которые позволяют вам управлять определенными функциями модуля:
diskquota.naptime
— определяет, как часто (в секундах) программа diskquota
пересчитывает размеры таблицы.diskquota.max_active_tables
— определяет максимальное количество отношений (включая таблицы, индексы и т. д.), которые модуль diskquota
может отслеживать одновременно.diskquota.hard_limit
— активирует или деактивирует жесткое ограничение использования диска.diskquota.max_workers
— указывает максимальное количество рабочих процессов diskquota, которые могут выполняться одновременно.diskquota.max_table_segments
— указывает максимальное количество сегментов таблицы в кластере.Вы используете команду gpconfig
для установки этих параметров таким же образом, как и любой другой параметр конфигурации сервера базы данных RT.WareHouse.
Параметр конфигурации сервера diskquota.naptime
указывает, как часто (в секундах) diskquota пересчитывает размеры таблиц. Чем меньше значение времени naptime
, тем меньше задержка при обнаружении изменений в использовании диска. В этом примере naptime
устанавливается равным десяти секундам, а база данных RT.WareHouse перезапускается:
$ gpconfig -c diskquota.naptime -v 10
$ gpstop -ar
Модуль diskquota использует общую (разделяемую) память для сохранения черного списка и списка активных таблиц.
Общая память черного списка может содержать до одного миллиона объектов базы данных, которые превышают лимит квоты. Если общая память черного списка заполнена, данные могут быть загружены в некоторые схемы или роли после того, как они достигли предела своей квоты.
Общая память активных таблиц по умолчанию содержит до одного миллиона активных таблиц. Активные таблицы — это таблицы, размеры которых могли измениться с тех пор, как diskquota в последний раз пересчитывала размеры таблиц. Функции ловушки diskquota вызываются, когда диспетчер хранения в каждом сегменте базы данных RT.WareHouse создает, расширяет или усекает табличный файл. Функции подключения сохраняют идентификатор файла в общей памяти, чтобы его размер файла можно было пересчитать при следующем обновлении данных о размере таблицы.
Параметр конфигурации сервера diskquota.max_active_tables
определяет максимальное количество отношений (включая таблицы, индексы и т. д.), которые модуль diskquota
может отслеживать одновременно. Значение по умолчанию — 300 * 1024. Этого значения должно быть достаточно для большинства установок базы данных RT.WareHouse. Если вы измените значение этого параметра конфигурации, вы должны перезапустить сервер базы данных RT.WareHouse.
При включении принудительного ограничения использования диска diskquota
проверяет квоту во время выполнения запроса. Если в какой-то момент времени выполняемый запрос превысит квоту, diskquota
завершит его выполнение.
По умолчанию принудительное ограничение использования жесткого диска отключено для всех баз данных. Чтобы активировать жесткое ограничение для всех баз данных, установите для параметра конфигурации сервера diskquota.hard_limit
значение «on»
, а затем перезагрузите конфигурацию базы данных RT.WareHouse:
$ gpconfig -c diskquota.hard_limit -v 'on'
$ gpstop -u
Выполните следующий запрос, чтобы просмотреть параметр принудительного применения жестких ограничений:
SELECT * from diskquota.status();
Параметр конфигурации сервера diskquota.max_workers
указывает максимальное количество рабочих процессов diskquota
(не включая процесс запуска diskquota), которые могут выполняться одновременно. Максимальное количество рабочих процессов по умолчанию — 10, а максимальное значение, которое можно указать — 20.
Вы должны установить этот параметр во время запуска сервера базы данных RT.WareHouse.
Примечание. Установка для |
Таблица RT.WareHouse (включая дочерние таблицы партиционированной таблицы) распространяется на все сегменты в виде шарда. diskquota
считает каждый шард таблицы как сегмент таблицы. Параметр конфигурации сервера diskquota.max_table_segments
определяет максимальное количество сегментов таблиц в кластере базы данных RT.WareHouse, что, в свою очередь, может ограничивать максимальное количество таблиц, которые может отслеживать diskquota
.
Значение времени выполнения diskquota.max_table_segments
равно максимальному количеству таблиц, умноженному на (number_of_segments + 1). Значение по умолчанию: 10 * 1024 * 1024.
В разделе представлены задачи, которые вы можете выполнять с помощью модуля diskquota
.
Чтобы просмотреть номер версии модуля diskquota
и схемы, а также состояние применения мягких и жестких ограничений в текущей базе данных, вызовите команду status()
:
SELECT diskquota.status();
name | status
------------------------+---------
soft limits | on
hard limits | on
current binary version | 2.0.1
current schema version | 2.0
Если вы не хотите получать уведомления о событиях превышения дисковой квоты в течение определенного периода времени, вы можете приостановить и возобновить уведомление об ошибках в текущей базе данных, как показано ниже:
SELECT diskquota.pause();
-- perform table operations where you do not care to be notified
-- when a disk quota exceeded
SELECT diskquota.resume();
Примечание. Операция приостановки не сохраняется после перезапуска кластера базы данных RT.WareHouse; вы должны снова вызвать |
Используйте определяемые пользователем функции diskquota.set_schema_quota()
и diskquota.set_role_quota()
в базе данных, чтобы устанавливать, обновлять или удалять ограничения дисковой квоты для схем и ролей в базе данных. Функции принимают два аргумента: имя схемы или роли и устанавливаемую квоту. Вы можете указать квоту в МБ, ГБ, ТБ или ПБ; например, «2 ТБ».
В следующем примере задается квота в 250 ГБ для схемы acct
:
SELECT diskquota.set_schema_quota('acct', '250GB');
В этом примере для роли nickd
устанавливается дисковая квота в 500 МБ:
SELECT diskquota.set_role_quota('nickd', '500MB');
Чтобы изменить квоту, снова вызовите функцию diskquota.set_schema_quota()
или diskquota.set_role_quota()
с новым значением квоты.
Чтобы удалить квоту схемы или роли, установите значение квоты на «-1» и вызовите функцию.
Используйте определяемые пользователем функции diskquota.set_schema_tablespace_quota()
и diskquota.set_role_tablespace_quota()
в базе данных, чтобы устанавливать, обновлять или удалять ограничения дисковой квоты на табличное пространство для схем и ролей в текущей базе данных. Функции принимают три аргумента: имя схемы или роли, имя табличного пространства и устанавливаемую квоту. Вы можете указать квоту в МБ, ГБ, ТБ или ПБ; например, «2 ТБ».
В следующем примере задается дисковая квота в 50 ГБ для табличного пространства с именем tspaced1
и схемы acct
:
SELECT diskquota.set_schema_tablespace_quota('acct', 'tspaced1', '250GB');
В этом примере устанавливается дисковая квота в 500 МБ для табличного пространства tspaced2
и роли nickd
:
SELECT diskquota.set_role_tablespace_quota('nickd', 'tspaced2', '500MB');
Чтобы изменить квоту, снова вызовите функцию diskquota.set_schema_tablespace_quota()
или diskquota.set_role_tablespace_quota()
с новым значением квоты.
Чтобы удалить квоту табличного пространства схемы или роли, установите значение квоты на «-1» и вызовите функцию.
Когда администратор устанавливает квоту табличного пространства для схемы или роли, он также может определить дисковую квоту для каждого сегмента табличного пространства. Установка квоты на сегмент ограничивает объем дискового пространства в одном сегменте базы данных RT.WareHouse, который может занимать одно табличное пространство, и может помочь предотвратить заполнение диска сегмента из-за перекоса данных.
Вы можете использовать функцию diskquota.set_per_segment_quota()
для установки, обновления или удаления лимита дисковой квоты табличного пространства на сегмент. Функция принимает два аргумента: имя табличного пространства и отношение. Отношение определяет, насколько больше дисковой квоты может использовать один сегмент, чем средняя квота сегмента. Указанный коэффициент должен быть больше нуля.
Вы можете рассчитать среднюю квоту сегмента следующим образом:
avg_seg_quota = tablespace_quota / number_of_segments
Например, если ваш кластер базы данных RT.WareHouse состоит из 8 сегментов, и вы установили следующую квоту табличного пространства схемы:
SELECT diskquota.set_schema_tablespace_quota( 'accts', 'tspaced1', '800GB' );
Средняя квота сегмента для табличного пространства tspaced1
составляет 800 ГБ / 8 = 100 ГБ.
Если вы установите следующую квоту табличного пространства для каждого сегмента:
SELECT diskquota.set_per_segment_quota( 'tspaced1', '2.0' );
Вы можете рассчитать максимально допустимое использование диска для каждого разрешенного сегмента следующим образом:
max_disk_usage_per_seg = average_segment_quota * ratio
В этом примере максимально допустимое использование диска для каждого сегмента составляет 100 ГБ * 2,0 = 200 ГБ.
diskquota
позволит выполнить запрос, если использование диска во всех сегментах для всех таблиц, находящихся в табличном пространстве tblspc1
и управляемых ролью или квотой схемы, не превышает 200 ГБ.
Вы можете изменить квоту табличного пространства для каждого сегмента, снова вызвав функцию diskquota.set_per_segment_quota()
с новым значением квоты.
Чтобы удалить квоту табличного пространства для каждого сегмента, установите значение квоты на «-1» и вызовите функцию.
Чтобы просмотреть соотношение квот на сегмент, установленное для табличного пространства, откройте представление show_segment_ratio_quota_view
. Например:
SELECT tablespace_name, per_seg_quota_ratio
FROM diskquota.show_segment_ratio_quota_view WHERE tablespace_name in ('tspaced1');
tablespace_name | per_seg_quota_ratio
-------------------+---------------------
tspaced1 | 2
(1 rows)
Выполните следующие команды SQL, чтобы получить список баз данных, контролируемых дисковыми квотами, в вашем кластере базы данных RT.WareHouse:
\c diskquota
SELECT d.datname FROM diskquota_namespace.database_list q, pg_database d
WHERE q.dbid = d.oid ORDER BY d.datname;
Модуль diskquota
предоставляет четыре представления для отображения активных квот и текущего используемого дискового пространства.
В представлении diskquota.show_fast_schema_quota_view
перечислены активные квоты для схем в текущей базе данных. Столбец nspsize_in_bytes
содержит рассчитанный размер всех таблиц, принадлежащих схеме.
SELECT * FROM diskquota.show_fast_schema_quota_view;
schema_name | schema_oid | quota_in_mb | nspsize_in_bytes
-------------+------------+-------------+------------------
acct | 16561 | 256000 | 131072
analytics | 16519 | 1073741824 | 144670720
eng | 16560 | 5242880 | 117833728
public | 2200 | 250 | 3014656
(4 rows)
В представлении diskquota.show_fast_role_quota_view
перечислены активные квоты для ролей в текущей базе данных. Столбец rolsize_in_bytes
содержит рассчитанный размер всех таблиц, принадлежащих роли.
SELECT * FROM diskquota.show_fast_role_quota_view;
role_name | role_oid | quota_in_mb | rolsize_in_bytes
-----------+----------+-------------+------------------
mdach | 16558 | 500 | 131072
adam | 16557 | 300 | 117833728
nickd | 16577 | 500 | 144670720
(3 rows)
Вы можете просмотреть дисковые квоты на табличное пространство для схем и ролей с помощью представлений diskquota.show_fast_schema_tablespace_quota_view
и diskquota.show_fast_role_tablespace_quota_view
. Например:
SELECT schema_name, tablespace_name, quota_in_mb, nspsize_tablespace_in_bytes
FROM diskquota.show_fast_schema_tablespace_quota_view
WHERE schema_name = 'acct' and tablespace_name ='tblspc1';
schema_name | tablespace_name | quota_in_mb | nspsize_tablespace_in_bytes
-------------+-----------------+-------------+-----------------------------
acct | tspaced1 | 250000 | 131072
(1 row)
Вы можете временно деактивировать модуль diskquota
, удалив общую библиотеку из shared_preload_libraries
. Например:
$ gpconfig -s shared_preload_libraries
Values on all segments are consistent
GUC : shared_preload_libraries
Master value: auto_explain,diskquota-2.0
Segment value: auto_explain,diskquota-2.0
$ gpconfig -c shared_preload_libraries -v 'auto_explain'
$ gpstop -ar
Примечание. Когда вы деактивируете модуль
|
Модуль diskquota
имеет следующие ограничения и известные проблемы:
diskquota
не работает автоматически с сегментом, когда сегмент заменяется зеркалом. В этом случае вы должны вручную перезапустить базу данных RT.WareHouse.diskquota
не может установить жесткое ограничение на операции ALTER TABLE ADD COLUMN DEFAULT
.SELECT diskquota.init_table_size_table();
для обеспечения точности статистики использования диска.diskquota
, прежде чем удалять расширение в любой базе данных:SELECT diskquota.pause();
DROP EXTENSION diskquota;
diskquota
может записать неправильный размер таблицы после ALTER TABLESPACE
, TRUNCATE
или других операций, которые изменяют relfilenode таблицы.Причина: diskquota
не устанавливает никаких блокировок отношения при вычислении размера таблицы. Если другой сеанс обновляет табличное пространство таблицы, в то время как diskquota
вычисляет размер таблицы, может произойти ошибка.
В большинстве случаев вы можете игнорировать разницу; diskquota
обновит размер при следующем приеме новых данных. Чтобы сразу убедиться, что статистика использования диска точна, вызовите:
SELECT diskquota.init_table_size_table();
Затем перезапустите базу данных RT.WareHouse.
В редких случаях операция VACUUM FULL
может превышать лимит квоты. Чтобы исправить ситуацию, приостановите diskquota
перед операцией, а затем возобновите diskquota
после:
SELECT diskquota.pause();
-- perform the VACUUM FULL
SELECT diskquota.resume();
Если вы не хотите приостанавливать/возобновлять diskquota
, вы можете временно установить более высокую квоту для операции, а затем снова установить ее после завершения VACUUM FULL
. Рассмотрим следующее:
VACUUM FULL
только для одной таблицы, установите квоту не меньше размера этой таблицы.VACUUM FULL
на все таблицы, установите квоту не меньше, чем размер самой большой таблицы в базе данных.diskquota.show_fast_role_quota_view
может отображать меньшую использованную квоту, чем предел квоты, новый запрос может вызвать состояние превышения квоты в следующих обстоятельствах:diskquota
действительно обновляет список запрещенных в этом сценарии, но diskquota.show_fast_role_quota_view
может не отражать фактическую используемую квоту, поскольку длительный запрос еще не зафиксирован. Если вы выполните новый запрос, пока исходный все еще работает, новый запрос вызовет ошибку превышения квоты.diskquota
работает в статическом режиме, она может не отслеживать некоторые базы данных, если diskquota.max_workers
превышает доступное количество процессов bgworker. В динамическом режиме diskquota
работает правильно, когда есть хотя бы один доступный процесс bgworker.Модуль diskquota
может обнаружить вновь созданную таблицу внутри незафиксированной транзакции. Размер новой таблицы включается в использование диска, рассчитанное для соответствующей схемы или роли. Принудительное ограничение использования диска должно быть включено, чтобы операция превышения квоты вызывала ошибку превышения квоты (quota exceeded) в этом сценарии.
Удаление строк или запуск VACUUM
для таблицы не освобождает место на диске, поэтому эти операции не могут сами по себе удалить схему или роль из запрещенного списка (denylist) diskquota
. Дисковое пространство, используемое таблицей, можно уменьшить, запустив VACUUM FULL
или TRUNCATE TABLE
.
Модуль diskquota
поддерживает функции высокой доступности, предоставляемые фоновой рабочей средой. Процесс запуска diskquota
выполняется только на активном мастере. Postmaster на резервном мастере не запускает процесс запуска diskquota
, когда он находится в режиме ожидания. Когда мастер отключен и администратор запускает команду gpactivatestandby
, резервный мастер меняет свою роль на мастер, и процесс запуска diskquota
автоматически разветвляется. Используя список баз данных с поддержкой diskquota
в базе данных diskquota
, средство запуска diskquota
создает рабочие процессы diskquota
, которые управляют дисковыми квотами для каждой базы данных.
Когда вы расширяете кластер базы данных RT.WareHouse, каждая таблица потребляет больше сегментов таблицы, что может уменьшить максимальное количество таблиц, которые может поддерживать diskquota
. Если вы столкнулись со следующим предупреждением, попробуйте увеличить значение diskquota.max_table_segments
, а затем перезапустите базу данных RT.WareHouse:
[diskquota] the number of tables exceeds the limit, please increase the GUC value for diskquota.max_table_segments.
Модуль diskquota 2.2 устанавливается при установке или обновлении базы данных RT.WareHouse. Версии 1.x, 2.0.x и 2.1.x модуля продолжат работать после обновления RT.WareHouse.
Примечание.
|
Выполните следующую процедуру, чтобы обновить модуль diskquota
:
1. Замените разделяемую библиотеку diskquota-<n>
в параметре конфигурации сервера shared_preload_libraries
базы данных RT.WareHouse и перезапустите базу данных RT.WareHouse. Обязательно сохраните другие библиотеки. Например:
$ gpconfig -s shared_preload_libraries
Values on all segments are consistent
GUC : shared_preload_libraries
Coordinator value: auto_explain,diskquota-2.1
Segment value: auto_explain,diskquota-2.1
$ gpconfig -c shared_preload_libraries -v 'auto_explain,diskquota-2.2'
$ gpstop -ar
2. Обновите расширение diskquota
в каждой базе данных, в которой вы зарегистрировали модуль:
$ psql -d testdb -c "ALTER EXTENSION diskquota UPDATE TO '2.2'";
3. Перезапустите базу данных RT.WareHouse:
$ gpstop -ar
После обновления ваши существующие правила дисковых квот продолжают применяться, и вы можете определить новые правила для табличного пространства или для каждого сегмента. Вы также можете использовать новые функции ограничения дисковой квоты приостановки/возобновления.
В этом примере показано, как настроить квоту схемы, а затем наблюдать за поведением мягкого ограничения дисковой квоты по мере добавления данных в схему. В примере предполагается, что процессы diskquota
настроены и запущены.
1. Создайте базу данных с именем testdb и подключитесь к ней.
$ createdb testdb
$ psql -d testdb
2. Создайте расширение diskquota в базе данных.
CREATE EXTENSION diskquota;
3. Создайте схему с именем s1:
CREATE SCHEMA s1;
4. Установите дисковую квоту в 1 МБ для схемы s1.
SELECT diskquota.set_schema_quota('s1', '1MB');
5. Выполните следующие команды, чтобы создать таблицу в схеме s1 и вставить в нее небольшой объем данных. В схеме еще нет данных, поэтому ее нет в списке запрещенных.
SET search_path TO s1;
CREATE TABLE a(i int);
INSERT INTO a SELECT generate_series(1,100);
6. Вставьте большой объем данных, достаточный для превышения квоты в 1 МБ, установленной для схемы. До команды INSERT
схема s1 по-прежнему отсутствует в списке запрещенных, поэтому выполнение этой команды должно быть разрешено с применением только мягкого ограничения использования диска, даже если операция превысит ограничение, установленное для схемы.
INSERT INTO a SELECT generate_series(1,10000000);
7. Попытка вставить небольшое количество данных. Поскольку предыдущая команда превысила мягкое ограничение дисковой квоты схемы, схема должна быть занесена в черный список, а любая команда загрузки данных должна быть отменена.
INSERT INTO a SELECT generate_series(1,100);
ERROR: schema's disk space quota exceeded with name: s1
8. Удалите квоту из схемы s1, установив для нее значение -1, и снова вставьте небольшое количество данных. 5-секундный спящий режим перед командой INSERT
гарантирует, что данные о размере таблицы diskquota будут обновлены до запуска команды.
SELECT diskquota.set_schema_quota('s1', '-1');
-- Wait for 5 seconds to ensure that the denylist is updated
SELECT pg_sleep(5);
INSERT INTO a SELECT generate_series(1,100);
В этом примере мы включаем жесткое ограничение использования диска и повторно запускаем команды из предыдущего примера.
1. Включить принудительное ограничение использования жесткого диска:
$ gpconfig -c diskquota.hard_limit -v 'on'
$ gpstop -u
2. Выполните следующий запрос, чтобы просмотреть параметр принудительного применения жестких ограничений:
SELECT * from diskquota.status();
3. Переустановите дисковую квоту в 1 МБ для схемы s1.
SELECT diskquota.set_schema_quota('s1', '1MB');
4. Вставьте большой объем данных, достаточный для превышения квоты в 1 МБ, установленной для схемы. Перед командой INSERT
схема s1 все еще не находится в списке запрещенных, поэтому запуск этой команды должен быть разрешен. Когда операция превышает квоту схемы, diskquota
завершает запрос.
INSERT INTO a SELECT generate_series(1,10000000);
[hardlimit] schema's disk space quota exceeded
5. Удалите квоту из схемы s1:
SELECT diskquota.set_schema_quota('s1', '-1');
В этом примере показано, как настроить квоты табличного пространства и табличного пространства для каждого сегмента. В дополнение к использованию базы данных testdb и схемы s1, созданной в предыдущем примере, в этом примере предполагается следующее:
Процедура:
1. Установите дисковую квоту в 1 МБ для табличного пространства с именем tbsp1 и схемы с именем s1:
SELECT diskquota.set_schema_tablespace_quota('s1', 'tbsp1', '1MB');
2. Установите коэффициент на сегмент 2 для табличного пространства tbsp1:
SELECT diskquota.set_per_segment_quota('tbsp1', 2);
При таком значении коэффициента средняя квота сегмента составляет 1 МБ / 8 = 125 КБ, а максимальное использование диска на сегмент для табличного пространства составляет 125 КБ * 2 = 250 КБ.
3. Создайте новую таблицу с именем b и вставьте некоторые данные:
CREATE TABLE b(i int);
INSERT INTO b SELECT generate_series(1,100);
Вставьте в таблицу большой объем данных, достаточный для превышения квоты в 250 КБ на сегмент, установленной для табличного пространства. Когда операция превышает квоту табличного пространства на сегмент, diskquota
завершит запрос.
INSERT INTO b SELECT generate_series(1,10000000);
ERROR: tablespace: tbsp1, schema: s1 diskquota exceeded per segment quota