MySQL 9.1.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
row0log.cc File Reference

Modification log for online index creation and online table rebuild. More...

#include "row0log.h"
#include "my_config.h"
#include <fcntl.h>
#include <algorithm>
#include <map>
#include "data0data.h"
#include "ddl0ddl.h"
#include "handler0alter.h"
#include "lob0lob.h"
#include "log0chkp.h"
#include "que0que.h"
#include "row0ext.h"
#include "row0ins.h"
#include "row0mysql.h"
#include "row0row.h"
#include "row0upd.h"
#include "srv0mon.h"
#include "trx0rec.h"
#include "ut0new.h"
#include "ut0stage.h"
#include "my_dbug.h"

Classes

struct  row_log_buf_t
 Log block for modifications during online ALTER TABLE. More...
 
class  row_log_table_blob_t
 Tracks BLOB allocation during online ALTER TABLE. More...
 
struct  row_log_t
 Buffer for logging modifications during online index creation. More...
 

Typedefs

typedef std::map< page_no_t, row_log_table_blob_t, std::less< page_no_t >, ut::allocator< std::pair< const page_no_t, row_log_table_blob_t > > > page_no_map
 Map of off-page column page numbers to 0 or log byte offsets. More...
 

Enumerations

enum  row_tab_op { ROW_T_INSERT = 0x41 , ROW_T_UPDATE , ROW_T_DELETE }
 Table row modification operations during online table rebuild. More...
 
enum  row_op { ROW_OP_INSERT = 0x61 , ROW_OP_DELETE }
 Index record modification operations during online index creation. More...
 

Functions

static bool row_log_tmpfile (row_log_t *log)
 Create the file or online log if it does not exist. More...
 
static bool row_log_block_allocate (row_log_buf_t &log_buf)
 Allocate the memory for the log buffer. More...
 
static void row_log_block_free (row_log_buf_t &log_buf)
 Free the log buffer. More...
 
void row_log_online_op (dict_index_t *index, const dtuple_t *tuple, trx_id_t trx_id)
 Logs an operation to a secondary index that is (or was) being created. More...
 
dberr_t row_log_table_get_error (const dict_index_t *index)
 Gets the error status of the online index rebuild log. More...
 
static byterow_log_table_open (row_log_t *log, ulint size, ulint *avail)
 Starts logging an operation to a table that is being rebuilt. More...
 
static void row_log_table_close_func (row_log_t *log, const byte *b, ulint size, ulint avail)
 Stops logging an operation to a table that is being rebuilt. More...
 
static void row_log_table_close (row_log_t *log, const byte *b, ulint size, ulint avail)
 
bool row_log_col_is_indexed (const dict_index_t *index, ulint v_no)
 Check whether a virtual column is indexed in the new table being created during alter table. More...
 
void row_log_table_delete (const rec_t *rec, const dtuple_t *ventry, dict_index_t *index, const ulint *offsets, const byte *sys)
 Logs a delete operation to a table that is being rebuilt. More...
 
static void row_log_table_low_redundant (const rec_t *rec, const dtuple_t *ventry, const dtuple_t *o_ventry, dict_index_t *index, bool insert, const dtuple_t *old_pk, const dict_index_t *new_index)
 Logs an insert or update to a table that is being rebuilt. More...
 
static void row_log_table_low (const rec_t *rec, const dtuple_t *ventry, const dtuple_t *o_ventry, dict_index_t *index, const ulint *offsets, bool insert, const dtuple_t *old_pk)
 Logs an insert or update to a table that is being rebuilt. More...
 
void row_log_table_update (const rec_t *rec, dict_index_t *index, const ulint *offsets, const dtuple_t *old_pk, const dtuple_t *new_v_row, const dtuple_t *old_v_row)
 Logs an update to a table that is being rebuilt. More...
 
static const dict_col_trow_log_table_get_pk_old_col (const dict_table_t *table, const ulint *col_map, ulint col_no)
 Gets the old table column of a PRIMARY KEY column. More...
 
static dberr_t row_log_table_get_pk_col (dict_index_t *index, const dict_field_t *ifield, dfield_t *dfield, mem_heap_t *heap, const rec_t *rec, const ulint *offsets, ulint i, const page_size_t &page_size, ulint max_len)
 Maps an old table column of a PRIMARY KEY column. More...
 
