[プレビュー]BigQueryのData Transfer ServiceでMySQLと連携できるようになったので試してみた
概要
2025年1月17日のアップデートで、BigQueryのData Transfer ServiceでMySQLからデータを取り込むことができるようになりました。
他にもPostgreSQLにも対応したとのことです。
今回の記事では早速Data Transfer Serviceを用いてCloud SQLのMySQLインスタンスからデータを取り込んでみました。
Cloud SQL以外にもオンプレミス、AWS、Azureなど他のパブリッククラウドのインスタンスもサポートするとのことです。
It supports MySQL instances that are hosted in your on-premises environment, in Cloud SQL, and in other public cloud providers such as Amazon Web Services (AWS) and Microsoft Azure.
まずは制限事項の確認
試す前に、Data Transfer ServiceでMySQLからデータを取り込む場合は制限事項があるのでそれに触れます。
制限事項は以下の2つが記載されていました。
- The maximum number of simultaneous connections to a MySQL database is determined by the MySQL configuration parameter max_connections. By default, this is set to 151 connections, but it can be configured to a higher limit as needed. As a result, the number of simultaneous transfer runs to a single MySQL database is limited to that maximum amount. This limitation also means that the number of concurrent transfer jobs should be limited to a value less than the maximum number of concurrent connections supported by the MySQL database.
MySQLデータベースへの同時接続の最大数は、MySQLの設定パラメータmax_connectionsによって決定されます。デフォルトでは151接続に設定されていますが、必要に応じてより高い上限に設定することができます。その結果、1つのMySQLデータベースへの同時転送実行の数は、その最大値に制限されます。この制限は、MySQLデータベースがサポートする同時接続の最大数よりも少ない値に、同時転送ジョブの数を制限する必要があることも意味します。
- In MySQL, some data types get mapped to the string type in BigQuery to avoid any data loss. For example, numeric types defined in MySQL that don't have a defined precision and scale are mapped to the string type in BigQuery.
MySQLでは、データ損失を回避するために、一部のデータ型がBigQueryの文字列型にマッピングされます。例えば、MySQLで定義された精度とスケールが指定されていない数値型は、BigQueryの文字列型にマッピングされます。
接続数に関しては、Data Transfer Serviceを使用しない場合でも考慮が必要な事項かと思いますので特に違和感はないと思います。
注意すべきは後者のデータ型に関する点だと思います。リファレンスにMySQLとBigQueryのデータ型がどのようにマッピングされるか記載があるので押さえておくべきと考えます。
リファレンスのままですが、以下にデータ型のマッピングを記載しました。
データ型のマッピング
| MySQLデータ型 | BigQueryデータ型 |
|---|---|
| BIT | BOOLEAN |
| TINYINT | INTEGER |
| BOOL, BOOLEAN | BOOLEAN |
| SMALLINT | INTEGER |
| MEDIUMINT | INTEGER |
| INT, INTEGER | INTEGER |
| BIGINT | BIGNUMERIC |
| FLOAT | FLOAT |
| DOUBLE | FLOAT |
| DECIMAL | BIGNUMERIC |
| DATE | DATE |
| DATETIME | TIMESTAMP |
| TIMESTAMP | TIMESTAMP |
| TIME | TIME |
| YEAR | DATE |
| CHAR | STRING |
| VARCHAR | STRING |
| BINARY | BYTES |
| VARBINARY | BYTES |
| TINYBLOB | BYTES |
| TINYTEXT | STRING |
| BLOB | BYTES |
| TEXT | STRING |
| MEDIUMBLOB | BYTES |
| MEDIUMTEXT | STRING |
| LONGBLOB | BYTES |
| LONGTEXT | STRING |
| ENUM | STRING |
| SET | STRING |
やってみる
前提条件
- Cloud SQL MySQLインスタンスが作成済みであること
- プライベートIPを持ったプライベートサービスアクセスが有効になっているCloud SQL MySQLインスタンスがあること
- MySQLインスタンスにアクセスできるネットワークアタッチメントが作成済みであること
ネットワークアタッチメントの作成に関しては以下をご参照ください
連携用のテーブルを作成する
データ型のマッピングが設定されるかどうかもみたいので、MySQLデータ型とBigQueryデータ型が異なるデータ型をもつテーブルを作成します。
CREATE TABLE test_data_types (
id INT AUTO_INCREMENT PRIMARY KEY,
bool_col BOOLEAN,
int_col INT,
bigint_col BIGINT,
float_col FLOAT,
double_col DOUBLE,
datetime_col DATETIME,
timestamp_col TIMESTAMP,
year_col YEAR,
char_col CHAR(10),
varchar_col VARCHAR(50),
blob_col BLOB
);
テーブルを作成したら、データを投入します。
INSERT INTO test_data_types (
bool_col, int_col, bigint_col, float_col, double_col,
datetime_col, timestamp_col, year_col, char_col, varchar_col, blob_col
) VALUES
(
FALSE,
-456,
1234567890123456789,
0.0,
-98765.4321,
'2000-01-01 00:00:00',
'1970-01-01 00:00:01',
1999,
'Test',
'Another VARCHAR example.',
'Another BLOB data'
),
(
TRUE,
0,
-9223372036854775808,
3.14159,
2.718281828459045,
'2023-12-31 23:59:59',
CURRENT_TIMESTAMP,
2025,
'A',
'This is a longer VARCHAR example with more text.',
'Sample binary data for BLOB'
),
(
TRUE,
123,
9223372036854775807,
123.45,
123456.789,
'2023-10-01 12:34:56',
CURRENT_TIMESTAMP,
2023,
'A',
'This is a VARCHAR example.',
'Sample BLOB data'
);
INSERTしたらData Transfer Serviceの設定に移ります。
Data Transfer Serviceを設定する
GUIで設定してみました。
BigQueryコンソールのデータ転送 > 転送を作成を押下します。

ソースタイプでMySQLを選択します(恐らく、以前はこの項目はなかったはず・・・)。

データソースの詳細を設定します。

主な設定項目としては以下です。
| 設定項目 | 設定値 |
|---|---|
| ネットワークアタッチメント | ネットワークアタッチメント名 |
| Host | IPアドレスまたはホスト名 |
| Port Number | ポート番号(デフォルトは3306) |
| Database Name | 連携対象テーブルのあるDB名 |
| Username | Data Transfer Serviceが連携に使用するユーザ名 |
| Password | パスワード |
| Encryption Mode | 暗号化有無。FULLまたはDISABLE |
| MySQL objects to transfer | 連携対象テーブル名。表記形式は DB名/テーブル名 |
設定できたら実行します。連携に成功すると転送実行が正常に完了しました。と表示されます。

BigQueryに連携されたテーブルを確認してみます。

無事テーブルが連携できていました。
※BigQuery側でテーブルを事前に作成してはいません。自動でテーブルが作成されました。
MySQLのテーブル定義のデータ型とBigQueryのテーブル定義のデータ型を対比してみます。
| フィールド名 | MySQLのデータ型 | BigQueryの種類 |
|---|---|---|
| id | INT | INTEGER |
| bool_col | BOOLEAN | BOOLEAN |
| int_col | INT, | INTEGER |
| bigint_col | BIGINT | BIGNUMERIC |
| float_col | FLOAT | FLOAT |
| double_col | DOUBLE | FLOAT |
| datetime_col | DATETIME | TIMESTAMP |
| timestamp_col | TIMESTAMP | TIMESTAMP |
| year_col | YEAR | DATE |
| char_col | CHAR | STRING |
| varchar_col | VARCHAR | STRING |
| blob_col | BLOB | BYTES |
上記より、リファレンスのマッピング表通りの変換が行われていることが確認できました。
テーブルのレコードも入っているか確認します。

さらっと見ただけですが問題なくデータ連携されていました。
削除して連携してみる
テーブルのデータを全レコード削除して連携してみます。
DELETE FROM test_data_types;
Query OK, 3 rows affected (0.06 sec)
BigQueryのテーブルも全レコード削除されていました。

どうやら洗い替えている様子。
所感
MySQLのテーブルデータをそのまま取り込みたい場合にとても手軽な方法だなと思いました。ただしMySQLとBigQueryのデータ型の違いがあるのでこれは連携時には注意した方が良いですね。GAになるのが楽しみです。






