I file di un database possono essere copiati mentre un database è online?


9

Sto lavorando alla configurazione di una copia di sviluppo di un database di produzione su SQL Server 2008 R2 SP1. Il database live viene attualmente leggermente utilizzato da due sviluppatori per query di sola lettura, ma anche il nuovo database avrà aggiornamenti.

Poiché il database è di 2,1 TB e sono stati necessari in totale 3 giorni per ripristinare e aggiornare all'ultima build di cui abbiamo bisogno per i test, il mio piano originale era creare un nuovo set di file di backup e quindi ripristinare da quei file. Ciò mi consentirebbe di creare la copia di sviluppo del database sulla stessa istanza e macchina SQL, senza dover portare offline il database corrente.

Tuttavia, per salvare un paio di quei giorni, stavo pensando che potrebbe essere una buona idea semplicemente copiare i file del database fisico e allegare la nuova copia del database. Sfortunatamente quando provo a copiare ricevo un errore facendo riferimento al blocco che SQL Server mette su quei file.

Dal momento che non riesco a portare il database offline per tutto tranne che trasferire i file di registro (posso finirlo prima che le persone entrino la mattina), c'è un modo in cui posso copiare i file del database live senza mettere il database in uno stato offline? O dovrei aspettare che le persone tornino a casa per farlo?

Risposte:


11

Perché sono necessari 3 giorni per eseguire il backup / ripristinare un database da 2,1 TB? Se si tratta di spostare il backup, sospetto che la copia dei file MDF / LDF sarebbe effettivamente più lenta poiché almeno il backup potrebbe essere compresso. E se si tratta solo di ripristinare, quindi scrivere le copie del file non dovrebbe essere più veloce del processo di ripristino stesso: assicurati di avere l'inizializzazione istantanea del file abilitata . O velocizzare l'I / O sul sistema secondario.

Comunque, no, non puoi copiare i file MDF / LDF mentre il database è online, dovresti metterlo offline per farlo. E questo è il modo assolutamente MINIMO sicuro per copiare un database. Se succede qualcosa ai file mentre sono staccati / offline, ora hai zero copie del tuo database.

Suggerirei di cercare modi per rendere il backup / ripristino più veloce, sia che si tratti di comprimere i backup e di trasferire i file nel modo migliore possibile, utilizzando il miglior sottosistema I / O disponibile, migliorando l'I / O, rendendo sicuro che IFI sia abilitato, ecc.

Un'altra opzione da considerare è la spedizione dei log round robin: supponendo che la produzione sia in pieno recupero e si stanno eseguendo backup regolari dei log, è possibile eseguire la spedizione dei log in un database mentre gli sviluppatori lavorano su un altro e quando si arriva a un punto stabile, ripristinare con il ripristino e far cambiare gli sviluppatori, portando con sé le loro ultime modifiche. Ora reinizializza il log shipping sulla copia su cui hanno appena smesso di lavorare e sarà pronto per loro al prossimo cut-over "stabile", senza aspettare.


Il backup richiederebbe un numero sconosciuto di ore (non ho creato il backup originale). Il ripristino richiede 10 ore, quindi l'esecuzione degli aggiornamenti per arrivare alla nostra build di sviluppo richiede altre 8 ore. Quindi davvero, se stiamo parlando di un giorno di 24 ore ci vogliono solo 18 ore. Parlando di 8 ore al giorno, sono praticamente 3 giorni (aggiungendo un po 'di tempo per copiare i file). Ci sono ASSOLUTAMENTE modi in cui posso ottimizzare il processo di backup / ripristino stesso, ed è quello che farò ora che so che è il modo in cui voglio andare.
Sean Long,

0

No, dovrai copiarlo offline per copiare i file. Se il database è diviso in file / filegroup più piccoli, potrebbe essere utile rendere più rapido il ripristino del backup dopo averlo eseguito una volta (a seconda di quali dati stanno cambiando e di quali dati sono necessari per la copia di sviluppo).


0

Ho visto le altre risposte e hanno perfettamente senso. Tuttavia, solo per rispondere alla tua domanda, puoi sicuramente copiare i file del database senza portare offline il DB. A tale scopo dovrai utilizzare la programmazione SMO. Dai un'occhiata a: http://technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

Si noti che il collegamento fornito è agli oggetti di programmazione SMO generali e non una risposta specifica a questa domanda. Non l'ho ancora fatto, ma presto lo proverò e farò sapere a tutti (se ricordo) cosa scopro.


-1

I file di un database possono essere copiati mentre un database è online?

Sì.

Tutto quello che devi fare è impostare il database in sola lettura:

  1. Correre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
  2. Copia i file del database - MDF, LDF, ecc. Nella loro nuova destinazione

  3. Al termine della copia, è possibile staccare e ricollegare sulla nuova posizione. Assicurati di reimpostare l'opzione di sola lettura e di utilizzare lo stesso account utente durante la manipolazione di questi file. Inoltre, potresti voler eliminare i vecchi file dopo lo spostamento.

Un altro metodo

Dopo che i file sono stati copiati correttamente (passaggio 2 sopra):

È possibile impostare il database su: Single_Usermode quindi:

  1. Correre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
  2. D:\ essendo la nuova posizione

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
  3. Assicurarsi che i file di dati nella nuova posizione ( D:\) abbiano pieno accesso all'account del servizio che esegue SQL Server.

  4. Riavvia i servizi SQL

  5. Correre:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO

Fatto!


Si noti innanzitutto che l'attivazione del DB in modalità di sola lettura provoca un'interruzione effettiva se l'utilizzo normale richiede la scrittura nel database. In secondo luogo, mi aspetto che SQL Server abbia ancora i file bloccati per l'uso se vengono letti; se la tua esperienza personale o la documentazione di MS dice il contrario, modificalo nella tua risposta. In terzo luogo, il consiglio che ho generalmente visto di modificare la posizione di un file è di portare offline il DB , non solo in modalità utente singolo. Ancora una volta, se hai esperienza personale o documenti MS che suggeriscono il contrario, modifica in risposta. Grazie!
RDFozz

È corretto! Sola lettura impedirà agli utenti di scrivere ma saranno in grado di leggere. Nel tuo secondo punto - sì, puoi portare il database offline - ma la domanda è mentre sei online. Il processo che ho descritto sopra funziona con i tempi di inattività minimi. Grazie.
RAVicioso,

@RAVicioso anche il database in sola lettura è un'interruzione. Se non riesci a scrivere nuovi dati (ad esempio prendere ordini), il tuo sistema è effettivamente inattivo. Sembra una cattiva idea, no?
Erik Darling,

@sp_BlitzErik - La soluzione funziona, ma non potrai scrivere durante questo tipo di manutenzione. Nel tuo esempio: "prendi ordini", non lo farà.
RAVicioso,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.