作業ノート

様々なまとめ、雑感など

Oracleで「user」という名前のテーブルが作成できなかった

最近、既存システムを刷新することになり、その調査で知ったこと。

Oracleを使用することが決まっていて、プロジェクトの要件、使用するフレームワークなどを確認する過程で、試しにuserという名前のテーブルを作成しようとしたところ、

SQL> create table user (id  number not null, name varchar2(255) not null);
create table user (id number not null, name varchar2(255) not null)
             *
行1でエラーが発生しました。 :
ORA-00903: 表名が無効です。

作成できなかった。試したOracleは12c(12.1.0.2.0)。

他に、カラム名をuserにすると、そのテーブルは作成できない。

SQL> create table foo (id number not null, user varchar2(128) not null);
create table foo (id number not null, user varchar2(128) not null)
                                      *
行1でエラーが発生しました。:
ORA-00904: : 無効な識別子です。

調べたところ、userはSQLの予約語であり、テーブル名などの識別子として使えない。また、この制約は12cに限ったことではない。

Oracleでは、予約語をV$RESERVED_WORDSで確認できる。

SQL> set linesize 150
SQL> col RESERVED format a8
SQL> col RES_TYPE format a8
SQL> col RES_ATTR format a8
SQL> col RES_SEMI format a8
SQL> col DUPLICATE format a8
SQL> select * from V$RESERVED_WORDS where keyword = 'USER';

KEYWORD                            LENGTH RESERVED RES_TYPE RES_ATTR RES_SEMI DUPLICAT     CON_ID
------------------------------ ---------- -------- -------- -------- -------- -------- ----------
USER                                    4 N        N        N        Y        N                 0

リファレンスによると、YになっているRES_SEMIは、DMLなどのSQLで識別子として利用できない、とのこと。

どうしても予約語を使ったテーブルを作成したい場合は、識別子としてみなされないようにするために引用符をつける。

SQL> create table "user" (id number not null, name varchar2(128) not null);

表が作成されました。

SQL> desc "user";
名前                                       NULL?    型
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER
NAME                                      NOT NULL VARCHAR2(128)

SQL> create table foo (id number not null, "user" varchar2(128) not null);

表が作成されました。

SQL> desc foo;
名前                                       NULL?    型
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER
user                                      NOT NULL VARCHAR2(128)

確かに作成できるが、SQLで指定するときは必ず引用符が必要になる。また、ドキュメントでは、引用符を用いた方法は推奨されていないので、識別子とみなされるワードを使用するのは避けたほうがいい。

参考

curlコマンドでHTTPレスポンスのヘッダを確認する

以前クリックジャッキングの対応で、X-Frame-Optionsヘッダを出力するようにhttpdの設定を変更したが、その確認でcurlを使って確認した時の方法。

$ curl -s -D - http://www.example.com -o /dev/null
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Mon, 03 Aug 2015 15:04:03 GMT
Etag: "359670651"
Expires: Mon, 10 Aug 2015 15:04:03 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (pae/3796)
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270

-sは、curlをサイレントモードで実行する。curlは標準エラー出力に進捗を表示するが、このオプションをつけると表示されない。

-Dは、ヘッダを表示するオプション。このオプションには出力先ファイル名を指定するが、-を指定するとヘッダは標準出力に出力される。

-oは、レスポンスボディをファイルに出力する。オプションを指定しないと標準出力に出力されるが、このオプションに/dev/nullを指定して、標準出力に出力されないようにしている。

参考

Vagrantのディスク容量を増やす

開発の過程で、開発用のVagrantのディスク容量が足りなくなったので、増やすことにした。

VirtualBoxのゲストOSのディスク容量を増やすでまとめた方法は、ディスクイメージがVDI形式の場合。VagrantのディスクイメージはVMDKなので、この手順では増やせない。

そこでこのエントリでは、VMDK形式のディスクイメージを増やす手順をまとめた。

手順は以下のとおり。

  • 容量を増やすVMDK形式の仮想ディスクから、VDI形式の仮想ディスクを作成する。
  • 作成したディスクの容量を増やす。
  • 容量を増やしたVDI形式の仮想ディスクから、VMDK形式の仮想ディスクを作成する。
  • ゲストOSの仮想ディスクを差し替える。
  • 後処理

今回は、容量を8GiBから20GiBに増やす。

ゲストOSを停止する

対象のゲストOSを停止する。

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

VDI形式の仮想ディスクを作成する

ゲストOSの仮想マシンディレクトリに移動する。

