【DBeaver】作ったデータベースが消えてしまった!


起きたこと

『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』
の「12-付録 実習の準備方法」を進めています。
(作業内容=Qiita記事「PostgreSQL実習環境の準備_『OSS-DB標準教科書』」

この作業内容記事の「2.DBeaverでDB(ossdb)を作成」「3.DBeaverでテーブルを作成」の通り、DBeaverで「ossdb」という名前のデータベースとテーブルを作成しました。

【データベース作成当時の画面】

作成後、一度DBeaverを閉じ、後日、その続きを進めようとDBeaverを立ち上げたところ、作成したデータベース「ossdb」がまるごと消えていました。

【データベースが消えた画面】

これでは教科書の続きを進めることができません。
対処方法を調べます。

環境

ホストPC:Windows10
GUI DBツール:DBeaver
仮想化ソフト:VirtualBox
ゲストPC:Vagrant(=CentOS7=仮想マシン)
コンテナ型仮想環境:Docker
CUI DBクライアント:PostgreSQL

試行錯誤1.もう一度同じ名前のDBを作成してみる

まず、「ossdb」がまるっと消えたと仮定し、新規で「ossdb」を作成しようと試みました。

[first_tutorial]上で右クリック→「作成」→「データベース」
→出てきたダイアログボックスに「ossdb」と入力(下図)→「OK」

すると、下図エラーが発生。

「database "ossdb" already exists」
データベースは消えていたなかったということでしょうか。
仮定は間違いでした。

では、なぜ見かけ上消えてしまっているのでしょうか・・・?

試行錯誤2.検索にかけてみる

1.下図検索窓に「ossdb」と入力し、「Enter」。

2.下図のように、first_tutorialのプロパティが表示された。

なぜーー???
「ossdb」を表示して欲しいのに...!

試行錯誤3.一度ossdbを削除するコマンドを実行し、再度新規作成する

今、DBeaverで見かけ上見えなくなっているデータベース「ossdb」。
PowerShellのコマンドでなら削除できるかもしれません。
現在PowerShellの状態は下画のとおり。
「first_tutlrial=#」。
ここに、データベース削除するコマンドを打ち込みます。

(↓参考:『OSS教科書 OSS-DB Silver Ver.2.0対応』p81「4-7 dropdb」)

PowerShell
# dropdb -U used -i ossdb

実行したPowerShell画面がこちら。

変化なし!!

DBeaverで試行錯誤1の方法をもう一度実行し「ossdb」を新規作成しようとしてみましたが、また「database "ossdb" already exists」というエラーが出ました。
「ossdb」はまだどこかに存在している状態のようです。

ここで気になったのが、OSS教科書にあったこちらの表記。

データベースを削除できるのは、スーパーユーザ、もしくは削除するデータベースの所有者だけです(所有者であれば、データベースの作成権限は不要です。)
(引用元:『OSS教科書 OSS-DB Silver Ver.2.0対応』p81「4-7 dropdb」)

その次に例として出されているコマンドの表記が、
「$ dropdb -U postgres -i testdb」となっています。
私の画面だと「#」マーク。教科書の例だと「$」マーク。

OSS教科書には、

本書では、シャープ(#)で始まるコマンド行はrootユーザで実行します。ドルマーク($)で始まるコマンド行は一般ユーザーで実行します。
(引用元:『OSS教科書 OSS-DB Silver Ver.2.0対応』p48「3-1-1 事前準備」)

とあります。
教科書は「$」の一般ユーザで実行されているようです。
私のPowerShellは今「#」マーク表記になっていますが、これは何ユーザなのでしょうか?
「PostgreSQLを操作するためのユーザ」であると思うのですが、これは「一般ユーザ」の部類に入るのでしょうか?
仮にここを「$」に切り替え、その状態で「dropdb -U used -i ossdb」を実行したら、「ossdb」の削除は実行できるのでしょうか?

なんだか違う気がする・・・。
目的は「ossdb」をDBeaver上に表示させることです。それをかなえるためにはどうすれば良いのでしょうか?

試行錯誤4.ossdbのことは忘れて「first_tutorial」に「ossdb-a」を作成する

ossdbはどこへ行ったのか、謎のままですが、
こうしていては先へ進めないので、標準教科書とは別の名前のデータベースを新規作成することにしました。

[first_tutorial]上で右クリック→「作成」→「データベース」
→出てきたダイアログボックスに「ossdb」と入力(下図)→「OK」

できました!
また消えてしまわれても困るので、いちどDBeaverを閉じて再度立ち上げ、消えないか確認します。

DBeaver再起動!

・・・・・・また消えてしまいました。
新たに「ossdb-a」を作成しようとしても、やはり同じ「database "ossdb-a" already exists」のエラーが出ました。

あれかな、DBeaverを閉じる前に、「上書き保存」的なのをしなきゃならないのかな?
と思い見てみるも、

この通り反転していて選択できない状態。
試しに「ossdb-b」を作って同じ動作をしても、やはり反転していて選択できませんでした。

結論

データベース「first_tutorial」をそのまま使うことにしました。
その中に新たにデータベースを作るのではなく。

標準教科書の記載はこうです。

[root@ localhost ~]# su - postgres
[postgres@ localhost ~]$ createdb ossdb
[postgres@ localhost ~]$ psql ossdb psql (10. 1)
Type "help" for help. ossdb =#
(引用元:宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.4300-4305). LPI-Japan. Kindle 版.-12.1 データベースの作成)

PowerShellの状態はこうです。

PowerShell
[vagrant@localhost docker]$ docker exec -it postgres_container /bin/bash
root@************:/# psql -U user first_tutorial
psql (10.16 (Debian 10.16-1.pgdg90+1))
Type "help" for help.

first_tutorial=#

これは、標準教科書は「ossdb」を作ったけれど、わろ先生のお手本コマンドでは、同等の位置づけで「first_tutorial」を作った、ということなのでは?

だとしたら、標準教科書の「ossdb」を「first_tutorial」と置き換えて標準教科書の内容を進めれば良いのではないか???
→師匠より「その通り そこが異なっていても学習は進めれる」とのコメントいただきました。
ossdbがどこへ消えたのか謎のままですが、そこは今後DBeaverを使っていくうちにわかるかもしれないので、今はfirst_tutorialで教科書を進めます!