sql >> Database >  >> RDS >> Database

Begrip van opnieuw uitvoeren van loggroep versus bestand versus lid

In deze Oracle-zelfstudie leggen we een eenvoudige manier uit om de loggroep opnieuw te doen versus bestand versus lid.

Vandaag gaan we het concept van de logbuffer opnieuw in Oracle leren. Waarin we zullen leren wat de redo log-buffer is, hoe het werkt en wat zijn rol is in de Oracle-architectuur.

Als u de Oracle-architectuur wilt begrijpen, is het erg belangrijk om de werking van de redo-logbuffer te begrijpen. Het onderstaande artikel helpt je ook bij het beantwoorden van sollicitatievragen.

Begrijpen van opnieuw uitvoeren van loggroep versus bestand versus lid

Wat is een logboekbuffer voor opnieuw uitvoeren?

Het is een kleine geheugentoewijzing die standaard rond de 14 MB ligt. Het is een cyclische buffer. Zodra het vol is, begint het opnieuw vanaf de bovenkant te schrijven, het overschrijft de gegevens zodra het vol is.

Wat is het opnieuw invoeren en wijzigen van Vector?

Oracle-database-instance registreert alle DML/DDL-transacties in de redo-logbuffer van SGA in de vorm van redo-items. Het individuele overzicht in een transactie zal resulteren in één of meer dan één herhalingsboeking. Al deze items voor opnieuw uitvoeren worden samen een wijzigingsvector of opnieuw uitvoeren genoemd.

Elke herhalingsinvoer bestaat uit een herhalingsinstructie en een ongedaanmakingsinstructie, bijvoorbeeld:

RUIMTE TABEL
Empno Naam

Afd.
1 Jhon 10
2 Tony 20
3 Laura 50
4 Tijger 10
5 Scott 10
sql>delete empno from emp where deptno=10;

In het bovenstaande voorbeeld heeft de emp-tabel 3 records voor deptno=10. Dus Oracle zal 3 herhalingsitems maken voor de bovenstaande instructie en deze items worden opgenomen in de redo-logbuffer. Deze 3 herhalingsitems worden samen een wijzigingsvector of herhalingsvector genoemd.

De wijzigingsvector is niets anders dan een aantal betrokken rijen door een enkele bewerking. Redo-logbuffer legt de transacties van de gebruiker vast en legt ook het ongeldigmakende effect (undo-statement) voor die transactie vast.

Werking van het LGWR-proces

Aangezien de omvang van de buffer voor het opnieuw uitvoeren van het logboek klein is en niet dynamisch kan groeien, moeten deze opgenomen herhalingsitems periodiek naar de schijf worden geschreven in een online logboekbestand voor opnieuw uitvoeren. Dit wordt vaak het opschonen van de logbuffer voor opnieuw uitvoeren genoemd en het schrijven van deze herhalingsitems naar schijf wordt gedaan door het LGWR-proces.

Wanneer LGWR opnieuw invoer naar schijf schrijft?

LGWR is behoorlijk agressief in het schrijven van deze vermeldingen naar schijf. Hieronder staan ​​de gebeurtenissen wanneer LGWR opnieuw invoer naar schijf schrijft.

  • Als de buffergrootte 1/3 vol is
  • Als er 1 MB aan wijzigingsvectoren beschikbaar is in de logbuffer voor opnieuw uitvoeren in afwachting van schrijven
  • Elke 3 seconden
  • Telkens wanneer een controlepunt plaatsvindt
  • Wanneer een gebruiker zijn/haar transacties uitvoert

Een parameter om de grootte van de logbuffer opnieuw in te stellen

log_buffer=x bytes
Structuur van Redo Log Buffer

De redo-architectuur bestaat uit 3 dingen

  1. Draad opnieuw uitvoeren (logisch)
  2. Groepen opnieuw loggen (logisch)
  3. Bestanden van leden opnieuw loggen (fysiek)

1. Wat is de redo-logthread?

  • Terwijl het maken van een controlebestand wordt gegeven door de parameter "MAXINSTANCES".
  • Een redo-thread bestaat uit redo-groepen. De redo-thread moet zijn ingeschakeld om operationeel te zijn.
  • In de RAC-omgeving kun je een redo-thread binden aan de specifieke instantie met behulp van de init.ora-parameter "thread".

In een niet-RAC-database zou er meestal één thread zijn (thread =1)

2. Inzicht in de Redo-loggroep en de status ervan?

