I den här Oracle-handledningen kommer vi att förklara ett enkelt sätt att förstå om logggrupp och fil kontra medlem.
Idag ska vi lära oss begreppet redo log buffer i Oracle. Där kommer vi att få veta vad som är redo log buffer, hur det fungerar och vad är dess roll i Oracle-arkitekturen.
Om du ville förstå Oracle-arkitekturen är det verkligen viktigt att förstå hur loggbufferten fungerar. Artikeln nedan hjälper dig också att ta itu med intervjufrågor.
Förståelse av redo logggrupp vs fil vs medlem
Vad är en redo-loggbuffert?
Det är en liten minnesallokering vanligtvis runt 14mb som standard. Det är en cyklisk buffert. När den är full börjar den skriva från toppen igen, den skriver över data när den är full.
Vad är redo-posten och ändra vektorn?
Oracle-databasinstansen registrerar alla DML/DDL-transaktioner i SGAs redo-loggbuffert i form av redo-poster. Det individuella uttalandet i en transaktion kommer att resultera i en eller flera ombokningar. Dessa alla redo-poster kallas tillsammans en förändringsvektor eller redo-vektor.
Varje redo-post består av redo-sats och undo-sats, till exempel:
TABELL EMP
Empno | Namn | Avdnr |
---|---|---|
1 | Jhon | 10 |
2 | Tony | 20 |
3 | Laura | 50 |
4 | Tiger | 10 |
5 | Scott | 10 |
sql>delete empno from emp where deptno=10;
I exemplet ovan har emp-tabellen 3 poster för deptno=10. Så Oracle kommer att skapa 3 redo-poster för ovanstående uttalande och dessa poster kommer att registreras i redo-loggbuffert. Dessa 3 redo-poster kallas tillsammans en förändringsvektor eller redo-vektor.
Ändringsvektorn är inget annat än ett antal påverkade rader av en enda operation. Gör om loggbuffert fångar användarens transaktioner och den fångar också upp en annullerande effekt (ångra uttalande) för den transaktionen.
Fungerar med LGWR-processen
Eftersom storleken på redo-loggbufferten är liten som inte kan växa dynamiskt, måste dessa registrerade redo-poster skrivas med jämna mellanrum till disken i en online redo-loggfil. Detta kallas ofta tömning av redo-loggbuffert och jobbet med att skriva dessa redo-poster till disken görs av LGWR-processen.
När LGWR skriver redo-poster till disken?
LGWR är ganska aggressiv när det gäller att skriva dessa poster till disk. Nedan är händelserna när LGWR skriver redo-poster till disken.
- När buffertstorleken är 1/3 full
- När det finns 1 MB ändringsvektorer tillgängliga i redo-loggbufferten som väntar på att skrivas
- Var tredje sekund
- När en kontrollpunkt inträffar
- När en användare utför sina transaktioner
En parameter för att ställa in storleken på redo log buffert
log_buffer=x byte
Struktur för Redo Log Buffer
Göra om-arkitekturen består av tre saker
- Gör om tråden (logisk)
- Redolog-grupper (logiska)
- Redolog-medlemsfiler (fysiska)
1. Vad är redo-loggtråden?
- När man skapar en kontrollfil ges av parametern "MAXINSTANCES".
- En redo-tråd består av redo-grupper. Gör om tråden måste vara aktiverad för att fungera.
- I RAC-miljön kan du binda en redo-tråd till den specifika instansen med init.ora-parametern "thread".
I en icke-RAC-databas skulle det mestadels finnas en tråd (tråd =1)
2. Förstår du Redo-logggruppen och dess status?
-När man skapar en kontrollfil anges den som parametern "MAXLOGFILES".
-En redo-logggrupp är en samling identiska redo-loggmedlemsfiler.
-Men för bättre feltolerans är det vanligt att ha två redo-loggmedlemsfiler i varje redo-logggrupp.
-Om man går vilse påverkar det inte. Omloggningsmedlemsfilerna är identiska (spegelkopior)
LGWR skriver parallellt till alla medlemmar i en given redo-logggrupp
Vid varje given tidpunkt skriver LGWR-processen till endast en redo-logggrupp. Gör om logggruppen är fast, vilket betyder att loggmedlemsfilerna för redo inte kan växa dynamiskt.
Redologggruppen som LGWR-processen för närvarande skriver i visas med statusen "aktuell"
När redo-logggruppen är full kommer LGWR-processen att byta nästa redo-logggrupp.
Den föregående gruppen kommer att visa status "AKTIV" och efter en tid skulle status vara "INAKTIV"
AKTIV => AKTIV => INAKTIV => AKTIV => AKTIV => INAKTIV …………………………………
AKTUELL status betyder orakel som för närvarande skriver i denna buffert
AKTIV Kontrollpunkt för redo-poster i denna buffert väntar
INAKTIV status betyder att redo-loggen har kontrollerats och kan skrivas över omedelbart.
Du kan inte ändra storleken på redo-logggruppen när den väl har skapats, men du släpper och återskapar alltid redo-logggruppen med olika storlekar. Du kan inte släppa logggruppen för att göra om med statusen "CURRENT" eller "ACTIVE".
Hur byter man en redo-logggrupp?
Normalt växlar LGWR automatiskt mellan redo-logggrupperna men du kan manuellt byta från en redo-logggrupp till en annan med kommandot.
sql>alter system switch logfile ;
Varje gång LGWR plockar upp en ny redo-logggrupp och den tilldelar ett monotont ökande nummer till den redo-logggruppen som kallas "Log sequence number" eller "sequence#". Du kan fråga om logggruppernas metadata genom att använda view:- v$log Redo logggrupper skrivs med fysisk diskblockstorlek (sektor på 512 byte)
Hur man lägger till en ny redo-logggrupp
sql>alter database add logfile group 3 ('/path/to/member1.log', '/path/to/member2.log') size 100m reuse;
Häri betyder återanvändning, återanvänd filen medlem 1.log eller medlem2.log om den redan finns i samma sökväg.
Hur man släpper logggrupp för att göra om
Du kan släppa redo logggrupper förutsatt att statusen inte är AKTIV eller AKTIV. Efter att ha tillämpat det här kommandot bör antalet tillgängliga logggrupper göras om 2 eller fler.
sql>alter database drop logfile groups 3;
3. Gör om Loggmedlemsfiler (fysiska)
När du skapar en kontrollfil ges den av parametern "MAXLOGMEMBERS". Redologgmedlemsfilerna är tillgängliga fysiskt på OS-nivå. Storleken på filen är fast vid tidpunkten för skapande av logggrupp om igen.
Filen kan inte växa dynamiskt. LGWR skriver parallellt till alla medlemmar i en given redo-logggrupp.
Medlemsfilerna i redo-logggruppen är identiska. Du kan fråga statusinformationen från v$logfilen
Hur lägger man till en ny medlem i en befintlig grupp?
sql>alter database add logfile member '/path/to/new/member1.log' to group 3;
Du kan ta bort en medlem från gruppen förutsatt att det finns en medlem kvar och gruppstatus inte är aktuell
sql>alter database drop logfile member '/path/to/member_to_be_deleted.log';
För att fråga om loggbytedetaljerna
du kan fråga v$log-history
sql>select count(*), trunc(first_time) from v$log_history;
grupp för att skriva över redo-posterna
Varför jag ser "checkpoint not complete" i alert.log
När LGWR kommer till en redo-logggrupp för att skriva över redo-poster och vid den tidpunkten, om en kontrollpunkt för den gruppen väntar, skulle du se ett meddelande i varningsloggen "kontrollpunkten inte klar" På grund av detta kan LGWR inte skriva över redo-logggruppen omedelbart.
Därför kommer Oracle att utlösa "kontrollpunkten" som kommer att tömma smutsiga buffertar orsakade av ominmatningar till disken. Först efter detta kan LGWR skriva över för att göra om bufferten. Det betyder att LGWR måste vänta ett tag, vilket inte är bra. För att övervinna antingen lägg till fler redo-logggrupper och/eller öka storleken på redo-logggrupper.
Vi hoppas att vår information ovan kommer att hjälpa dig att rensa din förståelse av redo-loggbufferten.
Detta är slutet på handledningen, förståelse för redo-logggrupp kontra fil kontra medlem.