1. 程式人生 > >再談PostgreSQL建立資料庫

再談PostgreSQL建立資料庫

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庫
重要的事情說三遍