Известные проблемы и ограничения

ADB 5.x имеет следующее ограничение:

  • Пакеты ADB 4.3.x не совместимы с ADB 5.x.

Далее перечислены основные известные проблемы в ADB 5.x:

  • 29139 – DML

При первичной проверке leaf-партиций в append-optimized partitioned таблице ADB выполняет блокировку ROW EXCLUSIVE на все партиции таблицы при вставке данных непосредственно в одну из них. В дальнейшем, пока информация о валидации остается в памяти, вставка данных в leaf-партицию не сопровождается блокировкой других партиций.

Проблема не возникает для heap-storage partitioned таблиц.

  • 29523 – gptoolkit

Обновление с младших версий не обновляет базу данных template0, и в некоторых случаях использование этих представлений в схеме gp_toolkit может вызвать проблемы при создании базы данных с использованием template0 в качестве шаблона после обновления до версии ADB 5.11.0_arenadata3 и выше.

В представлении gp_toolkit.gp_bloat_expected_pages некорректно сообщается о чрезмерности root-партиции таблицы, даже при отсутствии данных. В некоторых случаях представление gp_toolkit.gp_bloat_diag может возвращать ошибку integer вне диапазона (при обновлении с версии 5.3 и ниже).

Решение: Обновить представления в схеме gp_toolkit в новой базе данных.

  • 29485 – Catalog and Metadata

Когда сессия создает временные объекты в базе данных, ADB может не удалять временные объекты при завершении сессии в случае, если она прерывается или прекращается по команде администратора.

  • 29496 – gpconfig

Для небольшого числа параметров конфигурации сервера, таких как log_min_messages, команда gpconfig -s <config_param> не отображает правильное значение параметра для хостов сегмента, когда значение параметра на master отличается от значения на сегментах.

Для параметров с набором классификации master утилита отображает значение, заданное на мастере, как для мастера, так и для сегментов. Для этих параметров значение на мастере передается как часть запросов на инстансы сегмента. SQL-запрос, который gpconfig запускает для отображения значений параметра мастера и сегмента, возвращает значение мастер-хоста, которое передается сегменту как часть запроса.

Для параметров, таких как log_min_messages, инстансы сегмента используют значение хоста сегмента, указанное в файле postgresql.conf при запуске. Значение сегмента может быть переопределено для области запроса.

Решение: Для отображения значения параметра, указанного в postgresql.conf на мастер-хосте и хостах сегмента, можно указать в gpconfig опцию –file.

  • 29395 – DDL

Утилита gpdbrestore и gprestore завершается сбоем при попытке восстановить таблицу из резервной копии, которая неправильно определена с повторяющимися столбцами в качестве ключей распределения. Проблема возникает в результате некорректного определения таблицы утилитой gpcrondump или gpbackup при копировании. Команда CREATE TABLE AS создает такую неправильно определенную таблицу с помощью политики распределения.

Решение: Проблема CREATE TABLE ISSUE устранена. Команда CREATE TABLE AS не создает указанный тип таблицы, а возвращает ошибку. Однако попытка восстановления неверно определенной таблицы из резервной копии продолжает завершаться сбоем.

  • 29351 – gptransfer

Утилита gptransfer может скопировать строку данных с максимальной длиной 256 МБ.

  • 158011506 – Catalog and Metadata

В некоторых случаях часовой пояс, используемый в базе данных ADB, может отличаться от часового пояса хост-системы или заданного пользователем. В некоторых редких случаях время, используемое и отображаемое в базе данных ADB, может немного отличаться от времени хост-системы.

Часовой пояс, используемый в базе данных ADB, выбирается из набора встроенных часовых поясов PostgreSQL. База данных выбирает часовой пояс путем сопоставления часового пояса PostgreSQL с часовым поясом, заданным пользователем, или часовым поясом хост-системы. Часовой пояс по умолчанию использует алгоритм для выбора часовых поясов PostgreSQL на основе часового пояса хост-системы. Если системный часовой пояс содержит информацию о секунде координации, база данных не может сопоставить системный часовой пояс с часовым поясом PostgreSQL.

Решение: Установить параметры базы данных ADB и часовых поясов хост-системы в часовой пояс, который поддерживается как базой данных, так и хост-системой. Например, с помощью утилиты gpconfig. Следующие команды показывают часовой пояс базы данных и устанавливают часовой пояс для US/Pacific:

# gpconfig -s TimeZone
# gpconfig -c TimeZone -v 'US/Pacific'

После изменения часового пояса необходимо перезапустить ADB (команда gpstop -ra).