-Tijdens het maken van een controlebestand wordt het gegeven als de parameter "MAXLOGFILES".
-Een redo-loggroep is een verzameling identieke redo-logledenbestanden.
-Maar voor een betere fouttolerantie is het gebruikelijk om twee redo-log-ledenbestanden in elke redo-loggroep te bewaren.
-Als er een verloren gaat, heeft dit geen invloed. De ledenbestanden van het opnieuw uitvoeren zijn identiek (spiegelkopieën)
LGWR schrijft parallel naar alle leden van een bepaalde redo-loggroep
Op elk willekeurig moment schrijft het LGWR-proces naar slechts één redo-loggroep. De redo log-groep is vast, wat betekent dat de redo log-ledenbestanden niet dynamisch kunnen groeien.
De redo-loggroep waarin het LGWR-proces momenteel aan het schrijven is, wordt gezien met de status "huidig"
Zodra de redo-loggroep vol is, schakelt het LGWR-proces over naar de volgende redo-loggroep.
De vorige groep zal de status "ACTIEF" tonen en na enige tijd zou de status "INACTIEF" zijn
HUIDIG => ACTIEF => INACTIEF => HUIDIG => ACTIEF => INACTIEF …………………………………
HUIDIGE status betekent dat orakel momenteel in deze buffer schrijft
ACTIEF Controlepunt voor opnieuw uitvoeren in deze buffer is in behandeling
INACTIEF status betekent dat het herhalingslogboek is gecontroleerd en onmiddellijk kan worden overschreven.
U kunt de grootte van de opnieuw gemaakte loggroep niet wijzigen, maar u kunt de opnieuw gemaakte loggroep altijd verwijderen en opnieuw maken met verschillende groottes. U kunt de herhalingsloggroep met de status "CURRENT" of "ACTIVE" niet verwijderen.

Hoe wissel je van loggroep voor opnieuw uitvoeren?

Normaal gesproken schakelt de LGWR automatisch tussen de redo-loggroepen, maar u kunt handmatig van de ene redo-loggroep naar de andere overschakelen met behulp van een opdracht.

sql>alter system switch logfile ;

Elke keer dat LGWR een nieuwe redo-loggroep oppikt en een monotoon oplopend nummer toewijst aan die redo-loggroep genaamd "Logreeksnummer" of "reeks#". U kunt de metadata van de loggroepen opnieuw opvragen met view:- v$log Logboekgroepen voor opnieuw uitvoeren worden geschreven met behulp van fysieke schijfblokgrootte (sector van 512 bytes)

Een nieuwe loggroep voor opnieuw uitvoeren toevoegen

sql>alter database add logfile group 3 ('/path/to/member1.log', '/path/to/member2.log') size 100m reuse;

In de betekenis van hergebruik staat:hergebruik de bestanden member 1.log of member2.log als deze al in hetzelfde pad bestaat.

Hoe loggroep voor opnieuw uitvoeren te verwijderen

U kunt loggroepen opnieuw uitvoeren, op voorwaarde dat de status niet HUIDIG of ACTIEF is. Ook na het toepassen van deze opdracht moet het aantal beschikbare loggroepen voor opnieuw uitvoeren 2 of meer zijn.

sql>alter database drop logfile groups 3;

3. Log ledenbestanden opnieuw (fysiek)

Bij het maken van een controlebestand wordt dit gegeven door de parameter "MAXLOGMEMBERS". De logbestandsbestanden voor opnieuw uitvoeren zijn fysiek beschikbaar op OS-niveau. De grootte van het bestand ligt vast op het moment dat de loggroep opnieuw wordt gemaakt.

Het bestand kan niet dynamisch groeien. LGWR schrijft parallel naar alle leden van een bepaalde redo-loggroep.
Ledenbestanden in de redo-loggroep zijn identiek. U kunt de statusinformatie opvragen vanuit de view v$logfile

Hoe voeg je een nieuw lid toe aan een bestaande groep?

sql>alter database add logfile member '/path/to/new/member1.log' to group 3;

Je kunt een lid uit de groep verwijderen, op voorwaarde dat er één lid overblijft en de groepsstatus niet actueel is

sql>alter database drop logfile member '/path/to/member_to_be_deleted.log';

Om de schakelgegevens voor opnieuw uitvoeren op te vragen:
je kunt v$log-geschiedenis opvragen

sql>select count(*), trunc(first_time) from v$log_history;

groep om de herhalingsitems te overschrijven

Waarom ik "checkpoint niet voltooid" zie in alert.log

Wanneer LGWR arriveert bij een redo-loggroep om opnieuw invoeren te overschrijven en tegen die tijd, als een controlepunt van die groep in behandeling is, ziet u een bericht in het waarschuwingslog "checkpoint niet voltooid". Hierdoor kan LGWR de redo-loggroep niet onmiddellijk overschrijven.

Vandaar dat Oracle het "controlepunt" activeert dat vuile buffers zal doorspoelen die zijn veroorzaakt door opnieuw invoeren op schijf. Pas daarna kan LGWR overschrijven om de buffer opnieuw uit te voeren. Het betekent dat LGWR enige tijd moet wachten, wat niet goed is. Om dit te voorkomen, voegt u meer loggroepen voor opnieuw uitvoeren toe en/of vergroot u de grootte van loggroepen voor opnieuw uitvoeren.

We hopen dat onze bovenstaande details u zullen helpen uw begrip van de logbuffer voor opnieuw uitvoeren te wissen.

Dit is het einde van de tutorial, begrip van opnieuw uitvoeren van loggroep versus bestand versus lid.


  1. Hoe kan ik een groot (14 GB) MySQL-dumpbestand in een nieuwe MySQL-database importeren?

  2. Hoe records van de huidige maand in MySQL te krijgen

  3. Een technische vergelijking:Microsoft Access 2016 versus SQL Server 2016

  4. Hoe het resultaat van de SELECT-instructie uit te voeren die wordt uitgevoerd met behulp van native dynamische SQL?