const dtuple_trow_log_table_get_pk (const rec_t *rec, dict_index_t *index, const ulint *offsets, byte *sys, mem_heap_t **heap)
 Constructs the old PRIMARY KEY and DB_TRX_ID,DB_ROLL_PTR of a table that is being rebuilt. More...
 
void row_log_table_insert (const rec_t *rec, const dtuple_t *ventry, dict_index_t *index, const ulint *offsets)
 Logs an insert to a table that is being rebuilt. More...
 
void row_log_table_blob_free (dict_index_t *index, page_no_t page_no)
 Notes that a BLOB is being freed during online ALTER TABLE. More...
 
void row_log_table_blob_alloc (dict_index_t *index, page_no_t page_no)
 Notes that a BLOB is being allocated during online ALTER TABLE. More...
 
static const dtuple_trow_log_table_apply_convert_mrec (const ddl::mrec_t *mrec, dict_index_t *index, const ulint *offsets, const row_log_t *log, mem_heap_t *heap, dberr_t *error)
 Converts a log record to a table row. More...
 
static dberr_t apply_insert_multi_value (uint32_t flags, dict_index_t *index, mem_heap_t *offsets_heap, mem_heap_t *heap, dtuple_t *entry, trx_id_t trx_id, que_thr_t *thr)
 Tries to insert an entry into a secondary index, which is created for multi-value field. More...
 
static dberr_t row_log_table_apply_insert_low (que_thr_t *thr, const dtuple_t *row, trx_id_t trx_id, mem_heap_t *offsets_heap, mem_heap_t *heap, ddl::Dup *dup)
 Replays an insert operation on a table that was rebuilt. More...
 
static dberr_t row_log_table_apply_insert (que_thr_t *thr, const ddl::mrec_t *mrec, const ulint *offsets, mem_heap_t *offsets_heap, mem_heap_t *heap, ddl::Dup *dup, trx_id_t trx_id)
 Replays an insert operation on a table that was rebuilt. More...
 
static dberr_t row_log_table_delete_sec (dict_index_t *index, const dtuple_t *entry, btr_pcur_t *pcur)
 Delete a record from a secondary index. More...
 
static dberr_t apply_delete_multi_value (const dtuple_t *row, row_ext_t *ext, dict_index_t *index, btr_pcur_t *pcur, mem_heap_t *heap)
 Deletes a record from a multi-value index. More...
 
static dberr_t row_log_table_apply_delete_low (btr_pcur_t *pcur, const dtuple_t *ventry, const ulint *offsets, mem_heap_t *heap, mtr_t *mtr)
 Deletes a record from a table that is being rebuilt. More...
 
static dberr_t row_log_table_apply_delete (ulint trx_id_col, const ddl::mrec_t *mrec, const ulint *moffsets, mem_heap_t *offsets_heap, mem_heap_t *heap, const row_log_t *log)
 Replays a delete operation on a table that was rebuilt. More...
 
static dberr_t apply_update_multi_value (dict_index_t *index, uint32_t n_index, const dtuple_t *old_row, row_ext_t *old_ext, const dtuple_t *new_row, bool non_mv_upd, trx_id_t trx_id, que_thr_t *thr, mem_heap_t *offsets_heap, mem_heap_t *heap)
 Replays an update operation on the multi-value index. More...
 
static dberr_t row_log_table_apply_update (que_thr_t *thr, ulint new_trx_id_col, const ddl::mrec_t *mrec, const ulint *offsets, mem_heap_t *offsets_heap, mem_heap_t *heap, ddl::Dup *dup, trx_id_t trx_id, const dtuple_t *old_pk)
 Replays an update operation on a table that was rebuilt. More...
 
static const ddl::mrec_trow_log_table_apply_op (que_thr_t *thr, ulint trx_id_col, ulint new_trx_id_col, ddl::Dup *dup, dberr_t *error, mem_heap_t *offsets_heap, mem_heap_t *heap, const ddl::mrec_t *mrec, const ddl::mrec_t *mrec_end, ulint *offsets)
 Applies an operation to a table that was rebuilt. More...
 
ulint row_log_progress_inc_per_block ()
 Estimate how much an ALTER TABLE progress should be incremented per one block of log applied. More...
 
