Răspunsul de aici este iubitul meu întotdeauna: totul depinde de circumstanțe! Permiteți-mi să ofer câteva informații de bază pentru o explicație.
Punctul cheie care trebuie luat în considerare este raportul de compresie pe care fiecare copie de rezervă a bazei de date o va avea când este activată compresia de rezervă. Gradul de comprimare atunci când se utilizează orice algoritm este determinat de datele comprimate.
Datele aleatorii (de exemplu, valori mici întregi, de exemplu) nu se vor micșora foarte bine, astfel încât eventuala rată de compresie va determina în principal conținutul tabelelor și al indexurilor din baza de date.
Iată câteva exemple de cazuri în care comprimarea copiilor de siguranță nu poate da un raport de compresie ridicat:
- Dacă baza de date include criptarea transparentă a datelor, atunci raportul de compresie va fi foarte scăzut, deoarece datele vor fi comprimate în valori aleatorii mici.
- Dacă majoritatea datelor din baza de date este comprimată la nivelul coloanei, atunci raportul de compresie va fi din nou scăzut, deoarece comprimarea coloanelor, de fapt, amestecă datele.
- Dacă compresia datelor este activată pentru majoritatea tabelelor din baza de date, atunci raportul de compresie va fi scăzut; comprimarea datelor care este deja comprimată, produce, de obicei, un efect redus.
În cazul în care raportul de compresie este scăzut, problema nu este cea mai mică, dar resursele CPU folosite pentru a efectua algoritmul de comprimare nu sunt utile. Indiferent de cât de bine puteți comprima o bucată de date, resursele procesorului sunt folosite întotdeauna pentru a efectua algoritmi de compresie și decompresie.
Acest lucru înseamnă că, înainte de a decide cu privire la utilizarea în continuare a compresiei pentru această bază de date, trebuie să verificați cât de bine fiecare bază de date este comprimată într-o copie de rezervă. În caz contrar, este posibilă o pierdere sensibilă de resurse CPU. Aceasta este baza a ceea ce ați auzit.
Pe scurt, dacă majoritatea bazelor de date beneficiază de backupuri comprimate, este logic să activați compresia de backup la nivelul serverului și să modificați manual mai multe sarcini de salvare pentru a utiliza în mod specific parametrul WITH NO_COMPRESSION. În mod alternativ, dacă majoritatea bazelor de date nu beneficiază de copii de rezervă comprimate, este logic să opriți compresia de backup la nivelul serverului și să modificați manual mai multe sarcini de salvare pentru a utiliza în mod specific parametrul WITH COMPRESSION.
Q. Anul trecut, am actualizat bazele de date pentru a include oglindirea, care în caz de eșec, mergeți la o oglindă și continuați să lucrați. La dezvoltarea sistemului, am efectuat astfel de tranziții pentru baza de date și totul a funcționat bine. Săptămâna trecută am întâmpinat o eroare reală și a avut loc transferul bazei de date, însă toate tranzacțiile cu aplicații s-au oprit și aplicația nu sa conectat la serverul care tolerează erorile. Cum pot instala SQL Server în viitor, astfel încât să nu reseteze conexiunile la aplicații în timpul tranziției, astfel încât tranzacțiile să poată continua?
A. Să rezolvăm răspunsul în două părți: modul în care aplicațiile pot face față toleranței la erori și modului de gestionare a redirecționării clientului prin oglindirea bazelor de date.
Atunci când apare o eroare prin utilizarea oricăror dintre tehnologiile de înaltă disponibilitate disponibile în SQL Server, conexiunea clientului la serverul eșuat este resetată și toate tranzacțiile din proces sunt pierdute. Transferul unei tranzacții în tranzit între servere este imposibil (ca în caz de failover sau oricare altul). În funcție de tehnologia utilizată pentru disponibilitate ridicată situate în orice tranzacție nu va exista la toate într-un server failover, sau va exista ca fiind în tranzacție, dar va storcator înapoi ca eficiența de recuperare a bazei de date de proces pe serverul failover.
În ceea ce privește baza de date oglindire, transmiterea în mod continuu înregistrările jurnal de tranzacții de pe serverul principal la serverul oglindă, se întâmplă de obicei, a doua - sunt tranzacțiile sunt rulate din nou în procesul de recuperare a oglindit date de performanță de baze de date la un nou participant de siguranță.
Din acest motiv, există două lucruri pe care o aplicație ar trebui să le poată face corect atunci când lucrează pe un server cu posibilitatea de a trece la un alt server în caz de eșec:
- Ar trebui să poată procesa corect conexiunea care trebuie resetată pe server și să încerce să restaureze conexiunea după o perioadă scurtă de timp.
- Trebuie să fie capabil să proceseze corect anularea tranzacției și apoi să încerce să reia tranzacția după ce a fost stabilită conexiunea cu serverul failover (posibil folosind un manager de tranzacții de nivel intermediar).
Singura tehnologie de înaltă disponibilitate aici, care nu necesită în mod specific modificări pe client, este să permită redirecționarea conexiunilor clienților după tranziție, aceasta fiind clustering failover. Clienții se conectează la numele serverului virtual și redirecționează în mod transparent la nodul activ al clusterului fizic.
În cazul tehnologiilor de înaltă disponibilitate, cum ar fi expedierea și replicarea jurnalului, numele serverului failover este diferit, ceea ce înseamnă că, după trecerea la acest server, trebuie să redirecționați manual conexiunile clientului. Această redirecționare poate fi efectuată în mai multe moduri:
- Puteți să codificați cu greșeală numele clientului pentru serverul de eroare, astfel încât încercările de reconectare să fie direcționate spre acel server.
- Puteți utiliza echilibrarea încărcării în rețea cu o setare de 100 / 0-0 / 100, care apoi va comuta conexiunea la un server failover.
- Aveți posibilitatea să utilizați ceva asemănător unui alias de server sau să schimbați înregistrările în tabelul DNS.
Utilizând oglindirea bazei de date, oricare dintre aceste opțiuni funcționează. Dar oglindirea bazei de date are, de asemenea, capabilități direcționate în direcția clientului. Șirul de conexiune client poate specifica direct numele serverului de oglindă la care încercarea de conectare va fi efectuată automat dacă nu este posibil pentru serverul principal. Acest proces este cunoscut ca redirecționare directă.
Dacă șirul de conexiune client nu poate fi modificat, redirecționarea indirectă poate fi posibilă dacă serverul eșuat acționează acum ca un server oglindă. Orice conexiune la acesta va fi automat redirecționată către noul principiu de securitate - dar acest lucru va funcționa numai dacă serverul oglindit funcționează.
Fig. 1. Studiul încuietorii pe o masă împărțită pe secțiuni
A. Problema observată este cauzată de un mecanism numit blocarea blocurilor. SQL Server primește blocări pe date pentru a le proteja în timp ce interogarea citește sau scrie date. Poate primi blocări pe tabele întregi, pagini de fișiere de date sau rânduri individuale de tabele / indici și fiecare blocare ocupă un spațiu mic în memorie.
În cazul în care cererea este obtinerea număr prea mare de încuietori, SQL Server poate decide să înlocuiască toate încuietorile de pe masa de linie sau pagină într-o singură blocare pentru întregul tabel (pragul în cazul în care acesta se produce, este de aproximativ 5000 de încuietori complicate, dar precis algoritm și configurat). Acest proces se numește consolidarea blocărilor.
Apoi, interogarea B poate funcționa pe o altă partiție fără a fi blocată. Întrebarea B va fi chiar capabilă să provoace escaladarea blocării, ceea ce va bloca numai partiția pe care funcționează interogarea B, și nu întregul tabel.
Acest model de consolidare a blocării poate fi instalat utilizând următoarea sintaxă:
Această sintaxă indică managerului de blocare SQL Server să utilizeze blocarea la nivelul partiției dacă tabelul este împărțit în ele și mărirea obișnuită la nivelul tabelului, dacă nu. Comportamentul implicit este de a utiliza escaladarea blocului la nivelul tabelului. Este necesar să setați acest mod cu grijă, deoarece, în funcție de comportamentul solicitărilor, poate duce la blocări.
De exemplu, dacă fiecare dintre solicitările A și B determină blocarea diferitelor partiții din tabel să fie mărită, dar apoi încearcă să acceseze partiția blocată de alta, una dintre solicitări va fi întreruptă de monitorul blocării.
Figura prezintă un exemplu de catalog de interogare sistem de depunere sys.partitions (primul set de rezultate) și dinamice sys.dm_os_locks Vedere de management (al doilea set de rezultate), pentru a investiga zăvoare păstrate pentru interogările de pe masa împărțit în secțiuni, în cazul în care a avut loc escaladarea de blocare la nivelul secțiunii . În acest caz, există două încuietori exclusive nivel de secțiune (încuietorilor HOBt în ieșire), dar încuietorile de masă (Blocare obiect din ieșire) nu sunt exclusive, astfel încât mai multe interogări pot accesa partițiile chiar dacă escaladarea de blocare. Rețineți că identificatorii de resurse pentru aceste două încuietori de partiții sunt identice cu identificatorii de partiții pentru primele două secțiuni ale tabelului din ieșirea pentru sys.partitions.
A. Pe scurt, răspunsul este că aș putea să mă gândesc la restaurarea jurnalului de tranzacții numai dacă recuperarea din copii de rezervă este imposibilă. Cu toate că sunt cunoscute pericol de restaurare jurnal de tranzacții (cititorii pot vedea postarea de pe blogul meu, Pentru a afla mai multe despre ele „măsuri extreme, aplicate în primul rând.“), Faptul că baza de date a devenit nesigure, ceea ce înseamnă că recuperarea nu a reușit; - fie atunci când se recuperează de la un eșec, fie când tranzacția este reluată. Aceasta înseamnă o posibilitate reală de corupere a datelor în baza de date.
Deși problema a apărut într-o perioadă liniștită, ați gândit la sarcinile planificate și de fond? La momentul coruperii jurnalului, sarcina de întreținere ar fi putut să funcționeze, să restaureze sau să reorganizeze indexul grupat. Sarcina de fundal ar putea duce cu ușurință la curățarea fantomă pe paginile dintr-un index de grup sau de grup. Oricare dintre aceste sarcini, de exemplu, ar putea face schimbări în structurile indexului cluster, care, dacă nu ar fi reluat în mod corespunzător, ar duce la coruperea bazei de date și la pierderea posibilă a datelor.
În general, recuperarea jurnalului de tranzacții ar trebui să fie întotdeauna cea mai recentă și ultimă soluție în orice opțiune de recuperare în caz de dezastru, din cauza oportunităților uriașe pentru daune suplimentare și pierderi de date. Cel puțin, trebuie să executați un DBCC CHECKDB complet pe baza de date pentru a verifica eventualele daune.
Apoi, trebuie să schimbați strategia de backup pentru a putea efectua recuperarea în timp util, în loc să recurgeți la măsuri radicale, cum ar fi restaurarea jurnalului de tranzacții. Acțiunile de dezvoltare a acestei strategii depășesc sfera de aplicare a acestui articol, dar intenționez să subliniez acest subiect într-un articol special de anvergură în acest an. Asa ca stai bine!