Hatena::ブログ(Diary)

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

2017-09-18

sqlplus から Oracle Database に接続すると ORA-21561 で失敗する

事象

sqlplus から Oracle Database に接続すると ORA-21561 で失敗する。

% sqlplus awsuser/******@******.******.ap-northeast-1.rds.amazonaws.com:1521/ORCL

SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 18 22:37:57 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-21561: OID generation failed

ORA-21561: OID生成に失敗しました

原因: 渡されたハンドルが有効でない可能性があります。

処置: env、svcハンドルの妥当性を確認してください。

docs.oracle.com 404 error. We’re sorry, the page does not exist or is no longer available.

原因

  • /etc/hosts にホスト名のマッピングがない、もしくは間違っている。

Incorrect /etc/hosts mapping for the client machine or no mapping at all.

Sfaturi Oracle / Tips and tricks OracleDBA: ORA-21561 : OID generation failed

対処

  • ホスト名を確認する
% uname -n
******.***.foo.com
  • /etc/hosts に追記する
% sudo vi /etc/hosts
127.0.0.1	localhost ******.***.foo.com

環境


参考

2017-09-15

MySQL で NOT NULL 制約のある列に複数行インサートするとその型のデフォルト値が入る

MySQLSQL モードが STRICT モードでない場合、NOT NULL 制約のある列に複数行インサートするとその型のデフォルト値(0とか空文字)が入る(1行インサートだとエラーで入らない)。


検証結果

  • Amazon Aurora with MySQL Compatibility に接続する
$ mysql -h ******.******.ap-northeast-1.rds.amazonaws.com -u awsuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mydb;
Database changed
  • テーブルを作成する
mysql> create table `not_null_test` (
    ->   `id` int(10) unsigned not null,
    ->   `int_col` int(10) unsigned not null,
    ->   `char_col` char(10)  not null,
    ->   `ts_col` timestamp not null,
    ->   primary key (`id`)
    -> ) engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.05 sec)
  • SQL モードは設定されていない
mysql> select @@global.sql_mode;
+-------------------+
| @@global.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.02 sec)
  • 1行インサートはエラーになる
mysql> insert into not_null_test (id, int_col, char_col, ts_col) values (1, null, null, null);
ERROR 1048 (23000): Column 'int_col' cannot be null
  • 複数行インサートは成功する
mysql> insert into not_null_test (id, int_col, char_col, ts_col) values (1, null, null, null), (2, null, null, null);
Query OK, 2 rows affected, 4 warnings (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 4
  • テーブルのデータを確認する
mysql> select * from not_null_test;
+----+---------+----------+---------------------+
| id | int_col | char_col | ts_col              |
+----+---------+----------+---------------------+
|  1 |       0 |          | 2017-09-15 06:54:07 |
|  2 |       0 |          | 2017-09-15 06:54:07 |
+----+---------+----------+---------------------+
2 rows in set (0.02 sec)
  • SQLモードを STRICT_ALL_TABLES にする
mysql> set sql_mode='strict_all_tables';
Query OK, 0 rows affected (0.03 sec)
  • 1行インサートは失敗する
mysql> insert into not_null_test (id, int_col, char_col, ts_col) values (1, null, null, null);
ERROR 1048 (23000): Column 'int_col' cannot be null
  • 複数行インサートも失敗する
mysql> insert into not_null_test (id, int_col, char_col, ts_col) values (1, null, null, null), (2, null, null, null);
ERROR 1048 (23000): Column 'int_col' cannot be nul

参考

単列インサートの場合はNOT NULLが指定されたカラムにNULL値が挿入されるとそのクエリはエラーとなって失敗するが、複数列インサートの場合は警告(warning)を発するものの、クエリは正常に受け付けられる。

その際、NULL値が指定された各カラムにはそれぞれのカラムのデータ型の暗黙的なデフォルト値が挿入される。(数値型なら0、文字列型なら空文字''、etc…)

MySQLにおけるNOT NULLカラムへのインサート時の挙動 - Sojiro’s Blog

NOT NULL として宣言されているカラムへの NULL の挿入。複数行の INSERT ステートメントまたは INSERT INTO ... SELECT ステートメントの場合、このカラムは、そのカラムデータ型の暗黙のデフォルト値に設定されます。これは、数値型では 0、文字列型では空の文字列 ('')、および日付と時間型では「0」の値です。サーバーは SELECT からの結果セットを検査して、それが単一行を返すかどうかを確認しないため、INSERT INTO ... SELECT ステートメントは複数行の挿入と同じ方法で処理されます。(単一行の INSERT の場合は、NULL が NOT NULL カラムに挿入されても警告は発生しません。代わりに、このステートメントがエラーで失敗します。)

no title

明示的な DEFAULT 句のない NOT NULL カラムに対するデータエントリでは、INSERT または REPLACE ステートメントにカラムの値を含まれていない場合、または UPDATE ステートメントがカラムを NULL に設定する場合、MySQL はその時点で有効な SQL モードに従ってカラムを処理します。

(中略)

セクション5.1.7「サーバー SQL モード」を参照してください。

所定のテーブルに対して、SHOW CREATE TABLE ステートメントを使用すると、どのカラムに明示的な DEFAULT 句があるかを確認できます。

暗黙的なデフォルトは次のように定義されます。

  • 数値型のデフォルトは 0 です。ただし、例外として AUTO_INCREMENT 属性で宣言された整数型または浮動小数点型のデフォルトは、そのシーケンスの次の値になります。
  • TIMESTAMP 以外の日付と時間型のデフォルトには、「ゼロ」値が適切です。explicit_defaults_for_timestamp システム変数が有効な場合、これは TIMESTAMP にも当てはまります (セクション5.1.4「サーバーシステム変数」を参照してください)。それ以外の場合、テーブルの最初の TIMESTAMP カラムのデフォルト値は現在の日付と時間になります。セクション11.3「日付と時間型」を参照してください。
  • ENUM ではない文字列型のデフォルト値は空の文字列です。ENUMデフォルトは、最初の列挙値です。
no title

厳密モードは、MySQL が INSERT や UPDATE などのデータ変更ステートメントで無効な値または欠落した値を処理する方法を制御します。値はいくつかの理由で無効になることがあります。たとえば、カラムに対して正しくないデータ型を持っていたり、範囲外であったりすることがあります。値の欠落が発生するのは、挿入される新しい行の非 NULL カラムに値が含まれておらず、そのカラムに明示的な DEFAULT 句が定義されていない場合です。(NULL カラムの場合、値が欠落しているときは NULL が挿入されます。)

厳密モードが有効でない場合、MySQL は無効または欠落した値に対して調整された値を挿入し、警告を生成します (セクション13.7.5.41「SHOW WARNINGS 構文」を参照してください)。厳密モードでは、INSERT IGNORE または UPDATE IGNORE を使用すると、この動作を実行できます。

データを変更しない SELECT などのステートメントの場合、厳密モードでは無効な値はエラーでなく警告を生成します。

厳密モードは、外部キー制約が検査されるかどうかに影響されません。foreign_key_checks を検査に使用できます。(セクション5.1.4「サーバーシステム変数」を参照してください。)

no title

2017-09-10

Amazon RDS for Oracle で起動しているプロセスを確認する

Amazon RDS for Oracle で起動しているプロセスは V$PROCESS で確認できる。*1

$ export _JAVA_OPTIONS="-Duser.language=en -Duser.country=US"
$ sql awsuser@orcl.******.ap-northeast-1.rds.amazonaws.com:1521/orcl
Picked up _JAVA_OPTIONS: -Duser.language=en -Duser.country=US

SQLcl: Release 4.2.0 Production on Sun Sep 10 12:27:40 2017

Copyright (c) 1982, 2017, Oracle.  All rights reserved.


	New version: 4.1.0 available to download

Password? (**********?) *************
Last Successful login time: Sun Sep 10 2017 12:27:49 +09:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options


SQL> set sqlformat ansiconsole
SQL> select * from v$process;
ADDR              PID  SOSID  SPID   STID   EXECUTION_TYPE  PNAME  USERNAME  SERIAL#  TERMINAL  PROGRAM                     TRACEID  TRACEFILE                                                        BACKGROUND  LATCHWAIT  LATCHSPIN  PGA_USED_MEM  PGA_ALLOC_MEM  PGA_FREEABLE_MEM  PGA_MAX_MEM  CON_ID
0000000344B0E280  1                         NONE                             0                  PSEUDO                               /rdsdbdata/log/diag/rdbms/orcl_a/ORCL/trace/ORCL_ora_0.trc                                         0             0              0                 0            0
0000000344B0F028  2    12011  12011  12011  PROCESS         PMON   rdsdb     1        UNKNOWN   oracle@ip-10-7-2-38 (PMON)           /rdsdbdata/log/diag/rdbms/orcl_a/ORCL/trace/ORCL_pmon_12011.trc  1                                 797036        974508         0                 974508       0
0000000344B0FDD0  3    12013  12013  12013  PROCESS         PSP0   rdsdb     1        UNKNOWN   oracle@ip-10-7-2-38 (PSP0)           /rdsdbdata/log/diag/rdbms/orcl_a/ORCL/trace/ORCL_psp0_12013.trc  1                                 772748        949716         0                 949716       0
0000000344B10B78  4    12015  12015  12015  PROCESS         VKTM   rdsdb     1        UNKNOWN   oracle@ip-10-7-2-38 (VKTM)           /rdsdbdata/log/diag/rdbms/orcl_a/ORCL/trace/ORCL_vktm_12015.trc  1                                 769508        949716         0                 949716       0
0000000344B11920  5    12019  12019  12019  PROCESS         GEN0   rdsdb     1        UNKNOWN   oracle@ip-10-7-2-38 (GEN0)           /rdsdbdata/log/diag/rdbms/orcl_a/ORCL/trace/ORCL_gen0_12019.trc  1                                 778644        958084         0                 958084       0
(以下略)

参考

*1クライアントはSQLclを使用

2017-04-20

Amazon Aurora に MySQL Client on macOS から接続する

インストール

$ brew install mysql --client-only
  • バージョンを確認する
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using  EditLine wrapper

Amazon Aurora のインスタンスを起動する

  • AWSコンソールで Aurora のインスタンスを起動する

接続してみる

  • Amazon Aurora に接続する
$ mysql -h mydbinstance-cluster.cluster-******.us-east-1.rds.amazonaws.com -u master -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 55
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.20 sec)
mysql> create database test;
Query OK, 1 row affected (0.17 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.16 sec)
mysql> use test;
Database changed
  • テーブルを作成する
mysql> create table test(col1 int, col2 varchar(255));
Query OK, 0 rows affected (0.18 sec)
  • レコードを insert する
mysql> insert into test(col1, col2) values(1, '  Work hard, Have fun, Make History!!  ');
Query OK, 1 row affected (0.17 sec)

mysql> insert into test(col1, col2) values(2, 'Work hard, Have fun, Make History!!');
Query OK, 1 row affected (0.17 sec)
  • insert した行を確認する
mysql> select * from test;
+------+-----------------------------------------+
| col1 | col2                                    |
+------+-----------------------------------------+
|    1 |   Work hard, Have fun, Make History!!   |
|    2 | Work hard, Have fun, Make History!!     |
+------+-----------------------------------------+
2 rows in set (0.17 sec)
  • もう1行 insert して確認してみる
mysql> insert into test(col1, col2) values(1, '  Work hard, Have fun, Make History!!                 ');
Query OK, 1 row affected (0.16 sec)

mysql> select * from test;
+------+--------------------------------------------------------+
| col1 | col2                                                   |
+------+--------------------------------------------------------+
|    1 |   Work hard, Have fun, Make History!!                  |
|    2 | Work hard, Have fun, Make History!!                    |
|    1 |   Work hard, Have fun, Make History!!                  |
+------+--------------------------------------------------------+
3 rows in set (0.18 sec)

追記(2017/05/12):

mysql> use mydb
Database changed

mysql> create table test(col1 int, col2 char(30));
Query OK, 0 rows affected (0.25 sec)

mysql> insert into test(col1, col2) values(1, 'Make History!!');
Query OK, 1 row affected (0.23 sec)

mysql> select * from test;
+------+----------------+
| col1 | col2           |
+------+----------------+
|    1 | Make History!! |
+------+----------------+
1 row in set (0.34 sec)

mysql> insert into test(col1, col2) values(1, 'Make History!!     ');
Query OK, 1 row affected (0.23 sec)

mysql> select * from test;
+------+----------------+
| col1 | col2           |
+------+----------------+
|    1 | Make History!! |
|    1 | Make History!! |
+------+----------------+
2 rows in set (0.31 sec)

mysql> SELECT @@SESSION.sql_mode;
+--------------------+
| @@SESSION.sql_mode |
+--------------------+
|                    |
+--------------------+
1 row in set (0.33 sec)

mysql> SET SESSION sql_mode='PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.25 sec)

mysql> SELECT @@SESSION.sql_mode;
+-------------------------+
| @@SESSION.sql_mode      |
+-------------------------+
| PAD_CHAR_TO_FULL_LENGTH |
+-------------------------+
1 row in set (0.23 sec)

mysql> SELECT EVENT_NAME FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'Common';
ERROR 2013 (HY000): Lost connection to MySQL server during query

参考

2016-10-25

tar の解凍結果を -O オプションで標準出力する

tar で解凍するときに標準出力したい場合は -O オプションをつければよい。


書式

  • 全て解凍して標準出力
tar xfvz sqlcl.tar.gz -O
  • 特定のファイルのみ解凍して標準出力
tar xfvz sqlcl.tar.gz -O sqlcl/bin/sql

実行例

$ tar cfz sqlcl.tar.gz sqlcl
$ tar tfz sqlcl.tar.gz sqlcl
sqlcl/
sqlcl/lib/
sqlcl/lib/jline-2.12.1.jar
sqlcl/lib/oracle.sqldeveloper.sqlcl.jar
sqlcl/lib/ojdbc6.jar
sqlcl/lib/jsch.jar
sqlcl/lib/SQLinForm.jar
sqlcl/lib/xmlparserv2.jar
sqlcl/lib/orai18n-mapping.jar
sqlcl/lib/xdb6.jar
sqlcl/lib/orai18n-utility.jar
sqlcl/lib/oracle.dbtools-common.jar
sqlcl/lib/orai18n.jar
sqlcl/bin/
sqlcl/bin/sql
sqlcl/bin/sql.exe
sqlcl/bin/sql.bat
$ tar xfvz sqlcl.tar.gz -O sqlcl/bin/sql|head
sqlcl/bin/sql
#!/bin/bash
########################################################################
#  (@)sql.sh
#
#  Copyright 2014 by Oracle Corporation,
#  500 Oracle Parkway, Redwood Shores, California, 94065, U.S.A.
#  All rights reserved.
#
#  This software is the confidential and proprietary information
#  of Oracle Corporation.

参考

tar -O -xzvf bar.tar.gz | grep 'foo'

gzipと違い-Oオプションが--stdoutで、解凍結果を標準出力にだします

gzやtar.gzに固められたログをgrepする - kanonjiの日記
NAME         top

       tar - an archiving utility
SYNOPSIS         top

   Traditional usage
       tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]

   UNIX-style usage
       tar -A [OPTIONS] ARCHIVE ARCHIVE

       tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

       tar -d [-f ARCHIVE] [OPTIONS] [FILE...]

       tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]

       tar -r [-f ARCHIVE] [OPTIONS] [FILE...]

       tar -u [-f ARCHIVE] [OPTIONS] [FILE...]

       tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]

   GNU-style usage
       tar {--catenate|--concatenate} [OPTIONS] ARCHIVE ARCHIVE

       tar --create [--file ARCHIVE] [OPTIONS] [FILE...]

       tar {--diff|--compare} [--file ARCHIVE] [OPTIONS] [FILE...]

       tar --delete [--file ARCHIVE] [OPTIONS] [MEMBER...]

       tar --append [-f ARCHIVE] [OPTIONS] [FILE...]

       tar --list [-f ARCHIVE] [OPTIONS] [MEMBER...]

       tar --test-label [--file ARCHIVE] [OPTIONS] [LABEL...]

       tar --update [--file ARCHIVE] [OPTIONS] [FILE...]

       tar --update [-f ARCHIVE] [OPTIONS] [FILE...]

       tar {--extract|--get} [-f ARCHIVE] [OPTIONS] [MEMBER...]