Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード

2018-03-24

EC2 にログインしようとすると "Permission denied (publickey,gssapi-with-mic) " と怒られる

事象

EC2ログインしようとすると以下のエラーで怒られる。

% ssh -i ~/mykey.pem ec2-user@ec2-**-***-***-**.ap-northeast-1.compute.amazonaws.com
Permission denied (publickey,gssapi-with-mic).

原因

  • ユーザー名が間違っている。

SSH を使用してインスタンスに接続し、Host key not found in [directory]、Permission denied (publickey)、または Authentication failed, permission denied のいずれかのエラーが発生した場合は、AMI 用の適切なユーザー名で接続していて、なおかつインスタンス用の適切なプライベートキー (.pem)) ファイルを指定していることを確認します。MindTerm クライアントについては、[Connect To Your Instance] ウィンドウの [User name] ボックスにユーザー名を入力します。

適切なユーザー名は以下のとおりです。

  • Amazon Linux AMI の場合は、ユーザー名は ec2-user です。
  • Centos AMI の場合、ユーザー名は centos です。
  • Debian AMI の場合は、ユーザー名は admin または root です。
  • Fedora AMI の場合、ユーザー名は ec2-user です。
  • RHEL AMI の場合は、ユーザー名は ec2-user または root のどちらかです。
  • SUSE AMI の場合は、ユーザー名は ec2-user または root のどちらかです。
  • Ubuntu AMI の場合、ユーザー名は ubuntu または root. です。

それ以外の場合で、ec2-user および root が機能しない場合は、AMI プロバイダーに確認してください

インスタンスへの接続に関するトラブルシューティング - Amazon Elastic Compute Cloud

補足

  • EC2 ではなく ssh の話だが、AMI によってユーザー名が異なるので、思い込みで間違っていてこのエラーになることがあるのでメモ。

2018-03-03

MySQL クライアントのプロンプトを設定する

[mysql]
prompt='\\v \\u: [\\d] \\R:\\m> '
  • 接続してみる
azekyohe% mysql -h aurora01.*********.ap-northeast-1.rds.amazonaws.com -u awsuser -p
Enter password:

(中略)

5.6.10-log awsuser: [(none)] 04:39> use mydb;
5.6.10-log awsuser: [mydb] 04:39>

参考

2018-02-14

Amazon Linux で iperf を使ってみる

EC2インスタンスを2つ作成して両方に iperf をインストールし、片方でiperf をサーバとして起動し、もう片方から iperf をクライアントとして実行してベンチマークを取る。


インストール

$ sudo yum -y install git gcc
$ git clone https://github.com/esnet/iperf
$ cd iperf
$ ./configure
$ sudo make
$ sudo make install
$ sudo ldconfig

計測

サーバ側
$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
クライアント
$ iperf3 -c 172.31.30.119 -P 10
Connecting to host 172.31.30.119, port 5201
[  5] local 172.31.31.185 port 23094 connected to 172.31.30.119 port 5201
[  7] local 172.31.31.185 port 23096 connected to 172.31.30.119 port 5201
[  9] local 172.31.31.185 port 23098 connected to 172.31.30.119 port 5201
[ 11] local 172.31.31.185 port 23100 connected to 172.31.30.119 port 5201
[ 13] local 172.31.31.185 port 23102 connected to 172.31.30.119 port 5201
[ 15] local 172.31.31.185 port 23104 connected to 172.31.30.119 port 5201
[ 17] local 172.31.31.185 port 23106 connected to 172.31.30.119 port 5201
[ 19] local 172.31.31.185 port 23108 connected to 172.31.30.119 port 5201
[ 21] local 172.31.31.185 port 23110 connected to 172.31.30.119 port 5201
[ 23] local 172.31.31.185 port 23112 connected to 172.31.30.119 port 5201

(中略)

[SUM]   0.00-10.00  sec  24.5 GBytes  21.0 Gbits/sec   28             sender
[SUM]   0.00-10.03  sec  24.4 GBytes  20.9 Gbits/sec                  receiver

iperf Done.

参考

2017-12-10

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする には以下の用に JDBC URL に「connectionCollation=utf8mb4_bin」のように設定すれば良い。

jdbc:mysql://aurora01.cluster-*******.ap-northeast-1.rds.amazonaws.com:3306/mydb?connectionCollation=utf8mb4_bin

参考

MySQL クライアントプログラム mysql、mysqladmin、mysqlcheck、mysqlimport、および mysqlshow は、次のように、使用するデフォルトの文字セットを特定します。

  • ほかの情報が欠如している場合、プログラムは、コンパイル時のデフォルトの文字セット (通常は latin1) を使用します。
  • プログラムは、オペレーティングシステム設定 (たとえば、Unix システムでは LANG や LC_ALL ローカル環境変数の値、Windows システムではコードページ設定) に基づいて、使用する文字セットを自動検出できます。ロケールが OS から利用できるシステムの場合、クライアントはコンパイル時のデフォルトを使用するのではなく、このロケールを使用してデフォルトの文字セットを設定します。たとえば、LANG を ru_RU.KOI8-R に設定すると、koi8r 文字セットが使用されます。したがってユーザーは、MySQL クライアントが使用できるように、自身の環境内でロケールを構成できます。OS 文字セットは、正確に一致するものがない場合は、もっとも近い MySQL 文字セットにマップされます。一致した文字セットをサポートしていない場合、クライアントはコンパイルイ時のデフォルトを使用します。たとえば、ucs2 は接続文字セットとしてはサポートされていません。

C アプリケーションは、サーバーに接続する前に次のように mysql_options() を呼び出すことによって、OS 設定に基づいて文字セットの自動検出を使用できます。

mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
  • プログラムは --default-character-set オプションをサポートしており、ユーザーはこのオプションを使用すると文字セットを明示的に指定でき、クライアントがそれ以外のどのデフォルトを指定していても、それをオーバーライドできます。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.4 接続文字セットおよび照合順序

Use characterEncoding=utf8mb4& for jdbc url

jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8mb4
java - utf8mb4 in MySQL Workbench and JDBC - Stack Overflow

connectionCollation

If set, tells the server to use this collation via 'set collation_connection'

Since version: 3.0.13

MySQL :: MySQL Connector/J 5.1 Developer Guide :: 5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J

2017-12-07

LOAD DATA ステートメントで "Row X was truncated; it contained more data than there were input columns" が発生する

事象

LOAD DATA ステートメントで CSV ファイルをロードすると "Row X was truncated; it contained more data than there were input columns" というワーニングが発生し、全ての行がロードされていない。

mysql> LOAD DATA LOCAL INFILE 'test.csv' INTO TEST FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Query OK, 9 rows affected, 9 warnings (0.04 sec)
Records: 9  Deleted: 0  Skipped: 0  Warnings: 9

Warning (Code 1262): Row 1 was truncated; it contained more data than there were input columns
Warning (Code 1262): Row 2 was truncated; it contained more data than there were input columns
Warning (Code 1262): Row 3 was truncated; it contained more data than there were input columns

原因

  • CSV ファイルの改行コードが CRLF になっていたため。

解決策

  • CSV ファイルの改行コードを LF に変換してロードした。

環境

% mysql -V
mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using  EditLine wrapper

LOAD DATA ステートメントで発生したワーニングの内容を表示する

LOAD DATA で "Warnings: 48" のようにワーニングが発生した場合に、その内容を見たい場合は、

% mysql  --local-infile -h aurora01.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuser -p
mysql> LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE TEST FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Query OK, 34 rows affected, 48 warnings (0.06 sec)
Records: 34  Deleted: 0  Skipped: 0  Warnings: 48

MySQL クライアントで接続時に --show-warnings オプションをつけて接続すると表示される。

% mysql  --local-infile --show-warnings -h aurora01.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuser -p
mysql> LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE TEST FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Warning (Code 1265): Data truncated for column 'COL1' at row 1
Warning (Code 1262): Row 1 was truncated; it contained more data than there were input columns
Warning (Code 1262): Row 2 was truncated; it contained more data than there were input columns

参考

You should startup mysqld with log-warnings (it should be on by default) and also the max error count

[mysqld]
log-warnings
max-error-count=9999999999
You may have to start the mysql client with
SET SQL_WARNINGS = 1;

This is not mysqld setting, it's a mysql client session setting.

You may want to add show-warnings to mysql client session

mysql -u... -p -hlocalhost --show-warnings
mysql - How do I show warnings when loading data created from mysqldump? - Database Administrators Stack Exchange

Aurora MySQL互換に LOAD コマンドで CSV ファイルをロードしようとすると "ERROR 1148 (42000)" で失敗する

Aurora MySQL互換というより MySQL の話です。


事象

  • mysql クライアントで接続して、LOAD DATA ステートメントで CSV ファイルをロードしようとすると、"ERROR 1148 (42000): The used command is not allowed with this MySQL version" と怒られる。
% mysql  --local-infile -h aurora01.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuser -p
mysql> LOAD DATA LOCAL INFILE '.test.csv' INTO TABLE TEST FIELDS TERMINATED BY ',' ENCLOSED BY '"';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

原因

  • セキュリティ上の理由でデフォルトで LOAD DATA ステートメントが無効なため。

解決策

% mysql  --local-infile -h aurora01.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuser -p
mysql LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE TEST FIELDS TERMINATED BY ',' ENCLOSED BY '"';

参考

LOAD DATA ステートメントの LOCAL バージョンのサポートに関しては、セキュリティーについての潜在的な問題が 2 つあります。

  • クライアントホストからサーバーホストへのファイルの送信は、MySQL サーバーによって開始されます。理論的には、パッチ適用済みサーバーを構築して、LOAD DATA ステートメントでクライアントによって指定されたファイルでなく、サーバーが選択するファイルを転送するようサーバーがクライアントプログラムに指示するようにすることができます。そのようなサーバーは、クライアントユーザーが読み取りアクセス権を持つクライアントホスト上のすべてのファイルにアクセスできます。
  • クライアントが Web サーバーから接続する Web 環境で、ユーザーは LOAD DATA LOCAL を使用して、Web サーバープロセスが読み取りアクセス権を持つすべてのファイルを読み取ることができます (ユーザーが SQL Server に対してあらゆるコマンドを実行できる場合)。この環境では、MySQL サーバーを基準にしたときのクライアントは実際には Web サーバーであって、Web サーバーに接続するユーザーによって実行されているリモートプログラムではありません。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.6 LOAD DATA LOCAL のセキュリティーの問題

You can specify that as an additional option when setting up your client connection:

mysql -u myuser -p --local-infile somedatabase

This is because that feature opens a security hole. So you have to enable it manually in case you really want to use it.

sql - ERROR 1148: The used command is not allowed with this MySQL version - Stack Overflow

mysql コマンド行クライアントの場合、--local-infile[=1] オプションを指定することによって LOAD DATA LOCAL を有効にするか、--local-infile=0 オプションを指定することによってこれを無効にします。mysqlimport の場合、ローカルデータファイルのロードはデフォルトでオフになっており、--local または -L オプションを使用してこれを有効にします。いずれの場合でも、ローカルロード操作を正常に使用するには、サーバーがこの操作を許可していることが必要。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.6 LOAD DATA LOCAL のセキュリティーの問題