> 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/it/config/persistence.md).

# Persistenza

PowerShell Universal archivia l'output e l'input dei job, le identità e i token delle app all'interno del database.

## SQLite

{% hint style="warning" %}
SQLite non è scalabile ed è consigliato solo per istanze di piccole dimensioni o per test. Consigliamo di selezionare MS SQL o PostgreSQL per gli ambienti di produzione.
{% endhint %}

Quando si utilizza SQLite, PowerShell Universal archivia tutti i dati all'interno di un unico database su file locale all'applicazione PowerShell Universal. Consigliamo SQLite rispetto a LiteDB per le nuove installazioni, poiché è più diffuso e supportato.

È possibile configurare SQLite aggiornando il file `appsettings.json`.

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

### Risoluzione dei problemi di database di grandi dimensioni

I database SQLite di grandi dimensioni possono essere il risultato di una lunga cronologia dei job, di job che scrivono in modo eccessivo nell'output della pipeline o nei flussi di output di PowerShell, di informazioni obsolete su computer, processi o runspace, oppure di tabelle di voci di log molto grandi.

Con la crescita del database, le prestazioni di PowerShell Universal ne risentiranno. Per individuare la causa di questa crescita, utilizzi lo strumento SQLite\_Analyzer. Può scaricare SQLite\_Analyzer come parte dello ZIP degli strumenti nella [pagina di download di SQLite](https://www.sqlite.org/download.html).

Una volta scaricato, esegua l'analyzer sul file di database di PowerShell Universal per ottenere un elenco esaustivo di informazioni sullo stato del database. Consigliamo di arrestare PowerShell Universal prima di eseguire il comando seguente.

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

Il comando includerà informazioni sulla dimensione delle tabelle e degli indici all'interno del database. Questo aiuterà a individuare esattamente dove viene archiviata la grande quantità di dati.

### Riduzione della dimensione del database

SQLite mantiene lo spazio inutilizzato nella freelist all'interno del database dopo che i record sono stati aggiornati o eliminati. I database che eseguono molti job o che sono in funzione da lungo tempo possono avere un file di database di grandi dimensioni con una freelist estesa. È possibile eseguire lo strumento `sqlite_analyzer` per determinare quanto spazio è utilizzato dalla freelist.

Il database di esempio qui sotto ha una dimensione di 23 GB, ma il 99,946% è spazio inutilizzato.

```
/** 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% 
```

Per recuperare questo spazio, SQLite può utilizzare la funzionalità vacuum per ricostruire il database e ridurre la dimensione della freelist. `auto-vacuum` non è abilitato nei database di PowerShell Universal. Se riscontra problemi con la dimensione del database, può eseguire il comando `VACUUM;` all'interno dello strumento Database del Support Tool.

{% hint style="warning" %}
Consigliamo di eseguire il backup del file di database prima di eseguire un VACUUM. Questo comando ricostruisce il database, lo deframmenta e rimuove la freelist dal file.
{% endhint %}

Clicchi su Help \ Support Tools \ Tools \ Database \ Execute. Inserisca il comando seguente ed esegualo.

```
VACUUM;
```

## SQL

{% hint style="info" %}
Il supporto SQL richiede una [licenza](https://store.devolutions.net/package#psu).
{% endhint %}

È possibile configurare PowerShell Universal per archiviare i dati all'interno di un database Microsoft SQL. Questo consente di scalare orizzontalmente il database e le istanze di PowerShell Universal. PowerShell Universal eseguirà automaticamente i job sul pool di agent. Può aggiornare il file `appsettings.json` di PowerShell Universal come segue per connettersi a un server SQL centralizzato.

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

Le istanze di PowerShell Universal condivideranno un'unica coda di job e una sola istanza eseguirà un job, sia in base alla pianificazione, sia come trigger, sia manualmente. Tutti i dati relativi ai job saranno archiviati nel database centralizzato.

### Azure SQL

Consigliamo di utilizzare le Azure Managed Identities quando si lavora con Azure SQL. Di seguito è mostrata una stringa di connessione di esempio.

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

Una guida su come utilizzare la [Managed Identity per Azure SQL è disponibile qui](https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql).

### Installazione\aggiornamento manuale dello schema

In alcuni ambienti, il servizio PSU potrebbe non avere accesso per creare lo schema nel database. In questo scenario, è possibile installare e aggiornare manualmente lo schema eseguendo i file SQL inclusi con PowerShell Universal. All'interno della cartella di installazione di PowerShell Universal, troverà una directory `SQL` che include due file SQL.

Esegua questi file sul database prima di aggiornare PowerShell Universal. Sarà necessario arrestare PowerShell Universal mentre lo fa. Può eseguirli in qualsiasi ordine. Entrambi gli script sono idempotenti.

Per impostazione predefinita, PowerShell Universal tenterà di aggiornare lo schema del database. Per disabilitare completamente questa funzionalità, può impostare l'impostazione `RunMigrations` su false in appsettings.json.

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

### Domande frequenti

#### Privilegi dell'account del database

*Qual è l'autorizzazione massima necessaria per un account utente del database durante le installazioni o gli aggiornamenti?*

Durante l'avvio del server PowerShell Universal, il database verrà installato e aggiornato, se necessario. Se il database esiste già, sarà necessario `db_owner` per creare e modificare le tabelle. Se il database non esiste ancora, sarà necessario `dbcreator` .

*Qual è l'autorizzazione massima necessaria una volta creati i database per le attività quotidiane correnti?*

PowerShell Universal esegue operazioni limitate sul database durante le attività quotidiane. Queste consistono nell'inserimento, aggiornamento, eliminazione e visualizzazione dei dati nelle tabelle create. Saranno necessari solo i seguenti ruoli: `db_datawriter`, `db_datareader`

#### Installazione e supporto del database e del sistema operativo

*Quali versioni di SQL Server sono supportate? È richiesta una versione minima?*

PowerShell Universal supporta Microsoft SQL Server 2016 e successivi.

*Quali versioni di compatibilità del database supportate?*

PowerShell Universal richiede la [versione di compatibilità del database 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 successiva.

*È necessario installare altri componenti di SQL Server oltre al Database Engine?*

Nessuno

*Quali versioni di Windows Server sono supportate?*

Le versioni attualmente supportate da Microsoft - Windows Server 2016 e successive. Attualmente, la data di fine del supporto esteso di Microsoft per 2012 R2 è il 10 ottobre 2023, momento in cui interromperemo il supporto per il sistema operativo.

#### Manutenzione e backup del database

*Con quale rapidità devono essere recuperati i dati?*

I dati servono principalmente per la reportistica, a parte i token delle app, quindi non è necessario recuperarli immediatamente. A seconda dell'uso dei token delle app, alcuni sistemi potrebbero perdere l'accesso al server durante il ripristino del database.

#### Progettazione del database

*Quanto saranno grandi i database al caricamento iniziale?*

Il database iniziale non include un ampio set di dati iniziali e occuperà principalmente solo lo spazio dello schema.

*Qual è la crescita stimata al mese/anno di ciascun database?*

La crescita stimata dipende da molti fattori, tra cui il numero di job eseguiti al mese, la quantità di log dei job e di output della pipeline archiviati e quanto è aggressiva la pulizia dei dati.

La dimensione del database raramente supera i 2 GB con le impostazioni predefinite. Estendere le impostazioni di grooming per conservare una cronologia dei job più lunga, eseguire i job più frequentemente e archiviare dati come la cronologia del terminale può aumentare la dimensione del database.

*La vostra applicazione supporta l'uso della compressione di SQL Server (a livello di riga o di pagina)?*

Sì. Utilizziamo un client di database standard e non vi è alcuna limitazione sulla compressione a livello di riga e di pagina.

#### Utilizzo del database

*Si tratta di un database transazionale (OLTP) o di reportistica (OLAP)?*

Si tratta principalmente di un database di reportistica che include informazioni come la cronologia dei job, l'output dei job e i token delle app.

*Qual è il numero totale di connessioni utente/dispositivo?*

Un pool di connessioni per server PSU. Massimo 1024 connessioni per server.

*Qual è il numero massimo di connessioni utente/dispositivo simultanee?*

Un pool di connessioni per server PSU. Massimo 1024 connessioni per server.

## PostgreSQL

È possibile abilitare PostgreSQL con il 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/it/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.