ulint row_log_estimate_work (const dict_index_t *index)
 Estimate how much work is to be done by the log apply phase of an ALTER TABLE for this index. More...
 
static dberr_t row_log_table_apply_ops (que_thr_t *thr, ddl::Dup *dup, Alter_stage *stage)
 Applies operations to a table was rebuilt. More...
 
dberr_t row_log_table_apply (que_thr_t *thr, dict_table_t *old_table, struct TABLE *table, Alter_stage *stage)
 Apply the row_log_table log to a table upon completing rebuild. More...
 
bool row_log_allocate (dict_index_t *index, dict_table_t *table, bool same_pk, const dtuple_t *add_cols, const ulint *col_map, const char *path)
 Allocate the row log for an index and flag the index for online creation. More...
 
void row_log_free (row_log_t *&log)
 Free the row log for an index that was being created online. More...
 
trx_id_t row_log_get_max_trx (dict_index_t *index)
 Get the latest transaction ID that has invoked row_log_online_op() during online creation. More...
 
static void row_log_apply_op_low (dict_index_t *index, ddl::Dup *dup, dberr_t *error, mem_heap_t *offsets_heap, bool has_index_lock, enum row_op op, trx_id_t trx_id, const dtuple_t *entry)
 Applies an operation to a secondary index that was being created. More...
 
static const ddl::mrec_trow_log_apply_op (dict_index_t *index, ddl::Dup *dup, dberr_t *error, mem_heap_t *offsets_heap, mem_heap_t *heap, bool has_index_lock, const ddl::mrec_t *mrec, const ddl::mrec_t *mrec_end, ulint *offsets)
 Applies an operation to a secondary index that was being created. More...
 
static dberr_t row_log_apply_ops (const trx_t *trx, dict_index_t *index, ddl::Dup *dup, Alter_stage *stage)
 Applies operations to a secondary index that was being created. More...
 
dberr_t row_log_apply (const trx_t *trx, dict_index_t *index, struct TABLE *table, Alter_stage *stage)
 Apply the row log to the index upon completing index creation. More...
 

Variables

constexpr uint32_t ROW_LOG_HEADER_SIZE = 2
 Size of the modification log entry header, in bytes. More...
 

Detailed Description

Modification log for online index creation and online table rebuild.

Created 2011-05-26 Marko Makela

Typedef Documentation

◆ page_no_map

typedef std::map< page_no_t, row_log_table_blob_t, std::less<page_no_t>, ut::allocator<std::pair<const page_no_t, row_log_table_blob_t> > > page_no_map

Map of off-page column page numbers to 0 or log byte offsets.

If there is no mapping for a page number, it is safe to access. If a page number maps to 0, it is an off-page column that has been freed. If a page number maps to a nonzero number, the number is a byte offset into the index->online_log, indicating that the page is safe to access when applying log records starting from that offset.

Enumeration Type Documentation

◆ row_op

enum row_op

Index record modification operations during online index creation.

Enumerator
ROW_OP_INSERT 

Insert a record.

ROW_OP_DELETE 

Delete a record.

◆ row_tab_op

enum row_tab_op

Table row modification operations during online table rebuild.

Delete-marked records are not copied to the rebuilt table.

Enumerator
ROW_T_INSERT 

Insert a record.

ROW_T_UPDATE 

Update a record in place.

ROW_T_DELETE 

Delete (purge) a record.

Function Documentation

◆ apply_delete_multi_value()

static dberr_t apply_delete_multi_value ( const dtuple_t row,
row_ext_t ext,
dict_index_t index,
btr_pcur_t pcur,
mem_heap_t heap 
)
inlinestatic

Deletes a record from a multi-value index.

Parameters
[in]rowrow to delete
[in]extexternal data
[in]indexmulti-value index
[in,out]pcurB-tree cursor
[in,out]heapmemory heap
Returns
DB_SUCCESS or error code

◆ apply_insert_multi_value()

static dberr_t apply_insert_multi_value ( uint32_t  flags,
dict_index_t index,
mem_heap_t offsets_heap,
mem_heap_t heap,
dtuple_t entry,
trx_id_t  trx_id,
que_thr_t thr 
)
static

