Перейти к основному содержимому

Практикум

Контекст параметров

  1. Очистите предыдущие настройки в postgresql.auto.conf и рестартуйте сервер:

    [student@p620 ~]$ psql -U postgres -h localhost
    Пароль пользователя postgres:
    psql (15.5)
    SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.) Введите "help", чтобы получить справку.
    postgres@postgres=# alter system reset all; ALTER SYSTEM
    postgres@postgres=# \q
    [student@p620 ~]$ sudo systemctl restart postgresql
  2. Подсчитайте количество параметров конфигурации для каждого контекста, отсортировав по возрастанию суммарного количества параметров в контекстах:

    postgres@postgres=# select context, count(*) from pg_settings
    group by context
    order by 2;
    context | count
    -------------------+-------
    backend | 2
    superuser-backend | 4
    internal | 22
    superuser | 60
    sighup | 133
    postmaster | 135
    user | 140
    (7 rows)

Представление pg_file_settings

  1. Получите список всех параметров, имеющих контекст superuser и значения которых установлены в конфигурационных файлах. Параметры с контекстом superuser может устанавливать в сессии суперпользователь:

    postgres@postgres=# select fs.sourcefile, fs.sourceline, fs.name from pg_file_settings fs, pg_settings st
    where fs.name = st.name
    and st.context = 'superuser';
    sourcefile | sourceline | name
    ---------------------------------+------------+-------------
    /pgdata/06/data/postgresql.conf | 756 | lc_messages
    (1 row)
  2. Запустите оболочку Bash от имени postgres. Скопируйте конфигурационный файл postgresql.conf:

    [student@p620 ~]$ sudo -iu postgres
    [postgres@p620 ~]$ cd $PGDATA
    [postgres@p620 data]$ cp -v postgresql.conf{,.orig} 'postgresql.conf' -> 'postgresql.conf.orig'
  3. Закомментируйте все строки, начинающиеся с include в postgresql.conf. Проверьте с помощью grep:

    [postgres@p620 data]$ sed -i 's/^include/#include/' postgresql.conf
    [postgres@p620 data]$ grep include postgresql.conf
    # can include strftime() escapes
    #include_dir = '...'
    #include_if_exists = '...'
    #include = '...'
    # include files ending in '.conf' from
    # include file only if it exists
    # include file
    # Can include strftime() escapes.
    #include_dir '/etc/pangolin/ssl/conf'
  4. Добавьте в конец файла postgresql.conf директиву include_dir:

[postgres@p620 data]$ echo "include_dir '/etc/pangolin/lab_conf'" >> postgresql.conf
  1. Создайте каталог /etc/pangolin/lab_conf и назначьте его владельцем пользователя ОС postgres:

    [student@p620 ~]$ sudo mkdir -p /etc/pangolin/lab_conf
    [student@p620 ~]$ sudo chown postgres:postgres /etc/pangolin/lab_conf
    [student@p620 ~]$ ls -ld /etc/pangolin/lab_conf
    drwxr-xr-x 2 postgres postgres 4096 Nov 8 20:42 /etc/pangolin/lab_conf
  2. Запишите в файл /etc/pangolin/lab_conf/lab.conf настройки для размера кеша буферов 512Мб и рабочей памяти для обслуживания 128Мб:

    [student@p620 ~]$ sudo -u postgres tee /etc/pangolin/lab_conf/lab.conf <<< 'shared_buffers = 512MB' shared_buffers = 512MB
    [student@p620 ~]$ sudo -u postgres tee -a /etc/pangolin/lab_conf/lab.conf <<< 'maintenance_work_mem = 128MB'
  3. Зайдите в сеанс psql пользователем postgres. Проверьте, что показывает pg_file_settings для настройки shared_buffers и maintenance_work_mem:

    postgres@postgres=# select * from pg_file_settings where name ~ 'shared_buffers|work_mem';
    sourcefile | sourceline | seqno | name | setting | applied | error
    --------------------------------+------------+-------+----------------------+---------+---------+------------------------------
    /pgdata/06/data/postgresql.conf | 127 | 2 | shared_buffers | 128MB | f |
    /etc/pangolin/lab_conf/lab.conf | 1 | 20 | shared_buffers | 512MB | f | setting could not be applied
    /etc/pangolin/lab_conf/lab.conf | 2 | 21 | maintenance_work_mem | 128MB | f |
    (3 rows)

    В поле error выводится сообщение setting could not be applied, а в поле applied - false. Причина в контексте этой настройки - postmaster. Необходимо рестартовать. Для параметра maintenance_work_mem в поле applied - true, что значит, что он может быть применен.

  4. Получите текущие значения параметров shared_buffers и maintenance_work_mem. Затем перечитайте их и проверьте снова:

    postgres=# \dconfig shared_buffers|m*work_mem List of configuration parameters
    Parameter | Value
    ----------------------+-------
    maintenance_work_mem | 64MB
    shared_buffers | 128MB
    (2 rows)
    postgres=# select pg_reload_conf(); pg_reload_conf
    ----------------
    t
    (1 row)
    postgres=# \dconfig shared_buffers|m*work_mem List of configuration parameters
    Parameter | Value
    ----------------------+-------
    maintenance_work_mem | 128MB
    shared_buffers | 128MB
    (2 rows)

    Изменение параметра shared_buffers требует рестарта сервера, так как его контекст - postmaster. Параметр maintenance_work_mem имеет контекст user, поэтому он применился.

  5. Рестартуйте экземпляр и проверьте параметр shared_buffers снова:

    postgres@postgres=# \q
    [student@p620 ~]$ sudo systemctl restart postgresql
    [student@p620 ~]$ psql -U postgres -h localhost Password for user postgres:
    psql (15.5)
    Type "help" for help.
    postgres@postgres=# select * from pg_file_settings where name = 'shared_buffers';
    sourcefile | sourceline | seqno | name | setting | applied | error
    ---------------------------------+------------+-------+----------------+---------+---------+-------
    /pgdata/06/data/postgresql.conf | 127 | 2 | shared_buffers | 128MB | f |
    /etc/pangolin/lab_conf/lab.conf | 1 | 23 | shared_buffers | 512MB | t |
    (2 rows)
    postgres@postgres=# show shared_buffers ; shared_buffers
    ----------------
    512MB
    (1 row)

    Параметр применен.

  6. Добавьте в файл /etc/pangolin/lab_conf/lab.conf заведомо неверную настройку и проверьте содержимое pg_file_settings:

[student@p620 ~]$ echo 'shared_buffers = mb' | sudo -u postgres tee -a /etc/pangolin/lab_conf/lab.conf
shared_buffers = mb
[student@p620 ~]$ psql -U postgres -h localhost Password for user postgres:
psql (15.5)
Type "help" for help.
postgres@postgres=# select * from pg_file_settings where name = 'shared_buffers';
sourcefile | sourceline | seqno | name | setting | applied | error
---------------------------------+------------+-------+----------------+---------+---------+------------------------------
/pgdata/06/data/postgresql.conf | 127 | 2 | shared_buffers | 128MB | f |
/etc/pangolin/lab_conf/lab.conf | 1 | 23 | shared_buffers | 512MB | f | setting could not be applied
/etc/pangolin/lab_conf/lab.conf | 2 | 24 | shared_buffers | mb | f |
(3 rows)
  1. Попробуйте рестартовать сервер:

    postgres@postgres=# \q
    [student@p620 ~]$ sudo systemctl restart postgresql
    Job for postgresql.service failed because the control process exited with error code.
    See "systemctl status postgresql.service" and "journalctl -xeu postgresql.service" for details.
  2. Восстановите настройки в postgresql.conf из копии. Рестартуйте сервер:

    [student@p620 ~]$ sudo -u postgres cp -v $PGDATA/postgresql.conf{.orig,} '/pgdata/06/data/postgresql.conf.orig' -> '/pgdata/06/data/postgresql.conf'
    [student@p620 ~]$ sudo systemctl restart postgresql

Команда ALTER SYSTEM

  1. Запустите сеанс Bash от имени postgres и перейдите в PGDATA. Выведите содержимое postgresql.auto.conf:
