Package io.debezium.connector.mysql
Class MySqlSnapshotChangeEventSource
- java.lang.Object
-
- io.debezium.pipeline.source.AbstractSnapshotChangeEventSource<P,O>
-
- io.debezium.relational.RelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
- io.debezium.connector.mysql.MySqlSnapshotChangeEventSource
-
- All Implemented Interfaces:
ChangeEventSource,SnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
public class MySqlSnapshotChangeEventSource extends RelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classMySqlSnapshotChangeEventSource.MySqlSnapshotContextMutable context which is populated in the course of snapshotting.-
Nested classes/interfaces inherited from class io.debezium.relational.RelationalSnapshotChangeEventSource
RelationalSnapshotChangeEventSource.RelationalSnapshotContext<P extends Partition,O extends OffsetContext>
-
Nested classes/interfaces inherited from class io.debezium.pipeline.source.AbstractSnapshotChangeEventSource
AbstractSnapshotChangeEventSource.SnapshotContext<P extends Partition,O extends OffsetContext>, AbstractSnapshotChangeEventSource.SnapshottingTask
-
Nested classes/interfaces inherited from interface io.debezium.pipeline.source.spi.ChangeEventSource
ChangeEventSource.ChangeEventSourceContext
-
-
Field Summary
Fields Modifier and Type Field Description private MySqlConnectionconnectionprivate MySqlConnectorConfigconnectorConfigprivate MySqlDatabaseSchemadatabaseSchemaprivate Set<TableId>delayedSchemaSnapshotTablesprivate RelationalTableFiltersfiltersprivate longglobalLockAcquiredAtprivate BlockingConsumer<Function<org.apache.kafka.connect.source.SourceRecord,org.apache.kafka.connect.source.SourceRecord>>lastEventProcessorprivate static org.slf4j.LoggerLOGGERprivate MySqlSnapshotChangeEventSourceMetricsmetricsprivate List<SchemaChangeEvent>schemaEventsprivate longtableLockAcquiredAt-
Fields inherited from class io.debezium.relational.RelationalSnapshotChangeEventSource
clock, dispatcher, SELECT_ALL_PATTERN
-
Fields inherited from class io.debezium.pipeline.source.AbstractSnapshotChangeEventSource
LOG_INTERVAL
-
-
Constructor Summary
Constructors Constructor Description MySqlSnapshotChangeEventSource(MySqlConnectorConfig connectorConfig, MySqlConnection connection, MySqlDatabaseSchema schema, EventDispatcher<MySqlPartition,TableId> dispatcher, Clock clock, MySqlSnapshotChangeEventSourceMetrics metrics, BlockingConsumer<Function<org.apache.kafka.connect.source.SourceRecord,org.apache.kafka.connect.source.SourceRecord>> lastEventProcessor)
-
Method Summary
-
Methods inherited from class io.debezium.relational.RelationalSnapshotChangeEventSource
additionalColumnFilter, createSnapshotConnection, doExecute, enhanceOverriddenSelect, getChangeRecordEmitter, getClock, getColumnValue, getPreparedColumnNames, schema, tryStartingSnapshot
-
Methods inherited from class io.debezium.pipeline.source.AbstractSnapshotChangeEventSource
delaySnapshotIfNeeded, determineDataCollectionsToBeSnapshotted, execute
-
-
-
-
Field Detail
-
LOGGER
private static final org.slf4j.Logger LOGGER
-
connectorConfig
private final MySqlConnectorConfig connectorConfig
-
connection
private final MySqlConnection connection
-
globalLockAcquiredAt
private long globalLockAcquiredAt
-
tableLockAcquiredAt
private long tableLockAcquiredAt
-
filters
private final RelationalTableFilters filters
-
metrics
private final MySqlSnapshotChangeEventSourceMetrics metrics
-
databaseSchema
private final MySqlDatabaseSchema databaseSchema
-
schemaEvents
private final List<SchemaChangeEvent> schemaEvents
-
lastEventProcessor
private final BlockingConsumer<Function<org.apache.kafka.connect.source.SourceRecord,org.apache.kafka.connect.source.SourceRecord>> lastEventProcessor
-
-
Constructor Detail
-
MySqlSnapshotChangeEventSource
public MySqlSnapshotChangeEventSource(MySqlConnectorConfig connectorConfig, MySqlConnection connection, MySqlDatabaseSchema schema, EventDispatcher<MySqlPartition,TableId> dispatcher, Clock clock, MySqlSnapshotChangeEventSourceMetrics metrics, BlockingConsumer<Function<org.apache.kafka.connect.source.SourceRecord,org.apache.kafka.connect.source.SourceRecord>> lastEventProcessor)
-
-
Method Detail
-
getSnapshottingTask
protected AbstractSnapshotChangeEventSource.SnapshottingTask getSnapshottingTask(MySqlPartition partition, MySqlOffsetContext previousOffset)
- Specified by:
getSnapshottingTaskin classAbstractSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
prepare
protected AbstractSnapshotChangeEventSource.SnapshotContext<MySqlPartition,MySqlOffsetContext> prepare(MySqlPartition partition) throws Exception
- Specified by:
preparein classAbstractSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
connectionCreated
protected void connectionCreated(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext) throws Exception
- Overrides:
connectionCreatedin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
getAllTableIds
protected Set<TableId> getAllTableIds(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> ctx) throws Exception
- Specified by:
getAllTableIdsin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
lockTablesForSchemaSnapshot
protected void lockTablesForSchemaSnapshot(ChangeEventSource.ChangeEventSourceContext sourceContext, RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext) throws SQLException, InterruptedException
- Specified by:
lockTablesForSchemaSnapshotin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
SQLExceptionInterruptedException
-
releaseSchemaSnapshotLocks
protected void releaseSchemaSnapshotLocks(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext) throws SQLException
- Specified by:
releaseSchemaSnapshotLocksin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
SQLException
-
releaseDataSnapshotLocks
protected void releaseDataSnapshotLocks(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext) throws Exception
- Overrides:
releaseDataSnapshotLocksin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
determineSnapshotOffset
protected void determineSnapshotOffset(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> ctx, MySqlOffsetContext previousOffset) throws Exception
- Specified by:
determineSnapshotOffsetin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
addSchemaEvent
private void addSchemaEvent(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, String database, String ddl)
-
readTableStructure
protected void readTableStructure(ChangeEventSource.ChangeEventSourceContext sourceContext, RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, MySqlOffsetContext offsetContext) throws Exception
- Specified by:
readTableStructurein classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
createSchemaEventsForTables
void createSchemaEventsForTables(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, Collection<TableId> tablesToRead, boolean firstPhase) throws SQLException
- Throws:
SQLException
-
twoPhaseSchemaSnapshot
private boolean twoPhaseSchemaSnapshot()
-
getCreateTableEvent
protected SchemaChangeEvent getCreateTableEvent(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, Table table) throws SQLException
- Specified by:
getCreateTableEventin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
SQLException
-
complete
protected void complete(AbstractSnapshotChangeEventSource.SnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext)
- Overrides:
completein classAbstractSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
getSnapshotSelect
protected Optional<String> getSnapshotSelect(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, TableId tableId, List<String> columns)
Generate a valid MySQL query string for the specified table and columns- Specified by:
getSnapshotSelectin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Parameters:
tableId- the table to generate a query for- Returns:
- a valid query string
-
isGloballyLocked
private boolean isGloballyLocked()
-
isTablesLocked
private boolean isTablesLocked()
-
globalLock
private void globalLock() throws SQLException- Throws:
SQLException
-
globalUnlock
private void globalUnlock() throws SQLException- Throws:
SQLException
-
tableLock
private void tableLock(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext) throws SQLException
- Throws:
SQLException
-
tableUnlock
private void tableUnlock() throws SQLException- Throws:
SQLException
-
rowCountForTable
protected OptionalLong rowCountForTable(TableId tableId)
- Overrides:
rowCountForTablein classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
readTableStatement
protected Statement readTableStatement(OptionalLong rowCount) throws SQLException
- Overrides:
readTableStatementin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
SQLException
-
createStatementWithLargeResultSet
private Statement createStatementWithLargeResultSet() throws SQLException
Create a JDBC statement that can be used for large result sets.By default, the MySQL Connector/J driver retrieves all rows for ResultSets and stores them in memory. In most cases this is the most efficient way to operate and, due to the design of the MySQL network protocol, is easier to implement. However, when ResultSets that have a large number of rows or large values, the driver may not be able to allocate heap space in the JVM and may result in an
OutOfMemoryError. See DBZ-94 for details.This method handles such cases using the recommended technique for MySQL by creating the JDBC
Statementwithforward-onlycursor andread-only concurrencyflags, and with aminimum valuefetch size hint.- Returns:
- the statement; never null
- Throws:
SQLException- if there is a problem creating the statement
-
createSchemaChangeEventsForTables
protected void createSchemaChangeEventsForTables(ChangeEventSource.ChangeEventSourceContext sourceContext, RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext, AbstractSnapshotChangeEventSource.SnapshottingTask snapshottingTask) throws Exception
- Overrides:
createSchemaChangeEventsForTablesin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
Exception
-
lastSnapshotRecord
protected void lastSnapshotRecord(RelationalSnapshotChangeEventSource.RelationalSnapshotContext<MySqlPartition,MySqlOffsetContext> snapshotContext)
- Overrides:
lastSnapshotRecordin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>
-
postSnapshot
protected void postSnapshot() throws InterruptedException- Overrides:
postSnapshotin classRelationalSnapshotChangeEventSource<MySqlPartition,MySqlOffsetContext>- Throws:
InterruptedException
-
-