# MySQL Tables Export Integration CLI CLIを使用してクエリを発行し、結果を出力することができます。以下の手順では、CLIを使用してクエリ出力結果をフォーマットする方法を説明します。 ## TD Queryコマンドの使用方法 単一のクエリの結果をMySQLサーバーに出力するには、`td query`コマンドに`--result`オプションを追加します。ジョブが完了すると、結果がデータベースに書き込まれます: ``` $ td query --result 'mysql://user:password@host/database/table' \ -w -d testdb \ "SELECT code, COUNT(1) FROM www_access GROUP BY code" ``` ## スケジュールされたジョブ 出力が体系的にMySQLに書き込まれるスケジュールされたクエリを作成するには、`td sched:create`コマンドでスケジュールを作成する際に`--result`オプションを追加します。ジョブが実行されるたびに、結果が`mytbl`に書き込まれます。 ``` $ td result:create mydb mysql://user:password@host/database $ td sched:create hourly_count_example "0 * * * *" -d testdb "select count(*) from www_access" --result mydb:mytbl ``` ## 結果出力URLフォーマット 結果出力先は、以下の形式のURLで表されます: ``` mysql://username:password@hostname:port/database/table ``` ここで: - **mysql** は、MySQLへの結果出力を示します - **username** と **password** は、MySQLサーバーへの認証情報です - **hostname** は、MySQLサーバーのホスト名です - **port** は、MySQLサーバーにアクセスできるポート番号です。「:」はオプションであり、デフォルトでは3306と想定されます - **database** は、宛先データベースの名前です - **table** は、上記のデータベース内のテーブルの名前です。クエリ出力の実行時に存在しない場合もありますが、その場合はユーザーのために指定された名前のテーブルが作成されます ## オプション ジョブ結果のMySQLサーバーへの書き込みは、以下のオプションをサポートしています。 ### データを変更するモード(Append/Replace/Truncate/Update) データを4つの方法で追加または削除できます。 ``` mysql://user:password@host/database/table # append mysql://user:password@host/database/table?mode=append # append mysql://user:password@host/database/table?mode=replace # replace mysql://user:password@host/database/table?mode=truncate # truncate mysql://user:password@host/database/table?mode=update # update ``` 4つのモードすべてが**アトミック**です。 **「host」セクションでは、ポートも指定できます。** 以下は例です: ``` mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_info ``` #### APPEND これはデフォルトのモードです。クエリ結果はテーブルに追加されます。テーブルが存在しない場合は、新しいテーブルが作成されます。 #### REPLACE テーブルがすでに存在する場合、既存のテーブルの行はクエリ結果で置き換えられます。テーブルが存在しない場合は、新しいテーブルが作成されます。 **単一のトランザクション**で以下の3つのステップを実行することにより、**アトミック性**(テーブルのコンシューマーが常に一貫性のあるデータを持つように)を実現します。 1. 一時テーブルを作成します。 2. 一時テーブルに書き込みます。 3. ALTER TABLE RENAMEを使用して、既存のテーブルを一時テーブルで置き換えます。 replaceモードを使用すると、MySQLテーブルのスキーマが変更される可能性があります。ターゲットテーブルへのスキーマ変更を避けるには、「Preserve schema?」オプションを選択してください。 #### TRUNCATE システムは最初に既存のテーブルをトランケートし、次にクエリ結果を挿入します。テーブルが存在しない場合は、新しいテーブルが作成されます。 **REPLACEとは異なり、TRUNCATEはテーブルのインデックスを保持します。** #### UPDATE このモードは、以下のステップを実行することにより、新しいデータを挿入し、既存のデータを更新します。 1. 一時テーブルを作成します。 2. 一時テーブルに書き込みます。 3. 一時テーブルから宛先テーブルにデータを更新します。 4. 一時テーブルから宛先テーブルに残りのデータを挿入します。 一意キーを指定するには、`unique`パラメータを設定できます。これはキーのカンマ区切りのリストです。すべてのキーの値が既存のレコードのすべてと一致する場合、そのレコードは置き換えられます。以下は例です: ``` mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_infomode=update&unique=column1%2Ccolumn2 ``` CLIでは、パラメータ内のカンマはURLエンコードする必要があります(「,」は「%2C」にする必要があります)。 ### 追加オプション ジョブ結果のMySQLサーバーへの書き込みは、オプションのURLパラメータとして指定できる以下の追加オプションをサポートしています。 ## sslオプション **ssl**オプションは、MySQLサーバーへの接続にSSLを使用するかどうかを決定します。 ### ssl=true Treasure DataからMySQLサーバーへの接続にSSLを使用します。MySQLサーバーは、SSL接続を受け入れるように設定されている必要があります。 ``` mysql://user:password@host/database/table?ssl=true ``` ### ssl=false(デフォルト) Treasure DataからMySQLサーバーへSSLを使用しません。 ``` mysql://user:password@host/database/table?ssl=false ``` #### 文字エンコーディング Treasure Dataは常に文字エンコーディングとしてUTF-8を使用します。また、デフォルトでUTF-8を使用するようにデータベースを設定する必要があります。エンコーディングに関連する問題が発生した場合は、以下の設定を確認してください。 ``` mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ ``` #### MySQLのINT UNSIGNED型 MySQLへのジョブ結果は、MySQLのINT UNSIGNED型をサポートしていません。その値は予期しない値に変換されます。