这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

升级前

在升级 Vertica 数据库之前,请执行以下步骤:

  • 验证您是否有足够的 RAM 可用于运行升级。升级所需的内存量大约是数据库编录所用内存量的三倍。

    您可以通过查询系统表 RESOURCE_POOL_STATUS 来计算所有节点上的编录内存使用情况:

    => SELECT node_name, pool_name, memory_size_kb FROM resource_pool_status WHERE pool_name = 'metadata';
    

  • 执行完整的数据库备份。此预防措施让您可以在升级失败时还原当前版本。

  • 备份您的授权

  • 验证新版本的平台要求

  • 确定您是否正在使用任何第三方用户定义的扩展库 (UDx)。已编译的 UDx 库(例如使用 C++ 或 Java 开发的库)可能需要使用新版本的 Vertica SDK 库重新编译才能与新版本的 Vertica 兼容。请参阅UDx 库与新服务器版本的兼容性

  • 确定并移除不受支持的投影。在高于 Vertica 9.0 的所有版本中,已移除对具有不同 SELECT 和 ORDER BY 子句的投影伙伴实例的支持。对预联接和范围分段投影的支持也已被移除。如果升级遇到不受支持的投影,很可能会失败。

  • 检查编录存储空间

  • 如果从 Vertica 9.2.x 升级并且已设置 PasswordMinCharChangePasswordMinLifeTime 系统级别安全参数,请记下它们的当前值。您将不得不再次设置这些参数(这次是在配置文件级别)以重现您的配置。要查看这些参数的当前值,请运行以下查询:

    => SELECT parameter_name,current_value from CONFIGURATION_PARAMETERS
        WHERE parameter_name IN ('PasswordMinCharChange', 'PasswordMinLifeTime');
    

完成这些任务后,正常关闭数据库

1 - 验证平台要求

Vertica 安装程序会在运行时检查目标平台,并在确定平台无法满足安装要求时停止运行。在更新系统上的服务器软件包之前,请手动验证平台是否满足所有硬件和软件要求(请参阅平台要求和建议)。

默认情况下,安装程序将在出现所有警告时停止。您可以通过安装参数 --failure-threshold 配置安装程序停止安装的程度。如果将故障阈值设置为 FAIL,则安装程序将忽略警告,仅在失败时停止运行。

2 - 标识不受支持的投影

从 9.1 版到 9.2 版,Vertica 已移除对以下投影的支持:

  • 9.1 版:具有不同 SELECT 和 ORDER BY 子句的投影伙伴实例。所有投影伙伴实例必须以相同的顺序指定列。具有不合规伙伴实例的投影将被 Vertica 数据库认为不安全。
  • 9.2 版:预联接和范围分段投影。如果表的唯一超投影属于这些投影类型之一,则该投影也被认为不安全。

如果您从 9.1 之前的 Vertica 版本升级,请运行由 Vertica 提供的升级前脚本,检查您的数据库中是否存在不受支持的投影。如果您升级 Vertica 9.1 或更高版本,则不需要运行此脚本。此脚本检查您当前的数据库并将其分析和建议发送到标准输出。如果此脚本识别到不受支持的投影,则会列出它们。如果此脚本找到具有不同 SELECT 和 ORDER BY 子句的投影伙伴实例,它还会生成一个部署脚本。此脚本会对这些投影进行补救,使其符合系统 K-safety 的要求。

升级前脚本下载

从以下位置下载升级前脚本 identify_unsupported_projections.sh

https://www.vertica.com/pre-upgrade-script/

升级前要求

  • Vertica 8.x 或更高版本

  • 有足够的磁盘空间可用于存放生成的输出(磁盘空间因数据库大小不同而异,例如,如果编录大小 < 5GB,则为 4GB)。

  • 已经为了处理脚本和 DDL 开销而增加了 SYSDATA 资源池的 maxmemorysize

  • 群集中的所有节点都已启动。

