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)