Tries to insert an entry into a secondary index, which is created for multi-value field.

For each value to be inserted, if a record with exactly the same fields is found, the other record is necessarily marked deleted. It is then unmarked. Otherwise, the entry is just inserted to the index.

Parameters
[in]flagsundo logging and locking flags
[in]indexsecondary index
[in,out]offsets_heapmemory heap that can be emptied
[in,out]heapmemory heap
[in,out]entryindex entry to insert
[in]trx_idPAGE_MAX_TRX_ID during row_log_table_apply(), or trx_id when undo log is disabled during alter copy operation or 0
[in]thrquery thread
Return values
DB_SUCCESSon success
DB_LOCK_WAITon lock wait when !(flags & BTR_NO_LOCKING_FLAG)
DB_FAILif retry with BTR_MODIFY_TREE is needed
Returns
error code

◆ apply_update_multi_value()

static dberr_t apply_update_multi_value ( dict_index_t index,
uint32_t  n_index,
const dtuple_t old_row,
row_ext_t old_ext,
const dtuple_t new_row,
bool  non_mv_upd,
trx_id_t  trx_id,
que_thr_t thr,
mem_heap_t offsets_heap,
mem_heap_t heap 
)
static

Replays an update operation on the multi-value index.

Parameters
[in]indexmulti-value index
[in]n_indexthe sequence of the index
[in]old_rowold row of the update
[in]old_extold external data of the update
[in]new_rownew row of the update
[in]non_mv_updtrue if any non-multi-value field on the index gets updated too
[in]trx_idtransaction id of the update
[in]thrquery graph
[in,out]offsets_heapmemory heap that can be emptied
[in,out]heapmemory heap
Returns
DB_SUCCESS or error code

◆ row_log_allocate()

bool row_log_allocate ( dict_index_t index,
dict_table_t table,
bool  same_pk,
const dtuple_t add_cols,
const ulint col_map,
const char *  path 
)

Allocate the row log for an index and flag the index for online creation.

Parameters
[in]indexIndex.
[in]tableNew table being rebuilt, or NULL when creating a secondary index.
[in]same_pkWhether the definition of the PRIMARY KEY has remained the same.
[in]add_colsDefault values of added columns, or nullptr.
[in]col_mapMapping of old column numbers to new ones, or nullptr if !table.
[in]pathWhere to create temporary file.
Return values
trueif success, false if not

◆ row_log_apply()

dberr_t row_log_apply ( const trx_t trx,
dict_index_t index,
struct TABLE table,
Alter_stage stage 
)

Apply the row log to the index upon completing index creation.

Parameters
[in]trxtransaction (for checking if the operation was interrupted)
[in,out]indexsecondary index
[in,out]tableMySQL table (for reporting duplicates)
[in,out]stageperformance schema accounting object, used by ALTER TABLE. stage->begin_phase_log_index() will be called initially and then stage->inc() will be called for each block of log that is applied.
Returns
DB_SUCCESS, or error code on failure

◆ row_log_apply_op()

static const ddl::mrec_t * row_log_apply_op ( dict_index_t index,
ddl::Dup dup,
dberr_t error,
mem_heap_t offsets_heap,
mem_heap_t heap,
bool  has_index_lock,
const ddl::mrec_t mrec,
const ddl::mrec_t mrec_end,
ulint offsets 
)
static

Applies an operation to a secondary index that was being created.

Returns
NULL on failure (mrec corruption) or when out of data; pointer to next record on success
Parameters
indexin/out: index
dupin/out: for reporting duplicate key errors
errorout: DB_SUCCESS or error code
offsets_heapin/out: memory heap for allocating offsets; can be emptied
heapin/out: memory heap for allocating data tuples
has_index_lockin: true if holding index->lock in exclusive mode
mrecin: merge record
mrec_endin: end of buffer
offsetsin/out: work area for rec_deserialize_init_offsets()

◆ row_log_apply_op_low()

static void row_log_apply_op_low ( dict_index_t index,
ddl::Dup dup,
dberr_t error,
mem_heap_t offsets_heap,
bool  has_index_lock,
enum row_op  op,
trx_id_t  trx_id,
const dtuple_t entry 
)
static

Applies an operation to a secondary index that was being created.