语法

在数据库运行时,在其服务器节点之一上执行升级前脚本:

./identify_unsupported_projections.sh
          [ ‑U username ]
          [ ‑w password ]
          [ ‑p port ]
          [ ‑d path ]
          [ ‑s temp‑schema ]

参数

推荐用法

  1. 对安装的 Vertica 运行升级前脚本

  2. 评估脚本输出中是否存在不受支持的投影。

  3. 如果检测到不受支持的投影,请执行以下一项或多项操作:

    • 移除预联接和范围分段投影。

    • 使用不同的 SELECT 和 ORDER BY 子句修复所有投影:运行部署脚本,或手动修改不合规的投影,以便所有伙伴实例都有相同的选择列表和排序。

  4. 再次运行升级前脚本,以确认所有问题都已解决。如果是这样,Vertica 将返回以下消息:

    Congratulations! No unsafe projections detected
    

    否则,重复步骤 2-4。

部署脚本

如果升级前脚本检测到具有不同 SELECT 和 ORDER BY 子句的投影伙伴实例,它会生成一个用于执行以下任务的部署脚本:

  • 为不受支持的投影提供补救措施。

  • 对不具有最新状态的新投影和现有投影进行刷新。

补救措施因投影类型不同而异:

估计开销

  • 升级前脚本:根据数据库大小,需要运行一小时或更长时间。
  • 部署文件:对所有需要刷新的投影(包括所有替换投影)调用 Vertica 元函数 REFRESH

处理失败的升级

如果升级由于不受支持的投影而失败,则必须恢复到以前的 Vertica 安装:

  1. 对于群集上的每个主机,查找并移除 RPM 或 DEB 软件包。

  2. 重新安装早期版本的软件包。

  3. 启动重新安装的数据库并验证它是否正常运行。

  4. 对数据库执行完整备份

  5. 对安装的 Vertica 运行升级前脚本

3 - 检查编录存储空间

使用此处记录的命令确定升级前有多少编录空间可用。这有助于确定更新后的编录可能占用多少空间。

对编录当前使用的空间大小与同一目录中的可用空间大小进行比较:

  1. 使用 du 命令确定编录目录当前使用的空间大小:

    $ du -s -BG v_vmart_node0001_catalog
    2G      v_vmart_node0001_catalog
    
  2. 确定同一目录中有多少空间可用:

    $ df -BG v_vmart_node0001_catalog
    Filesystem     1G-blocks  Used Available Use% Mounted on
    /dev/sda2            48G   19G       26G  43% /
    

4 - 验证 ORC 和 Parquet 数据的许可证合规性

如果从 9.1.0 之前的版本升级并且:

  • 您的数据库具有基于 ORC 或 Parquet 文件的外部表(无论是存储在 Vertica 群集本地还是存储 Hadoop 群集上)

  • 您的 Vertica 许可证有原始数据限额

在升级之前按照本主题中的步骤进行操作。

背景

Vertica 许可证可以包括原始数据限额。自 2016 年以来,Vertica 许可证允许您在外部表中使用 ORC 和 Parquet 数据。此数据始终计入您许可证中的任何原始数据限额。以前,ORC 和 Parquet 格式的数据审核通过手动方式加以处理。由于此审核并非自动运行,因此原生表和外部表中的数据总量可能会在一段时间内偷偷超过您的许可限额。

从版本 9.1.0 开始,Vertica 将自动审核外部表中的 ORC 和 Parquet 数据。此审核在您安装或升级到版本 9.1.0 后立即开始。如果 Vertica 许可证包含原始数据限额,且您在基于 Parquet 或 ORC 文件的外部表中有数据,请在升级到 Vertica 9.1.x 之前检查您的许可证合规性。验证数据库是否遵循许可条款,可避免数据库在升级后很快变得不合规。

验证 ORC 和 Parquet 的使用是否符合许可证条款

