Uso de extensiones PostgreSQL con Amazon RDS para PostgreSQL - Amazon Relational Database Service

Uso de extensiones PostgreSQL con Amazon RDS para PostgreSQL

Puede ampliar la funcionalidad de PostgreSQL instalando una variedad de extensiones y módulos. Por ejemplo, para trabajar con datos espaciales, puede instalar y utilizar la extensión de PostGIS. Para obtener más información, consulte Administración de datos espaciales con la extensión PostGIS. Otro ejemplo, si desea mejorar la entrada de datos para tablas muy grandes, puede considerar la posibilidad de particionar los datos con la extensión pg_partman. Para obtener más información, consulte Administración de las particiones de PostgreSQL con la extensión pg_partman.

Según la versión de RDS para PostgreSQL, la instalación de una extensión podría requerir permisos rds_superuser, de la siguiente forma:

  • Para versiones 12 y anteriores de RDS para PostgreSQL, la instalación de extensiones requiere privilegios de rds_superuser.

  • Para la versión 13 y superiores de RDS para PostgreSQL , los usuarios (roles) con permisos de creación en una instancia de base de datos determinada pueden instalar y utilizar cualquier extensión de confianza. Para obtener una lista de las extensiones de confianza, consulte Extensiones de confianza de PostgreSQL.

También puede especificar con precisión qué extensiones se pueden instalar en la instancia de base de datos de RDS para PostgreSQL, enumerándolas en el parámetro rds.allowed_extensions. De forma predeterminada, este parámetro no está configurado, por lo que se puede agregar cualquier extensión compatible si el usuario tiene permisos para hacerlo. Al agregar una lista de extensiones a este parámetro, identifica explícitamente las extensiones que puede utilizar su instancia de base de datos de RDS para PostgreSQL. Las extensiones que no aparecen en la lista no se pueden instalar. Esta capacidad está disponible para las siguientes versiones:

  • RDS para PostgreSQL, versiones 14.1 y todas las superiores

  • RDS para PostgreSQL, versiones 13.2 y versiones menores superiores

  • RDS para PostgreSQL, versiones 12.6 y versiones menores superiores

Para obtener más información, consulte Restringir la instalación de extensiones de PostgreSQL.

Para obtener más información acerca del rol rds_superuser, consulte Descripción de los roles y permisos de PostgreSQL.

Uso de las funciones de la extensión orafce

La extensión orafce brinda funciones y operadores que emulan un subconjunto de funciones y paquetes de una base de datos de Oracle. La extensión orafce facilita la realización de la portabilidad de una aplicación Oracle a PostgreSQL. Esta extensión es compatible con la versión 9.6.6 y posteriores de RDS for PostgreSQL. Para obtener más información sobre orafce, consulte orafce en GitHub.

nota

RDS for PostgreSQL no admite el paquete utl_file que forma parte de la extensión orafce. Esto se debe a que las funciones del esquema utl_file proporcionan operaciones de lectura y escritura con archivos de texto del sistema operativo, lo que requiere el acceso de los superusuarios al host subyacente. Como servicio administrado, RDS for PostgreSQL no brinda acceso al host.

Para usar la extensión orafce

  1. Conéctese a la instancia de base de datos usando el nombre de usuario maestro que utilizó para crear la instancia de base de datos.

    Si desea activar orafce para una base de datos diferente en la misma instancia de base de datos, utilice el comando psql /c dbname. Con este comando, cambia de la base de datos principal después de iniciar la conexión.

  2. Active la extensión orafce con la instrucción CREATE EXTENSION.

    CREATE EXTENSION orafce;
  3. Transfiera la propiedad del esquema de Oracle al rol rds_superuser con la instrucción ALTER SCHEMA.

    ALTER SCHEMA oracle OWNER TO rds_superuser;

    Si desea ver la lista de propietarios del esquema de Oracle, utilice el comando \dn de psql.

Registro a nivel de sesión y objeto con la extensión pgAudit

Puede registrar la actividad a nivel de sesión o a nivel de objeto mediante la instalación de la extensión PostgreSQL Audit (pgAudit) en la instancia de base de datos de RDS for PostgreSQL. Esta extensión es compatible con todas las versiones disponibles de RDS for PostgreSQL. Utiliza el mecanismo de registro nativo subyacente de PostgreSQL.

Para obtener más información sobre la extensión pgAudit, consulte pgAudit en GitHub.

