> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/es/config/persistence.md).

# Persistencia

PowerShell Universal almacena la salida y la entrada de los trabajos, las identidades y los tokens de aplicación en la base de datos.

## SQLite

{% hint style="warning" %}
SQLite no es escalable y solo se recomienda para instancias pequeñas o para pruebas. Recomendamos seleccionar MS SQL o PostgreSQL para entornos de producción.
{% endhint %}

Cuando se utiliza SQLite, PowerShell Universal almacena todos los datos en una única base de datos en fichero local a la aplicación PowerShell Universal. Recomendamos SQLite en lugar de LiteDB para las nuevas instalaciones, ya que su uso y soporte están más extendidos.

Puede configurar SQLite actualizando el fichero `appsettings.json`.

```json
 "Plugins": [
    "SQLite"
  ],
  "Data": {
    "ConnectionString": "Data Source=%ProgramData%\\UniversalAutomation\\psu.db",
  },
```

### Resolución de problemas de bases de datos de gran tamaño

Las bases de datos SQLite de gran tamaño pueden deberse a un historial de trabajos prolongado, a trabajos que escriben excesivamente en la salida de la canalización o en los flujos de salida de PowerShell, a información obsoleta de ordenadores, procesos o runspaces, o a tablas de entradas de registro de gran tamaño.

