PostgreSQL9.1的新特性之一:日志表,往日志表写数据时会比普通表快很多,因为日志表写入时不写 WAL 日志,这是它的优点;同时,日志表的使用还有些限制,比如在主库日志表上写数据时,数据不会自动复制到从库,在日志表上创建索引时也不会产生WAL日志,并且目前日志表不支持创建 GIST 索引。同时日志表还有个致命的缺点,在数据库异常关闭时,日志表数据可能会丢失,下面测试下日志表表的特性。
环境准备
修改 postgresql.conf
| 1 | checkpoint_timeout = 120min | 
为了测试效果,先修改 checkpoint_timeout 参数,设置较大值, 排除 PostgreSQL自动 checkpoint 对测试结果的影响!
创建普通表和日志表
| 1 | mydb=> create table test ( id integer, name varchar(32)); | 
插入数据测试
| 1 | mydb=> timing | 
备注:这是在笔记本虚拟机上的测试,从上面看出,向日志表里写数据比向普通表写数据要快很多。
测试一: 数据库非正常关闭
数据库非正常关闭
| 1 | [postgres@pgb pg_root]$ pg_ctl stop -m immediate -D/database/pgdata1923_9.1/pg_root -p 1923 | 
数据库再次启动,并连接
| 1 | [postgres@pgb tf]$ /opt/pgsql9.1/bin/psql -p 1923 | 
备注:数据库非正常关闭并启动后,日志表 test_unlogged 数据完全丢失。
测试二: 数据库正常关闭
3.1 向日志表插入数据
| 1 | mydb=> insert into test_unlogged select generate_series(1,1000000),'AAA'; | 
正常关闭后
| 1 | [postgres@pgb pg_root]$ pg_ctl stop -m fast -D /database/pgdata1923_9.1/pg_root | 
数据库再次启动,并连接
| 1 | [postgres@pgb tf]$ /opt/pgsql9.1/bin/psql -p 1923 | 
备注:数据库正常关闭后,数据没有丢失。
测试三: Checkpoint 后非正常关闭数据库
向日志表插入数据
| 1 | mydb=> insert into test_unlogged select generate_series(1,1000000),'AAA'; | 
主动发出 checkpoint 命令
| 1 | mydb=> checkpoint; | 
数据库非正常关闭
| 1 | [postgres@pgb pg_root]$ pg_ctl stop -m immediate -D /database/pgdata1923_9.1/pg_root -p 1923 | 
数据库连接后,再次查看数据
| 1 | select count(*) from test_unlogged; | 
备注: 往日志表 test_unlogged 写入数据,并执行 checkpoint 操作后,数据库非正常关闭后,数据没有丢失。
五 总结
- PostgreSQL 9.1 的日志表写入速度比普通表要快很多,经测试至少快了5倍以上,因为日志表写
 数据时,不产生 WAL日志。
- 在日志表上创建索引时,也不会写 WAL日志。
- 目前 PostgreQL 版本不支持在日志表上创建 GIST 索引。
- 在主库日志表上写数据时,不会自动复制到从库;
- 在生产库上使用日志表需谨慎,在数据库异常关闭时,数据可能会丢失;
- 在短时间数据维护时,可以临时使用日志表加载数据,提高数据加载速度。
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/236427.html