В каталоге pg_timezone_names предоставяется информация о часовом поясе базы данных ADB.

  • N/A – PXF

PXF доступен только для поддерживаемых платформ Red Hat и CentOS. PXF недоступен для платформ SuSE.

  • 151135629 – Команда COPY

Когда указано свойство ON SEGMENT, команда COPY не поддерживает SELECT в условии COPY TO. Например, следующая команда не поддерживается:

COPY (SELECT * FROM testtbl) TO '/tmp/mytst<SEGID>' ON SEGMENT
  • 29064 – Storage: DLL

Тип данных money принимает значения вне диапазона как отрицательные, и сообщение об ошибке не отображается.

Решение: Использовать только значения в диапазоне для типа данных money (64-разрядный для ADB 5.x). Или использовать альтернативный тип данных, например numeric или decimal.

Функция to_json() не реализована как вызываемая функция. Попытка вызова функции приводит к ошибке. Например:

tutorial=# select to_json('Fred said "Hi."'::text);
ERROR: function to_json(text) does not exist
LINE 1: select to_json('Fred said "Hi."'::text);
^
HINT: No function matches the given name and argument types.
You might need to add explicit type casts.

Решение: ADB вызывает функцию to_json() при приведении к типу данных json, поэтому следует выполнять листинг. Например: SELECT ‘{“foo”:”bar”}’::json; база данных обеспечивает функции array_to_json() и row_to_json().

  • 148119917 – Resource Groups

Тестирование функции Resource Groups выявило, что при использовании ядра по умолчанию в системе RHEL/CentOS может возникнуть ошибка. Проблема возникает из-за проблем в реализации контрольных групп ядра и приводит к ошибке ядра, похожей на следующую:

[81375.325947] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
      [81375.325986] IP: [<ffffffff812f94b1>] rb_next+0x1/0x50 [81375.326014] PGD 0 [81375.326025]
      Oops: 0000 [#1] SMP [81375.326041] Modules linked in: veth ipt_MASQUERADE
      nf_nat_masquerade_ipv4 iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 xt_addrtype
      iptable_filter xt_conntrack nf_nat nf_conntrack bridge stp llc intel_powerclamp coretemp
      intel_rapl dm_thin_pool dm_persistent_data dm_bio_prison dm_bufio kvm_intel kvm crc32_pclmul
      ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper cryptd iTCO_wdt
      iTCO_vendor_support ses enclosure ipmi_ssif pcspkr lpc_ich sg sb_edac mfd_core edac_core
      mei_me ipmi_si mei wmi ipmi_msghandler shpchp acpi_power_meter acpi_pad ip_tables xfs
      libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 syscopyarea sysfillrect crct10dif_pclmul
      sysimgblt crct10dif_common crc32c_intel drm_kms_helper ixgbe ttm mdio ahci igb libahci drm ptp
      pps_core libata dca i2c_algo_bit [81375.326369]  i2c_core megaraid_sas dm_mirror
      dm_region_hash dm_log dm_mod [81375.326396] CPU: 17 PID: 0 Comm: swapper/17 Not tainted
      3.10.0-327.el7.x86_64 #1 [81375.326422] Hardware name: Cisco Systems Inc
      UCSC-C240-M4L/UCSC-C240-M4L, BIOS C240M4.2.0.8b.0.080620151546 08/06/2015 [81375.326459] task:
      ffff88140ecec500 ti: ffff88140ed10000 task.ti: ffff88140ed10000 [81375.326485] RIP:
      0010:[<ffffffff812f94b1>]  [<ffffffff812f94b1>] rb_next+0x1/0x50 [81375.326514] RSP:
      0018:ffff88140ed13e10  EFLAGS: 00010046 [81375.326534] RAX: 0000000000000000 RBX:
      0000000000000000 RCX: 0000000000000000 [81375.326559] RDX: ffff88282f1d4800 RSI:
      ffff88280bc0f140 RDI: 0000000000000010 [81375.326584] RBP: ffff88140ed13e58 R08:
      0000000000000000 R09: 0000000000000001 [81375.326609] R10: 0000000000000000 R11:
      0000000000000001 R12: ffff88280b0e7000 [81375.326634] R13: 0000000000000000 R14:
      0000000000000000 R15: 0000000000b6f979 [81375.326659] FS:  0000000000000000(0000)
      GS:ffff88282f1c0000(0000) knlGS:0000000000000000 [81375.326688] CS:  0010 DS: 0000 ES: 0000
      CR0: 0000000080050033 [81375.326708] CR2: 0000000000000010 CR3: 000000000194a000 CR4:
      00000000001407e0 [81375.326733] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
      0000000000000000 [81375.326758] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7:
      0000000000000400 [81375.326783] Stack: [81375.326792]  ffff88140ed13e58 ffffffff810bf539
      ffff88282f1d4780 ffff88282f1d4780 [81375.326826]  ffff88140ececae8 ffff88282f1d4780
      0000000000000011 ffff88140ed10000 [81375.326861]  0000000000000000 ffff88140ed13eb8
      ffffffff8163a10a ffff88140ecec500 [81375.326895] Call Trace: [81375.326912]
      [<ffffffff810bf539>] ? pick_next_task_fair+0x129/0x1d0 [81375.326940]  [<ffffffff8163a10a>]
      __schedule+0x12a/0x900 [81375.326961]  [<ffffffff8163b9e9>] schedule_preempt_disabled+0x29/0x70
      [81375.326987]  [<ffffffff810d6244>] cpu_startup_entry+0x184/0x290 [81375.327011]
      [<ffffffff810475fa>] start_secondary+0x1ba/0x230 [81375.327032] Code: e5 48 85 c0 75 07 eb 19 66
      90 48 89 d0 48 8b 50 10 48 85 d2 75 f4 48 8b 50 08 48 85 d2 75 eb 5d c3 31 c0 5d c3 0f 1f 44
      00 00 55 <48> 8b 17 48 89 e5 48 39 d7 74 3b 48 8b 47 08 48 85 c0 75 0e eb [81375.327157] RIP
      [<ffffffff812f94b1>] rb_next+0x1/0x50 [81375.327179]  RSP <ffff88140ed13e10> [81375.327192] CR2:
      0000000000000010

Решение: Обновить ядро Red Hat или CentOS до последней версии.

  • 149789783 – Resource Groups

Значительное снижение производительности ADB наблюдается при включении управления рабочими нагрузками Resource Groups на системах RedHat 6.x, CentOS 6.x и SuSE 11. Эта проблема вызвана ошибкой контрольной группы ядра Linux. Ошибка была исправлена в CentOS 7.x и Red Hat 7.x.

Когда Resource Groups включены в системах с поврежденным ядром, при запуске транзакции или запроса может быть задержка в 1 секунду или более. Задержка вызвана ошибкой ядра Linux, где механизм синхронизации вызывается synchronize_sched и выдает ошибку, когда процесс присоединяется к группе. См. http://www.spinics.net/lists/cgroups/msg05708.html и https://lkml.org/lkml/2013/1/14/97 для получения дополнительной информации.

Эта проблема приводит к тому, что операции одиночного присоединения занимают больше времени, а также, что все параллельные вложения выполняются последовательно. Например, одно приложение процесса может занимать около 0,01 секунды. При одновременном подключении 100 процессов самое быстрое присоединение занимает 0,01 секунды, а самое медленное - около 1 секунды. ADB выполняет присоединения процессов при запуске транзакции или запросов. Таким образом, ухудшение производительности зависит от одновременно запущенных транзакций или запросов и не связано с параллельными работающими запросами. Также ADB имеет оптимизацию для обхода переписывания, когда QE повторно используется несколькими запросами в том же сеансе.

Эта ошибка не влияет на системы CentOS 7.x и Red Hat 7.x

Решение: Если используется RedHat 6 и производительность с Resource Groups приемлема, следует обновить ядро до версии 2.6.32-696 или выше, чтобы воспользоваться преимуществами и доработками новой реализации Resource Groups.

SuSE 11 не имеет версии ядра, решающей эту проблему; Resource Groups по-прежнему считаются экспериментальной функцией на данной платформе.

  • 150906510 – Backup и Restore

Резервные копии базы данных 4.3.15.0 и более поздних версий содержат следующую строку в файлах резервных копий:

SET gp_strict_xml_parse = false;

Однако, ADB 5.0.0 не имеет параметр с gp_strict_xml_parse. При восстановлении данных из резервного набора версии 4.3 в кластере 5.0.0 может появиться предупреждение:

[WARNING]:-gpdbrestore finished but ERRORS were found, please check the restore report file for details

Кроме того, файл отчета может содержать ошибку:

ERROR: unrecognized configuration parameter "gp_strict_xml_parse"

Данные предупреждения и ошибки не влияют на процедуру восстановления, и могут быть проигнорированы.

Обновление gp_toolkit.gp_bloat_diag

В ADB 5.3.0 или более ранней версии 5.x в некоторых случаях при выполнении запроса в отношении gp_toolkit.gp_bloat_diag появлялась ошибка целого числа вне диапазона. Проблема была решена в ADB 5.4.0. При обновлении базы данных ADB функция gp_toolkit.gp_bloat_diag и визуализация должны обновляться в базах данных, созданных с помощью ADB 5.3.0 или более ранней версии 5.x. Проблема была решена в ADB 5.4.0 и более поздних версиях.

Чтобы проверить, требуется ли обновление для функции gp_toolkit.gp_bloat_diag и визуализации в базе данных, необходимо запустить psql и выполнить команду df, чтобы отобразить информацию о функции gp_toolkit.gp_bloat_diag:

df gp_toolkit.gp_bloat_diag

Если тип данных для btdexppages является целым числом (“numeric”), требуется обновление. Если тип данных является цифровым (“integer”), обновление не требуется. В примере тип данных btdexppages является целым числом и требует обновления:

List of functions
-[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------
Schema              | gp_toolkit
Name                | gp_bloat_diag
Result data type    | record
Argument data types | btdrelpages integer, btdexppages integer, aotable boolean, OUT bltidx integer, OUT bltdiag text
Type                | normal

Необходимо запустить скрипт, чтобы обновить функцию и визуализацию и исправить проблему в каждой базе данных, которая была создана с помощью ADB 5.3.0 или более ранней версии 5.x. И в качестве пользователя gpadmin выполнить следующие действия:

  1. Скопировать скрипт в текстовый файл в базе данных ADB.
  2. Запустить скрипт в каждой базе данных, требующей обновления.

В примере обновлена функция gp_toolkit.gp_bloat_diag и визуализация в базе данных mytest и предполагается, что скрипт находится в файле update_bloat_diag.sql в доменном каталоге gpadmin:

psql -f /home/gpadmin/update_bloat_diag.sql -d mytest

Запустить скрипт в период низкой активности. Запуск скрипта в период высокой активности не влияет на функциональность базы данных, но может повлиять на производительность.

Скрипт gp_toolkit.gp_bloat_diag для обновления функций и представления

BEGIN;
CREATE OR REPLACE FUNCTION gp_toolkit.gp_bloat_diag(btdrelpages int, btdexppages numeric, aotable bool,
    OUT bltidx int, OUT bltdiag text)
AS
$$
    SELECT
        bloatidx,
        CASE
            WHEN bloatidx = 0
                THEN 'no bloat detected'::text
            WHEN bloatidx = 1
                THEN 'moderate amount of bloat suspected'::text
            WHEN bloatidx = 2
                THEN 'significant amount of bloat suspected'::text
            WHEN bloatidx = -1
                THEN 'diagnosis inconclusive or no bloat suspected'::text
        END AS bloatdiag
    FROM
    (
        SELECT
            CASE
                WHEN $3 = 't' THEN 0
                WHEN $1 < 10 AND $2 = 0 THEN -1
                WHEN $2 = 0 THEN 2
                WHEN $1 < $2 THEN 0
                WHEN ($1/$2)::numeric > 10 THEN 2
                WHEN ($1/$2)::numeric > 3 THEN 1
                ELSE -1
            END AS bloatidx
    ) AS bloatmapping

$$
LANGUAGE SQL READS SQL DATA;

GRANT EXECUTE ON FUNCTION gp_toolkit.gp_bloat_diag(int, numeric, bool, OUT int, OUT text) TO public;

CREATE OR REPLACE VIEW gp_toolkit.gp_bloat_diag
AS
    SELECT
        btdrelid AS bdirelid,
        fnnspname AS bdinspname,
        fnrelname AS bdirelname,
        btdrelpages AS bdirelpages,
        btdexppages AS bdiexppages,
        bltdiag(bd) AS bdidiag
    FROM
    (
        SELECT
            fn.*, beg.*,
            gp_toolkit.gp_bloat_diag(btdrelpages::int, btdexppages::numeric, iao.iaotype::bool) AS bd
        FROM
            gp_toolkit.gp_bloat_expected_pages beg,
            pg_catalog.pg_class pgc,
            gp_toolkit.__gp_fullname fn,
            gp_toolkit.__gp_is_append_only iao

        WHERE beg.btdrelid = pgc.oid
            AND pgc.oid = fn.fnoid
            AND iao.iaooid = pgc.oid
    ) as bloatsummary
    WHERE bltidx(bd) > 0;

GRANT SELECT ON TABLE gp_toolkit.gp_bloat_diag TO public;
COMMIT;