Per ownCloud 10, inizia applicando le modifiche allo schema fornite dal core e dalle app installate, quindi verifica quali query del database sono effettivamente lente. Non aggiungere indici alla cieca né presumere che il comando Nextcloud db:add-missing-indicessia un comando di riparazione supportato da ownCloud 10: la documentazione di riferimento OCC di ownCloud Server 10.15 non lo menziona. Gli indici possono velocizzare le letture corrispondenti, ma ogni indice aggiunto consuma spazio di archiviazione e aumenta il carico di lavoro per inserimenti, aggiornamenti ed eliminazioni.
Questo approccio è adatto a un amministratore che riscontra rallentamenti nella pagina ownCloud, nell'elenco dei file o nel funzionamento dell'app e che può accedere al server e al database. Se l'intera istanza è lenta o se è in esecuzione su SQLite con più utenti attivi, è consigliabile verificare la configurazione generale del database e dell'implementazione prima di considerare gli indici come la causa del problema.
Scegli la modifica che corrisponde alle prove
Un indice di database è una struttura ausiliaria che aiuta il database a individuare le righe senza dover scansionare l'intera tabella. ownCloud e le sue app definiscono tabelle, colonne e indici come parte del loro schema. Gli aggiornamenti del core e delle app possono includere migrazioni dello schema che creano o modificano tali indici. Mantenere aggiornato lo schema dell'applicazione è quindi il primo passo più sicuro.
Prima di apportare qualsiasi modifica, si prega di tenere conto delle seguenti distinzioni:
- Avviso dell'amministratore o problema noto di aggiornamento: eseguire la normale procedura di aggiornamento di ownCloud e analizzarne l'output. Le migrazioni di aggiornamento sono il percorso supportato per le modifiche dello schema fornite da ownCloud o da un'app.
- Una query nota per essere lenta, con un piano di esecuzione inefficiente: chiedete a un amministratore di database di esaminare la query e il piano. Un indice mirato potrebbe essere d'aiuto, ma le colonne e l'ordine proposti devono corrispondere alla query e alla definizione della tabella.
- Caricamento lento, blocco o contesa diffusa: indagare su transazioni, latenza di archiviazione, capacità del database e blocco dei file. Questi sintomi, di per sé, non dimostrano la mancanza di un indice.
- Installazione di piccole dimensioni di SQLite che diventa multiutente: valutate la migrazione a MySQL/MariaDB o PostgreSQL. ownCloud descrive SQLite come adatto per test e piccoli carichi di lavoro a utente singolo, mentre le implementazioni multiutente in produzione dovrebbero utilizzare un database server supportato.
Un indice non è una soluzione universale per aumentare la velocità. Un numero maggiore di indici può migliorare le prestazioni di determinate ricerche, ma può anche incrementare le dimensioni del database e la latenza di scrittura. Il risultato dipende dalla struttura della query, dalle dimensioni della tabella, dalla distribuzione dei dati, dal motore del database e dallo stato della cache.
Preparare un intervallo di manutenzione sicuro
- Annota le versioni esatte e il database. Dalla directory di installazione di ownCloud, esegui
sudo -u www-data ./occ status. Prendi nota della versione di ownCloud, delle versioni delle app installate, del tipo di database e del prefisso della tabella da config/config.php. Sostituisci www-datacon l'account del server web sulla tua distribuzione. - Cattura l'operazione lenta. Annota la schermata o l'app interessata, il tempo approssimativo e se il ritardo si ripete. Esamina i log di ownCloud e la diagnostica delle query lente del tuo database. Abilita la registrazione delle query solo seguendo le indicazioni del fornitore del tuo database, poiché i log possono contenere valori SQL sensibili e crescere rapidamente.
- Esegui il backup del database e della configurazione. Utilizza un metodo di backup coerente con il database e verifica che il backup sia leggibile. La documentazione di ownCloud sul backup utilizza
mysqldump --single-transactioncome esempio i database compatibili con MySQL; adatta i valori di host, utente e database alla tua configurazione. Non inserire la password del database direttamente nella cronologia della shell o nell'elenco dei processi. - Pianifica le modifiche con responsabilità. Un aggiornamento dello schema o la creazione di un indice possono utilizzare I/O del disco, CPU e blocchi. In caso di installazioni di grandi dimensioni o con un elevato carico di lavoro, informa gli utenti sulla finestra temporale disponibile e monitora il carico del database. Utilizza la modalità di manutenzione di ownCloud solo quando la procedura di aggiornamento o manutenzione applicabile lo richiede; non abilitarla come sostituto di un backup.
Applicare prima gli aggiornamenti dello schema gestiti da ownCloud.
Se è in sospeso un aggiornamento del core o dell'app di ownCloud, utilizzare la procedura di aggiornamento documentata per il metodo di installazione in uso. In un'installazione Linux convenzionale, il comando OCC viene eseguito come utente HTTP dalla directory radice di ownCloud. Seguendo le istruzioni per l'aggiornamento manuale, il comando è:
sudo -u www-data ./occ upgrade
Non eseguirlo su un'installazione i cui file sono stati aggiornati solo parzialmente. Prima di tutto, prepara i file di rilascio corrispondenti e segui i passaggi di aggiornamento ufficiali per quella versione. Per le implementazioni Docker, utilizza l'invocazione OCC documentata del container anziché un percorso host che punta a un ambiente PHP diverso.
Leggere l'output completo del comando e i log. Un comando eseguito correttamente dovrebbe terminare senza segnalare errori di migrazione; ciò non garantisce la correzione di tutte le query lente. Se l'aggiornamento segnala un errore di migrazione, interrompere l'esecuzione e analizzare l'errore anziché rieseguire ripetutamente il comando o modificare manualmente le tabelle dello schema. Consultare la documentazione di aggiornamento di ownCloud specifica per la versione e il manutentore dell'app in caso di migrazione dell'app.
Il riferimento OCC di ownCloud 10.15 elenca comandi di database come db:convert-type, db:convert-mysql-charsete db:restore-default-row-format, ma non elenca db:add-missing-indices. Poiché la disponibilità dei comandi può variare a seconda della versione e del codice installato, è possibile ispezionare la propria istanza con sudo -u www-data ./occ list dbo sudo -u www-data ./occ help db:add-missing-indices. Se quest'ultimo segnala un comando sconosciuto, non copiare il comando da un tutorial di Nextcloud in ownCloud. Consultare la documentazione per la versione esatta di ownCloud in uso e utilizzare il percorso di aggiornamento o migrazione dell'app supportato.
Quando è opportuno utilizzare un indice manuale?
L'SQL manuale è un'opzione per gli amministratori di database da utilizzare in caso di problemi di query verificati, non un'ottimizzazione di routine di ownCloud. Innanzitutto, individua la query lenta esatta ed esegui lo strumento di analisi del piano di esecuzione del motore, ad esempio EXPLAINper MySQL/MariaDB o PostgreSQL. Verifica se il piano esegue la scansione di un numero eccessivo di righe e se un indice esistente viene ignorato. Il prefisso delle tabelle di ownCloud è configurabile, quindi non dare mai per scontato che i nomi delle tabelle inizino con oc_.
Prima di creare un indice, confronta le colonne proposte con i filtri, le join e l'ordinamento della query. L'ordine delle colonne di un indice composito è importante; duplicare un indice esistente potrebbe comportare costi aggiuntivi senza migliorare il piano. Chiedi a un DBA di valutare il comportamento della versione del database, il supporto per la creazione di indici online o simultanea, lo spazio su disco disponibile, l'impatto dei blocchi e la procedura di rollback. Questi dettagli sono specifici del motore e della versione, quindi non esiste un'unica istruzione SQL sicura per ogni installazione di ownCloud 10.
Non modificare le tabelle di ownCloud né rimuovere gli indici solo perché un nome sembra ridondante. Tali modifiche possono entrare in conflitto con una successiva migrazione del core o dell'app e possono compromettere una funzionalità che utilizza una query diversa da quella che hai ispezionato. Conserva una documentazione scritta di qualsiasi modifica manuale allo schema e assicurati che possa essere ricreata dopo un ripristino o una migrazione. Preferisci una patch o una versione dell'app di ownCloud supportata quando l'indice mancante è un difetto dello schema del prodotto.
Confronta le alternative a livello di database
Se il piano utilizza già un indice appropriato, è improbabile che l'aggiunta di un altro risolva un ritardo causato altrove. Confronta queste opzioni con il collo di bottiglia osservato:
- MySQL o MariaDB: una scelta comune per le implementazioni i cui amministratori già utilizzano questi motori. Prima di modificare le impostazioni del server, è consigliabile esaminare la memoria del buffer pool, la latenza del disco, le connessioni e i piani di gestione delle query lente.
- PostgreSQL: un'alternativa supportata per ownCloud 10, a condizione che il connettore PHP per il database e la distribuzione siano configurati correttamente. I suoi piani di query e gli strumenti di manutenzione degli indici differiscono da quelli di MySQL, pertanto si consiglia di seguire le indicazioni specifiche per PostgreSQL.
- SQLite: semplice da utilizzare per test o piccoli carichi di lavoro a utente singolo, ma non la scelta predefinita per carichi di lavoro di produzione multiutente e simultanei. L'ottimizzazione degli indici non può eliminare i limiti di concorrenza dell'implementazione.
Il cambio di motore di database è un progetto di migrazione, non una semplice modifica all'indice. ownCloud offre occ db:convert-typeconversioni supportate; verifica i prerequisiti, esegui prima un backup e testa l'istanza convertita prima di indirizzare gli utenti ad essa.
Verifica il risultato e interrompi se le prove lo contraddicono.
Ripeti la stessa azione dell'utente in condizioni comparabili e confronta la durata della query, il piano di esecuzione, le righe esaminate, l'I/O del database e il carico del server. Verifica che la pagina o l'app ownCloud pertinente venga completata correttamente e che i log non mostrino errori del database o di migrazione. Un risultato più veloce su una singola richiesta non dimostra un miglioramento complessivo; confronta diverse richieste rappresentative e tieni conto delle cache calde.
Se la stessa query continua a essere lenta anche utilizzando un indice appropriato, è necessario esaminare blocchi, spazio di archiviazione, latenza di rete, processi PHP e limiti delle risorse del database. Se il piano di esecuzione della query o la struttura della tabella non sono chiari, è meglio interrompere l'esecuzione prima di eseguire manualmente il DDL e chiedere a un DBA o al supporto di ownCloud di esaminarlo. Il risultato ottimale è uno schema allineato alla versione di ownCloud installata e alle query misurate, senza modifiche agli indici non tracciate.
Riferimenti ufficiali