Parameters
indexin/out: index
dupin/out: for reporting duplicate key errors
errorout: DB_SUCCESS or error code
offsets_heapin/out: memory heap for allocating offsets; can be emptied
has_index_lockin: true if holding index->lock in exclusive mode
opin: operation being applied
trx_idin: transaction identifier
entryin: row

◆ row_log_apply_ops()

static dberr_t row_log_apply_ops ( const trx_t trx,
dict_index_t index,
ddl::Dup dup,
Alter_stage stage 
)
static

Applies operations to a secondary index that was being created.

Parameters
[in]trxtransaction (for checking if the operation was interrupted)
[in,out]indexindex
[in,out]dupfor reporting duplicate key errors
[in,out]stageperformance schema accounting object, used by ALTER TABLE. If not NULL, then stage->inc() will be called for each block of log that is applied.
Returns
DB_SUCCESS, or error code on failure

◆ row_log_block_allocate()

static bool row_log_block_allocate ( row_log_buf_t log_buf)
static

Allocate the memory for the log buffer.

Parameters
[in,out]log_bufBuffer used for log operation
Returns
true if success, false if not

◆ row_log_block_free()

static void row_log_block_free ( row_log_buf_t log_buf)
static

Free the log buffer.

Parameters
[in,out]log_bufBuffer used for log operation

◆ row_log_col_is_indexed()

bool row_log_col_is_indexed ( const dict_index_t index,
ulint  v_no 
)

Check whether a virtual column is indexed in the new table being created during alter table.

Parameters
[in]indexcluster index
[in]v_novirtual column number
Returns
true if it is indexed, else false

◆ row_log_estimate_work()

ulint row_log_estimate_work ( const dict_index_t index)

Estimate how much work is to be done by the log apply phase of an ALTER TABLE for this index.

Parameters
[in]indexindex whose log to assess
Returns
work to be done by log-apply in abstract units

◆ row_log_free()

void row_log_free ( row_log_t *&  log)

Free the row log for an index that was being created online.

in,own: row log

Parameters
login,own: row log

◆ row_log_get_max_trx()

trx_id_t row_log_get_max_trx ( dict_index_t index)

Get the latest transaction ID that has invoked row_log_online_op() during online creation.

Returns
latest transaction ID, or 0 if nothing was logged
Parameters
indexin: index, must be locked

◆ row_log_online_op()

void row_log_online_op ( dict_index_t index,
const dtuple_t tuple,
trx_id_t  trx_id 
)

Logs an operation to a secondary index that is (or was) being created.

Parameters
indexin/out: index, S or X latched
tuplein: index tuple
trx_idin: transaction ID for insert, or 0 for delete

◆ row_log_progress_inc_per_block()

ulint row_log_progress_inc_per_block ( )
inline

Estimate how much an ALTER TABLE progress should be incremented per one block of log applied.

For the other phases of ALTER TABLE we increment the progress with 1 per page processed.

Returns
amount of abstract units to add to work_completed when one block of log is applied.

◆ row_log_table_apply()

dberr_t row_log_table_apply ( que_thr_t thr,
dict_table_t old_table,
struct TABLE table,
Alter_stage stage 
)

Apply the row_log_table log to a table upon completing rebuild.

Parameters
[in]thrquery graph
[in]old_tableold table
[in,out]tableMySQL table (for reporting duplicates)
[in,out]stageperformance schema accounting object, used by ALTER TABLE. stage->begin_phase_log_table() will be called initially and then stage->inc() will be called for each block of log that is applied.
Returns
DB_SUCCESS, or error code on failure

◆ row_log_table_apply_convert_mrec()

static const dtuple_t * row_log_table_apply_convert_mrec ( const ddl::mrec_t mrec,
dict_index_t index,
const ulint offsets,
const row_log_t log,
mem_heap_t heap,
dberr_t error 
)
static

Converts a log record to a table row.

Returns
converted row, or NULL if the conversion fails
Parameters
mrecin: merge record
indexin: index of mrec
offsetsin: offsets of mrec
login: rebuild context
heapin/out: memory heap
errorout: DB_SUCCESS or DB_MISSING_HISTORY or reason of failure

◆ row_log_table_apply_delete()