要验证您的数据使用是否符合许可证要求,请以数据库管理员身份运行以下查询:

SELECT (database_size_bytes + file_size_bytes) <= license_size_bytes
       "license_compliant?"
       FROM (SELECT database_size_bytes,
                    license_size_bytes FROM license_audits
                    WHERE audited_data='Total'
                    ORDER BY audit_end_timestamp DESC LIMIT 1) dbs,
            (SELECT sum(total_file_size_bytes) file_size_bytes
                    FROM external_table_details
                    WHERE source_format IN ('ORC', 'PARQUET')) ets;

此查询将返回以下三个值之一:

  • 如果您没有 ORC 或 Parquet 格式的外部数据,则此查询返回 0 行:

     license_compliant?
    --------------------
    (0 rows)
    

    在这种情况下,可以继续升级。

  • 如果基于 ORC 或 Parquet 格式的外部表中有数据,并且该数据不会导致您的数据库超出原始数据限额,则此查询返回 t:

     license_compliant?
    --------------------
     t
    (1 row)
    

    在这种情况下,可以继续升级。

  • 如果基于 ORC 和 Parquet 的外部表中的数据导致您的数据库超出原始数据限额,则查询返回 f:

     license_compliant?
    --------------------
     f
    (1 row)
    

    在这种情况下,请在升级之前解决合规问题。有关详细信息,请参阅下文。

解决不合规问题

如果上一部分中的查询表明您的数据库不符合许可证要求,您应该在升级之前解决此问题。可通过以下两种方法使您的数据库合规:

  • 联系 Vertica 将您的许可证升级到更大的数据大小限额。 请参阅获取许可证密钥文件

  • (从基于 ORC 和 Parquet 的外部表或 Vertica 原生表中)删除数据,使您的数据大小符合许可证要求。您始终应该备份即将从 Vertica 中删除的所有数据。丢弃外部表是用来缩小数据库的具有较小破坏性的方法,因为数据不会丢失 — 它仍然位于外部表所基于的文件中。

5 - 备份和还原授权