A medida que crece la base de datos, el rendimiento de PowerShell Universal se verá afectado. Para determinar la causa de este crecimiento, utilice la herramienta SQLite\_Analyzer. Puede descargar SQLite\_Analyzer como parte del ZIP de herramientas en la [página de descargas de SQLite](https://www.sqlite.org/download.html).

Una vez descargada, ejecute el analizador contra el fichero de base de datos de PowerShell Universal para obtener una lista exhaustiva de información sobre el estado de su base de datos. Recomendamos detener PowerShell Universal antes de ejecutar el siguiente comando.

```
.\sqlite_analyzer.exe C:\ProgramData\UniversalAutomation\database.db
```

El comando incluirá información sobre el tamaño de las tablas y los índices de la base de datos. Esto ayudará a identificar exactamente dónde se almacena la gran cantidad de datos.

### Reducir el tamaño de la base de datos

SQLite conserva el espacio no utilizado en la lista de espacio libre (freelist) de la base de datos después de que los registros se actualicen o se eliminen. Las bases de datos que ejecutan muchos trabajos o que han estado funcionando durante mucho tiempo pueden tener un fichero de base de datos grande con una freelist extensa. Puede ejecutar la herramienta `sqlite_analyzer` para determinar cuánto espacio utiliza la freelist.

La base de datos de ejemplo que aparece a continuación tiene un tamaño de 23 GB, pero el 99,946 % de ella es espacio no utilizado.

```
/** Disk-Space Utilization Report For ./psu.db

Page size in bytes................................ 4096      
Pages in the whole file (measured)................ 5953770   
Pages in the whole file (calculated).............. 5953770   
Pages that store data............................. 3230         0.054% 
Pages on the freelist (per header)................ 5950539     99.946% 
Pages on the freelist (calculated)................ 5950539     99.946% 
Pages of auto-vacuum overhead..................... 0            0.0% 
Number of tables in the database.................. 66        
Number of indices................................. 48        
Number of defined indices......................... 47        
Number of implied indices......................... 1         
Size of the file in bytes......................... 24386641920
Bytes of user payload stored...................... 6611527      0.027% 
```

Para recuperar este espacio, SQLite puede utilizar la función vacuum para reconstruir la base de datos y reducir el tamaño de la freelist. `auto-vacuum` no está habilitado en las bases de datos de PowerShell Universal. Si tiene problemas con el tamaño de la base de datos, puede ejecutar el comando `VACUUM;` en la herramienta Base de datos de la Herramienta de soporte.

{% hint style="warning" %}
Recomendamos hacer una copia de seguridad del fichero de base de datos antes de realizar un VACUUM. Este comando reconstruye la base de datos, la desfragmenta y elimina la freelist del fichero.
{% endhint %}

Haga clic en Ayuda \ Herramientas de soporte \ Herramientas \ Base de datos \ Ejecutar. Introduzca el siguiente comando y ejecútelo.

```
VACUUM;
```

## SQL

{% hint style="info" %}
El soporte de SQL requiere una [licencia](https://store.devolutions.net/package#psu).
{% endhint %}

Puede configurar PowerShell Universal para almacenar datos en una base de datos de Microsoft SQL. Esto le permite escalar horizontalmente su base de datos y sus instancias de PowerShell Universal. PowerShell Universal ejecutará automáticamente los trabajos en el grupo de agentes. Puede actualizar el fichero `appsettings.json` de PowerShell Universal como se indica a continuación para conectarse a un servidor SQL centralizado.

```json
  "Plugins": [
    "SQL"
  ],
  "Data": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=PSUv3;Integrated Security=true;",
  },
```

Las instancias de PowerShell Universal compartirán una única cola de trabajos y solo una instancia ejecutará un trabajo, ya sea de forma programada, como desencadenador o manualmente. Todos los datos sobre los trabajos se almacenarán en la base de datos centralizada.

### Azure SQL

Recomendamos utilizar Azure Managed Identities cuando se trabaja con Azure SQL. A continuación se muestra un ejemplo de cadena de conexión.

```
Server=tcp:psudb.database.windows.net,1433;Initial Catalog=psu;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Managed Identity;
```

Puede encontrar [aquí un tutorial sobre cómo usar Managed Identity para Azure SQL](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql).

### Instalación\actualización manual del esquema

En algunos entornos, el servicio PSU puede no tener acceso para crear el esquema en la base de datos. En este caso, puede instalar y actualizar el esquema manualmente ejecutando los ficheros SQL incluidos con PowerShell Universal. En la carpeta de instalación de PowerShell Universal encontrará un directorio `SQL` que incluye dos ficheros SQL.

Ejecute estos ficheros contra su base de datos antes de actualizar PowerShell Universal. Deberá detener PowerShell Universal mientras lo hace. Puede ejecutarlos en cualquier orden. Ambos scripts son idempotentes.

De forma predeterminada, PowerShell Universal intentará actualizar el esquema de la base de datos. Para desactivar completamente esta función, puede establecer el ajuste `RunMigrations` en false en appsettings.json.

```json
"Data": {
   "RunMigrations": false
}
```

### Preguntas frecuentes

#### Privilegios de la cuenta de base de datos

*¿Cuál es el permiso máximo que necesita una cuenta de usuario de base de datos durante las instalaciones o las actualizaciones?*

Durante el inicio del servidor PowerShell Universal, la base de datos se instalará y se actualizará, si es necesario. Si la base de datos ya existe, necesitará `db_owner` para crear y modificar tablas. Si la base de datos aún no existe, necesitará `dbcreator` .

*¿Cuál es el permiso máximo necesario, una vez creada la base de datos, para las actividades diarias continuas?*

PowerShell Universal realiza operaciones de base de datos limitadas durante las actividades diarias. Estas consisten en insertar, actualizar, eliminar y visualizar datos en las tablas creadas. Solo necesitará los siguientes roles: `db_datawriter`, `db_datareader`

#### Instalación y soporte de la base de datos y el sistema operativo

*¿Qué versiones de SQL Server son compatibles? ¿Se requiere una versión mínima?*

PowerShell Universal es compatible con Microsoft SQL Server 2016 y posteriores.

*¿Qué versiones de compatibilidad de base de datos admiten?*

PowerShell Universal requiere la [versión de compatibilidad de base de datos 130 ](https://learn.microsoft.com/en-us/sql/relational-databases/databases/view-or-change-the-compatibility-level-of-a-database?view=sql-server-ver16)o posterior.

*¿Es necesario instalar otros componentes de SQL Server además del motor de base de datos?*

Ninguno

*¿Qué versiones de Windows Server son compatibles?*

Las versiones actualmente compatibles con Microsoft: Windows Server 2016 y posteriores. Actualmente, la fecha de finalización del soporte extendido de Microsoft para 2012 R2 es el 10 de octubre de 2023, momento en el que dejaremos de dar soporte a ese sistema operativo.

#### Mantenimiento y copia de seguridad de la base de datos

*¿Con qué rapidez es necesario recuperar los datos?*

Los datos son principalmente para informes, aparte de los tokens de aplicación, por lo que no es necesario recuperarlos de inmediato. Según el uso de los tokens de aplicación, algunos sistemas pueden perder el acceso al servidor mientras se recupera la base de datos.

#### Diseño de la base de datos

*¿Qué tamaño tendrá la base de datos en la carga inicial?*

La base de datos inicial no incluye un gran conjunto de datos iniciales y principalmente solo ocupará el espacio del esquema.

*¿Cuál es el crecimiento estimado por mes/año de cada base de datos?*

El crecimiento estimado depende de muchos factores, entre ellos el número de trabajos ejecutados al mes, la cantidad de registros de trabajos y de salida de la canalización almacenados, y la agresividad con la que se depuran los datos.

El tamaño de la base de datos rara vez supera los 2 GB con la configuración predeterminada. Ampliar la configuración de depuración para conservar un historial de trabajos más largo, ejecutar trabajos con más frecuencia y almacenar datos como el historial del terminal puede aumentar el tamaño de la base de datos.

*¿Su aplicación admite el uso de la compresión de SQL Server (a nivel de fila o de página)?*

Sí. Utilizamos un cliente de base de datos estándar y no tiene ninguna limitación en cuanto a la compresión a nivel de fila y de página.

#### Uso de la base de datos

*¿Es una base de datos transaccional (OLTP) o de informes (OLAP)?*

Se trata principalmente de una base de datos de informes que incluye información como el historial de trabajos, la salida de los trabajos y los tokens de aplicación.

*¿Cuál es el número total de conexiones de usuario/dispositivo?*

Un grupo de conexiones por servidor PSU. Máximo de 1024 conexiones por servidor.

*¿Cuál es el número máximo de conexiones simultáneas de usuario/dispositivo?*

Un grupo de conexiones por servidor PSU. Máximo de 1024 conexiones por servidor.

## PostgreSQL

Puede habilitar PostgreSQL con el plugin `PostgreSQL`.

```json
 "Plugins": [
    "PostgreSQL"
  ],
  "Data": {
    "ConnectionString": "Host=PGhostname; Database=PGdatabase; User Id=PGusername; Password=PGpassword!;Port=5432",
  },
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/es/config/persistence.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
