PostgreSQL查看及设置参数、单位、描述等信息

注意

1
2
3
参数名:不区分大小写。
参数值:布尔、整数、浮点数、字符串(大小写无关, 枚举参数值是不区分大小写的)
布尔值可以是:on, off, true, false, yes, no, 1, 0 或这些东西的任意清晰无歧义的前缀。
1
2
3
内存单位:kB(千字节), MB(兆字节), GB(吉字节);
时间单位:ms(毫秒), s(秒), min(分钟), h(小时), d(天)。
内存单位中的"千"是1024, 不是1000。

查看参数的默认单位

1
select name, unit from pg_settings;

查看参数允许的枚举

1
select name, enumvals from pg_settings;

设置参数

方式一:在 postgresql.conf设置

方式二:在启动时传递参数:postgres -c log_connections=yes -c log_destination=’syslog’

在 psql 里查看及设置参数

1
2
查看:show postgresql.conf中的参数名;
设置:set postgresql.conf中的参数名 TO 参数值 | set postgresql.conf中的参数名=参数值

PostgreSQL删除表空间

昨天在群里看到有同鞋问:如何删除表空间?因为删除的时候,一直报

1
2
3
postgres=# drop tablespace mytmp;
ERROR: tablespace "mytmp" is not empty
postgres=#

原因

想要删除表空间,那么该表空间必须为空(即没有任何其他的对象会使用到该表空间)才能被删除。

找出有哪些对象使用到了表空间

SQL语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
postgres=# SELECT
c.relname,
t.spcname
FROM
pg_class c
JOIN pg_tablespace t ON c.reltablespace = t.oid
WHERE
t.spcname = 'mytmp';
relname | spcname
---------+---------
tsp | mytmp
(1 row)
postgres=#

删除

找到表空间的使用对象时,这时如果确实要删除表空间,那就要将该表空间下的表对象都删除了最后才能删除表空间。

删除该表空间下的表

1
2
3
postgres=# drop table tsp;
DROP TABLE
postgres=#

删除该表空间

1
2
3
postgres=# drop tablespace mytmp;
DROP TABLESPACE
postgres=#

再检查一次看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
postgres=# select * from pg_tablespace where spcname = 'mytmp';
spcname | spcowner | spcacl | spcoptions
---------+----------+--------+------------
(0 rows)
postgres=#
postgres=# SELECT
postgres-# c.relname,
postgres-# t.spcname
postgres-# FROM
postgres-# pg_class c
postgres-# JOIN pg_tablespace t ON c.reltablespace = t.oid
postgres-# WHERE
postgres-# t.spcname = 'mytmp';
relname | spcname
---------+---------
(0 rows)
postgres=#

PostgreSQL中 copy 和 \copy 的区别

权限

1
2
3
copy 必须要以超级用户来运行
\copy 则不必

文件位置

1
2
3
4
5
copy 的文件必须是在服务器端的位置
\copy 的则是在客户端的位置。
所以,文件的权限方面,copy是以服务器的为准,\copy 是以客户端的为准

例子

DB服务器:10.0.0.10

1
2
3
4
5
6
7
postgres=# \du yang;
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
yang | | {}
postgres=#

客户端(10.0.0.11)连接到DB服务器(10.0.0.10)
客户端运行copy命令(11):

/tmp/tcopy.txt该文件是在客户端(10.0.0.11)的,DB服务器(10.0.0.10)并不存在该文件。

1
2
3
4
test=> copy tcopy from '/tmp/tcopy.txt';
ERROR: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
test=>

它会报告必须要以数据库的超级用户身份才能运行copy命令。

客户端运行\copy命令(11):

1
2
3
test=> \copy tcopy from '/tmp/tcopy.txt';
COPY 3
test=>

它没有报告必须要以数据库的超级用户来运行,而且也没有报告文件或目录不存在的问题。

在DB(10.0.0.10)服务器端修改用户yang为超级用户:

1
2
3
postgres=# alter role yang superuser ;
ALTER ROLE
postgres=#

然后在客户端再执行看看:

1
2
3
test=> copy tcopy from '/tmp/tcopy.txt';
ERROR: could not open file "/tmp/tcopy.txt" for reading: No such file or directory
test=>

它现在不报权限了,而是报告文件或目录不存在。这是因为该文件是在客户端的,而copy只会在服务器端定位。

在客户端换成\copy命令看看:

1
2
3
test=> \copy tcopy from '/tmp/tcopy.txt';
COPY 3
test=>

可以发现COPY成功了。