偶數(shù)社區(qū)投稿丨OushuDB學(xué)習(xí)實(shí)踐系列(一):開一家超市
2023-03-03 18:08 作者:偶數(shù)實(shí)驗(yàn)室 | 我要投稿
為了更方便理解 OushuDB 以及相關(guān)操作,本系列內(nèi)容中,設(shè)計(jì)了一個(gè)場(chǎng)景——開一家超市。
啟動(dòng)環(huán)境
最開始,我們還是要先啟動(dòng)整個(gè)環(huán)境。打開 terminal,并執(zhí)行。# 設(shè)置OushuDB的環(huán)境變量,并執(zhí)行(執(zhí)行后沒有任何輸出返回,是正常的)
source /usr/local/oushu/oushudb/oushudb_path.sh
# 啟動(dòng)hdfs
start-dfs.sh
# 啟動(dòng)整個(gè)oushuDB集群,和magma
oushudb start cluster -a --with_magma
# 單獨(dú)啟動(dòng)magma
magma start cluster
開一個(gè)超市
你打算開一個(gè)超市,但是有很多商品,你需要一個(gè)管理商品、進(jìn)貨、交易等的流程。
首先,你想到,需要幾張表格,分別記錄:
- 商品表:商品的名稱、價(jià)格、數(shù)量等。
- 交易訂單表:記錄賣出了哪些商品
- .......
多張表組成的系統(tǒng),我們就稱之為數(shù)據(jù)庫(kù)系統(tǒng)。
- 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
psql -d postgres
# 創(chuàng)建數(shù)據(jù)庫(kù) (很多輸入是大寫的,大家可以在鍵盤上按“CAPS LOCK”鍵打開大寫輸入,方便書寫,需要小寫時(shí)再切回來(lái))
postgres=# CREATE DATABASE supermarket;
CREATE DATABASE
# 查看有哪些數(shù)據(jù)庫(kù),我們會(huì)看到有了一個(gè)supermarket
postgres=# \l
List of databases
Name | Owner | Encoding | Access privileges
-------------+---------+----------+-------------------
postgres | gpadmin | UTF8 |
supermarket | gpadmin | UTF8 |
template0 | gpadmin | UTF8 |
template1 | gpadmin | UTF8 |
(4rows)
# 查看的另一種方式:檢查系統(tǒng)表pg_database, 查看datname字段(!注意不是dataname)
postgres=# select datname from pg_database;
datname
-------------
template1
template0
postgres
supermarket
(4rows)開了一家超市,你自然就是這個(gè)超市的主人,同樣的,當(dāng)你創(chuàng)建數(shù)據(jù)庫(kù)后,你就自動(dòng)成為了這個(gè)新數(shù)據(jù)庫(kù)的主人(所有者),以后開不開這家超市,是否刪除掉這個(gè)數(shù)據(jù)庫(kù),都是你來(lái)決定。
現(xiàn)在,我們退出數(shù)據(jù)庫(kù),重新進(jìn)入 supermarket 庫(kù)。# 退出posgres數(shù)據(jù)庫(kù) (在unix類系統(tǒng)中,'\'一般表示執(zhí)行,q全稱是quit,一般表示退出)
postgres=# \q
[gpadmin@localhost ~]$
# 進(jìn)入到數(shù)據(jù)庫(kù)supermarket
[gpadmin@localhost ~]$ psql -d supermarket
psql (8.2.15)
Type "help" for help.
supermarket=# 由此,可看出 psql -d 命令,后面跟的是數(shù)據(jù)庫(kù)的名稱
給超市起一個(gè)獨(dú)特的名字
supermarket 這個(gè)名字,太大眾、普通了?,F(xiàn)在我想給我的超市起一個(gè)特別的名字,恰好最近正值春節(jié),闔家歡樂之際,我們所求的不過(guò)是一家人幸福安康,我們就叫"歡樂超市"吧,英文就翻譯為 happymarket 吧!
現(xiàn)在,我們?cè)賱?chuàng)建一個(gè)名為 happymarket 的數(shù)據(jù)庫(kù):supermarket=# CREATE DATABASE happymarket;
CREATE DATABASE
supermarket=# \l
List of databases
Name | Owner | Encoding | Access privileges
-------------+---------+----------+-------------------
happymarket | gpadmin | UTF8 |
postgres | gpadmin | UTF8 |
supermarket | gpadmin | UTF8 |
template0 | gpadmin | UTF8 |
template1 | gpadmin | UTF8 |
(5 rows)
好了,現(xiàn)在歡樂超市的庫(kù)也建完了。但是,之前的 supermarket 這個(gè)庫(kù),我們不想要了,需要?jiǎng)h除它。我們可以使用 drop 命令。(drop 譯為停止、放棄)supermarket=# DROP DATABASE supermarket;
ERROR: cannot drop the currently open database我們看到,如果直接刪除 supermarket 會(huì)報(bào)錯(cuò),提示說(shuō)“不能廢棄當(dāng)前打開的數(shù)據(jù)庫(kù)”。我們現(xiàn)在打開并鏈接的數(shù)據(jù)庫(kù)是 supermarket,所以不能刪除。
相信你已經(jīng)有了解決辦法,我們只要切換到別的數(shù)據(jù)庫(kù)上,比如新建的 happymarket 上,就可以刪除 supermarket 庫(kù)了。實(shí)踐一下,果然可行!supermarket=#
# 退出數(shù)據(jù)庫(kù)
supermarket=# \q
# 連接happymarket
[gpadmin@localhost ~]$ psql -d happymarket
psql (8.2.15)
Type "help" for help.
# 刪除supermarket,沒有報(bào)錯(cuò)
happymarket=# DROP DATABASE supermarket;
DROP DATABASE
# 查看現(xiàn)在有哪些庫(kù)
happymarket=# \l
List of databases
Name | Owner | Encoding | Access privileges
-------------+---------+----------+-------------------
happymarket | gpadmin | UTF8 |
postgres | gpadmin | UTF8 |
template0 | gpadmin | UTF8 |
template1 | gpadmin | UTF8 |
(4 rows)
討論和優(yōu)化
Nice!現(xiàn)在已經(jīng)刪除原來(lái)的 supermarket 了。但是,大家想一想,這樣刪除是不是比較麻煩,還要切換到另一個(gè)庫(kù)中。回顧一下,我們的整個(gè)流程,從產(chǎn)品的角度來(lái)考慮下問(wèn)題,這樣會(huì)有很多疑惑。
整個(gè)流程的邏輯是這樣的:
- 如果要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù),需要先進(jìn)入的 postgres 庫(kù)
- 如果要?jiǎng)h除的話,需要先切換到另一庫(kù)上
帶來(lái)的問(wèn)題:
- 問(wèn)題 1:創(chuàng)建時(shí),如果沒有預(yù)先設(shè)置好的 postgres 庫(kù),要怎么創(chuàng)建呢?
- 問(wèn)題 2:既然需要先進(jìn)入再創(chuàng)建庫(kù),那么 postgres 庫(kù)是哪里來(lái)的呢?
- 問(wèn)題 3:能不能直接創(chuàng)建,或是刪除庫(kù)?
我們來(lái)一個(gè)一個(gè)的探索!現(xiàn)在,我們來(lái)從實(shí)際的角度來(lái)考慮問(wèn)題。
你為什么開超市?
你當(dāng)時(shí)選擇開超市,是看到別人開超市賺錢了,有利可圖,你才開始做這件事的,并且有了一個(gè)比較成熟的市場(chǎng)規(guī)范,那么,第一個(gè)開超市的人是誰(shuí)?
我也不知道是哪位前輩祖先,但是我們可以想到,第一個(gè)開超市的人一定明白了交換的價(jià)值,他開超市成功了,并且摸索出了一套基本的規(guī)范,后人根據(jù)這樣的規(guī)范,開了類似的場(chǎng)所、店鋪,而后逐漸有了市場(chǎng)、有了行業(yè)。
同樣地,當(dāng)我們創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,也是遵循了某個(gè)“前輩”摸索出的基本規(guī)范,依照這樣的規(guī)范,搞一個(gè)差不多的庫(kù)。
第一個(gè)數(shù)據(jù)庫(kù)是如何創(chuàng)建的?
這位“前輩”叫做 initdb 命令,譯過(guò)來(lái)就是初始化數(shù)據(jù)庫(kù)的命令。
“前輩”開的超市,叫做“postgres”,所以我們后人每次開超市時(shí),其實(shí)就是與前輩的一次時(shí)空的對(duì)話,與文化的傳承。
第一個(gè)數(shù)據(jù)庫(kù),由 initdb 命令,在初始化數(shù)據(jù)存儲(chǔ)區(qū)的時(shí)候,創(chuàng)建的,這個(gè)數(shù)據(jù)庫(kù)叫做 postgres。因此,要?jiǎng)?chuàng)建第一個(gè)用戶數(shù)據(jù)庫(kù)時(shí),需要先與 postgres 連接。
直接創(chuàng)建、刪除數(shù)據(jù)庫(kù)
既然有需要,那么產(chǎn)品設(shè)計(jì)人早已為我們想好了。為了方便,我們可以直接在 shell 中,用 createdb 程序,來(lái)創(chuàng)建新數(shù)據(jù)庫(kù)。
我們還是以創(chuàng)建 supermarket 數(shù)據(jù)庫(kù)為例:# 退出數(shù)據(jù)庫(kù)連接,回到shell環(huán)境
postgres=# \q
[gpadmin@localhost ~]$
# 在shell中,直接使用createdb來(lái)創(chuàng)建數(shù)據(jù)庫(kù)
[gpadmin@localhost ~]$ createdb supermarket
# 連接數(shù)據(jù)庫(kù),查看是否已經(jīng)創(chuàng)建好
[gpadmin@localhost ~]$ psql -d supermarket
psql (8.2.15)
Type "help" for help.
supermarket=# \l
List of databases
Name | Owner | Encoding | Access privileges
-------------+---------+----------+-------------------
happymarket | gpadmin | UTF8 |
postgres | gpadmin | UTF8 |
supermarket | gpadmin | UTF8 |
template0 | gpadmin | UTF8 |
template1 | gpadmin | UTF8 |
(5 rows)
# 已創(chuàng)建好,沒什么問(wèn)題
# 退出連接
supermarket=# \q
# 在shell環(huán)境中,直接使用dropdb命令刪除數(shù)據(jù)庫(kù)
[gpadmin@localhost ~]$ dropdb supermarket
# 連接數(shù)據(jù)庫(kù),看看是否已刪除
[gpadmin@localhost ~]$ psql -d postgres
psql (8.2.15)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Access privileges
-------------+---------+----------+-------------------
happymarket | gpadmin | UTF8 |
postgres | gpadmin | UTF8 |
template0 | gpadmin | UTF8 |
template1 | gpadmin | UTF8 |
(4 rows)
# 已刪除沒有問(wèn)題
總結(jié)
好了,現(xiàn)在我們已經(jīng)給超市立了一個(gè)牌子,還學(xué)會(huì)了如何創(chuàng)建、刪除數(shù)據(jù)庫(kù),現(xiàn)在我們來(lái)總結(jié)一下這些命令。