MySQL 9.1.0
Source Code Documentation
log0recv.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1997, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/log0recv.h
29 Recovery
30
31 Created 9/20/1997 Heikki Tuuri
32 *******************************************************/
33
34#ifndef log0recv_h
35#define log0recv_h
36
37#include "buf0types.h"
38#include "dict0types.h"
39#include "hash0hash.h"
40#include "log0sys.h"
41#include "mtr0types.h"
42
43/* OS_FILE_LOG_BLOCK_SIZE */
44#include "os0file.h"
45
46#include "ut0byte.h"
47#include "ut0new.h"
48#include "ut0todo_counter.h"
49
50#include <list>
51#include <unordered_map>
52#include <unordered_set>
53
54class MetadataRecover;
56
57#ifdef UNIV_HOTBACKUP
58
59struct recv_addr_t;
60
61/** list of tablespaces, that experienced an inplace DDL during a backup op */
62extern std::list<std::pair<space_id_t, lsn_t>> index_load_list;
63/** the last redo log flush len as seen by MEB */
64extern volatile lsn_t backup_redo_log_flushed_lsn;
65/** true when the redo log is being backed up */
66extern bool recv_is_making_a_backup;
67
68/** Scans the log segment and n_bytes_scanned is set to the length of valid
69log scanned.
70@param[in] buf buffer containing log data
71@param[in] buf_len data length in that buffer
72@param[in,out] scanned_lsn lsn of buffer start, we return scanned
73lsn
74@param[in,out] scanned_checkpoint_no 4 lowest bytes of the highest scanned
75@param[out] block_no highest block no in scanned buffer.
76checkpoint number so far
77@param[out] n_bytes_scanned how much we were able to scan, smaller
78than buf_len if log data ended here
79@param[out] has_encrypted_log set true, if buffer contains encrypted
80redo log, set false otherwise */
81void meb_scan_log_seg(byte *buf, size_t buf_len, lsn_t *scanned_lsn,
82 uint32_t *scanned_checkpoint_no, uint32_t *block_no,
83 size_t *n_bytes_scanned, bool *has_encrypted_log);
84
85/** Applies the hashed log records to the page, if the page lsn is less than the
86lsn of a log record. This can be called when a buffer page has just been
87read in, or also for a page already in the buffer pool.
88
89
90@param[in,out] block buffer block */
92
93/** Wrapper for recv_recover_page_func().
94Applies the hashed log records to the page, if the page lsn is less than the
95lsn of a log record. This can be called when a buffer page has just been
96read in, or also for a page already in the buffer pool.
97@param jri in: true if just read in (the i/o handler calls this for
98a freshly read page)
99@param block in,out: the buffer block
100*/
101static inline void recv_recover_page(bool jri [[maybe_unused]],
102 buf_block_t *block) {
104}
105
106/** Applies log records in the hash table to a backup. */
107void meb_apply_log_recs(void);
108
109/** Applies log records in the hash table to a backup using a callback
110functions.
111@param[in] apply_log_record_function function for apply
112@param[in] wait_till_done_function function for wait */
113void meb_apply_log_recs_via_callback(
114 void (*apply_log_record_function)(recv_addr_t *),
115 void (*wait_till_done_function)());
116
117/** Applies a log record in the hash table to a backup.
118@param[in] recv_addr chain of log records
119@param[in,out] block buffer block to apply the records to */
120void meb_apply_log_record(recv_addr_t *recv_addr, buf_block_t *block);
121
122/** Process a file name passed as an input
123@param[in] name absolute path of tablespace file
124@param[in] space_id the tablespace ID
125@retval true if able to process file successfully.
126@retval false if unable to process the file */
127void meb_fil_name_process(const char *name, space_id_t space_id);
128
129/** Scans log from a buffer and stores new log data to the parsing buffer.
130Parses and hashes the log records if new data found. Unless
131UNIV_HOTBACKUP is defined, this function will apply log records
132automatically when the hash table becomes full.
133@param[in] available_memory we let the hash table of recs
134to grow to this size, at the maximum
135@param[in] buf buffer containing a log
136segment or garbage
137@param[in] len buffer length
138@param[in] start_lsn buffer start lsn
139@param[out] group_scanned_lsn scanning succeeded up to this lsn
140@retval true if limit_lsn has been reached, or not able to scan any
141more in this log group
142@retval false otherwise */
143bool meb_scan_log_recs(size_t available_memory, const byte *buf, size_t len,
144 lsn_t start_lsn, lsn_t *group_scanned_lsn);
145
146/** Check the 4-byte checksum to the trailer checksum field of a log
147block.
148@param[in] block pointer to a log block
149@return whether the checksum matches */
150bool log_block_checksum_is_ok(const byte *block);
151#else /* UNIV_HOTBACKUP */
152
153/** Applies the hashed log records to the page, if the page lsn is less than the
154lsn of a log record. This can be called when a buffer page has just been
155read in, or also for a page already in the buffer pool.
156
157
158@param[in] just_read_in true if the IO handler calls this for a freshly
159 read page
160@param[in,out] block buffer block */
161void recv_recover_page_func(bool just_read_in, buf_block_t *block);
162
163/** Wrapper for recv_recover_page_func().
164Applies the hashed log records to the page, if the page lsn is less than the
165lsn of a log record. This can be called when a buffer page has just been
166read in, or also for a page already in the buffer pool.
167@param jri in: true if just read in (the i/o handler calls this for
168a freshly read page)
169@param[in,out] block buffer block */
170static inline void recv_recover_page(bool jri, buf_block_t *block) {
171 recv_recover_page_func(jri, block);
172}
173
174#endif /* UNIV_HOTBACKUP */
175
176/** Frees the recovery system. */
177void recv_sys_free();
178
179/** Reset the state of the recovery system variables. */
180void recv_sys_var_init();
181
182#ifdef UNIV_HOTBACKUP
183/** Get the number of bytes used by all the heaps
184@return number of bytes used */
185size_t meb_heap_used();
186#endif /* UNIV_HOTBACKUP */
187
188/** Returns true if recovery is currently running.
189@return recv_recovery_on */
190[[nodiscard]] static inline bool recv_recovery_is_on();
191
192/** Returns true if the page is brand new (the next log record is init_file_page
193or no records to apply).
194@param[in] block buffer block
195@return true if brand new */
197
198/** Start recovering from a redo log checkpoint.
199@see recv_recovery_from_checkpoint_finish
200@param[in,out] log redo log
201@param[in] flush_lsn lsn stored at offset FIL_PAGE_FILE_FLUSH_LSN
202 in the system tablespace header
203@return error code or DB_SUCCESS */
205 lsn_t flush_lsn);
206
207/** Determine if a redo log from a version before MySQL 8.0.30 is clean.
208@param[in,out] log redo log
209@return error code
210@retval DB_SUCCESS if the redo log is clean
211@retval DB_ERROR if the redo log is corrupted or dirty */
213
214/** Complete the recovery from the latest checkpoint.
215@param[in] aborting true if the server has to abort due to an error
216@return recovered persistent metadata or nullptr if aborting*/
218 bool aborting);
219
220/** Creates the recovery system. */
221void recv_sys_create();
222
223/** Release recovery system mutexes. */
224void recv_sys_close();
225
226/** Inits the recovery system for a recovery operation. */
227void recv_sys_init();
228
229/** Calculates the new value for lsn when more data is added to the log.
230@param[in] lsn Old LSN
231@param[in] len This many bytes of data is added, log block
232 headers not included
233@return LSN after data addition */
235
236/** Empties the hash table of stored log records, applying them to appropriate
237pages.
238@param[in,out] log redo log
239@param[in] allow_ibuf if true, ibuf operations are allowed during
240 the application; if false, no ibuf operations
241 are allowed, and after the application all
242 file pages are flushed to disk and invalidated
243 in buffer pool: this alternative means that
244 no new log records can be generated during
245 the application; the caller must in this case
246 own the log mutex */
247void recv_apply_hashed_log_recs(log_t &log, bool allow_ibuf);
248
249#if defined(UNIV_DEBUG) || defined(UNIV_HOTBACKUP)
250/** Return string name of the redo log record type.
251@param[in] type record log record enum
252@return string name of record log record */
253const char *get_mlog_string(mlog_id_t type);
254#endif /* UNIV_DEBUG || UNIV_HOTBACKUP */
255
256/** Block of log record data */
258 /** pointer to the next block or NULL. The log record data
259 is stored physically immediately after this struct, max amount
260 RECV_DATA_BLOCK_SIZE bytes of it */
261
263};
264
265/** Stored log record struct */
266struct recv_t {
268
269 /** Log record type */
271
272 /** Log record body length in bytes */
274
275 /** Chain of blocks containing the log record body */
277
278 /** Start lsn of the log segment written by the mtr which generated
279 this log record: NOTE that this is not necessarily the start lsn of
280 this log record */
282
283 /** End lsn of the log segment written by the mtr which generated
284 this log record: NOTE that this is not necessarily the end LSN of
285 this log record */
287
288 /** List node, list anchored in recv_addr_t */
290};
291
292/** States of recv_addr_t */
294
295 /** not yet processed */
297
298 /** page is being read */
300
301 /** log records are being applied on the page */
303
304 /** log records have been applied on the page */
306
307 /** log records have been discarded because the tablespace
308 does not exist */
311
312/** Hashed page file address struct */
315
316 /** recovery state of the page */
318
319 /** Space ID */
321
322 /** Page number */
324
325 /** List of log records for this page */
327};
328
329// Forward declaration
330namespace dblwr {
331namespace recv {
332class DBLWR;
333}
334} // namespace dblwr
335
336/** Class to parse persistent dynamic metadata redo log, store and
337merge them and apply them to in-memory table objects finally */
340 table_id_t, PersistentTableMetadata *, std::less<table_id_t>,
342
343 public:
344 /** Default constructor */
346
347 /** Destructor */
349
350 /** Parse a dynamic metadata redo log of a table and store
351 the metadata locally
352 @param[in] id table id
353 @param[in] version table dynamic metadata version
354 @param[in] ptr redo log start
355 @param[in] end end of redo log
356 @retval ptr to next redo log record, nullptr if this log record
357 was truncated */
358 const byte *parseMetadataLog(table_id_t id, uint64_t version, const byte *ptr,
359 const byte *end);
360
361 /** Store the collected persistent dynamic metadata to
362 mysql.innodb_dynamic_metadata */
363 void store();
364
365 /** If there is any metadata to be applied
366 @return true if any metadata to be applied, otherwise false */
367 bool empty() const { return m_tables.empty(); }
368
369 private:
370 /** Get the dynamic metadata of a specified table,
371 create a new one if not exist
372 @param[in] id table id
373 @return the metadata of the specified table */
375
376 private:
377 /** Map used to store and merge persistent dynamic metadata */
379};
380
381/** Recovery system data structure */
383 using Pages =
384 std::unordered_map<page_no_t, recv_addr_t *, std::hash<page_no_t>,
385 std::equal_to<page_no_t>>;
386
387 /** Every space has its own heap and pages that belong to it. */
388 struct Space {
389 /** Constructor
390 @param[in,out] heap Heap to use for the log records. */
391 explicit Space(mem_heap_t *heap) : m_heap(heap), m_pages() {}
392
393 /** Default constructor */
394 Space() : m_heap(), m_pages() {}
395
396 /** Memory heap of log records and file addresses */
398
399 /** Pages that need to be recovered */
401 };
402
403 using Missing_Ids = std::unordered_set<space_id_t>;
404
405 using Spaces = std::unordered_map<space_id_t, Space, std::hash<space_id_t>,
406 std::equal_to<space_id_t>>;
407
408 /* Recovery encryption information */
410 /** Tablespace ID */
412
413 /** LSN of REDO log encryption entry */
415
416 /** Encryption key */
417 byte *ptr;
418
419 /** Encryption IV */
420 byte *iv;
421 };
422
423 using Encryption_Keys = std::vector<Encryption_Key>;
424
425 /** Mini transaction log record. */
426 struct Mlog_record {
427 /* Space ID */
429 /* Page number */
431 /* Log type */
433 /* Log body */
434 const byte *body;
435 /* Record size */
436 size_t size;
437 };
438
439 using Mlog_records = std::vector<Mlog_record, ut::allocator<Mlog_record>>;
440
441 /** While scanning logs for multi-record mini-transaction (mtr), we have two
442 passes. In first pass, we check if all the logs of the mtr is present in
443 current recovery buffer or not. If yes, then in second pass we go through the
444 logs again the add to hash table for apply. To avoid parsing multiple times,
445 we save the parsed records in first pass and reuse them in second pass.
446
447 Parsing of redo log takes significant amount of time and this optimization of
448 avoiding second parse gave about 1.8x speed up on recovery scan time of 1G of
449 redo log from sysbench rw test.
450
451 There is currently no limit for maximum number of logs in an mtr. Practically,
452 from sysbench rw test recovery with 1G of redo log to recover from the record
453 count were spread from 3 - 1235 with majority between 600 - 700. So, it is
454 likely by saving 1k records we could avoid most of the re-parsing overhead.
455 Considering possible bigger number of records in other load and future changes
456 the limit for number of saved records is kept at 8k. The same value from the
457 contribution patch. The memory requirement 32 x 8k = 256k seems fine as one
458 time overhead for the entire instance. */
459 static constexpr size_t MAX_SAVED_MLOG_RECS = 8 * 1024;
460
461 /** Save mlog record information. Silently returns if cannot save. Works only
462 in single threaded recovery scanner.
463 @param[in] rec_num record number in multi record group
464 @param[in] space_id space ID for the log record
465 @param[in] page_no page number for the log record
466 @param[in] type log record type
467 @param[in] body pointer to log record body in recovery buffer
468 @param[in] len length of the log record */
469 void save_rec(size_t rec_num, space_id_t space_id, page_no_t page_no,
470 mlog_id_t type, const byte *body, size_t len) {
471 /* No more space to save log. */
472 if (rec_num >= MAX_SAVED_MLOG_RECS) {
473 return;
474 }
475
476 ut_ad(rec_num < saved_recs.size());
477
478 if (rec_num >= saved_recs.size()) {
479 return;
480 }
481
482 auto &saved_rec = saved_recs[rec_num];
483
484 saved_rec.space_id = space_id;
485 saved_rec.page_no = page_no;
486 saved_rec.type = type;
487 saved_rec.body = body;
488 saved_rec.size = len;
489 }
490
491 /** Return saved mlog record information, if there. Works only
492 in single threaded recovery scanner.
493 @param[in] rec_num record number in multi record group
494 @param[out] space_id space ID for the log record
495 @param[out] page_no page number for the log record
496 @param[out] type log record type
497 @param[out] body pointer to log record body in recovery buffer
498 @param[out] len length of the log record
499 @return true iff saved record data is found. */
500 bool get_saved_rec(size_t rec_num, space_id_t &space_id, page_no_t &page_no,
501 mlog_id_t &type, const byte *&body, size_t &len) {
502 if (rec_num >= MAX_SAVED_MLOG_RECS) {
503 return false;
504 }
505
506 ut_ad(rec_num < saved_recs.size());
507
508 if (rec_num >= saved_recs.size()) {
509 return false;
510 }
511
512 auto &saved_rec = saved_recs[rec_num];
513
514 space_id = saved_rec.space_id;
515 page_no = saved_rec.page_no;
516 type = saved_rec.type;
517 body = const_cast<byte *>(saved_rec.body);
518 len = saved_rec.size;
519
520 return true;
521 }
522
523#ifndef UNIV_HOTBACKUP
524
525 /** mutex protecting the fields apply_log_recs, decrements of
526 n_pages_to_recover, and the state field in each recv_addr struct */
527 ib_mutex_t mutex;
528
529 /** mutex coordinating flushing between recv_writer_thread and
530 the recovery thread. */
531 ib_mutex_t writer_mutex;
532
533 /** event to activate page cleaner threads */
535
536 /** event to signal that the page cleaner has finished the request */
538
539 /** type of the flush request. BUF_FLUSH_LRU: flush end of LRU,
540 keeping free blocks. BUF_FLUSH_LIST: flush all of blocks. */
542
543#else /* !UNIV_HOTBACKUP */
544 bool apply_file_operations;
545#endif /* !UNIV_HOTBACKUP */
546
547 /** This is true when log rec application to pages is allowed;
548 this flag tells the i/o-handler if it should do log record
549 application */
551
552 /** Buffer for parsing log records */
553 byte *buf;
554
555 /** Size of the parsing buffer */
556 size_t buf_len;
557
558 /** Amount of data in buf */
560
561 /** This is the lsn from which we were able to start parsing
562 log records and adding them to the hash table; zero if a suitable
563 start point not found yet */
565
566 /** Checkpoint lsn that was used during recovery (read from file). */
568
569 /** Number of data bytes to ignore until we reach checkpoint_lsn. */
571
572 /** The log data has been scanned up to this lsn */
574
575 /** The log data has been scanned up to this epoch_no */
577
578 /** Start offset of non-parsed log records in buf */
580
581 /** The log records have been parsed up to this lsn */
583
584 /** The previous value of recovered_lsn - before we parsed the last mtr.
585 It is equal to recovered_lsn before we parsed any mtr. This is used to
586 find moments in which recovered_lsn moves to the next block in which case
587 we should update the last_block_first_rec_group (described below). */
589
590 /** Tracks what should be the proper value of first_rec_group field in the
591 header of the block to which recovered_lsn belongs. It might be also zero,
592 in which case it means we do not know. */
594
595 /** Set when finding a corrupt log block or record, or there
596 is a log parsing buffer overflow */
598
599 /** Set when an inconsistency with the file system contents
600 is detected during log scan or apply */
602
603 /** Data directory has been recognized as cloned data directory. */
605
606 /** Data directory has been recognized as data directory from MEB. */
608
609 /** Doublewrite buffer state before MEB recovery starts. We restore to this
610 state after MEB recovery completes and disable the doublewrite buffer during
611 MEB recovery. */
613
614 /** Hash table of pages, indexed by SpaceID. */
616
617 /** Number of unique unprocessed page ids in the spaces nested hash table.
618 Increments are done only from the main recovery thread before apply starts.
619 Decrements are done from multiple threads during batch apply phase, and are
620 protected by the recv_sys_t::mutex. */
622
623 /** Doublewrite buffer pages, destroyed after recovery completes */
625
626 /** We store and merge all table persistent data here during
627 scanning redo logs */
629
630 /** Encryption Key information per tablespace ID */
632
633 /** Tablespace IDs that were ignored during redo log apply. */
635
636 /** Tablespace IDs that were explicitly deleted. */
638
639 /* Saved log records to avoid second round parsing log. */
641};
642
643/** The recovery system */
644extern recv_sys_t *recv_sys;
645
646/** true when applying redo log records during crash recovery; false
647otherwise. Note that this is false while a background thread is
648rolling back incomplete transactions. */
649extern volatile bool recv_recovery_on;
650
651/** If the following is true, the buffer pool file pages must be invalidated
652after recovery and no ibuf operations are allowed; this becomes true if
653the log record hash table becomes too full, and log records must be merged
654to file pages already before the recovery is finished: in this case no
655ibuf operations are allowed, as they could modify the pages read in the
656buffer pool before the pages have been recovered to the up-to-date state.
657
658true means that recovery is running and no operations on the log files
659are allowed yet: the variable name is misleading. */
660extern bool recv_no_ibuf_operations;
661
662/** true when recv_init_crash_recovery() has been called. */
663extern bool recv_needed_recovery;
664
665/** true if buf_page_is_corrupted() should check if the log sequence
666number (FIL_PAGE_LSN) is in the future. Initially false, and set by
667recv_recovery_from_checkpoint_start(). */
668extern bool recv_lsn_checks_on;
669
670/** Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many
671times! */
672constexpr uint32_t RECV_PARSING_BUF_SIZE = 2 * 1024 * 1024;
673
674/** Size of block reads when the log groups are scanned forward to do a
675roll-forward */
676#define RECV_SCAN_SIZE (4 * UNIV_PAGE_SIZE)
677
679
680#include "log0recv.ic"
681
682#endif
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:48
uint32_t page_no_t
Page number.
Definition: api0api.h:46
The database buffer pool global types for the directory.
buf_flush_t
Flags for flush types.
Definition: buf0types.h:68
Definition: sql_list.h:494
Class to parse persistent dynamic metadata redo log, store and merge them and apply them to in-memory...
Definition: log0recv.h:338
MetadataRecover() 1=default
Default constructor.
const byte * parseMetadataLog(table_id_t id, uint64_t version, const byte *ptr, const byte *end)
Parse a dynamic metadata redo log of a table and store the metadata locally.
Definition: log0recv.cc:296
bool empty() const
If there is any metadata to be applied.
Definition: log0recv.h:367
void store()
Store the collected persistent dynamic metadata to mysql.innodb_dynamic_metadata.
Definition: log0recv.cc:687
PersistentTableMetadata * getMetadata(table_id_t id)
Get the dynamic metadata of a specified table, create a new one if not exist.
Definition: log0recv.cc:270
PersistentTables m_tables
Map used to store and merge persistent dynamic metadata.
Definition: log0recv.h:378
std::map< table_id_t, PersistentTableMetadata *, std::less< table_id_t >, ut::allocator< std::pair< const table_id_t, PersistentTableMetadata * > > > PersistentTables
Definition: log0recv.h:341
Persistent dynamic metadata for a table.
Definition: dict0mem.h:2751
Redo recovery configuration.
Definition: buf0dblwr.h:475
A counter which tracks number of things left to do, which can be incremented or decremented,...
Definition: ut0todo_counter.h:41
Allocator that allows std::* containers to manage their memory through ut::malloc* and ut::free libra...
Definition: ut0new.h:2183
dberr_t
Definition: db0err.h:39
Data dictionary global types.
ib_id_t table_id_t
Table or partition identifier (unique within an InnoDB instance).
Definition: dict0types.h:232
mysql_service_status_t recv(const char *tag, const unsigned char *data, size_t data_length) noexcept
Definition: gr_message_service_example.cc:39
The simple hash table utility.
bool recv_is_making_a_backup
true When the redo log is being backed up
Definition: log0recv.cc:175
static bool log_block_checksum_is_ok(const byte *block)
Check the 4-byte checksum to the trailer checksum field of a log block.
Definition: log0recv.cc:623
bool recv_no_ibuf_operations
If the following is true, the buffer pool file pages must be invalidated after recovery and no ibuf o...
Definition: log0recv.cc:172
MetadataRecover * recv_recovery_from_checkpoint_finish(bool aborting)
Complete the recovery from the latest checkpoint.
Definition: log0recv.cc:4108
void recv_sys_free()
Frees the recovery system.
Definition: log0recv.cc:772
void recv_sys_init()
Inits the recovery system for a recovery operation.
Definition: log0recv.cc:534
recv_addr_state
States of recv_addr_t.
Definition: log0recv.h:293
@ RECV_BEING_READ
page is being read
Definition: log0recv.h:299
@ RECV_DISCARDED
log records have been discarded because the tablespace does not exist
Definition: log0recv.h:309
@ RECV_BEING_PROCESSED
log records are being applied on the page
Definition: log0recv.h:302
@ RECV_NOT_PROCESSED
not yet processed
Definition: log0recv.h:296
@ RECV_PROCESSED
log records have been applied on the page
Definition: log0recv.h:305
lsn_t recv_calc_lsn_on_data_add(lsn_t lsn, os_offset_t len)
Calculates the new value for lsn when more data is added to the log.
Definition: log0recv.cc:240
void recv_sys_close()
Release recovery system mutexes.
Definition: log0recv.cc:419
constexpr uint32_t RECV_PARSING_BUF_SIZE
Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many times!
Definition: log0recv.h:672
dberr_t recv_verify_log_is_clean_pre_8_0_30(log_t &log)
Determine if a redo log from a version before MySQL 8.0.30 is clean.
Definition: log0recv.cc:824
size_t recv_n_frames_for_pages_per_pool_instance
This many blocks must be left in each Buffer Pool instance to be managed by the LRU when we scan the ...
Definition: log0recv.cc:198
void recv_sys_var_init()
Reset the state of the recovery system variables.
Definition: log0recv.cc:457
bool recv_page_is_brand_new(buf_block_t *block)
Returns true if the page is brand new (the next log record is init_file_page or no records to apply).
Definition: log0recv.cc:2552
void recv_apply_hashed_log_recs(log_t &log, bool allow_ibuf)
Empties the hash table of stored log records, applying them to appropriate pages.
Definition: log0recv.cc:1166
static void recv_recover_page(bool jri, buf_block_t *block)
Wrapper for recv_recover_page_func().
Definition: log0recv.h:170
const char * get_mlog_string(mlog_id_t type)
Return string name of the redo log record type.
Definition: log0recv.cc:4173
recv_sys_t * recv_sys
The recovery system.
Definition: log0recv.cc:98
bool recv_needed_recovery
true when recv_init_crash_recovery() has been called.
Definition: log0recv.cc:156
void recv_sys_create()
Creates the recovery system.
Definition: log0recv.cc:337
static bool recv_recovery_is_on()
Returns true if recovery is currently running.
volatile bool recv_recovery_on
true when applying redo log records during crash recovery; false otherwise.
Definition: log0recv.cc:103
bool recv_lsn_checks_on
true if buf_page_is_corrupted() should check if the log sequence number (FIL_PAGE_LSN) is in the futu...
Definition: log0recv.cc:161
void recv_recover_page_func(bool just_read_in, buf_block_t *block)
Applies the hashed log records to the page, if the page lsn is less than the lsn of a log record.
Definition: log0recv.cc:2592
dberr_t recv_recovery_from_checkpoint_start(log_t &log, lsn_t flush_lsn)
Start recovering from a redo log checkpoint.
Definition: log0recv.cc:3901
Recovery.
Redo log - the log_sys.
uint64_t lsn_t
Type used for all log sequence number storage and arithmetic.
Definition: log0types.h:63
Mini-transaction buffer global types.
mlog_id_t
Definition: mtr0types.h:63
Definition: buf0block_hint.cc:30
Definition: buf0dblwr.cc:75
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2894
The interface to the operating system file io.
uint64_t os_offset_t
File offset in bytes.
Definition: os0file.h:87
required uint64 version
Definition: replication_group_member_actions.proto:41
required string type
Definition: replication_group_member_actions.proto:34
case opt name
Definition: sslopt-case.h:29
The buffer control block structure.
Definition: buf0buf.h:1747
Redo log - single data structure with state of the redo log system.
Definition: log0sys.h:77
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
InnoDB condition variable.
Definition: os0event.cc:63
Hashed page file address struct.
Definition: log0recv.h:313
page_no_t page_no
Page number.
Definition: log0recv.h:323
recv_addr_state state
recovery state of the page
Definition: log0recv.h:317
space_id_t space
Space ID.
Definition: log0recv.h:320
List rec_list
List of log records for this page.
Definition: log0recv.h:326
Block of log record data.
Definition: log0recv.h:257
recv_data_t * next
pointer to the next block or NULL.
Definition: log0recv.h:262
Definition: log0recv.h:409
byte * ptr
Encryption key.
Definition: log0recv.h:417
space_id_t space_id
Tablespace ID.
Definition: log0recv.h:411
byte * iv
Encryption IV.
Definition: log0recv.h:420
lsn_t lsn
LSN of REDO log encryption entry.
Definition: log0recv.h:414
Mini transaction log record.
Definition: log0recv.h:426
space_id_t space_id
Definition: log0recv.h:428
size_t size
Definition: log0recv.h:436
const byte * body
Definition: log0recv.h:434
page_no_t page_no
Definition: log0recv.h:430
mlog_id_t type
Definition: log0recv.h:432
Every space has its own heap and pages that belong to it.
Definition: log0recv.h:388
Pages m_pages
Pages that need to be recovered.
Definition: log0recv.h:400
mem_heap_t * m_heap
Memory heap of log records and file addresses.
Definition: log0recv.h:397
Space(mem_heap_t *heap)
Constructor.
Definition: log0recv.h:391
Space()
Default constructor.
Definition: log0recv.h:394
Recovery system data structure.
Definition: log0recv.h:382
std::vector< Encryption_Key > Encryption_Keys
Definition: log0recv.h:423
Missing_Ids deleted
Tablespace IDs that were explicitly deleted.
Definition: log0recv.h:637
ulint len
Amount of data in buf.
Definition: log0recv.h:559
bool found_corrupt_fs
Set when an inconsistency with the file system contents is detected during log scan or apply.
Definition: log0recv.h:601
ib_mutex_t mutex
mutex protecting the fields apply_log_recs, decrements of n_pages_to_recover, and the state field in ...
Definition: log0recv.h:527
bool is_meb_db
Data directory has been recognized as data directory from MEB.
Definition: log0recv.h:607
lsn_t previous_recovered_lsn
The previous value of recovered_lsn - before we parsed the last mtr.
Definition: log0recv.h:588
ulint bytes_to_ignore_before_checkpoint
Number of data bytes to ignore until we reach checkpoint_lsn.
Definition: log0recv.h:570
os_event_t flush_end
event to signal that the page cleaner has finished the request
Definition: log0recv.h:537
void save_rec(size_t rec_num, space_id_t space_id, page_no_t page_no, mlog_id_t type, const byte *body, size_t len)
Save mlog record information.
Definition: log0recv.h:469
dblwr::recv::DBLWR * dblwr
Doublewrite buffer pages, destroyed after recovery completes.
Definition: log0recv.h:624
Spaces * spaces
Hash table of pages, indexed by SpaceID.
Definition: log0recv.h:615
lsn_t recovered_lsn
The log records have been parsed up to this lsn.
Definition: log0recv.h:582
std::vector< Mlog_record, ut::allocator< Mlog_record > > Mlog_records
Definition: log0recv.h:439
ut::Todo_counter n_pages_to_recover
Number of unique unprocessed page ids in the spaces nested hash table.
Definition: log0recv.h:621
ulint recovered_offset
Start offset of non-parsed log records in buf.
Definition: log0recv.h:579
lsn_t last_block_first_mtr_boundary
Tracks what should be the proper value of first_rec_group field in the header of the block to which r...
Definition: log0recv.h:593
std::unordered_map< page_no_t, recv_addr_t *, std::hash< page_no_t >, std::equal_to< page_no_t > > Pages
Definition: log0recv.h:385
std::unordered_map< space_id_t, Space, std::hash< space_id_t >, std::equal_to< space_id_t > > Spaces
Definition: log0recv.h:406
ib_mutex_t writer_mutex
mutex coordinating flushing between recv_writer_thread and the recovery thread.
Definition: log0recv.h:531
bool get_saved_rec(size_t rec_num, space_id_t &space_id, page_no_t &page_no, mlog_id_t &type, const byte *&body, size_t &len)
Return saved mlog record information, if there.
Definition: log0recv.h:500
Mlog_records saved_recs
Definition: log0recv.h:640
bool is_cloned_db
Data directory has been recognized as cloned data directory.
Definition: log0recv.h:604
os_event_t flush_start
event to activate page cleaner threads
Definition: log0recv.h:534
Missing_Ids missing_ids
Tablespace IDs that were ignored during redo log apply.
Definition: log0recv.h:634
std::unordered_set< space_id_t > Missing_Ids
Definition: log0recv.h:403
lsn_t checkpoint_lsn
Checkpoint lsn that was used during recovery (read from file).
Definition: log0recv.h:567
uint32_t scanned_epoch_no
The log data has been scanned up to this epoch_no.
Definition: log0recv.h:576
size_t buf_len
Size of the parsing buffer.
Definition: log0recv.h:556
buf_flush_t flush_type
type of the flush request.
Definition: log0recv.h:541
Encryption_Keys * keys
Encryption Key information per tablespace ID.
Definition: log0recv.h:631
bool dblwr_state
Doublewrite buffer state before MEB recovery starts.
Definition: log0recv.h:612
bool found_corrupt_log
Set when finding a corrupt log block or record, or there is a log parsing buffer overflow.
Definition: log0recv.h:597
lsn_t parse_start_lsn
This is the lsn from which we were able to start parsing log records and adding them to the hash tabl...
Definition: log0recv.h:564
lsn_t scanned_lsn
The log data has been scanned up to this lsn.
Definition: log0recv.h:573
byte * buf
Buffer for parsing log records.
Definition: log0recv.h:553
bool apply_log_recs
This is true when log rec application to pages is allowed; this flag tells the i/o-handler if it shou...
Definition: log0recv.h:550
MetadataRecover * metadata_recover
We store and merge all table persistent data here during scanning redo logs.
Definition: log0recv.h:628
static constexpr size_t MAX_SAVED_MLOG_RECS
While scanning logs for multi-record mini-transaction (mtr), we have two passes.
Definition: log0recv.h:459
Stored log record struct.
Definition: log0recv.h:266
recv_data_t * data
Chain of blocks containing the log record body.
Definition: log0recv.h:276
lsn_t start_lsn
Start lsn of the log segment written by the mtr which generated this log record: NOTE that this is no...
Definition: log0recv.h:281
UT_LIST_NODE_T(recv_t) Node
Definition: log0recv.h:267
ulint len
Log record body length in bytes.
Definition: log0recv.h:273
lsn_t end_lsn
End lsn of the log segment written by the mtr which generated this log record: NOTE that this is not ...
Definition: log0recv.h:286
Node rec_list
List node, list anchored in recv_addr_t.
Definition: log0recv.h:289
mlog_id_t type
Log record type.
Definition: log0recv.h:270
typedef UT_LIST_BASE_NODE_T(rw_lock_t, list) rw_lock_list_t
#define UNIV_NOTHROW
Definition: univ.i:456
unsigned long int ulint
Definition: univ.i:406
Utilities for byte operations.
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:105
#define UT_LIST_NODE_T(t)
Macro used for legacy reasons.
Definition: ut0lst.h:64
Dynamic memory allocation routines and custom allocators specifically crafted to support memory instr...
static uint64_t lsn
Definition: xcom_base.cc:446