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/236427.html