前端之家收集整理的这篇文章主要介绍了
postgresql 临时表空间及注意事项,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
--查看数据库临时表空间位置
--temp_tablespaces是表空间名称的列表,当列表中有一个以上名称时, Postgresql 每次临时对象被创建时选择一个列表中的随机数;
--除了在一个事务中之外,先后创建临时对象放置在列表连续的表空间中。
--如果列表中选定的元素是一个空字符串, Postgresql 会自动使用当前数据库的缺省表空间
select * from pg_settings where name = 'temp_tablespaces';
--可以把pg的临时表空间建立在/dev/shm下面提高性能
-- 新建目录结构.
mkdir /dev/shm/tbs_tmp
-- 创建表空间
create tablespace tbs_tmp location '/dev/shm/tbs_tmp';
--如果把目录建在/dev/shm目录下,需要改变目录权限,默认为root用户
chown postgres.postgres /dev/shm
--设置session级别的临时表空间
set session temp_tablespaces='tbs_tmp';
--创建测试表
postgres=# create temp table test2 (id int);
CREATE TABLE
postgres=# \d+ test2
Table "pg_temp_5.test2"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id | integer | | plain | |
Has OIDs: no
Tablespace: "tbs_tmp"
--插入数据
postgres=# insert into test2 select generate_series(1,1000000);
INSERT 0 1000000
--可发现此目录明显增大,说明临时表的数据已经进到此目录
35M /dev/shm/tbs_tmp/
--由于是临时表,故session退出后此数据就会被清空,临时表目录大小变为0
0 /dev/shm/tbs_tmp/
--如果要想让临时表空间的设置对所有的session永久生效,则需要修改配置文件
[postgres@staging27 tmp]$ vim /db/pgsql/data/postgresql.conf
temp_tablespaces = 'tbs_tmp'
[postgres@staging27 tmp]$ pg_ctl reload -D /db/pgsql/data
--执行压力测试,进行大量的排序,需要使用到临时表空间
\setrandom id 140 12345678
\setrandom id2 1470 3023
\setrandom id3 1570 3213
select snapid,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,correlation from statsrepo.column order by name desc limit 11 offset :id;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id ) ;
select snapid,correlation from statsrepo.column where snapid=:id2 order by name desc limit 11 offset :id2;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id3+14 ) ;
select snapid,correlation from statsrepo.column where snapid=:id3 order by name desc limit 11 offset :id3;
select count(*) from statsrepo.index where name=(select name from statsrepo.index limit 1 offset :id2+1 ) ;
--执行测试,可知当临时表空间用完后,pg将会kill掉需要临时表空间的进程(不需要临时表空间的不受影响)
[postgres@staging27 tmp]$ pgbench -M prepared -f ./test.sql -n -r -c 6 -j 2 -T 1800 statsrepo > /tmp/pgbench_report_2.txt
Client 3 aborted in state 3: ERROR: could not write block 102208 of temporary file: 设备上没有空间
HINT: Perhaps out of disk space?
Client 1 aborted in state 3: ERROR: could not write block 68958 of temporary file: 设备上没有空间
--监控其大小
while true; do du -sh /dev/shm/tbs_tmp/ /db/pgsql/data/base/pgsql_tmp/ ; sleep 1 ; done;
3.8G /dev/shm/tbs_tmp/
3.9G /dev/shm/tbs_tmp/
1.2G /dev/shm/tbs_tmp/
0 /dev/shm/tbs_tmp/
--由于/dev/shm 空间有限,此时可以建立一个磁盘文件的临时表空间
create tablespace disk_tbs_tmp location '/db/pgsql/data/base/pgsql_tmp';
--修改配置文件
temp_tablespaces='tbs_tmp,disk_tbs_tmp';
--进行压力测试后可知,如果磁盘文件不足,pg还是会kill掉需要临时表空间的进程
3.7G /dev/shm/
5.6G /db/pgsql/data/base/pgsql_tmp/
3.7G /dev/shm/
5.6G /db/pgsql/data/base/pgsql_tmp/
3.8G /dev/shm/
5.6G /db/pgsql/data/base/pgsql_tmp/
1.0G /dev/shm/
4.6G /db/pgsql/data/base/pgsql_tmp/
1.0G /dev/shm/
606M /db/pgsql/data/base/pgsql_tmp/
1.0G /dev/shm/
--dev/shm/ 目彔,其实是利用内存虚拝出来癿磁盘空间! 讵问速度是非帯快的,但建立在这个目录下的文件在下次开机时就消失了