Skip to content

1,drop表后空间不释放

数据库执行drop table XXX后,查看du -sh 已下降,但df -h /pgdb没有减少,是有还有进程使用对应的文件句柄

1.通过表名确认文件ID

select pg_relation_filepath('table_name');
select pg_relation_filepath('table_name');

2.确认使用文件ID的进程是否可以删除

lsof |  grep “文件ID”

select *
from pg_stat_activity
where pid="PID”
lsof |  grep “文件ID”

select *
from pg_stat_activity
where pid="PID”

3.删除对应进程

select pg_terminate_backend('PID');
select pg_terminate_backend('PID');

4.数据库drop 对应的表

csharp
drop table table_name;
drop table table_name;

2,pid

查看下postmaster.pid文件的内容

cd $PGDATA     
cat postmaster.pid
4188   //postgresql主进程号
/pgdata/xjwq/1953/data02/pg_root
1585846709
1953
/pgdata/xjwq/1953/data02/pg_root
0.0.0.0
  1953001    4227076
cd $PGDATA     
cat postmaster.pid
4188   //postgresql主进程号
/pgdata/xjwq/1953/data02/pg_root
1585846709
1953
/pgdata/xjwq/1953/data02/pg_root
0.0.0.0
  1953001    4227076

2. 分别对内容做一下解释,以及在文件删除后,如何重建

1.查看进程号可见为4188
ps -elf | grep  "postgres -D"
0 S postgres  4188     1  0  75   0 - 324843 -     Apr02 ?        00:01:16 /opt/pgsql/bin/postgres -D /pgdata/xjwq/1953/data02/pg_root -p 1953

2.数据库目录,也就是$PGDATA,这里是/pgdata/xjwq/1953/data02/pg_root

3.文件创建时间,可以模糊认为是进程启动时间,即4188启动的时间,这里是epoch时间,需要转换,可以通过以下命令取到,时间为16:58:29 2020,然后去转换为epoch时间
ps -eo pid,lstart,etime|grep 4188
4188 Thu Apr  2 16:58:29 2020  1-00:13:30
也可以进入数据库查看:
postgres=# select pg_postmaster_start_time();
   pg_postmaster_start_time    
-------------------------------
 2020-04-02 16:58:34.081295+08
(1 row)
这里看到有些偏差,文件里记录的时间应该是文件创建的时间
postgres=# select extract(epoch from '2020-04-02 16:58:34'::timestamp);  
 date_part  
------------
 1585817914
(1 row)
目前看来时间不需要特别精准,我给文件写入时间后,都可以正常使用

4.数据库端口,即数据库参数port设置

5.unix_socket_directory参数设置的目录,这里还是$PGDATA

6.监听地址,listen_addresses参数值
7.共享段地址的值,这里是key,shmid,通过以下命令取的
ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x001dcce9 4227076    postgres  600        1214545920 641  

文件里面都是10进制,0x001dcce9转换10进制的值为1953001,然后写入4227076
1.查看进程号可见为4188
ps -elf | grep  "postgres -D"
0 S postgres  4188     1  0  75   0 - 324843 -     Apr02 ?        00:01:16 /opt/pgsql/bin/postgres -D /pgdata/xjwq/1953/data02/pg_root -p 1953

2.数据库目录,也就是$PGDATA,这里是/pgdata/xjwq/1953/data02/pg_root

3.文件创建时间,可以模糊认为是进程启动时间,即4188启动的时间,这里是epoch时间,需要转换,可以通过以下命令取到,时间为16:58:29 2020,然后去转换为epoch时间
ps -eo pid,lstart,etime|grep 4188
4188 Thu Apr  2 16:58:29 2020  1-00:13:30
也可以进入数据库查看:
postgres=# select pg_postmaster_start_time();
   pg_postmaster_start_time    
-------------------------------
 2020-04-02 16:58:34.081295+08
(1 row)
这里看到有些偏差,文件里记录的时间应该是文件创建的时间
postgres=# select extract(epoch from '2020-04-02 16:58:34'::timestamp);  
 date_part  
------------
 1585817914
(1 row)
目前看来时间不需要特别精准,我给文件写入时间后,都可以正常使用

4.数据库端口,即数据库参数port设置

5.unix_socket_directory参数设置的目录,这里还是$PGDATA

6.监听地址,listen_addresses参数值
7.共享段地址的值,这里是key,shmid,通过以下命令取的
ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x001dcce9 4227076    postgres  600        1214545920 641  

文件里面都是10进制,0x001dcce9转换10进制的值为1953001,然后写入4227076

3. 找一个正常的数据库复制一个文件,按照上面逐项修改,最后把权限设置为600,重新使用pg_ctl

$chmod 600 postmaster.pid
把文件复制到$PGDATA
$pg_ctl reload
server signaled
$chmod 600 postmaster.pid
把文件复制到$PGDATA
$pg_ctl reload
server signaled

4. 以下是需要用的转换工具

登陆以下网址进行时间转换: https://www.epochconverter.com/

登陆以下地址可以进行16转10进制 https://tool.oschina.net/hexconvert

3,wal xlog 区别

ostgresql 10.x 叫做 wal、lsn postgresql 9.x 叫做 xlog、location

在实际应用中经常需要根据 lsn/location 获取 wal/xlog 文件名

postgresql 10.x

postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn 
--------------------
 0/1656FE0
(1 row)

postgres=# select pg_current_wal_lsn(),
           pg_walfile_name(pg_current_wal_lsn()),
           pg_walfile_name_offset(pg_current_wal_lsn());

 pg_current_wal_lsn |     pg_walfile_name      |       pg_walfile_name_offset   

--------------------+--------------------------+------------------------------------
 0/1656FE0          | 000000010000000000000001 | (000000010000000000000001,6647776)
(1 row)
postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn 
--------------------
 0/1656FE0
(1 row)

postgres=# select pg_current_wal_lsn(),
           pg_walfile_name(pg_current_wal_lsn()),
           pg_walfile_name_offset(pg_current_wal_lsn());

 pg_current_wal_lsn |     pg_walfile_name      |       pg_walfile_name_offset   

--------------------+--------------------------+------------------------------------
 0/1656FE0          | 000000010000000000000001 | (000000010000000000000001,6647776)
(1 row)

postgresql 9.x

postgres=# select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 596/C4DA2000
(1 row)

postgres=# select pg_current_xlog_location(),
                  pg_xlogfile_name(pg_current_xlog_location()),
                  pg_xlogfile_name_offset(pg_current_xlog_location());

 pg_current_xlog_location |     pg_xlogfile_name     |       pg_xlogfile_name_offset       
--------------------------+--------------------------+-------------------------------------
 596/C4DA2000             | 0000000100000596000000C4 | (0000000100000596000000C4,14295040)

(1 row)
postgres=# select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 596/C4DA2000
(1 row)

postgres=# select pg_current_xlog_location(),
                  pg_xlogfile_name(pg_current_xlog_location()),
                  pg_xlogfile_name_offset(pg_current_xlog_location());

 pg_current_xlog_location |     pg_xlogfile_name     |       pg_xlogfile_name_offset       
--------------------------+--------------------------+-------------------------------------
 596/C4DA2000             | 0000000100000596000000C4 | (0000000100000596000000C4,14295040)

(1 row)