$ cd ~/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811
$ ls
Logs/                                              blog-sample_default_1438086650392_98811.vbox-prev
blog-sample_default_1438086650392_98811.vbox       box-disk1.vmdk

VBoxManage clonehdでVDI形式の仮想ディスクを作成する。

$ VBoxManage clonehd "box-disk1.vmdk" "clone-disk1.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vdi'. UUID: 05b1c324-01fe-462c-9834-78de2c46a5a3

作成した仮想ディスクの情報。

$ VBoxManage showhdinfo clone-disk1.vdi
UUID:           05b1c324-01fe-462c-9834-78de2c46a5a3
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       8192 MBytes
Size on disk:   1508 MBytes

作成したディスクの容量を増やす

VBoxManage modifyhdで容量を増やす。--resizeで指定した値は、20(GB) * 1024(MB) = 20480。

$ VBoxManage modifyhd clone-disk1.vdi --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

容量を増やした仮想ディスクの情報。

$ VBoxManage showhdinfo clone-disk1.vdi
UUID:           05b1c324-01fe-462c-9834-78de2c46a5a3
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1508 MBytes

Capacityが、8192から20480に変わっていることを確認する。

VMDK形式の仮想ディスクを作成する

VBoxManage clonehdでVMDK形式の仮想ディスクを作成する。

$ VBoxManage clonehd "clone-disk1.vdi" "box-disk2.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vmdk'. UUID: d224e6fc-5b52-438b-9f95-b9310276ca75

作成した仮想ディスクの情報。

$ VBoxManage showhdinfo box-disk2.vmdk
UUID:           d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1482 MBytes

ゲストOSの仮想ディスクを差し替える

VBoxManage showvminfoで、仮想マシンの仮想ディスクの情報を確認する。

$ VBoxManage showvminfo blog-sample_default_1438086650392_98811 | grep ".vmdk"
SATA (0, 0): /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk1.vmdk (UUID: 550be626-6968-4c71-b34b-23023fceb55f)

VBoxManage storageattachで仮想ディスクを差し替える。

$ VBoxManage storageattach blog-sample_default_1438086650392_98811 \
--storagectl "SATA" --port 0 --device 0 \
--type hdd --medium box-disk2.vmdk

VBoxManage showvminfoで、仮想マシンの仮想ディスクが変更されていることを確認する。

$ VBoxManage showvminfo blog-sample_default_1438086650392_98811 | grep -i vmdk
SATA (0, 0): /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk (UUID: d224e6fc-5b52-438b-9f95-b9310276ca75)

入れ替えた仮想ディスクをVBoxManage showhdinfoで確認する。

$ VBoxManage showhdinfo box-disk2.vmdk
UUID:           d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   1482 MBytes
In use by VMs:  blog-sample_default_1438086650392_98811 (UUID: 4ee3a11c-bab7-4069-9831-a4b59208d0df)

In use by VMsの項目が増えていることを確認する。

ゲストOSを起動して確認する

Vagrantfileのあるディレクトリに移動し、vagrant upを実行してゲストOSが起動することを確認する。

$ vagrant up

今回試したゲストOS(CentOS 7.1 x86_64)で、変更後の状態。

[vagrant@localhost ~]$ df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.7G  1.3G  5.5G   19% /
devtmpfs                  236M     0  236M    0% /dev
tmpfs                     245M     0  245M    0% /dev/shm
tmpfs                     245M  4.3M  241M    2% /run
tmpfs                     245M     0  245M    0% /sys/fs/cgroup
/dev/sda1                 497M  126M  371M   26% /boot
none                      232G   51G  182G   22% /vagrant

[vagrant@localhost ~]$ sudo fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x0009977c

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    16777215     7875584   8e  Linux LVM

Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト


Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

ディスク全体は増えたがパーティションの容量は変わっていないので、それを増やす必要がある。 その手順はVirtualBoxのゲストOSのディスク容量を増やすにまとめているので、ここでは省略する。

後処理

ゲストOSを停止する。

$ vagrant halt

VDIの仮想ディスクと容量増加前の仮想ディスクをVirtualBoxの管理下から外す。

$ VBoxManage closemedium disk clone-disk1.vdi
$ VBoxManage closemedium disk box-disk1.vmdk

VBoxManage list hddsで外した仮想ディスクが一覧に表示されないことを確認する。

$ VBoxManage list hdds
UUID:           d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Capacity:       20480 MBytes

VDIの仮想ディスクは削除する。

$ rm clone-disk1.vdi

参考