blog.tohojo.dk/2026/02/the-...
When does lgwr transition from single to scalable mode?
t.ly/Ohe7a
Everybody should get rid of tnsnames.ora and use Easy Connect instead. Change my mind.
Just discovered this new blog series by @ludovico.bsky.social explaining Data Guard enhancements in 26ai - must readπ
www.ludovicocaldara.net/dba/dg-26ai-...
I felt like taking a closer look at this new datapatch feature and ended up making some interesting discoveries π
t.ly/Tufob
Yeah, it looks like πhttps://www.basel.com/de/attraktionen/messe-basel-d184427748
Glad Iβm already on vacation and donβt have to deal with this drama anymore this year π
Woot! By a happy twist of fate, a ticket for the 39th Chaos Communication Congress came may way ... π See you in Hamburg! @ccc.de
Thanks @krischan.bsky.social!
Not needed, bottom line is quite simple: interruptions kill your focus. Some people won't understand π€·ββοΈ
#POUG2026 dress code π
www.galaxus.ch/en/page/woul...
@pougorg.bsky.social
12/11
Internally, the write_sz is stored in structures used by Pipelined Log Writes (Overlapped Redo Writes, OLRW). This makes me wonder if the write threshold was changed in 19.22 when Pipelined Log Writes were first introduced.
11/11
On Exadata X10+, Pipelined Log Writes make the threshold even more dynamic as the write_sz adapts continuously when lgwr is running in parallel, depending on how many lg workers are active and whether they are operating in thin or thick mode (a topic for another day).
10/11
This behavior can be observed (and changed) with gdb - highly experimental (t.ly/lqdJ0)!
Examples:
9/11
If only one or a few strands are active at gather time, wr_thresh may be larger than the total size of all active strands. In that situation, a session never stalls to signal lgwr, unless a strand completely fills up and a "log buffer space" wait occurs.
8/11
So interestingly, the "1/3 of log buffer full" rule only applies when the capacity per public strand is <= 1 MB and if all strands are active at gather time!
7/11
The stall size (also measured in redo blocks/buffers) defaults to the smaller of "1 MB worth of redo blocks" or "1/3 of a strand's capacity in redo blocks":
stall_sz = least(1 MB/redo_block_size, strand_size/redo_block_size/3)
6/11
write_sz is derived from a per-strand stall size (explained in more detail below) and computed as:
write_sz = max_strands * stall_sz
So, write_sz is the aggregate across all strands, the wr_thresh, however, is per strand.
5/11
More importantly, the "start write threshold" also depends on the number of active public redo strands at gather time and defaults to:
single strand : wr_thresh = (write_sz * poke_pct/100)
multiple strands: wr_thresh = (write_sz * poke_pct/100) / actv_strands
4/11
The "start write threshold" is computed based on the write size (explained below) and the value of parameter _target_log_write_size_percent_for_poke (which defaults to 100).
3/11
When a session allocates buffers in a public strand, it checks the "start write threshold" (kcrfw_redo_gen_ext). If <= 0 (it can go negative), the session "stalls" to signal lgwr to flush. The threshold is measured in redo buffers and decremented for each buffer allocated.
2/11
Before lgwr issues a redo write, it gathers the redo buffers from the public redo strands and computes a "start write threshold" (in kcrfw_gather_lwn). In kcrfa traces, this threshold appears as start_wr_thresh_kcrfa_client.
1/11
Everything changes... turns out the age-old rule that lgwr writes out the log buffer when it's 1/3 full no longer applies in recent Oracle versions.
Observations below from 19.26 (with RAC on Exadata). π
10/11
This behavior can be observed (and changed) with gdb - highly experimental (t.ly/lqdJ0)!
Examples:
9/11
If only one or a few strands are active at gather time, wr_thresh may be larger than the total size of all active strands. In that situation, a session never stalls to signal lgwr, unless a strand completely fills up and a "log buffer space" wait occurs.
8/11
So interestingly, the "1/3 of log buffer full" rule only applies when the capacity per public strand is <= 1 MB and if all strands are active at gather time!
7/11
The stall size (also measured in redo blocks/buffers) defaults to the smaller of "1 MB worth of redo blocks" or "1/3 of a strand's capacity in redo blocks":
stall_sz = least(1 MB/redo_block_size, strand_size/redo_block_size/3)
6/11
write_sz is derived from a per-strand stall size (explained in more detail below) and computed as:
write_sz = max_strands * stall_sz
So, write_sz is the aggregate across all strands, the wr_thresh, however, is per strand.
5/11
More importantly, the "start write threshold" also depends on the number of active public redo strands at gather time and defaults to:
single strand : wr_thresh = (write_sz * poke_pct/100)
multiple strands: wr_thresh = (write_sz * poke_pct/100) / actv_strands