資料庫PostrageSQL-管理資料庫

cwl_java發表於2020-12-11

Chapter 22. 管理資料庫

每個正在執行的PostgreSQL伺服器例項都管理著一個或多個資料庫。因此,在組織SQL物件(“資料庫物件”)的層次中,資料庫位於最頂層。本章描述資料庫的屬性,以及如何建立、管理、刪除它們。

22.1. 概述

一個資料庫是一些SQL物件(“資料庫物件”)的命名集合。通常每個資料庫物件(表、函式等) 屬於並且只屬於一個資料庫(不過有幾個系統表如pg_database屬於整個集簇並且對集簇中的每個資料庫都是可訪問的)。更準確地說,一個資料庫是一個模式的集合, 而模式包含表、函式等等。因此完整的層次是這樣的:伺服器、資料庫、模式、表(或者某些其他物件型別,如函式)。

當連線到資料庫伺服器時,客戶端必須在它的連線請求中指定它要連線的資料庫名。每次連線不能訪問超過一個資料庫。不過,一個應用能夠在同一個或者其他資料庫上開啟的連線數並沒有受到限制。資料庫是物理上相互隔離的,並且訪問控制是在連線層面進行管理的。

如果一個PostgreSQL伺服器例項用於承載那些應該分隔並且相互之間並不知曉的使用者 和專案,那麼我們建議把它們放在不同的資料庫裡。如果專案或者使用者是相互關聯的, 並且可以相互使用對方的資源,那麼應該把它們放在同一個資料庫裡,但可能在不同的模式中。

模式只是一個純粹的邏輯結構並且誰能訪問某個模式由許可權系統管理。有關管理模式的更多資訊在Section 5.8中。

資料庫是使用CREATE DATABASE(見Section 22.2),並且用DROP DATABASE命令刪除(見Section 22.5)。要確定現有資料庫的集合,可以檢查系統目錄pg_database,例如

SELECT datname FROM pg_database;

psql程式的\l元命令和-l命令列選項也可以用來列出已有的資料庫。

SQL標準把資料庫稱作“目錄”,不過實際上沒有區別。

22.2. 建立一個資料庫

為了建立一個資料庫,PostgreSQL伺服器必須啟動並執行(見Section 18.3)。資料庫用 SQL 命令CREATE DATABASE建立:

CREATE DATABASE name;

其中name遵循SQL識別符號的一般規則。當前角色自動成為該新資料庫的擁有者。以後刪除這個資料庫也是該擁有者的特權(同時還會刪除其中的所有物件,即使那些物件有不同的擁有者)。

建立資料庫是一個受限的操作。如何授權請見Section 21.2。因為你需要連線到資料庫伺服器來執行CREATE DATABASE命令, 那麼還有一個問題是任意給定站點的第一個資料庫是怎樣建立的?第一個資料庫總是由initdb命令在初始化資料儲存區域時建立的(見Section 18.2)。這個資料庫被稱為postgres。因此要建立第一個“普通”資料庫時,你可以連線到postgres。

在資料庫集簇初始化期間也會建立第二個資料庫template1,。當在集簇中建立一個新資料庫時,實際上就是克隆了template1。這就意味著你對template1所做的任 何修改都會體現在所有隨後建立的資料庫中。因此應避免在template1中建立物件,除非你想把它們傳播到每一個新建立的資料庫中。詳見Section 22.3。

為了方便,你還可以用一個程式來建立新資料庫: createdb。

createdb dbname

createdb沒什麼神奇的。它連線到postgres資料庫並且發出CREATE DATABASE命令,和前面介紹的完全一樣。createdb參考頁包含了呼叫細節。注意不帶任何引數的createdb將建立一個使用當前使用者名稱的資料庫。

Chapter 20包含有關如何限制誰能連線到一個給定資料庫的資訊。

有時候你想為其他人建立一個資料庫,並且使其成為新資料庫的擁有者, 這樣他們就可以自己配置和管理這個資料庫。要實現這個目標,使用下列命令之一: 用於 SQL 環境的

CREATE DATABASE dbname OWNER rolename;

或者用於 shell 的

createdb -O rolename dbname

只有超級使用者才被允許為其他人(即為一個你不是其成員的角色)建立一個資料庫。

相關文章