再談PostgreSQL建立資料庫
阿新 • • 發佈:2018-11-10
1背景
在實踐中使用Postgresql資料庫時,發現很多同學經常直接使用postgres使用者和系統的postgres庫,這是非常不安全的.
postgres使用者和系統的postgres庫一般只用來對資料庫進行管理,其它任何情況時都不應該使用postgres使用者和系統的postgres庫.
題外話,好的設計可以達到事半功倍的效果…
2 正確的姿勢
以linux為例,windows同理.
2.1 規劃資料庫程式目錄
博主的習慣是將編譯好的Postgresql安裝到
/usr/local/pgsql #linux
2.2 規劃資料庫資料目錄
現在我們測試建立test資料庫,博主習慣資料目錄如下
#資料庫資料根目錄.這個目錄如果能直接mount比較好,和作業系統分開,這樣比較安全.作業系統出問題後重新mount這個目錄就可以快速恢復.
/data
#postgresql系統目錄,也是initdb時的目錄.PostgreSQL的系統配置如postgresql.conf,pg_hba.conf等都在這個目錄中
/data/pgdata
#資料庫test的表空間目錄
/data/test
#資料庫test的索引表空間目錄.索引表空間目錄一般建議設定,因為當使用SSD和機械硬碟混合時,可以直接修改索引表空間的目錄指至SSD
/data/idxtest
2.3 初始化DB
注意要先在作業系統建立postgres使用者.
# mount /data略
sudo rm -rf /data/pgdata
sudo mkdir /data/pgdata &&\
sudo chown -R postgres /data/pgdata &&\
sudo chmod -R 700 /data/pgdata
su postgres
initdb -D /data/pgdata -E UTF-8 --locale=zh_CN.UTF-8 -A md5 -W -U postgres
完成以後按需求修改postgresql.conf,pg_hba.conf等配置資訊.然後啟動資料庫.
2.4 建立test庫的表空間和索引表空間目錄
sudo rm -rf /data/test
sudo rm -rf /data/idxtest
sudo mkdir /data/test &&\
sudo chown -R postgres /data/test &&\
sudo chmod -R 700 /data/test
sudo mkdir /data/idxtest &&\
sudo chown -R postgres /data/idxtest &&\
sudo chmod -R 700 /data/idxtest
2.5 建立test庫和使用者
為方便記憶,資料庫使用者和資料庫名稱相同,都是test.你可以根據自己的需要修改.
#這裡才需要使用postgres使用者
psql -h localhost -U postgres
#initdb完成後,第一次連結時,執行以下sql,從postgres資料庫收回public的所有許可權
revoke all on database postgres from public;
drop database if exists test;
drop tablespace if exists test;
drop tablespace if exists idxtest;
drop user if exists test;
--建立使用者test
create user test with password '123' nocreatedb;
--建立表空間
create tablespace test owner test location '/data/test';
--建立索引表空間
create tablespace idxtest owner test location '/data/idxtest';
--建立資料庫test
create database test
with owner = test --指定使用者test為此庫的所有者
template template0
encoding 'UTF8'
LC_COLLATE 'zh_CN.UTF-8'
LC_CTYPE 'zh_CN.UTF-8'
tablespace = test --使用第2節建立的資料目錄,和pg系統資料目錄分開
connection limit = -1;
--建立擴充套件
--create extension "uuid-ossp";
--其它擴充套件
--從test資料庫收回public的所有許可權
revoke all on database test from public;
#建立完成後退出postgres
\q
2.6 建立表
#以後我們操作test庫都使用test使用者
psql -h localhost -U test -d test
drop table if exists test009;
create table test009(
objectid bigint not null,
name text not null,
flag integer default(2) not null,
constraint pk_test009_objectid primary key (objectid) with (fillfactor=100) using index tablespace idxtest
) with (fillfactor=100)
tablespace test; /*可以不用指定表空間,因為在建立資料庫裡已經指定*/
#注意建立索引語法,where最後,然後是tablespace
create index idx_test009_flag on test009(flag) with (fillfactor=100) tablespace idxtest where flag=1;
OK,現在一個標準的資料庫就建立完成了,以後我們都用test使用者對這個庫進行管理.
小結
除修改資料庫配置時,任何情況時都不應該使用postgres使用者和系統的postgres庫
除修改資料庫配置時,任何情況時都不應該使用postgres使用者和系統的postgres庫
除修改資料庫配置時,任何情況時都不應該使用postgres使用者和系統的postgres庫
重要的事情說三遍