[student@p620 ~]$ sudo -iu postgres
[postgres@p620 ~]$ cd $PGDATA
[postgres@p620 data]$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
  1. Командой ALTER SYSTEM установите значение shared_buffers равным 256Мб:

    [postgres@p620 data]$ psql -c "ALTER SYSTEM SET shared_buffers TO '256MB'"
    ALTER SYSTEM
    [postgres@p620 data]$ psql -c "SELECT * FROM pg_file_settings WHERE name = 'shared_buffers'"
    sourcefile | sourceline | seqno | name | setting | applied | error --------------------------------------+------------+-------+----------------+---------+---------+------------------------------
    /pgdata/06/data/postgresql.conf | 127 | 2 | shared_buffers | 128MB
    /pgdata/06/data/postgresql.auto.conf | 3 | 27 | shared_buffers | 256MB (2 rows)
  2. Проверьте, что записалось в postgresql.auto.conf:

    [postgres@p620 data]$ cat postgresql.auto.conf
    # Do not edit this file manually!
    # It will be overwritten by the ALTER SYSTEM command. shared_buffers = '256MB'
  3. Снова повторите настройку для shared_buffers, но установите теперь значение 512Мб. Проверьте содержимое postgresql.auto.conf:

    [postgres@p620 data]$ psql -c "ALTER SYSTEM SET shared_buffers TO '512MB'" ALTER SYSTEM
    [postgres@p620 data]$ cat postgresql.auto.conf
    # Do not edit this file manually!
    # It will be overwritten by the ALTER SYSTEM command. shared_buffers = '512MB'

    Обратите внимание на то, что предыдущая настройка со значением 256Мб удалена.

  4. С помощью ALTER SYSTEM установите значение 8Мб для параметра work_mem. Проверьте содержимое postgresql.auto.conf:

    [postgres@p620 data]$ psql -c "ALTER SYSTEM SET work_mem TO '8MB'" ALTER SYSTEM
    [postgres@p620 data]$ cat postgresql.auto.conf
    # Do not edit this file manually!
    # It will be overwritten by the ALTER SYSTEM command. shared_buffers = '512MB'
    work_mem = '8MB'
  5. Сбросьте значение параметра shared_buffers. Проверьте содержимое postgresql.auto.conf:

    [postgres@p620 data]$ psql -c "ALTER SYSTEM RESET shared_buffers" ALTER SYSTEM
    [postgres@p620 data]$ cat postgresql.auto.conf
    # Do not edit this file manually!
    # It will be overwritten by the ALTER SYSTEM command. work_mem = '8MB'
  6. Сбросьте значения всех параметров:

    [postgres@p620 data]$ psql -c "ALTER SYSTEM RESET ALL" ALTER SYSTEM
    [postgres@p620 data]$ cat postgresql.auto.conf
    # Do not edit this file manually!
    # It will be overwritten by the ALTER SYSTEM command.

Представление pg_settings

  1. Отредактируйте файл postgresql.conf так, чтобы параметр work_mem имел значение 8Мб:

    [postgres@p620 data]$ cd $PGDATA
    [postgres@p620 data]$ pwd /pgdata/06/data
    [postgres@p620 data]$ sed -i.bak 's/^#work_mem.*$/work_mem = 8MB/' postgresql.conf
  2. Проверьте этот параметр в pg_file_settings и pg_settings:

    postgres=# select * from pg_file_settings where name = 'work_mem' \gx -[ RECORD 1 ]-------------------------------
    sourcefile | /pgdata/06/data/postgresql.conf
    sourceline | 138
    seqno | 3
    name | work_mem
    setting | 8MB
    applied | t
    error

    postgres=# select * from pg_settings where name = 'work_mem' \gx
    -[ RECORD 1 ]--- +---------------------------------------------------------------------------------------------------
    name | work_mem
    setting | 4096
    unit | kB
    category | Resource Usage / Memory
    short_desc | Sets the maximum memory to be used for query workspaces.
    extra_desc | This much memory can be used by each internal sort operation and hash table before
    context | user
    vartype | integer
    source | default
    min_val | 64
    max_val | 2147483647
    enumvals |
    boot_val | 4096
    reset_val | 4096
    sourcefile |
    sourceline |
    pending_restart | f

    postgres=# show work_mem ;
    work_mem
    ----------
    4MB
    (1 row)
  3. Так как контекст параметра user, но изменен он был в конфигурационном файле, следовательно, необходимо перечитать файлы конфигурации. После перечитывания проверьте pg_settings:

    postgres=# select pg_reload_conf();
    pg_reload_conf
    ----------------
    t
    (1 row)
    postgres=# select * from pg_settings where name = 'work_mem' \gx
    -[ RECORD 1 ]--- +---------------------------------------------------------------------------------------------------
    name | work_mem
    setting | 8192
    unit | kB
    category | Resource Usage / Memory
    short_desc | Sets the maximum memory to be used for query workspaces.
    extra_desc | This much memory can be used by each internal sort operation and hash table before
    context | user
    vartype | integer
    source | configuration file
    min_val | 64
    max_val | 2147483647
    enumvals
    boot_val | 4096
    reset_val | 8192
    sourcefile | /pgdata/06/data/postgresql.conf
    sourceline | 138
    pending_restart | f

    Значение по умолчанию - 4Мб, текущее значение - 8Мб, если в сессии сделать RESET work_mem, то значение будет 8Мб, поскольку оно установлено в postgresql.conf.