Con la auditoría de sesiones, puede registrar eventos de auditoría de varios orígenes e incluir el texto completo de los comandos cuando esté disponible. Modifique el grupo de parámetros personalizado que está asociado con su instancia de base de datos para que shared_preload_libraries contenga pgaudit. Luego, configure el parámetro pgaudit.log para registrar cualquiera de los siguientes tipos de eventos:

  • READ: registra SELECT y COPY cuando el origen es una relación o una consulta.

  • WRITE: registra INSERT, UPDATE, DELETE, TRUNCATE y COPY cuando el destino es una relación.

  • FUNCTION: registra llamadas a funciones y bloques DO.

  • ROLE: registra instrucciones relacionadas con roles y privilegios, como, por ejemplo, GRANT, REVOKE, CREATE ROLE, ALTER ROLE y DROP ROLE.

  • DDL: registra todas las instrucciones del lenguaje de definición de datos (DDL) que no están incluidas en la clase ROLE.

  • MISC: registra comandos variados como, por ejemplo, DISCARD, FETCH, CHECKPOINT, VACUUM y SET.

Para registrar varios tipos de eventos con auditorías de sesiones, utilice una lista separada por comas. Para registrar todos los tipos de eventos, establezca pgaudit.log en ALL. Reinicie la instancia de base de datos para aplicar los cambios.

Con la auditoría de objetos, puede mejorar los registros de auditoría para que funcionen con algunas relaciones específicas. Por ejemplo, puede especificar que desea crear registros de auditoría para las operaciones READ en un número concreto de tablas.

Para utilizar la extensión pgAudit, agregue pgaudit al parámetro shared_preload_libraries en la instancia de base de datos de RDS for PostgreSQL. No se pueden editar valores en los grupos de parámetros de base de datos predeterminados, por lo que es necesario utilizar un grupo de parámetros de base de datos personalizado para la instancia de base de datos. Para obtener más información acerca de los grupos de parámetros, consulte Trabajo con los grupos de parámetros.

Para utilizar la auditoría de objetos con la extensión pgAudit

  1. Cree un rol de base de datos llamado rds_pgaudit mediante el siguiente comando.

    CREATE ROLE rds_pgaudit;
  2. Modifique el grupo de parámetros de base de datos personalizado que está asociado con la instancia de base de datos de la siguiente manera:

    1. Agregue pgaudit a la lista de parámetros shared_preload_libraries. Cuando utilice la AWS CLI, ejecute lo siguiente.

      aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
    2. pgaudit.role se debe establecer en el rol rds_pgaudit. Cuando utilice la AWS CLI, ejecute lo siguiente.

      aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  3. Reinicie la instancia de base de datos para que los cambios en el grupo de parámetros surtan efecto.

    aws rds reboot-db-instance \ --db-instance-identifier your-RDS-db-instance \ --region aws-region
  4. Ejecute el siguiente comando para confirmar que pgaudit se ha inicializado.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  5. Ejecute el siguiente comando para crear la extensión pgaudit.

    CREATE EXTENSION pgaudit;
  6. Ejecute el siguiente comando para confirmar que pgaudit.role tiene el valor rds_pgaudit.

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

Para probar el registro de pgAudit, puede ejecutar varios comandos de ejemplo que desee auditar. Por ejemplo, podría ejecutar los siguientes comandos.

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

Los registros de base de datos contendrán una entrada similar a la siguiente.

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

Para obtener información acerca de la visualización de los registros, consulte Supervisión de archivos de registro de Amazon RDS.

Reducción de la sobrecarga en tablas e índices con la extensión pg_repack

Puede utilizar la extensión pg_repack para eliminar la sobrecarga de las tablas y los índices. Esta extensión es compatible con RDS para las versiones 9.6.3 y superiores de PostgreSQL. Para obtener más información sobre la extensión pg_repack, consulte la documentación del proyecto de GitHub.

Para usar la extensión pg_repack

  1. Instale la extensión pg_repack en la instancia de base de datos de RDS for PostgreSQL mediante el siguiente comando.

    CREATE EXTENSION pg_repack;
  2. Ejecute los siguientes comandos para conceder acceso de escritura para volver a reempaquetar las tablas de registro temporales creadas por pg_repack.

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. Conéctese a la base de datos mediante la utilidad de cliente pg_repack. Utilice una cuenta que tenga privilegios rds_superuser. Por ejemplo, suponga que ese rol rds_test tiene privilegios rds_superuser. La sintaxis del comando se muestra a continuación.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres

    Conéctese usando la opción -k. La opción -a no se admite.

  4. La respuesta del cliente pg_repack proporciona información relativa a las tablas de la instancia de base de datos que se han vuelto a empaquetar.

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"