static dberr_t row_log_table_apply_delete ( ulint  trx_id_col,
const ddl::mrec_t mrec,
const ulint moffsets,
mem_heap_t offsets_heap,
mem_heap_t heap,
const row_log_t log 
)
static

Replays a delete operation on a table that was rebuilt.

Returns
DB_SUCCESS or error code
Parameters
trx_id_colin: position of DB_TRX_ID in the new clustered index
mrecin: merge record
moffsetsin: offsets of mrec
offsets_heapin/out: memory heap that can be emptied
heapin/out: memory heap
login: online log

◆ row_log_table_apply_delete_low()

static dberr_t row_log_table_apply_delete_low ( btr_pcur_t pcur,
const dtuple_t ventry,
const ulint offsets,
mem_heap_t heap,
mtr_t mtr 
)
static

Deletes a record from a table that is being rebuilt.

Returns
DB_SUCCESS or error code
Parameters
pcurin/out: B-tree cursor, will be trashed
ventryin: dtuple holding virtual column info
offsetsin: offsets on pcur
heapin/out: memory heap
mtrin/out: mini-transaction, will be committed

◆ row_log_table_apply_insert()

static dberr_t row_log_table_apply_insert ( que_thr_t thr,
const ddl::mrec_t mrec,
const ulint offsets,
mem_heap_t offsets_heap,
mem_heap_t heap,
ddl::Dup dup,
trx_id_t  trx_id 
)
static

Replays an insert operation on a table that was rebuilt.

Returns
DB_SUCCESS or error code
Parameters
thrin: query graph
mrecin: record to insert
offsetsin: offsets of mrec
offsets_heapin/out: memory heap that can be emptied
heapin/out: memory heap
dupin/out: for reporting duplicate key errors
trx_idin: DB_TRX_ID of mrec

◆ row_log_table_apply_insert_low()

static dberr_t row_log_table_apply_insert_low ( que_thr_t thr,
const dtuple_t row,
trx_id_t  trx_id,
mem_heap_t offsets_heap,
mem_heap_t heap,
ddl::Dup dup 
)
static

Replays an insert operation on a table that was rebuilt.

Returns
DB_SUCCESS or error code
Parameters
thrin: query graph
rowin: table row in the old table definition
trx_idin: trx_id of the row
offsets_heapin/out: memory heap that can be emptied
heapin/out: memory heap
dupin/out: for reporting duplicate key errors

◆ row_log_table_apply_op()

static const ddl::mrec_t * row_log_table_apply_op ( que_thr_t thr,
ulint  trx_id_col,
ulint  new_trx_id_col,
ddl::Dup dup,
dberr_t error,
mem_heap_t offsets_heap,
mem_heap_t heap,
const ddl::mrec_t mrec,
const ddl::mrec_t mrec_end,
ulint offsets 
)
static

Applies an operation to a table that was rebuilt.

Returns
NULL on failure (mrec corruption) or when out of data; pointer to next record on success
Parameters
thrin: query graph
trx_id_colin: position of DB_TRX_ID in old index
new_trx_id_colin: position of DB_TRX_ID in new index
dupin/out: for reporting duplicate key errors
errorout: DB_SUCCESS or error code
offsets_heapin/out: memory heap that can be emptied
heapin/out: memory heap
mrecin: merge record
mrec_endin: end of buffer
offsetsin/out: work area for parsing mrec

◆ row_log_table_apply_ops()

static dberr_t row_log_table_apply_ops ( que_thr_t thr,
ddl::Dup dup,
Alter_stage stage 
)
static

Applies operations to a table was rebuilt.

Parameters
[in]thrquery graph
[in,out]dupfor reporting duplicate key errors
[in,out]stageperformance schema accounting object, used by ALTER TABLE. If not NULL, then stage->inc() will be called for each block of log that is applied.
Returns
DB_SUCCESS, or error code on failure

◆ row_log_table_apply_update()

static dberr_t row_log_table_apply_update ( que_thr_t thr,
ulint  new_trx_id_col,
const ddl::mrec_t mrec,
const ulint offsets,
mem_heap_t offsets_heap,
mem_heap_t heap,
ddl::Dup dup,
trx_id_t  trx_id,
const dtuple_t old_pk 
)
static

Replays an update operation on a table that was rebuilt.

Returns
DB_SUCCESS or error code

