diff --git a/airbyte-integrations/connectors/source-mysql-v2/metadata.yaml b/airbyte-integrations/connectors/source-mysql-v2/metadata.yaml
index 9e87d8079025..928f551ccb21 100644
--- a/airbyte-integrations/connectors/source-mysql-v2/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mysql-v2/metadata.yaml
@@ -9,7 +9,7 @@ data:
connectorSubtype: database
connectorType: source
definitionId: 561393ed-7e3a-4d0d-8b8b-90ded371754c
- dockerImageTag: 0.0.8
+ dockerImageTag: 0.0.9
dockerRepository: airbyte/source-mysql-v2
documentationUrl: https://docs.airbyte.com/integrations/sources/mysql
githubIssueLabel: source-mysql-v2
diff --git a/airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceConfigurationJsonObject.kt b/airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceConfigurationJsonObject.kt
index 476ec2b3e063..99b0e1e699ae 100644
--- a/airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceConfigurationJsonObject.kt
+++ b/airbyte-integrations/connectors/source-mysql-v2/src/main/kotlin/io/airbyte/integrations/source/mysql/MysqlSourceConfigurationJsonObject.kt
@@ -336,7 +336,79 @@ data object UserDefinedCursor : CursorConfiguration
"\"https://docs.airbyte.com/integrations/sources/mssql/#change-data-capture-cdc\"" +
"> change data capture feature. This must be enabled on your database.",
)
-data object CdcCursor : CursorConfiguration
+class CdcCursor : CursorConfiguration {
+ @JsonProperty("initial_waiting_seconds")
+ @JsonSchemaTitle("Initial Waiting Time in Seconds (Advanced)")
+ @JsonSchemaDefault("300")
+ @JsonPropertyDescription(
+ "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time.",
+ )
+ @JsonSchemaInject(json = """{"order":1, "max": 1200, "min": 120, "always_show": true}""")
+ var initialWaitTimeInSeconds: Int? = 300
+
+ @JsonProperty("server_timezone")
+ @JsonSchemaTitle("Configured server timezone for the MySQL source (Advanced)")
+ @JsonPropertyDescription(
+ "Enter the configured MySQL server timezone. This should only be done if the configured timezone in your MySQL instance does not conform to IANNA standard.",
+ )
+ @JsonSchemaInject(json = """{"order":2,"always_show":true}""")
+ var serverTimezone: String? = null
+
+ @JsonIgnore
+ @ConfigurationBuilder(configurationPrefix = "invalid_cdc_behavior")
+ var invalidCdcBehavior = MicronautPropertiesFriendlyInvalidCdcBehaviorConfiguration()
+
+ @JsonIgnore var invalidCdcPositionBehaviorJson: InvalidCdcPositionBehavior? = null
+
+ @JsonSetter("invalid_cdc_behavior")
+ fun setInvalidCdcBehaviorValue(value: InvalidCdcPositionBehavior) {
+ invalidCdcPositionBehaviorJson = value
+ }
+
+ @JsonGetter("invalid_cdc_behavior")
+ @JsonSchemaTitle("Invalid CDC position behavior (Advanced)")
+ @JsonPropertyDescription(
+ "Determines whether Airbyte should fail or re-sync data in case of an stale/invalid cursor value into the WAL. If 'Fail sync' is chosen, a user will have to manually reset the connection before being able to continue syncing data. If 'Re-sync data' is chosen, Airbyte will automatically trigger a refresh but could lead to higher cloud costs and data loss.",
+ )
+ @JsonSchemaInject(json = """{"order":3, "always_show": true}""")
+ fun getInvalidCdcBehaviorValue(): InvalidCdcPositionBehavior? =
+ invalidCdcPositionBehaviorJson ?: invalidCdcBehavior.asInvalidCdcPositionBehavior()
+
+ @JsonProperty("initial_load_timeout_hours")
+ @JsonSchemaTitle("Initial Load Timeout in Hours (Advanced)")
+ @JsonPropertyDescription(
+ "The amount of time an initial load is allowed to continue for before catching up on CDC logs.",
+ )
+ @JsonSchemaDefault("8")
+ @JsonSchemaInject(json = """{"order":4, "max": 24, "min": 4,"always_show": true}""")
+ var initialLoadTimeoutHours: Int? = 8
+}
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "invalid_cdc_cursor_position_behavior")
+@JsonSubTypes(
+ JsonSubTypes.Type(value = FailSync::class, name = "fail_sync"),
+ JsonSubTypes.Type(value = ResyncData::class, name = "resync")
+)
+@JsonSchemaTitle("Update Method")
+sealed interface InvalidCdcPositionBehavior
+
+@JsonSchemaTitle("Fail sync") data object FailSync : InvalidCdcPositionBehavior
+
+@JsonSchemaTitle("Re-sync data") data object ResyncData : InvalidCdcPositionBehavior
+
+@ConfigurationProperties("$CONNECTOR_CONFIG_PREFIX.invalid_cdc_cursor_position_behavior")
+class MicronautPropertiesFriendlyInvalidCdcBehaviorConfiguration {
+ var invalidCdcBehavior: String = "fail_sync"
+
+ fun asInvalidCdcPositionBehavior(): InvalidCdcPositionBehavior =
+ when (invalidCdcBehavior) {
+ "fail_sync" -> FailSync
+ "resync" -> ResyncData
+ else -> throw ConfigErrorException("invalid value $invalidCdcBehavior")
+ }
+}
@ConfigurationProperties("$CONNECTOR_CONFIG_PREFIX.cursor")
class MicronautPropertiesFriendlyCursorConfiguration {
@@ -345,7 +417,7 @@ class MicronautPropertiesFriendlyCursorConfiguration {
fun asCursorConfiguration(): CursorConfiguration =
when (cursorMethod) {
"user_defined" -> UserDefinedCursor
- "cdc" -> CdcCursor
+ "cdc" -> CdcCursor()
else -> throw ConfigErrorException("invalid value $cursorMethod")
}
}
diff --git a/airbyte-integrations/connectors/source-mysql-v2/src/test/kotlin/io/airbyte/integrations/source/mysql/MysqlCdcIntegrationTest.kt b/airbyte-integrations/connectors/source-mysql-v2/src/test/kotlin/io/airbyte/integrations/source/mysql/MysqlCdcIntegrationTest.kt
index b284c3a40cfb..3d1905a3c4c2 100644
--- a/airbyte-integrations/connectors/source-mysql-v2/src/test/kotlin/io/airbyte/integrations/source/mysql/MysqlCdcIntegrationTest.kt
+++ b/airbyte-integrations/connectors/source-mysql-v2/src/test/kotlin/io/airbyte/integrations/source/mysql/MysqlCdcIntegrationTest.kt
@@ -67,7 +67,7 @@ class MysqlCdcIntegrationTest {
lateinit var dbContainer: MySQLContainer<*>
fun config(): MysqlSourceConfigurationJsonObject =
- MysqlContainerFactory.config(dbContainer).apply { setCursorMethodValue(CdcCursor) }
+ MysqlContainerFactory.config(dbContainer).apply { setCursorMethodValue(CdcCursor()) }
val connectionFactory: JdbcConnectionFactory by lazy {
JdbcConnectionFactory(MysqlSourceConfigurationFactory().make(config()))
diff --git a/airbyte-integrations/connectors/source-mysql-v2/src/test/resources/expected-spec.json b/airbyte-integrations/connectors/source-mysql-v2/src/test/resources/expected-spec.json
index ae74e0257d9d..eb6aee1e6926 100644
--- a/airbyte-integrations/connectors/source-mysql-v2/src/test/resources/expected-spec.json
+++ b/airbyte-integrations/connectors/source-mysql-v2/src/test/resources/expected-spec.json
@@ -1,363 +1,422 @@
{
"documentationUrl": "https://docs.airbyte.com/integrations/sources/mysql",
"connectionSpecification": {
- "$schema": "http://json-schema.org/draft-07/schema#",
- "title": "Mysql Source Spec",
"type": "object",
- "additionalProperties": true,
+ "title": "Mysql Source Spec",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "required": [
+ "host",
+ "port",
+ "username",
+ "database",
+ "encryption",
+ "tunnel_method",
+ "cursor"
+ ],
"properties": {
"host": {
"type": "string",
- "description": "Hostname of the database.",
+ "order": 1,
"title": "Host",
- "order": 1
+ "description": "Hostname of the database."
},
"port": {
"type": "integer",
- "default": 3306,
- "description": "Port of the database.",
- "title": "Port",
"order": 2,
+ "title": "Port",
+ "default": 3306,
+ "maximum": 65536,
"minimum": 0,
- "maximum": 65536
+ "description": "Port of the database."
},
- "username": {
+ "cursor": {
+ "type": "object",
+ "oneOf": [
+ {
+ "type": "object",
+ "title": "Scan Changes with User Defined Cursor",
+ "required": ["cursor_method"],
+ "properties": {
+ "cursor_method": {
+ "enum": ["user_defined"],
+ "type": "string",
+ "default": "user_defined"
+ }
+ },
+ "description": "Incrementally detects new inserts and updates using the cursor column chosen when configuring a connection (e.g. created_at, updated_at).",
+ "additionalProperties": true
+ },
+ {
+ "type": "object",
+ "title": "Read Changes using Change Data Capture (CDC)",
+ "required": ["cursor_method"],
+ "properties": {
+ "cursor_method": {
+ "enum": ["cdc"],
+ "type": "string",
+ "default": "cdc"
+ },
+ "server_timezone": {
+ "type": "string",
+ "order": 2,
+ "title": "Configured server timezone for the MySQL source (Advanced)",
+ "always_show": true,
+ "description": "Enter the configured MySQL server timezone. This should only be done if the configured timezone in your MySQL instance does not conform to IANNA standard."
+ },
+ "invalid_cdc_behavior": {
+ "type": "object",
+ "oneOf": [
+ {
+ "type": "object",
+ "title": "Fail sync",
+ "required": ["invalid_cdc_cursor_position_behavior"],
+ "properties": {
+ "invalid_cdc_cursor_position_behavior": {
+ "enum": ["fail_sync"],
+ "type": "string",
+ "default": "fail_sync"
+ }
+ },
+ "additionalProperties": true
+ },
+ {
+ "type": "object",
+ "title": "Re-sync data",
+ "required": ["invalid_cdc_cursor_position_behavior"],
+ "properties": {
+ "invalid_cdc_cursor_position_behavior": {
+ "enum": ["resync"],
+ "type": "string",
+ "default": "resync"
+ }
+ },
+ "additionalProperties": true
+ }
+ ],
+ "order": 3,
+ "title": "Invalid CDC position behavior (Advanced)",
+ "always_show": true,
+ "description": "Determines whether Airbyte should fail or re-sync data in case of an stale/invalid cursor value into the WAL. If 'Fail sync' is chosen, a user will have to manually reset the connection before being able to continue syncing data. If 'Re-sync data' is chosen, Airbyte will automatically trigger a refresh but could lead to higher cloud costs and data loss."
+ },
+ "initial_waiting_seconds": {
+ "max": 1200,
+ "min": 120,
+ "type": "integer",
+ "order": 1,
+ "title": "Initial Waiting Time in Seconds (Advanced)",
+ "default": 300,
+ "always_show": true,
+ "description": "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time."
+ },
+ "initial_load_timeout_hours": {
+ "max": 24,
+ "min": 4,
+ "type": "integer",
+ "order": 4,
+ "title": "Initial Load Timeout in Hours (Advanced)",
+ "default": 8,
+ "always_show": true,
+ "description": "The amount of time an initial load is allowed to continue for before catching up on CDC logs."
+ }
+ },
+ "description": "Recommended - Incrementally reads new inserts, updates, and deletes using Mysql's change data capture feature. This must be enabled on your database.",
+ "additionalProperties": true
+ }
+ ],
+ "order": 10,
+ "title": "Update Method",
+ "description": "Configures how data is extracted from the database.",
+ "display_type": "radio"
+ },
+ "database": {
"type": "string",
- "description": "The username which is used to access the database.",
- "title": "User",
- "order": 4
+ "order": 6,
+ "title": "Database",
+ "always_show": true,
+ "description": "The database name."
},
"password": {
"type": "string",
- "description": "The password associated with the username.",
- "title": "Password",
"order": 5,
+ "title": "Password",
"always_show": true,
+ "description": "The password associated with the username.",
"airbyte_secret": true
},
- "database": {
- "type": "string",
- "description": "The database name.",
- "title": "Database",
- "order": 6,
- "always_show": true
- },
- "jdbc_url_params": {
+ "username": {
"type": "string",
- "description": "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3).",
- "title": "JDBC URL Params",
- "order": 7
+ "order": 4,
+ "title": "User",
+ "description": "The username which is used to access the database."
},
"encryption": {
+ "type": "object",
"oneOf": [
{
- "title": "preferred",
"type": "object",
- "additionalProperties": true,
- "description": "To allow unencrypted communication only when the source doesn't support encryption.",
+ "title": "preferred",
+ "required": ["encryption_method"],
"properties": {
"encryption_method": {
- "type": "string",
"enum": ["preferred"],
+ "type": "string",
"default": "preferred"
}
},
- "required": ["encryption_method"]
+ "description": "To allow unencrypted communication only when the source doesn't support encryption.",
+ "additionalProperties": true
},
{
- "title": "required",
"type": "object",
- "additionalProperties": true,
- "description": "To always require encryption. Note: The connection will fail if the source doesn't support encryption.",
+ "title": "required",
+ "required": ["encryption_method"],
"properties": {
"encryption_method": {
- "type": "string",
"enum": ["required"],
+ "type": "string",
"default": "required"
}
},
- "required": ["encryption_method"]
+ "description": "To always require encryption. Note: The connection will fail if the source doesn't support encryption.",
+ "additionalProperties": true
},
{
- "title": "verify_ca",
"type": "object",
- "additionalProperties": true,
- "description": "To always require encryption and verify that the source has a valid SSL certificate.",
+ "title": "verify_ca",
+ "required": ["encryption_method", "ssl_certificate"],
"properties": {
- "encryption_method": {
+ "ssl_client_key": {
"type": "string",
- "enum": ["verify_ca"],
- "default": "verify_ca"
+ "title": "Client Key",
+ "multiline": true,
+ "description": "Client key (this is not a required field, but if you want to use it, you will need to add the Client certificate as well)",
+ "airbyte_secret": true
},
"ssl_certificate": {
"type": "string",
- "description": "CA certificate",
"title": "CA certificate",
- "airbyte_secret": true,
- "multiline": true
+ "multiline": true,
+ "description": "CA certificate",
+ "airbyte_secret": true
},
- "ssl_client_certificate": {
+ "encryption_method": {
+ "enum": ["verify_ca"],
"type": "string",
- "description": "Client certificate (this is not a required field, but if you want to use it, you will need to add the Client key as well)",
- "title": "Client certificate File",
- "airbyte_secret": true,
- "multiline": true
+ "default": "verify_ca"
},
- "ssl_client_key": {
+ "ssl_client_certificate": {
"type": "string",
- "description": "Client key (this is not a required field, but if you want to use it, you will need to add the Client certificate as well)",
- "title": "Client Key",
- "airbyte_secret": true,
- "multiline": true
+ "title": "Client certificate File",
+ "multiline": true,
+ "description": "Client certificate (this is not a required field, but if you want to use it, you will need to add the Client key as well)",
+ "airbyte_secret": true
},
"ssl_client_key_password": {
"type": "string",
- "description": "Password for keystorage. This field is optional. If you do not add it - the password will be generated automatically.",
"title": "Client key password",
- "airbyte_secret": true,
- "multiline": true
+ "multiline": true,
+ "description": "Password for keystorage. This field is optional. If you do not add it - the password will be generated automatically.",
+ "airbyte_secret": true
}
},
- "required": ["encryption_method", "ssl_certificate"]
+ "description": "To always require encryption and verify that the source has a valid SSL certificate.",
+ "additionalProperties": true
},
{
- "title": "verify_identity",
"type": "object",
- "additionalProperties": true,
- "description": "To always require encryption and verify that the source has a valid SSL certificate.",
+ "title": "verify_identity",
+ "required": ["encryption_method", "ssl_certificate"],
"properties": {
- "encryption_method": {
+ "ssl_client_key": {
"type": "string",
- "enum": ["verify_identity"],
- "default": "verify_identity"
+ "title": "Client Key",
+ "multiline": true,
+ "description": "Client key (this is not a required field, but if you want to use it, you will need to add the Client certificate as well)",
+ "airbyte_secret": true
},
"ssl_certificate": {
"type": "string",
- "description": "CA certificate",
"title": "CA certificate",
- "airbyte_secret": true,
- "multiline": true
+ "multiline": true,
+ "description": "CA certificate",
+ "airbyte_secret": true
},
- "ssl_client_certificate": {
+ "encryption_method": {
+ "enum": ["verify_identity"],
"type": "string",
- "description": "Client certificate (this is not a required field, but if you want to use it, you will need to add the Client key as well)",
- "title": "Client certificate File",
- "airbyte_secret": true,
- "multiline": true
+ "default": "verify_identity"
},
- "ssl_client_key": {
+ "ssl_client_certificate": {
"type": "string",
- "description": "Client key (this is not a required field, but if you want to use it, you will need to add the Client certificate as well)",
- "title": "Client Key",
- "airbyte_secret": true,
- "multiline": true
+ "title": "Client certificate File",
+ "multiline": true,
+ "description": "Client certificate (this is not a required field, but if you want to use it, you will need to add the Client key as well)",
+ "airbyte_secret": true
},
"ssl_client_key_password": {
"type": "string",
- "description": "Password for keystorage. This field is optional. If you do not add it - the password will be generated automatically.",
"title": "Client key password",
- "airbyte_secret": true,
- "multiline": true
+ "multiline": true,
+ "description": "Password for keystorage. This field is optional. If you do not add it - the password will be generated automatically.",
+ "airbyte_secret": true
}
},
- "required": ["encryption_method", "ssl_certificate"]
+ "description": "To always require encryption and verify that the source has a valid SSL certificate.",
+ "additionalProperties": true
}
],
- "description": "The encryption method with is used when communicating with the database.",
- "title": "Encryption",
"order": 8,
- "type": "object"
+ "title": "Encryption",
+ "description": "The encryption method with is used when communicating with the database."
+ },
+ "concurrency": {
+ "type": "integer",
+ "order": 12,
+ "title": "Concurrency",
+ "default": 1,
+ "description": "Maximum number of concurrent queries to the database."
},
"tunnel_method": {
+ "type": "object",
"oneOf": [
{
- "title": "No Tunnel",
"type": "object",
- "additionalProperties": true,
- "description": "No ssh tunnel needed to connect to database",
+ "title": "No Tunnel",
+ "required": ["tunnel_method"],
"properties": {
"tunnel_method": {
- "type": "string",
"enum": ["NO_TUNNEL"],
+ "type": "string",
"default": "NO_TUNNEL"
}
},
- "required": ["tunnel_method"]
+ "description": "No ssh tunnel needed to connect to database",
+ "additionalProperties": true
},
{
- "title": "SSH Key Authentication",
"type": "object",
- "additionalProperties": true,
- "description": "Connect through a jump server tunnel host using username and ssh key",
+ "title": "SSH Key Authentication",
+ "required": [
+ "tunnel_method",
+ "tunnel_host",
+ "tunnel_port",
+ "tunnel_user",
+ "ssh_key"
+ ],
"properties": {
- "tunnel_method": {
+ "ssh_key": {
"type": "string",
- "enum": ["SSH_KEY_AUTH"],
- "default": "SSH_KEY_AUTH"
+ "order": 4,
+ "title": "SSH Private Key",
+ "multiline": true,
+ "description": "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
+ "airbyte_secret": true
},
"tunnel_host": {
"type": "string",
- "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+ "order": 1,
"title": "SSH Tunnel Jump Server Host",
- "order": 1
+ "description": "Hostname of the jump server host that allows inbound ssh tunnel."
},
"tunnel_port": {
"type": "integer",
- "default": 22,
- "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
- "title": "SSH Connection Port",
"order": 2,
+ "title": "SSH Connection Port",
+ "default": 22,
+ "maximum": 65536,
"minimum": 0,
- "maximum": 65536
+ "description": "Port on the proxy/jump server that accepts inbound ssh connections."
},
"tunnel_user": {
"type": "string",
- "description": "OS-level username for logging into the jump server host",
+ "order": 3,
"title": "SSH Login Username",
- "order": 3
+ "description": "OS-level username for logging into the jump server host"
},
- "ssh_key": {
+ "tunnel_method": {
+ "enum": ["SSH_KEY_AUTH"],
"type": "string",
- "description": "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
- "title": "SSH Private Key",
- "order": 4,
- "multiline": true,
- "airbyte_secret": true
+ "default": "SSH_KEY_AUTH"
}
},
+ "description": "Connect through a jump server tunnel host using username and ssh key",
+ "additionalProperties": true
+ },
+ {
+ "type": "object",
+ "title": "Password Authentication",
"required": [
"tunnel_method",
"tunnel_host",
"tunnel_port",
"tunnel_user",
- "ssh_key"
- ]
- },
- {
- "title": "Password Authentication",
- "type": "object",
- "additionalProperties": true,
- "description": "Connect through a jump server tunnel host using username and password authentication",
+ "tunnel_user_password"
+ ],
"properties": {
- "tunnel_method": {
- "type": "string",
- "enum": ["SSH_PASSWORD_AUTH"],
- "default": "SSH_PASSWORD_AUTH"
- },
"tunnel_host": {
"type": "string",
- "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+ "order": 1,
"title": "SSH Tunnel Jump Server Host",
- "order": 1
+ "description": "Hostname of the jump server host that allows inbound ssh tunnel."
},
"tunnel_port": {
"type": "integer",
- "default": 22,
- "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
- "title": "SSH Connection Port",
"order": 2,
+ "title": "SSH Connection Port",
+ "default": 22,
+ "maximum": 65536,
"minimum": 0,
- "maximum": 65536
+ "description": "Port on the proxy/jump server that accepts inbound ssh connections."
},
"tunnel_user": {
"type": "string",
- "description": "OS-level username for logging into the jump server host",
+ "order": 3,
"title": "SSH Login Username",
- "order": 3
+ "description": "OS-level username for logging into the jump server host"
+ },
+ "tunnel_method": {
+ "enum": ["SSH_PASSWORD_AUTH"],
+ "type": "string",
+ "default": "SSH_PASSWORD_AUTH"
},
"tunnel_user_password": {
"type": "string",
- "description": "OS-level password for logging into the jump server host",
- "title": "Password",
"order": 4,
+ "title": "Password",
+ "description": "OS-level password for logging into the jump server host",
"airbyte_secret": true
}
},
- "required": [
- "tunnel_method",
- "tunnel_host",
- "tunnel_port",
- "tunnel_user",
- "tunnel_user_password"
- ]
+ "description": "Connect through a jump server tunnel host using username and password authentication",
+ "additionalProperties": true
}
],
- "description": "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
- "title": "SSH Tunnel Method",
"order": 9,
- "type": "object"
- },
- "cursor": {
- "oneOf": [
- {
- "title": "Scan Changes with User Defined Cursor",
- "type": "object",
- "additionalProperties": true,
- "description": "Incrementally detects new inserts and updates using the cursor column chosen when configuring a connection (e.g. created_at, updated_at).",
- "properties": {
- "cursor_method": {
- "type": "string",
- "enum": ["user_defined"],
- "default": "user_defined"
- }
- },
- "required": ["cursor_method"]
- },
- {
- "title": "Read Changes using Change Data Capture (CDC)",
- "type": "object",
- "additionalProperties": true,
- "description": "Recommended - Incrementally reads new inserts, updates, and deletes using Mysql's change data capture feature. This must be enabled on your database.",
- "properties": {
- "cursor_method": {
- "type": "string",
- "enum": ["cdc"],
- "default": "cdc"
- }
- },
- "required": ["cursor_method"]
- }
- ],
- "description": "Configures how data is extracted from the database.",
- "title": "Update Method",
- "order": 10,
- "display_type": "radio",
- "type": "object"
- },
- "checkpoint_target_interval_seconds": {
- "type": "integer",
- "default": 300,
- "description": "How often (in seconds) a stream should checkpoint, when possible.",
- "title": "Checkpoint Target Time Interval",
- "order": 11
+ "title": "SSH Tunnel Method",
+ "description": "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use."
},
- "concurrency": {
- "type": "integer",
- "default": 1,
- "description": "Maximum number of concurrent queries to the database.",
- "title": "Concurrency",
- "order": 12
+ "jdbc_url_params": {
+ "type": "string",
+ "order": 7,
+ "title": "JDBC URL Params",
+ "description": "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3)."
},
"check_privileges": {
"type": "boolean",
+ "order": 13,
+ "title": "Check Table and Column Access Privileges",
"default": true,
"description": "When this feature is enabled, during schema discovery the connector will query each table or view individually to check access privileges and inaccessible tables, views, or columns therein will be removed. In large schemas, this might cause schema discovery to take too long, in which case it might be advisable to disable this feature.",
- "title": "Check Table and Column Access Privileges",
- "order": 13,
"display_type": "check"
+ },
+ "checkpoint_target_interval_seconds": {
+ "type": "integer",
+ "order": 11,
+ "title": "Checkpoint Target Time Interval",
+ "default": 300,
+ "description": "How often (in seconds) a stream should checkpoint, when possible."
}
},
- "required": [
- "host",
- "port",
- "username",
- "database",
- "encryption",
- "tunnel_method",
- "cursor"
- ]
- },
- "supportsNormalization": false,
- "supportsDBT": false,
- "supported_destination_sync_modes": []
+ "additionalProperties": true
+ }
}