The SQL Server to BigQuery template is a batch pipeline that copies data from a SQL Server table into an existing BigQuery table. This pipeline uses JDBC to connect to SQL Server. For an extra layer of protection, you can also pass in a Cloud KMS key along with Base64-encoded username, password, and connection string parameters encrypted with the Cloud KMS key. For more information about encrypting your username, password, and connection string parameters, see the Cloud KMS API encryption endpoint.
Pipeline requirements
- The BigQuery table must exist before pipeline execution.
- The BigQuery table must have a compatible schema.
- The relational database must be accessible from the subnet where Dataflow runs.
Template parameters
Required parameters
- driverJars: The comma-separated list of driver JAR files. For example,
gs://your-bucket/driver_jar1.jar,gs://your-bucket/driver_jar2.jar
. - driverClassName: The JDBC driver class name. For example,
com.mysql.jdbc.Driver
. - connectionURL: The JDBC connection URL string. For example,
jdbc:mysql://some-host:3306/sampledb
. You can pass in this value as a string that's encrypted with a Cloud KMS key and then Base64-encoded. Remove whitespace characters from the Base64-encoded string. Note the difference between an Oracle non-RAC database connection string (jdbc:oracle:thin:@some-host:<port>:<sid>
) and an Oracle RAC database connection string (jdbc:oracle:thin:@//some-host[:<port>]/<service_name>
). For example,jdbc:mysql://some-host:3306/sampledb
. - outputTable: The BigQuery output table location. For example,
<PROJECT_ID>:<DATASET_NAME>.<TABLE_NAME>
. - bigQueryLoadingTemporaryDirectory: The temporary directory for the BigQuery loading process. For example,
gs://your-bucket/your-files/temp_dir
.
Optional parameters
- connectionProperties: The properties string to use for the JDBC connection. The format of the string must be
[propertyName=property;]*
.For more information, see Configuration Properties (https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html) in the MySQL documentation. For example,unicode=true;characterEncoding=UTF-8
. - username: The username to use for the JDBC connection. Can be passed in as a string that's encrypted with a Cloud KMS key, or can be a Secret Manager secret in the form projects/{project}/secrets/{secret}/versions/{secret_version}.
- password: The password to use for the JDBC connection. Can be passed in as a string that's encrypted with a Cloud KMS key, or can be a Secret Manager secret in the form projects/{project}/secrets/{secret}/versions/{secret_version}.
- query: The query to run on the source to extract the data. Note that some JDBC SQL and BigQuery types, although sharing the same name, have some differences. Some important SQL -> BigQuery type mappings to keep in mind are
DATETIME --> TIMESTAMP
. Type casting may be required if your schemas do not match. For example,select * from sampledb.sample_table
. - KMSEncryptionKey: The Cloud KMS encryption key to use to decrypt the username, password, and connection string. If you pass in a Cloud KMS key, you must also encrypt the username, password, and connection string. For example,
projects/your-project/locations/global/keyRings/your-keyring/cryptoKeys/your-key
. - useColumnAlias: If set to
true
, the pipeline uses the column alias (AS
) instead of the column name to map the rows to BigQuery. Defaults tofalse
. - isTruncate: If set to
true
, the pipeline truncates before loading data into BigQuery. Defaults tofalse
, which causes the pipeline to append data. - partitionColumn: If this parameter is provided with the name of the
table
defined as an optional parameter, JdbcIO reads the table in parallel by executing multiple instances of the query on the same table (subquery) using ranges. Currently, only supportsLong
partition columns. - table: The table to read from when using partitions. This parameter also accepts a subquery in parentheses. For example,
(select id, name from Person) as subq
. - numPartitions: The number of partitions. With the lower and upper bound, this value forms partition strides for generated
WHERE
clause expressions that are used to split the partition column evenly. When the input is less than1
, the number is set to1
. - lowerBound: The lower bound to use in the partition scheme. If not provided, this value is automatically inferred by Apache Beam for the supported types.
- upperBound: The upper bound to use in the partition scheme. If not provided, this value is automatically inferred by Apache Beam for the supported types.
- fetchSize: The number of rows to be fetched from database at a time. Not used for partitioned reads. Defaults to: 50000.
- createDisposition: The BigQuery CreateDisposition to use. For example,
CREATE_IF_NEEDED
orCREATE_NEVER
. Defaults to: CREATE_NEVER. - bigQuerySchemaPath: The Cloud Storage path for the BigQuery JSON schema. If
createDisposition
is set toCREATE_IF_NEEDED
, this parameter must be specified. For example,gs://your-bucket/your-schema.json
. - outputDeadletterTable: The BigQuery table to use for messages that failed to reach the output table, formatted as
"PROJECT_ID:DATASET_NAME.TABLE_NAME"
. If the table doesn't exist, it is created when the pipeline runs. If this parameter is not specified, the pipeline will fail on write errors.This parameter can only be specified ifuseStorageWriteApi
oruseStorageWriteApiAtLeastOnce
is set to true. - disabledAlgorithms: Comma separated algorithms to disable. If this value is set to
none
, no algorithm is disabled. Use this parameter with caution, because the algorithms disabled by default might have vulnerabilities or performance issues. For example,SSLv3, RC4
. - extraFilesToStage: Comma separated Cloud Storage paths or Secret Manager secrets for files to stage in the worker. These files are saved in the /extra_files directory in each worker. For example,
gs://<BUCKET_NAME>/file.txt,projects/<PROJECT_ID>/secrets/<SECRET_ID>/versions/<VERSION_ID>
. - useStorageWriteApi: If
true
, the pipeline uses the BigQuery Storage Write API (https://cloud.google.com/bigquery/docs/write-api). The default value isfalse
. For more information, see Using the Storage Write API (https://beam.apache.org/documentation/io/built-in/google-bigquery/#storage-write-api). - useStorageWriteApiAtLeastOnce: When using the Storage Write API, specifies the write semantics. To use at-least-once semantics (https://beam.apache.org/documentation/io/built-in/google-bigquery/#at-least-once-semantics), set this parameter to
true
. To use exactly-once semantics, set the parameter tofalse
. This parameter applies only whenuseStorageWriteApi
istrue
. The default value isfalse
.
Run the template
Console
- Go to the Dataflow Create job from template page. Go to Create job from template
- In the Job name field, enter a unique job name.
- Optional: For Regional endpoint, select a value from the drop-down menu. The default
region is
us-central1
.For a list of regions where you can run a Dataflow job, see Dataflow locations.
- From the Dataflow template drop-down menu, select the SQL Server to BigQuery template.
- In the provided parameter fields, enter your parameter values.
- Click Run job.
gcloud
In your shell or terminal, run the template:
gcloud dataflow flex-template run JOB_NAME \ --project=PROJECT_ID \ --region=REGION_NAME \ --template-file-gcs-location=gs://dataflow-templates-REGION_NAME/VERSION/flex/SQLServer_to_BigQuery \ --parameters \ connectionURL=JDBC_CONNECTION_URL,\ query=SOURCE_SQL_QUERY,\ outputTable=PROJECT_ID:DATASET.TABLE_NAME, bigQueryLoadingTemporaryDirectory=PATH_TO_TEMP_DIR_ON_GCS,\ connectionProperties=CONNECTION_PROPERTIES,\ username=CONNECTION_USERNAME,\ password=CONNECTION_PASSWORD,\ KMSEncryptionKey=KMS_ENCRYPTION_KEY
Replace the following:
JOB_NAME
: a unique job name of your choiceVERSION
: the version of the template that you want to useYou can use the following values:
latest
to use the latest version of the template, which is available in the non-dated parent folder in the bucket— gs://dataflow-templates-REGION_NAME/latest/- the version name, like
2023-09-12-00_RC00
, to use a specific version of the template, which can be found nested in the respective dated parent folder in the bucket— gs://dataflow-templates-REGION_NAME/
REGION_NAME
: the region where you want to deploy your Dataflow job—for example,us-central1
JDBC_CONNECTION_URL
: the JDBC connection URLSOURCE_SQL_QUERY
: the SQL query to run on the source databaseDATASET
: your BigQuery datasetTABLE_NAME
: your BigQuery table namePATH_TO_TEMP_DIR_ON_GCS
: your Cloud Storage path to the temp directoryCONNECTION_PROPERTIES
: the JDBC connection properties, if neededCONNECTION_USERNAME
: the JDBC connection usernameCONNECTION_PASSWORD
: the JDBC connection passwordKMS_ENCRYPTION_KEY
: the Cloud KMS encryption key
API
To run the template using the REST API, send an HTTP POST request. For more information on the
API and its authorization scopes, see
projects.templates.launch
.
POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/flexTemplates:launch { "launchParameter": { "jobName": "JOB_NAME", "containerSpecGcsPath": "gs://dataflow-templates-LOCATION/VERSION/flex/SQLServer_to_BigQuery", "parameters": { "connectionURL": "JDBC_CONNECTION_URL", "query": "SOURCE_SQL_QUERY", "outputTable": "PROJECT_ID:DATASET.TABLE_NAME", "bigQueryLoadingTemporaryDirectory": "PATH_TO_TEMP_DIR_ON_GCS", "connectionProperties": "CONNECTION_PROPERTIES", "username": "CONNECTION_USERNAME", "password": "CONNECTION_PASSWORD", "KMSEncryptionKey":"KMS_ENCRYPTION_KEY" }, "environment": { "zone": "us-central1-f" } } }
Replace the following:
PROJECT_ID
: the Google Cloud project ID where you want to run the Dataflow jobJOB_NAME
: a unique job name of your choiceVERSION
: the version of the template that you want to useYou can use the following values:
latest
to use the latest version of the template, which is available in the non-dated parent folder in the bucket— gs://dataflow-templates-REGION_NAME/latest/- the version name, like
2023-09-12-00_RC00
, to use a specific version of the template, which can be found nested in the respective dated parent folder in the bucket— gs://dataflow-templates-REGION_NAME/
LOCATION
: the region where you want to deploy your Dataflow job—for example,us-central1
JDBC_CONNECTION_URL
: the JDBC connection URLSOURCE_SQL_QUERY
: the SQL query to run on the source databaseDATASET
: your BigQuery datasetTABLE_NAME
: your BigQuery table namePATH_TO_TEMP_DIR_ON_GCS
: your Cloud Storage path to the temp directoryCONNECTION_PROPERTIES
: the JDBC connection properties, if neededCONNECTION_USERNAME
: the JDBC connection usernameCONNECTION_PASSWORD
: the JDBC connection passwordKMS_ENCRYPTION_KEY
: the Cloud KMS encryption key
What's next
- Learn about Dataflow templates.
- See the list of Google-provided templates.