注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL 9.1 新特性之一: 日志表的使用  

2011-09-14 13:18:18|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 
       PostgreSQL9.1的新特性之一:日志表,往日志表写数据时会比普通表快很多,因为日志表写入时
不写 WAL 日志,这是它的优点;同时,日志表的使用还有些限制,比如在主库日志表上写数据时,数
据不会自动复制到从库,在日志表上创建索引时也不会产生WAL日志,并且目前日志表不支持创建 GIST
索引。同时日志表还有个致命的缺点,在数据库异常关闭时,日志表数据可能会丢失,下面测试下日
志表表的特性。

   备注:在做测试之前,查阅了德哥的 BLOG http://blog.163.com/digoal@126/blog/static/163877040201151402832128/

一 环境准备
--1 修改 postgresql.conf
checkpoint_timeout = 120min  

    为了测试效果,先修改 checkpoint_timeout 参数,设置较大值, 排除 PostgreSQL自动 checkpoint
对测试结果的影响!

--2 创建普通表和日志表
mydb=> create   table  test ( id integer, name varchar(32));
CREATE TABLE

mydb=> create  unlogged table  test_unlogged ( id integer, name varchar(32));
CREATE TABLE

--3 插入数据测试
mydb=> \timing
Timing is on.

mydb=> insert into test select generate_series(1,1000000),'AAA';
INSERT 0 1000000
Time: 8675.356 ms

mydb=> insert into test_unlogged select generate_series(1,1000000),'AAA';
INSERT 0 1000000
Time: 1657.043 ms

  备注:这是在笔记本虚拟机上的测试,从上面看出,向日志表里写数据比向普通表写数据
           要快很多。


二 测试一: 数据库非正常关闭
--2.1 数据库非正常关闭
[postgres@pgb pg_root]$ pg_ctl stop -m immediate -D/database/pgdata1923_9.1/pg_root -p 1923
waiting for server to shut down.... done
server stopped

--2.2 数据库再次启动,并连接
[postgres@pgb tf]$  /opt/pgsql9.1/bin/psql -p 1923
psql (9.1.0)
Type "help" for help.

mydb=> select count(*) from test_unlogged;
 count
-------
     0
(1 row)

  备注:数据库非正常关闭并启动后,日志表 test_unlogged 数据完全丢失。


三 测试二: 数据库正常关闭
--3.1 向日志表插入数据
mydb=> insert into test_unlogged select generate_series(1,1000000),'AAA';
INSERT 0 1000000
Time: 1657.043 ms

--3.2 正常关闭后
[postgres@pgb pg_root]$ pg_ctl stop -m fast -D  /database/pgdata1923_9.1/pg_root
waiting for server to shut down...... done
server stopped

--3.3 数据库再次启动,并连接
[postgres@pgb tf]$  /opt/pgsql9.1/bin/psql -p 1923
psql (9.1.0)
Type "help" for help.

postgres=# \c mydb mydb

mydb=> select count(*) from test_unlogged;
 count 
--------
 1000000
(1 row)

    备注:数据库正常关闭后,数据没有丢失。
   
   
四 测试三: checkpoint 后,再非正常关闭数据库  
--4.1 向日志表插入数据
mydb=> insert into test_unlogged select generate_series(1,1000000),'AAA';
INSERT 0 1000000
Time: 1648.446 ms

mydb=> select count(*) from test_unlogged;
  count 
---------
 2000000
(1 row)

--4.2 主动发出 checkpoint 命令
mydb=> checkpoint;
ERROR:  must be superuser to do CHECKPOINT

mydb=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".

postgres=# checkpoint;
CHECKPOINT

--4.3 数据库非正常关闭
[postgres@pgb pg_root]$ pg_ctl stop -m immediate -D  /database/pgdata1923_9.1/pg_root -p 1923
waiting for server to shut down.... done
server stopped

--4.4 数据库连接后,再次查看数据
mydb=> select count(*) from test_unlogged;
 count 
--------
 2000000
(1 row)

       备注: 往日志表 test_unlogged 写入数据,并执行 checkpoint 操作后,数据库非正常关闭后,
                   数据没有丢失。
             
五 总结

       1  PostgreSQL 9.1 的日志表写入速度比普通表要快很多,经测试至少快了5倍以上,因为日志表写
           数据时,不产生 WAL日志。
       2  在日志表上创建索引时,也不会写 WAL日志。   
       3  目前 PostgreQL 版本不支持在日志表上创建 GIST 索引。
       4  在主库日志表上写数据时,不会自动复制到从库;
       5  在生产库上使用日志表需谨慎,在数据库异常关闭时,数据可能会丢失;
       6  在短时间数据维护时,可以临时使用日志表加载数据,提高数据加载速度。            

  评论这张
 
阅读(26958)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016