您的位置:首页 > 数据库

postgresql 临时表空间及注意事项

2015-12-18 15:23 302 查看
--查看数据库临时表空间位置
--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,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,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,dbid,tbl,attnum,date,name,type,stattarget,storage,isnotnull,isdropped,avg_width,n_distinct,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/ 目彔,其实是利用内存虚拝出来癿磁盘空间! 讵问速度是非帯快的,但建立在这个目录下的文件在下次开机时就消失了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: