# MySQL Import Integration CLI TD Consoleが利用できない場合やご利用いただけない場合でも、CLIからMySQLデータコネクタを使用できます。以下の手順では、CLIを使用してデータをインポートする方法を説明します。 ## 前提条件 - Treasure Dataの基本的な知識 - MySQLの基本的な知識 - Treasure Dataから到達可能なMySQLインスタンス MySQL Community Server 5.6および5.7を使用していてSSLを使用したい場合は、コネクタの基盤となるライブラリとの互換性の問題を解決するために、パラメータenabledTLSProtocolsとTLSv1.2を設定してください。他のMySQLバージョンでは、統合は自動的に最高のTLSバージョンを使用しようとします。 ## 'td'コマンド v0.11.9以降のインストール 最新の[TD Toolbelt](https://toolbelt.treasuredata.com/)をインストールしてください。 ## 設定ファイルの作成 MySQLアクセス情報を含む設定ファイル(例:load.yml)を以下のように準備してください。 ```yaml in: type: mysql host: mysql_host_name port: 3306 user: test_user password: test_password database: test_database table: test_table select: "*" out: mode: replace ``` この例では、テーブル内のすべてのレコードをダンプします。[追加パラメータ](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql)を使用して、より詳細な制御が可能です。 SSLオプションを使用する場合は、以下のオプションを使用してください: - requireSSL - useSSL - verifyServerCertificate ```yaml in: type: mysql host: mysql_host_name port: 3306 user: test_user password: test_password options: requireSSL: true useSSL: true verifyServerCertificate: false database: test_database table: test_table select: "*" out: mode: replace ``` 利用可能なoutモードの詳細については、[付録](https://docs.treasuredata.com/articles/project-integrations/mysql-import-integration+CLI#MySQLImportIntegrationCLI-Appendix)を参照してください。 ## データのプレビュー(オプション) td connector:previewコマンドを使用して、インポートされるデータをプレビューできます。 ``` $ td connector:preview load.yml +---------+--------------+----------------------------------+------------+---------------------------+ | id:long | name:string | description:string | price:long | created_at:timestamp | +---------+--------------+----------------------------------+------------+---------------------------+ | 1 | "item name1" | "26e3c3625366591bc2ffc6e262976e" | 2419 | "2014-02-16 13:01:06 UTC" | | 2 | "item name2" | "3e9dd9474dacb78afd607f9e0a3366" | 1298 | "2014-05-24 13:59:26 UTC" | | 3 | "item name3" | "9b6c9e4a140284d3951681e9e047f6" | 9084 | "2014-06-21 00:18:21 UTC" | | 4 | "item name4" | "a11faf5e63c1b02a3d4c2b5cbb7331" | 669 | "2014-05-02 03:44:08 UTC" | | 6 | "item name6" | "6aa15471c373ddc8a6469e1c918f98" | 3556 | "2014-03-29 08:30:23 UTC" | +---------+--------------+----------------------------------+------------+---------------------------+ ``` ## ロードジョブの実行 ロードジョブを送信します。データサイズによっては数時間かかる場合があります。ユーザーは、データが保存されているデータベースとテーブルを指定する必要があります。 Treasure Dataのストレージは時間でパーティション分割されているため([アーキテクチャ](https://docs.treasuredata.com/articles/project-product-documentation/about-treasure-data+Architecture)も参照)、--time-columnオプションを指定することを推奨します。このオプションを指定しない場合、Data Connectorは最初のlong型またはtimestamp型のカラムをパーティショニング時間として選択します。--time-columnで指定するカラムの型は、long型またはtimestamp型のいずれかである必要があります。 データに時間カラムがない場合は、add_timeフィルタオプションを使用して追加できます。詳細は[add_timeフィルタプラグイン](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)を参照してください。 ``` $ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at ``` 上記のコマンドは、*database(td_sample_db)*と*table(td_sample_table)*を既に作成していることを前提としています。TDにdatabaseまたはtableが存在しない場合、このコマンドは成功しません。TD Consoleを使用してdatabaseとtableを作成するか、td connector:issueコマンドで--auto-create-tableオプションを使用して、databaseとtableを自動作成してください。 ``` $ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at --auto-create-table ``` "--time-column"オプションで、Time Format列を"Partitioning Key"に割り当てることができます。 ## Scheduled Execution 高可用性スケジューラを使用して、定期的なMySQLインポートのためのData Connector実行をスケジュールできます。この機能を使用することで、ローカルデータセンターにcronデーモンを設置する必要がなくなります。 ### Incremental load incremental_columnsパラメータにテーブルのカラムを指定することで、レコードを段階的にロードできます。オプションで、last_recordパラメータに初期値を指定することもできます。 ```yaml in: type: mysql options: {useLegacyDatetimeCode: false} host: mysql_host_name port: 3306 user: test_user password: test_password database: test_database table: test_table incremental: true incremental_columns: [id, created_at] last_record: [10000, '2014-02-16T13:01:06.000000Z'] out: mode: append exec: {} ``` フルテーブルスキャンを避けるために、`incremental\_columns:`オプションを使用して関連するカラムにインデックスを作成してください。 この例では、以下のインデックスを作成します。 ```sql CREATE INDEX embulk_incremental_loading_index ON test_table (id, created_at); ``` Connectorは自動的にクエリを作成し、値をソートします。 ```sql -- when last_record wasn't given SELECT * FROM( ...original query is here ) ORDER BY id, created_at ``` ```sql -- when last_record was given SELECT * FROM( ...original query is here ) WHERE id > 10000 OR (id = 10000 AND created_at > '2014-02-16T13:01:06.000000Z') ORDER BY id, created_at ``` Connectorは自動的にlast_recordを取得し、次のスケジュール実行時に使用します。 ```yaml in: type: mysql options: useLegacyDatetimeCode: false ... out: ... Config Diff --- in: last_record: - 20000 - '2015-06-16T16:32:14.000000Z' ``` `incremental: true`を設定すると、`query`オプションは使用できません。 incremental_columnsとしてサポートされているのは、文字列、整数、datetimeおよびtimestamp型のみです。 datetime/timestamp型のカラムをincremental_columnsとして使用する場合は、GUIでJDBC接続オプションとして、または設定ファイルの`options`として`useLegacyDatetimeCode: false`を設定してください。 ## スケジュールの作成 新しいスケジュールは、td connector:createコマンドを使用して作成できます。スケジュール名、cron形式のスケジュール、データの保存先となるデータベースとテーブル、およびData Connector設定ファイルが必要です。 ``` $ td connector:create \ daily_mysql_import \ "10 0 * * *" \ td_sample_db \ td_sample_table \ load.yml ``` `cron`パラメータは、`@hourly`、`@daily`、`@monthly`の3つのオプションも受け付けます。 デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、任意のタイムゾーンでスケジュールを設定できます。`--timezone`オプションは、'Asia/Tokyo'や'America/Los_Angeles'などの拡張タイムゾーン形式のみをサポートしています。PST、CSTなどのタイムゾーン略語は*サポートされておらず*、予期しないスケジュールになる可能性があります。 ## スケジュールの一覧表示 現在スケジュールされているエントリの一覧は、td connector:listで確認できます。 ``` $ td connector:list +--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+ | Name | Cron | Timezone | Delay | Database | Table | Config | +--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+ | daily_mysql_import | 10 0 * * * | UTC | 0 | td_sample_db | td_sample_table | {"type"=>"mysql", ... } | +--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+ ``` ## スケジュールの詳細表示 `td connector:show`は、スケジュールエントリの実行設定を表示します。 ``` % td connector:show daily_mysql_import Name : daily_mysql_import Cron : 10 0 * * * Timezone : UTC Delay : 0 Database : td_sample_db Table : td_sample_table ``` td connector:historyは、スケジュールエントリの実行履歴を表示します。各実行の結果を調査するには、td job jobidを使用してください。 ``` % td connector:history daily_mysql_import +--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+ | JobID | Status | Records | Database | Table | Priority | Started | Duration | +--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+ | 578066 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-18 00:10:05 +0000 | 160 | | 577968 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-17 00:10:07 +0000 | 161 | | 577914 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-16 00:10:03 +0000 | 152 | | 577872 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-15 00:10:04 +0000 | 163 | | 577810 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-14 00:10:04 +0000 | 164 | | 577766 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-13 00:10:04 +0000 | 155 | | 577710 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-12 00:10:05 +0000 | 156 | | 577610 | success | 10000 | td_sample_db | td_sample_table | 0 | 2015-04-11 00:10:04 +0000 | 157 | +--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+ 8 rows in set ``` ## スケジュールの削除 `td connector:delete`は、スケジュールを削除します。 ``` $ td connector:delete daily_mysql_import ``` # 付録 ## outプラグインのモード load.ymlのoutセクションでファイルインポートモードを指定できます。 たとえば、Treasure Data内の既存のテーブルにデータを追加するか、データを置き換えるかを選択できます。 | **モード** | **説明** | **例** | | --- | --- | --- | | Append | レコードがターゲットテーブルに追加されます。 | `in: ... out: mode: append` | | Always Replace | ターゲットテーブルのデータを置き換えます。ターゲットテーブルに対して手動で行われたスキーマ変更は保持されます。 | `in: ... out: mode: replace` | | Replace on new data | インポートする新しいデータがある場合にのみ、ターゲットテーブルのデータを置き換えます。 | `in: ... out: mode: replace_on_new_data` |