升级后,如果 UDx 库的原型发生更改,Vertica 将丢弃对这些库的授权,因为它们在技术上不再具有相同的功能。要解决这些类型的问题,最佳实践是备份对这些库的授权,以便可以在升级后还原它们。

  1. 将以下 SQL 保存到名为 user_ddl.sql 的文件中。它创建一个名为 user_ddl 的视图,其中包含对数据库中所有对象的授权。

    CREATE OR REPLACE VIEW user_ddl AS
    (
    SELECT 0 as grant_order,
           name principal_name,
           'CREATE ROLE "' || name || '"' ||    ';' AS sql,
           'NONE' AS object_type,
           'NONE' AS object_name
      FROM v_internal.vs_roles vr
     WHERE NOT vr.predefined_role -- Exclude system roles
       AND ldapdn = ''            -- Limit to NON-LDAP created roles
    )
    UNION ALL
    (
      SELECT 1, -- CREATE USERs
             user_name,
             'CREATE USER "' || user_name || '"' ||
             DECODE(is_locked, TRUE, ' ACCOUNT LOCK', '') ||
             DECODE(grace_period, 'undefined', '', ' GRACEPERIOD  ''' || grace_period || '''') ||
             DECODE(idle_session_timeout, 'unlimited', '', ' IDLESESSIONTIMEOUT ''' || idle_session_timeout || '''') ||
             DECODE(max_connections, 'unlimited', '', ' MAXCONNECTIONS ' || max_connections || ' ON ' || connection_limit_mode) ||
             DECODE(memory_cap_kb, 'unlimited', '', ' MEMORYCAP ''' || memory_cap_kb || 'K''') ||
             DECODE(profile_name, 'default', '', ' PROFILE ' || profile_name) ||
             DECODE(resource_pool, 'general', '', ' RESOURCE POOL ' || resource_pool) ||
             DECODE(run_time_cap, 'unlimited', '', ' RUNTIMECAP ''' || run_time_cap || '''') ||
             DECODE(search_path, '', '', ' SEARCH_PATH ' || search_path) ||
             DECODE(temp_space_cap_kb, 'unlimited', '', ' TEMPSPACECAP ''' || temp_space_cap_kb || 'K''') || ';' AS sql,
             'NONE' AS object_type,
             'NONE' AS object_name
        FROM v_catalog.users
       WHERE NOT is_super_user -- Exclude database superuser
         AND ldap_dn = ''      -- Limit to NON-LDAP created users
    )
    UNION ALL
    (
      SELECT 2, -- GRANTs
             grantee,
             'GRANT ' || REPLACE(TRIM(BOTH ' ' FROM words), '*', '') ||
             CASE
               WHEN object_type = 'RESOURCEPOOL' THEN ' ON RESOURCE POOL '
               WHEN object_type = 'STORAGELOCATION' THEN ' ON LOCATION '
               WHEN object_type = 'CLIENTAUTHENTICATION' THEN 'AUTHENTICATION '
               WHEN object_type IN ('DATABASE', 'LIBRARY', 'MODEL', 'SEQUENCE', 'SCHEMA') THEN ' ON ' || object_type || ' '
               WHEN object_type = 'PROCEDURE' THEN (SELECT ' ON ' || CASE REPLACE(procedure_type, 'User Defined ', '')
                                                                       WHEN 'Transform' THEN 'TRANSFORM FUNCTION '
                                                                       WHEN 'Aggregate' THEN 'AGGREGATE FUNCTION '
                                                                       WHEN 'Analytic' THEN 'ANALYTIC FUNCTION '
                                                                       ELSE UPPER(REPLACE(procedure_type, 'User Defined ', '')) || ' '
                                                                     END
                                                      FROM vs_procedures
                                                     WHERE proc_oid = object_id)
               WHEN object_type = 'ROLE' THEN ''
               ELSE ' ON '
             END ||
             NVL2(object_schema, object_schema || '.', '') || CASE WHEN object_type = 'STORAGELOCATION' THEN (SELECT '''' || location_path || ''' ON ' || node_name FROM storage_locations WHERE location_id = object_id) ELSE object_name END ||
             CASE
               WHEN object_type = 'PROCEDURE' THEN (SELECT CASE WHEN procedure_argument_types = '' OR procedure_argument_types = 'Any' THEN '()' ELSE '(' || procedure_argument_types || ')' END
                                                      FROM vs_procedures
                                                     WHERE proc_oid = object_id)
               ELSE ''
             END ||
             ' TO ' || grantee ||
             CASE WHEN INSTR(words, '*') > 0 THEN ' WITH GRANT OPTION' ELSE '' END
             || ';',
             object_type,
             object_name
      FROM (SELECT grantee, object_type, object_schema, object_name, object_id,
                     v_txtindex.StringTokenizerDelim(DECODE(privileges_description, '', ',' , privileges_description), ',')
                       OVER (PARTITION BY grantee, object_type, object_schema, object_name, object_id)
              FROM v_catalog.grants) foo
     ORDER BY CASE REPLACE(TRIM(BOTH ' ' FROM words), '*', '') WHEN 'USAGE' THEN 1 ELSE 2 END
    )
    UNION ALL
    (
      SELECT 3, -- Default ROLEs
             user_name,
             'ALTER USER "' || user_name || '"' ||
               DECODE(default_roles, '', '', ' DEFAULT ROLE ' || REPLACE(default_roles, '*', ''))  || ';' ,
             'NONE' AS object_type,
             'NONE' AS object_name
        FROM v_catalog.users
       WHERE default_roles <> ''
    )
    UNION ALL -- GRANTs WITH ADMIN OPTION
    (
      SELECT 4, user_name, 'GRANT ' || REPLACE(TRIM(BOTH ' ' FROM words), '*', '') || ' TO ' || user_name || ' WITH ADMIN OPTION;',
             'NONE' AS object_type ,
             'NONE' AS object_name
        FROM (SELECT user_name, v_txtindex.StringTokenizerDelim(DECODE(all_roles, '', ',', all_roles), ',') OVER (PARTITION BY user_name)
                FROM v_catalog.users
               WHERE all_roles <> '') foo
       WHERE INSTR(words, '*') > 0
    )
    UNION ALL
    (
      SELECT 5, 'public', 'ALTER SCHEMA ' || name || ' DEFAULT ' || CASE WHEN defaultinheritprivileges THEN 'INCLUDE PRIVILEGES;' ELSE 'EXCLUDE PRIVILEGES;' END, 'SCHEMA', name
        FROM v_internal.vs_schemata
       WHERE NOT issys -- Exclude system schemas
    )
    UNION ALL
    (
      SELECT 6, 'public', 'ALTER DATABASE ' || database_name ||  ' SET disableinheritedprivileges = ' || current_value || ';',
             'DATABASE', database_name
        FROM v_internal.vs_configuration_parameters
       CROSS JOIN v_catalog.databases
       WHERE parameter_name = 'DisableInheritedPrivileges'
    )
    UNION ALL -- TABLE PRIV INHERITENCE
    (
      SELECT 7, 'public' , 'ALTER TABLE ' || table_schema || '.' || table_name ||
             CASE WHEN inheritprivileges THEN ' INCLUDE PRIVILEGES;' ELSE ' EXCLUDE PRIVILEGES;' END,
             'TABLE' AS object_type,
             table_schema || '.' || table_name AS object_name
        FROM v_internal.vs_tables
        JOIN v_catalog.tables ON (table_id = oid)
    )
    UNION ALL -- VIEW PRIV INHERITENCE
    (
      SELECT 8, 'public', 'ALTER VIEW ' || table_schema || '.' || table_name || CASE WHEN inherit_privileges THEN ' INCLUDE PRIVILEGES;' ELSE ' EXCLUDE PRIVILEGES; ' END,
             'TABLE' AS object_type, table_schema || '.' || table_name AS object_name
        FROM v_catalog.views
    )
    UNION ALL
    (
      SELECT 9, owner_name, 'ALTER TABLE ' || table_schema || '.' || table_name || ' OWNER TO ' || owner_name || ';',
             'TABLE', table_schema || '.' || table_name
        FROM v_catalog.tables
    )
    UNION ALL
    (
      SELECT 10, owner_name, 'ALTER VIEW ' || table_schema || '.' || table_name || ' OWNER TO ' || owner_name || ';', 'TABLE',
             table_schema || '.' || table_name
        FROM v_catalog.views
    );
    
  2. 从 Linux 命令行,运行 user_ddl.sql 文件中的脚本:

    $ vsql -f user_ddl.sql
    CREATE VIEW
    
  3. 使用 vsql 连接到 Vertica。

  4. 将 user_ddl 的 sql 列(该列按 grant_order 列排序)的内容导出到一个文件:

    => \o pre-upgrade.txt
    => SELECT sql FROM user_ddl ORDER BY grant_order ASC;
    => \o
    
  5. 升级 Vertica

  6. 使用相同的命令选择该视图的 SQL 列并将其保存到不同的文件中。

    => \o post-upgrade.txt
    => SELECT sql FROM user_ddl ORDER BY grant_order ASC;
    => \o
    
  7. 区别 pre-upgrade.txtpost-upgrade.txt。这会将丢失的授权收集到 grants-list.txt 中。

    $ diff pre-upgrade.txt post-upgrade.txt > grants-list.txt
    
  8. 要还原丢失的任何授权,请运行 grants-list.txt 中的剩余授权(如果有):

    => \i 'grants-list.txt'