It allows to create tuple with virtual column information.

Parameters
thrin: query graph
new_trx_id_colin: position of DB_TRX_ID in the new clustered index
mrecin: new value
offsetsin: offsets of mrec
offsets_heapin/out: memory heap that can be emptied
heapin/out: memory heap
dupin/out: for reporting duplicate key errors
trx_idin: DB_TRX_ID of mrec
old_pkin: PRIMARY KEY and DB_TRX_ID,DB_ROLL_PTR of the old value, or PRIMARY KEY if same_pk

◆ row_log_table_blob_alloc()

void row_log_table_blob_alloc ( dict_index_t index,
page_no_t  page_no 
)

Notes that a BLOB is being allocated during online ALTER TABLE.

Parameters
indexin/out: clustered index, X-latched
page_noin: starting page number of the BLOB

◆ row_log_table_blob_free()

void row_log_table_blob_free ( dict_index_t index,
page_no_t  page_no 
)

Notes that a BLOB is being freed during online ALTER TABLE.

Parameters
indexin/out: clustered index, X-latched
page_noin: starting page number of the BLOB

◆ row_log_table_close()

static void row_log_table_close ( row_log_t log,
const byte b,
ulint  size,
ulint  avail 
)
inlinestatic

◆ row_log_table_close_func()

static void row_log_table_close_func ( row_log_t log,
const byte b,
ulint  size,
ulint  avail 
)
static

Stops logging an operation to a table that is being rebuilt.

Parameters
[in,out]logonline rebuild log
[in]bend of log record
[in]sizesize od log record
[in]availavailable size for log record

◆ row_log_table_delete()

void row_log_table_delete ( const rec_t rec,
const dtuple_t ventry,
dict_index_t index,
const ulint offsets,
const byte sys 
)

Logs a delete operation to a table that is being rebuilt.

This will be merged in row_log_table_apply_delete().

Parameters
recin: clustered index leaf page record, page X-latched
ventryin: dtuple holding virtual column info
indexin/out: clustered index, S-latched or X-latched
offsetsin: rec_get_offsets(rec,index)
sysin: DB_TRX_ID,DB_ROLL_PTR that should be logged, or NULL to use those in rec

◆ row_log_table_delete_sec()

static dberr_t row_log_table_delete_sec ( dict_index_t index,
const dtuple_t entry,
btr_pcur_t pcur 
)
inlinestatic

Delete a record from a secondary index.

Parameters
[in]indexsecondary index
[in]entryentry to delete
[in,out]pcurB-tree cursor
Returns
DB_SUCCESS or error code

◆ row_log_table_get_error()

dberr_t row_log_table_get_error ( const dict_index_t index)

Gets the error status of the online index rebuild log.

Returns
DB_SUCCESS or error code
Parameters
indexin: clustered index of a table that is being rebuilt online

◆ row_log_table_get_pk()

const dtuple_t * row_log_table_get_pk ( const rec_t rec,
dict_index_t index,
const ulint offsets,
byte sys,
mem_heap_t **  heap 
)

Constructs the old PRIMARY KEY and DB_TRX_ID,DB_ROLL_PTR of a table that is being rebuilt.

Returns
tuple of PRIMARY KEY,DB_TRX_ID,DB_ROLL_PTR in the rebuilt table, or NULL if the PRIMARY KEY definition does not change
Parameters
recin: clustered index leaf page record, page X-latched
indexin/out: clustered index, S-latched or X-latched
offsetsin: rec_get_offsets(rec,index)
sysout: DB_TRX_ID,DB_ROLL_PTR for row_log_table_delete(), or NULL
heapin/out: memory heap where allocated

◆ row_log_table_get_pk_col()

static dberr_t row_log_table_get_pk_col ( dict_index_t index,
const dict_field_t ifield,
dfield_t dfield,
mem_heap_t heap,
const rec_t rec,
const ulint offsets,
ulint  i,
const page_size_t page_size,
ulint  max_len 
)
static

Maps an old table column of a PRIMARY KEY column.

