一、什么是PostgreSQL?
PostgreSQL是一個功能強大的開源對象關系數據庫管理系統(ORDBMS)。 用于安全地存儲數據; 支持最佳做法,并允許在處理請求時檢索它們。
PostgreSQL(也稱為Post-gress-Q-L)由PostgreSQL全球開發集團(全球志愿者團隊)開發。 它不受任何公司或其他私人實體控制。 它是開源的,其源代碼是免費提供的。
PostgreSQL是跨平臺的,可以在許多操作系統上運行,如Linux,FreeBSD,OS X,Solaris和Microsoft Windows等。
二、PostgreSQL的特點
- PostgreSQL可在所有主要操作系統(即Linux,UNIX(AIX,BSD,HP-UX,SGI IRIX,Mac OS X,Solaris,Tru64)和Windows等)上運行。
- PostgreSQL支持文本,圖像,聲音和視頻,并包括用于C/C++,Java,Perl,Python,Ruby,Tcl和開放數據庫連接(ODBC)的編程接口。
- PostgreSQL支持SQL的許多功能,例如復雜SQL查詢,SQL子選擇,外鍵,觸發器,視圖,事務,多進程并發控制(MVCC),流式復制(9.0),熱備(9.0))。
- 在PostgreSQL中,表可以設置為從“父”表繼承其特征。可以安裝多個擴展以向PostgreSQL添加附加功能。
三、安裝并配置,并設置遠程登陸的用戶名和密碼
1.安裝postgreSQL
sudo apt-get update
主程序:
sudo apt-get install postgresql
數據庫圖形界面:
sudo apt install pgadmin3
- 在Ubuntu下安裝Postgresql后,會自動注冊為服務,并隨操作系統自動啟動。
- 在Ubuntu下安裝Postgresql后,會自動添加一個名為postgres的操作系統用戶,密碼是隨機的。并且會自動生成一個名字為postgres的數據庫,用戶名也為postgres,密碼也是隨機的。
2.修改postgres數據庫用戶的密碼為123456
打開客戶端工具(psql)
sudo -u postgres psql
- 其中,sudo -u postgres 是使用postgres 用戶登錄的意思
- PostgreSQL數據庫默認會創建一個postgres的數據庫用戶作為數據庫的管理員,密碼是隨機的
修改密碼的命令:
postgres=# ALTER USER postgres WITH PASSWORD '123456';
postgres=#為PostgreSQL下的命令提示符,--注意最后的分號;
3. 退出PostgreSQL psql客戶端
postgres=# \q
4.修改ubuntu操作系統的postgres用戶的密碼(密碼要與數據庫用戶postgres的密碼相同)
切換到root用戶
su root
刪除PostgreSQL用戶密碼
sudo passwd -d postgres
passwd -d 是清空指定用戶密碼的意思
設置PostgreSQL系統用戶的密碼
sudo -u postgres passwd
按照提示,輸入兩次新密碼
- 輸入新的 UNIX 密碼
- 重新輸入新的 UNIX 密碼
- passwd:已成功更新密碼
5.修改PostgresSQL數據庫配置實現遠程訪問
編輯配置文件: vi /etc/postgresql/9.4/main/postgresql.conf
添加/修改:在所有IP地址上監聽,從而允許遠程連接到數據庫服務器:
listen_addresses = 'localhost' 改為 listen_addresses = '*'
編輯配置文件:vi /etc/postgresql/9.4/main/pg_hba.conf
添加/修改:允許任意用戶從任意機器上以密碼方式訪問數據庫,把下行添加為第一條規則:
host all all 0.0.0.0/0 md5
6.重啟服務
$ sudo systemctl restart postgresql
或者
/etc/init.d/postgresql restart
四、關于PostgreSQL的登錄角色,組角色,用戶等概念及權限分配上的區別
登錄角色就是具有登錄權限的角色,是通常意義上的用戶,不具有登錄權限的角色就是組角色,是一些登錄角色的集合。這樣的目的是為了方便批量授權。在PostgreSQL中登錄角色、組角色和用戶本質上都是角色;看下面的操作就知道了。
CREATE USER和CREATE ROLE的區別在于,CREATE USER指令創建的用戶默認是有登錄權限的,而CREATE ROLE沒有。 在psql shell中輸入這上面兩條命令創建的角色如下圖所示:
如圖,使用CREATE ROLE創建的角色在組角色下,使用CREATE USER創建的角色在登錄角色欄下。
五、角色的權限分配
PostgreSQL存在兩種權限,一種是角色權限即role attribute(例如創建角色,創建數據庫,修改目錄等),另一種是操作數據庫的權限即privilege(例如數據庫的連接,數據表的各種操作等)。下面分別來說。
1.角色權限
一個數據庫角色可以有一系列屬性,這些屬性定義他的權限,以及與客戶認證系統的交互。如下圖:2.數據庫權限、成員角色及權限的繼承
PostgreSQL中預定義了許多不同類型的數據庫內置權限,如:SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE。
任何角色都可以是成員角色,但是只有組角色能擁有成員角色。成員角色會自動繼承父角色(它所屬的組角色)的數據庫權限。
一個登錄角色最終的權限等于其各個組角色所得權限的總合。
數據庫的權限需要逐層授予,例如某個登錄角色想要查看某張具體的表,那么他所屬的組角色需要同時獲得這張表所在的數據庫的connect權限、所在架構的usage權限和這張表的Select權限。權限不夠時系統給出的提示如以下三圖:
(準確說超級用戶的行為是不被檢查的)。那么如果你的登錄角色沒有組角色,那就給他創建一個組角色,讓登錄角色成為組角色的成員角色。另外,我強烈建議不要隨便給登錄角色賦予超級用戶權限,因為這是相當危險的。
六、用戶、角色和組的操作命令
postgres安裝完成后,會自動在操作系統
和postgres數據庫
中分別創建一個名為postgres
的用戶以及一個同樣名為postgres
的數據庫。
1.登錄
- 方式1:指定參數登錄
psql -U username -d database_name -h host -W
參數含義: -U指定用戶 -d要連接的數據庫 -h要連接的主機 -W提示輸入密碼。
- 方式2:切換到postgres同名用戶后登錄
su username
psql
當不指定參數時psql使用操作系統當前用戶的用戶名作為postgres的登錄用戶名和要連接的數據庫名。所以在PostgreSQL安裝完成后可以通過以上方式登錄。
- 方式3:
psql -U jiraadmin -W jira
-U:以哪個用戶登錄
-W:登錄哪個數據庫;
psql -U postgres -W transaction
直接回車以postgres身份登錄到transaction數據庫
psql -U postgres
以postgres身份登錄到默認數據庫(即postgres數據庫)
2.創建數據庫新用戶,如 dbuser:
postgres=# CREATE USER dbuser WITH PASSWORD '*****';
創建用戶數據庫,如exampledb:
postgres=# CREATE DATABASE exampledb OWNER dbuser;
將exampledb數據庫的所有權限都賦予dbuser:
postgres=# GRANT ALL PRIVILEGES ON DATABASE exampledb TO dbuser;
使用命令 \q 退出psql:
postgres=# \q
創建Linux普通用戶,與剛才新建的數據庫用戶同名,如 dbuser:
sudo adduser dbuser
sudo passwd dbuser
以dbuser的身份連接數據庫exampledb:
su - dbuser
3.創建用戶時設定用戶屬性
基本語法:
CREATE ROLE role_name WITH optional_permissions;
示例:在創建用戶時設定登錄權限。
CREATE ROLE username WITH LOGIN;
可以通過\h CREATE ROLE指令查看全部可設置的管理權限
4.修改用戶屬性
修改權限的命令格式
ALTER ROLE username WITH attribute_options;
示例:可通過以下方式禁止用戶登錄
ALTER ROLE username WITH NOLOGIN;
5.設置訪問權限
語法格式如下:
GRANT permission_type ON table_name TO role_name;
示例:
GRANT UPDATE ON demo TO demo_role; --賦予demo_role demo表的update權限
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to demo_role; --賦予demo_role所有表的SELECT權限
特殊符號:ALL代表所訪問權限,PUBLIC代表所有用戶
GRANT ALL ON demo TO demo_role; --賦給用戶所有權限
GRANT SELECT ON demo TO PUBLIC; --將SELECT權限賦給所有用戶
\z或\dp指令顯示用戶訪問權限。
\h GRANT顯示所有可設置的訪問權限
6.撤銷用戶訪問權限
語法格式如下:
REVOKE permission_type ON table_name FROM user_name;
其中permission_type和table_name含義與GRANT指令中相同。
7.用戶組
在postgres中用戶實際上是role,同時組也是role。 包含其他role的role就是組。
創建組示例:
CREATE ROLE temporary_users;
GRANT temporary_users TO demo_role;
GRANT temporary_users TO test_user;
切換ROLE
SET ROLE role_name; --切換到role_name用戶
RESET ROLE; --切換回最初的role
INHERIT權限:該屬性使組成員擁有組的所有權限
ALTER ROLE test_user INHERIT;
刪除用戶和組
DROP ROLE role_name;
DROP ROLE IF EXISTS role_name;
刪除組role只會刪除組的role本身,組的成員并不會被刪除
七、PostgreSQL常用操作命令
連接數據庫, 默認的用戶和數據庫是postgres
psql -U user -d dbname
切換數據庫,相當于mysql的use dbname
\c dbname
列舉數據庫,相當于mysql的show databases
\l
列舉表,相當于mysql的show tables
\dt
查看表結構,相當于desc tblname,show columns from tbname
\d tblname
\di 查看索引
創建數據庫:
create database [數據庫名];
刪除數據庫:
drop database [數據庫名];
重命名一個表:
alter table [表名A] rename to [表名B];
刪除一個表:
drop table [表名];
在已有的表里添加字段:
alter table [表名] add column [字段名] [類型];
刪除表中的字段:
alter table [表名] drop column [字段名];
重命名一個字段:
alter table [表名] rename column [字段名A] to [字段名B];
給一個字段設置缺省值:
alter table [表名] alter column [字段名] set default [新的默認值];
去除缺省值:
alter table [表名] alter column [字段名] drop default;
在表中插入數據:
insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......);
修改表中的某行某列的數據:
update [表名] set [目標字段名]=[目標值] where [該行特征];
刪除表中某行數據:
delete from [表名] where [該行特征];
delete from [表名];--刪空整個表
創建表:
create table ([字段名1] [類型1] ;,[字段名2] [類型2],......<,primary key (字段名m,字段名n,...)>;);
\copyright 顯示 PostgreSQL 的使用和發行條款
\encoding [字元編碼名稱]
顯示或設定用戶端字元編碼
\h [名稱] SQL 命令語法上的說明,用 * 顯示全部命令
\prompt [文本] 名稱
提示用戶設定內部變數
\password [USERNAME]
securely change the password for a user
\q 退出 psql
八、啟動,停止和重啟 PostgreSQL 服務器
命令提示
/etc/init.d/postgresql
啟動PostgreSQL
sudo service postgresql start
停止PostgreSQL
sudo service postgresql stop
重新啟動PostgreSQL服務器。
sudo service postgresql restart
九、導入和導出postgresql數據庫腳本
- 導出
/usr/bin/pg_dump -U postgres testdb > /home/app/testdb
date +%Y%m%d
.sql
cd /home/app
gzip testdbdate +%Y%m%d
.sql
- 導入
day=
date +%Y%m%d
drop database testdb;//刪除原來的庫
CREATE DATABASE testdb;
psql -U postgres -d testdb -f /home/app/testdb${day}.sql