Actualización y uso de la extensión PLV8

PLV8 es una extensión de lenguaje Javascript de confianza para PostgreSQL Puede usarlo para procedimientos almacenados, desencadenadores y otro código de procedimiento que se puede llamar desde SQL. Esta extensión de lenguaje es compatible con todas las versiones actuales de PostgreSQL.

Si utiliza PLV8 y actualiza PostgreSQL a una nueva versión de PLV8, inmediatamente aprovecha la nueva extensión. Lleve a cabo los siguientes pasos para sincronizar los metadatos del catálogo con la nueva versión de PLV8. Estos pasos son opcionales, pero recomendamos que los complete para evitar advertencias de discrepancia de metadatos.

El proceso de actualización elimina todas las funciones PLV8 existentes. Por lo tanto, le recomendamos que cree una instantánea de su instancia de base de datos de RDS for PostgreSQL antes de la actualización. Para obtener más información, consulte Creación de una instantánea de base de datos.

Para sincronizar los metadatos del catálogo con una nueva versión de PLV8

  1. Verifique que necesita realizar la actualización. Para ello, ejecute el siguiente comando mientras está conectado a la instancia.

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    Si los resultados contienen valores de una versión instalada con un número inferior a la versión predeterminada, continúe con este procedimiento para actualizar las extensiones. Por ejemplo, el siguiente conjunto de resultados indica que debería actualizar.

    name | default_version | installed_version | comment --------+-----------------+-------------------+-------------------------------------------------- plls | 2.1.0 | 1.5.3 | PL/LiveScript (v8) trusted procedural language plcoffee| 2.1.0 | 1.5.3 | PL/CoffeeScript (v8) trusted procedural language plv8 | 2.1.0 | 1.5.3 | PL/JavaScript (v8) trusted procedural language (3 rows)
  2. Cree una instantánea de la instancia de base de datos de RDS for PostgreSQL si aún no lo ha hecho. Puede continuar con los pasos siguientes mientras se crea la instantánea.

  3. Obtenga un recuento del número de funciones de PLV8 de su instancia de base de datos para que pueda validar que se aplican todas después de la actualización. Por ejemplo, la siguiente consulta SQL devuelve el número de funciones escritas en plv8, plcoffee y plls.

    SELECT proname, nspname, lanname FROM pg_proc p, pg_language l, pg_namespace n WHERE p.prolang = l.oid AND n.oid = p.pronamespace AND lanname IN ('plv8','plcoffee','plls');
  4. Use pg_dump para crear un archivo de volcado solo de esquema. Por ejemplo, cree un archivo en el equipo cliente en el directorio /tmp.

    ./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp

    En este ejemplo se utilizan las siguientes opciones:

    • -Fc: formato personalizado

    • --schema-only: vuelca solo los comandos necesarios para crear el esquema (funciones en este caso)

    • -U: el nombre de usuario maestro de RDS

    • database: el nombre de la base de datos para nuestra instancia de base de datos

    Para obtener más información sobre pg_dump, consulte pg_dump en la documentación de PostgreSQL.

  5. Extraiga la instrucción DDL "CREATE FUNCTION" que se encuentra en el archivo de volcado. El siguiente ejemplo utiliza el comando grep para extraer la instrucción DDL que crea las funciones y guardarlas en un archivo. Se utiliza en los pasos posteriores para volver a crear las funciones.

    ./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/

    Para obtener más información sobre pg_restore, consulte pg_restore en la documentación de PostgreSQL.

  6. Borre las funciones y las extensiones. El siguiente ejemplo elimina cualquier objeto basado en PLV8. La opción cascade garantiza que se borren los dependientes.

    DROP EXTENSION pvl8 CASCADE;

    Si su instancia de PostgreSQL contiene objetos basados en plcoffee o plls, repita este paso para dichas extensiones.

  7. Cree las extensiones. El siguiente ejemplo crea las extensiones plv8, plcoffee y plls.

    CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
  8. Cree las funciones con el archivo de volcado y el archivo "driver".

    El siguiente ejemplo recrea las funciones que extrajo anteriormente.

    ./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
  9. Verifique que todas las funciones se recrean con la siguiente consulta.

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    La versión 2 de PLV8 agrega la siguiente fila adicional a su conjunto de resultados:

    proname | nspname | lanname ---------------+------------+---------- plv8_version | pg_catalog | plv8