Сессионные параметры

  1. Установите в текущей сессии значение параметра work_mem равное 16Мб и проверьте pg_settings:

    SET
    postgres=# \dconfig+ work_mem
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    -----------+-------+---------+---------+-------------------
    work_mem | 16MB | integer | user |
    (1 row)
    postgres=# select * from pg_settings where name = 'work_mem' \gx
    -[ RECORD 1 ]--- +---------------------------------------------------------------------------------------------------
    name | work_mem
    setting | 16384
    unit | kB
    category | Resource Usage / Memory
    short_desc | Sets the maximum memory to be used for query workspaces.
    extra_desc | This much memory can be used by each internal sort operation and hash table before
    context | user
    vartype | integer
    source | session
    min_val | 64
    max_val | 2147483647
    enumvals
    boot_val | 4096
    reset_val | 8192
    sourcefile
    sourceline
    pending_restart | f

  2. Рестартуйте сессию и снова проверьте pg_settings:

    postgres=# \c
    You are now connected to database "postgres" as user "postgres".
    postgres=# select * from pg_settings where name = 'work_mem' \gx
    -[ RECORD 1 ]--- +---------------------------------------------------------------------------------------------------
    name | work_mem
    setting | 8192
    unit | kB
    category | Resource Usage / Memory
    short_desc | Sets the maximum memory to be used for query workspaces.
    extra_desc | This much memory can be used by each internal sort operation and hash table before
    context | user
    vartype | integer
    source | configuration file
    min_val | 64
    max_val | 2147483647
    enumvals
    boot_val | 4096
    reset_val | 8192
    sourcefile | /pgdata/06/data/postgresql.conf
    sourceline | 138
    pending_restart | f

    Параметр сессионный, поэтому был сброшен при рестарте сессии.

Транзакционные параметры

  1. Установите значение параметра work_mem равное 16Мб в транзакции. Проверьте значение во время транзакции и после ее отката:

    postgres=# begin;
    BEGIN
    postgres=*# set work_mem = '16MB'; SET
    postgres=*# \dconfig+ work_mem
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    -----------+-------+---------+---------+-------------------
    work_mem | 16MB | integer | user |
    (1 row)
    postgres=*# select * from pg_settings where name = 'work_mem' \gx
    -[ RECORD 1 ]---
    +---------------------------------------------------------------------------------------------------
    name | work_mem
    setting | 16384
    unit | kB
    category | Resource Usage / Memory
    short_desc | Sets the maximum memory to be used for query workspaces.
    extra_desc | This much memory can be used by each internal sort operation and hash table before
    context | user
    vartype | integer
    source | session
    min_val | 64
    max_val | 2147483647
    enumvals
    boot_val | 4096
    reset_val | 8192
    sourcefile
    sourceline
    pending_restart | f

    postgres=*# rollback; ROLLBACK
    postgres=# \dconfig+ work_mem
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    -----------+-------+---------+---------+-------------------
    work_mem | 8MB | integer | user |
    (1 row)

    Транзакция не зафиксирована - был откат, поэтому при выходе из нее значение параметра, установленного в этой транзакции, было сброшено.

  2. Запустите транзакцию, установите в ней два параметра командой SET, но для одного параметра добавьте LOCAL. Далее зафиксируйте транзакцию и проверьте значения параметров после фиксации:

    postgres=# \dconfig+ (work|hash)_mem*
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    ---------------------+-------+---------+---------+-------------------
    hash_mem_multiplier | 2 | real | user |
    work_mem | 8MB | integer | user |
    (2 rows)
    postgres=# begin;
    BEGIN
    postgres=*# set work_mem = '16MB';
    SET
    postgres=*# set local hash_mem_multiplier = 3; SET
    postgres=*# \dconfig+ (work|hash)_mem*
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    ---------------------+-------+---------+---------+-------------------
    hash_mem_multiplier | 3 | real | user |
    work_mem | 16MB | integer | user |
    (2 rows)
    postgres=*# commit;
    COMMIT
    postgres=# \dconfig+ (work|hash)_mem*
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    ---------------------+-------+---------+---------+-------------------
    hash_mem_multiplier | 2 | real | user |
    work_mem | 16MB | integer | user |
    (2 rows)

    После фиксации транзакции значение установленного в транзакции параметра work_mem так и осталось 16Мб, а значение установленного командой SET LOCAL параметра hash_mem_multiplier вернулось к исходному значению.

  3. Выполните команду RESET для параметра work_mem и получите его значение после этого:

    postgres=# reset work_mem ; RESET
    postgres=# \dconfig+ work_mem
    List of configuration parameters
    Parameter | Value | Type | Context | Access privileges
    -----------+-------+---------+---------+-------------------
    work_mem | 8MB | integer | user |
    (1 row)