Parameters
[in]indexindex being operated on
[in]ifieldclustered index field in the new table (after ALTER TABLE)
[in,out]dfieldclustered index tuple field in the new table
[in,out]heapmemory heap for allocating dfield contents
[in]recclustered index leaf page record in the old table
[in]offsetsrec_get_offsets(rec)
[in]irec field corresponding to col
[in]page_sizepage size of the old table
[in]max_lenmaximum length of dfield
Return values
DB_INVALID_NULLif a NULL value is encountered
DB_TOO_BIG_INDEX_COLif the maximum prefix length is exceeded

◆ row_log_table_get_pk_old_col()

static const dict_col_t * row_log_table_get_pk_old_col ( const dict_table_t table,
const ulint col_map,
ulint  col_no 
)
static

Gets the old table column of a PRIMARY KEY column.

Parameters
tableold table (before ALTER TABLE)
col_mapmapping of old column numbers to new ones
col_nocolumn position in the new table
Returns
old table column, or NULL if this is an added column

◆ row_log_table_insert()

void row_log_table_insert ( const rec_t rec,
const dtuple_t ventry,
dict_index_t index,
const ulint offsets 
)

Logs an insert to a table that is being rebuilt.

This will be merged in row_log_table_apply_insert().

Parameters
recin: clustered index leaf page record, page X-latched
ventryin: dtuple holding virtual column info
indexin/out: clustered index, S-latched or X-latched
offsetsin: rec_get_offsets(rec,index)

◆ row_log_table_low()

static void row_log_table_low ( const rec_t rec,
const dtuple_t ventry,
const dtuple_t o_ventry,
dict_index_t index,
const ulint offsets,
bool  insert,
const dtuple_t old_pk 
)
static

Logs an insert or update to a table that is being rebuilt.

Parameters
[in]recclustered index leaf page record, page X-latched
[in]ventrydtuple holding virtual column info
[in]o_ventrydtuple holding old virtual column info
[in,out]indexclustered index, S-latched or X-latched
[in]offsetsrec_get_offsets(rec,index)
[in]inserttrue if insert, false if update
[in]old_pkold PRIMARY KEY value (if !insert and a PRIMARY KEY is being created)

◆ row_log_table_low_redundant()

static void row_log_table_low_redundant ( const rec_t rec,
const dtuple_t ventry,
const dtuple_t o_ventry,
dict_index_t index,
bool  insert,
const dtuple_t old_pk,
const dict_index_t new_index 
)
static

Logs an insert or update to a table that is being rebuilt.

Parameters
[in]recclustered index leaf page record in ROW_FORMAT=REDUNDANT, page X-latched
[in]ventrydtuple holding virtual column info or NULL
[in]o_ventryold dtuple holding virtual column info or NULL
[in,out]indexclustered index, S-latched or X-latched
[in]inserttrue if insert, false if update
[in]old_pkold PRIMARY KEY value (if !insert and a PRIMARY KEY is being created)
[in]new_indexclustered index of the new table, not latched

◆ row_log_table_open()

static byte * row_log_table_open ( row_log_t log,
ulint  size,
ulint avail 
)
static

Starts logging an operation to a table that is being rebuilt.

Returns
pointer to log, or NULL if no logging is necessary
Parameters
login/out: online rebuild log
sizein: size of log record
availout: available size for log record

◆ row_log_table_update()

void row_log_table_update ( const rec_t rec,
dict_index_t index,
const ulint offsets,
const dtuple_t old_pk,
const dtuple_t new_v_row,
const dtuple_t old_v_row 
)

Logs an update to a table that is being rebuilt.

Logs an update operation to a table that is being rebuilt.

This will be merged in row_log_table_apply_update().

Parameters
recin: clustered index leaf page record, page X-latched
indexin/out: clustered index, S-latched or X-latched
offsetsin: rec_get_offsets(rec,index)
old_pkin: row_log_table_get_pk() before the update
new_v_rowin: dtuple contains the new virtual columns
old_v_rowin: dtuple contains the old virtual columns

◆ row_log_tmpfile()

static bool row_log_tmpfile ( row_log_t log)
static

Create the file or online log if it does not exist.

Parameters
[in,out]logonline rebuild log
Returns
true if success, false if not

Variable Documentation

◆ ROW_LOG_HEADER_SIZE

constexpr uint32_t ROW_LOG_HEADER_SIZE = 2
constexpr

Size of the modification log entry header, in bytes.

op, extra_size