前边若干文章,只是简单的介绍了一下PG的手动安装和启动。
如:
http://blog.csdn.net/iihero/article/details/8254115 (安装FAQ)
循序渐进PostgreSQL: 实现PostgreSQL自启动
循序渐进PostgreSQL: 学习pqxx C++ API访问
使用C编写的动态链接库为PostgreSQL数据库添加自定义函数
要正常使用PG,也必须要了解它的基本网络配置、用户权限以及数据库是如何创建,掌握了这些,其它的用法与别的数据库基本上也就大同小异了。
1. 网络配置
默认情况下, PG的配置文件:
postgresql.conf里有一行:
listen_addresses = 'localhost';
在pg_hba.conf里有另外几行:
listen_addresses = '*';
再在pg_hba.conf里加一行:
host all all 10.128.98.0/24 md5
(注,如果你只想某台机器访问,e.g. 10.128.98.4,使用10.128.98.4/32 即可,表示32位全部是有效地址)
对所有网段全开放:
#IPV4
2. 用户、组及角色,以及schema创建与管理
PG里头的角色与用户是有区分开的,有些细微区别。和别的数据库不一样。记住就好。
它的user相当于role加上一个login,它的group相当于role加一个nologin的限制,即本质上都是role. 这就能解释为什么你create完一个role之后,又不能登录的奇怪现象了。
iihero=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
spring | Superuser,Create role,Create DB | {}
创建一个新用户spring2,带有createdb createuser 权限
iihero=# create user spring2 password 'spring1' createdb createuser;
CREATE ROLE
iihero=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
spring | Superuser,Create DB | {}
spring2 | Superuser,Create DB | {}
问题:
iihero=# create table spring2.t1(id int);
ERROR: schema "spring2" does not exist
为何不能创建spring2下的表呢? 因为PG有schema的概念。user spring2并不等于schema为spring2.
要想正常使用,还得为spring2创建一个同名的schema
iihero=# create schema spring2 authorization spring2;
CREATE SCHEMA
iihero=# create table spring2.t1(id int);
CREATE TABLE
我们切到spring2的session下边,查查看:
iihero=# set session authorization spring2;
SET
iihero=# \d
List of relations
Schema | Name | Type | Owner
---------+------+-------+--------
spring2 | t1 | table | spring
(1 row)
能看到刚才创建的表.
也可以创建不同的schema名称:
iihero=# create schema spring_new authorization spring2;
CREATE SCHEMA
iihero=# create table spring_new.t1(id int);
CREATE TABLE
创建同名的schema的简要做法是将中间的schema名称省去。这样它与user名就完全相同。
iihero=# create schema authorization spring2;
CREATE SCHEMA
因此,在创建完带密码的用户之后,需要一步创建同名的schema,即完成与别的数据库等效的功能。
下边是创建用户、schema、建对应表、删除的完整顺序实验:
3. 表空间、数据库创建
PG里支持表空间的概念,并且一个表空间可以放置多个数据库(虽然,实际上很少这么做),一个数据库实际上也可以置于多个表空间,比如将其中的某些表指定到不同的表空间里。
通常情况下,用户会选择不同的数据库,创建不同的表空间,或者创建一个不同位置的表空间,以提高相应性能。
下边是简单的示例,使用psql控制台或者纯命令行都是可以的:
总结: 使用PG时,能做到基本手动安装,配置网络访问限制,创建数据库用户及对应的schema,并能依次清除。 这样,才能进入下一步的基本管理与开发,对于开发人员来说,有了与schema相应的概念,后边的东西应该都是类似的。
在pg_hba.conf里有另外几行:
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
意思是只监听本机,对本机的所有用户都是trust,无需密码即可访问。 IP地址限制为127.0.0.1,/32的意思是32个bit都是有效地址。
我要限制只有网段10.128.98.*上的主机才能访问,首先,要修改postgresql.conf,host all all ::1/128 trust
意思是只监听本机,对本机的所有用户都是trust,无需密码即可访问。 IP地址限制为127.0.0.1,/32的意思是32个bit都是有效地址。
listen_addresses = '*';
再在pg_hba.conf里加一行:
host all all 10.128.98.0/24 md5
(注,如果你只想某台机器访问,e.g. 10.128.98.4,使用10.128.98.4/32 即可,表示32位全部是有效地址)
对所有网段全开放:
#IPV4
host all all 0.0.0.0/0 md5
#IPV6
#IPV6
host all all ::/0 md5
IPV6什么时候会用到,当你用psql -h <hostname> 而不是IP地址的时候,可能会碰到。
具体的描述定义,可以参照:http://www.postgresql.org/docs/8.2/static/datatype-net-types.html
在此以后,就可以从别的主机上访问本机的数据库了。
IPV6什么时候会用到,当你用psql -h <hostname> 而不是IP地址的时候,可能会碰到。
具体的描述定义,可以参照:http://www.postgresql.org/docs/8.2/static/datatype-net-types.html
2. 用户、组及角色,以及schema创建与管理
PG里头的角色与用户是有区分开的,有些细微区别。和别的数据库不一样。记住就好。
它的user相当于role加上一个login,它的group相当于role加一个nologin的限制,即本质上都是role. 这就能解释为什么你create完一个role之后,又不能登录的奇怪现象了。
iihero=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
spring | Superuser,Create role,Create DB | {}
创建一个新用户spring2,带有createdb createuser 权限
iihero=# create user spring2 password 'spring1' createdb createuser;
CREATE ROLE
iihero=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
spring | Superuser,Create DB | {}
spring2 | Superuser,Create DB | {}
问题:
iihero=# create table spring2.t1(id int);
ERROR: schema "spring2" does not exist
为何不能创建spring2下的表呢? 因为PG有schema的概念。user spring2并不等于schema为spring2.
要想正常使用,还得为spring2创建一个同名的schema
iihero=# create schema spring2 authorization spring2;
CREATE SCHEMA
iihero=# create table spring2.t1(id int);
CREATE TABLE
我们切到spring2的session下边,查查看:
iihero=# set session authorization spring2;
SET
iihero=# \d
List of relations
Schema | Name | Type | Owner
---------+------+-------+--------
spring2 | t1 | table | spring
(1 row)
能看到刚才创建的表.
也可以创建不同的schema名称:
iihero=# create schema spring_new authorization spring2;
CREATE SCHEMA
iihero=# create table spring_new.t1(id int);
CREATE TABLE
创建同名的schema的简要做法是将中间的schema名称省去。这样它与user名就完全相同。
iihero=# create schema authorization spring2;
CREATE SCHEMA
因此,在创建完带密码的用户之后,需要一步创建同名的schema,即完成与别的数据库等效的功能。
下边是创建用户、schema、建对应表、删除的完整顺序实验:
iihero=# create user spring3 password 'spring1'; CREATE ROLE iihero=# create schema authorization spring3; CREATE SCHEMA iihero=# create table spring3.t1(id int); CREATE TABLE iihero=# insert into spring3.t1 values(1),(2); INSERT 0 2 iihero=# select * from spring3.t1; id ---- 1 2 (2 rows) iihero=# drop table spring3.t1; DROP TABLE iihero=# drop user spring3; ERROR: role "spring3" cannot be dropped because some objects depend on it DETAIL: owner of schema spring3 iihero=# drop schema spring3; DROP SCHEMA iihero=# drop user spring3; DROP ROLE
3. 表空间、数据库创建
PG里支持表空间的概念,并且一个表空间可以放置多个数据库(虽然,实际上很少这么做),一个数据库实际上也可以置于多个表空间,比如将其中的某些表指定到不同的表空间里。
通常情况下,用户会选择不同的数据库,创建不同的表空间,或者创建一个不同位置的表空间,以提高相应性能。
下边是简单的示例,使用psql控制台或者纯命令行都是可以的:
create tablespace demospace location 'd:/pgsql92latest/demo';
iihero=# create database demo encoding 'latin1' template template0 OWNER spring tablespace demospace;
CREATE DATABASE
CREATE DATABASE
iihero=# drop database demo;
DROP DATABASE
DROP DATABASE
或者:
D:\pgsql92latest>createdb --tablespace=demospace -e --encoding=latin1 --owner=spring --template=template0 demo
CREATE DATABASE "demo" OWNER spring TABLESPACE demospace ENCODING 'latin1' TEMPLATE template0;
CREATE DATABASE "demo" OWNER spring TABLESPACE demospace ENCODING 'latin1' TEMPLATE template0;
或者
D:\pgsql92latest>createdb -Ddemospace -e -Elatin1 -Ospring -Ttemplate0 demo CREATE DATABASE demo OWNER spring TABLESPACE demospace ENCODING 'latin1' TEMPLATE template0;