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

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

环境准备

修改 postgresql.conf

1
checkpoint_timeout = 120min

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

创建普通表和日志表

1
2
3
4
mydb=> create table test ( id integer, name varchar(32));  
CREATE TABLE
mydb=> create unlogged table test_unlogged ( id integer, name varchar(32));
CREATE TABLE

插入数据测试

1
2
3
4
5
6
7
8
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

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

测试一: 数据库非正常关闭

数据库非正常关闭

1
2
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

数据库再次启动,并连接

1
2
3
4
5
6
7
8
[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 向日志表插入数据

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

正常关闭后

1
2
3
[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

数据库再次启动,并连接

1
2
3
4
5
6
7
8
9
[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 后非正常关闭数据库

向日志表插入数据

1
2
3
4
5
6
7
8
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)

主动发出 checkpoint 命令

1
2
3
4
5
6
7
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

数据库非正常关闭

1
2
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

数据库连接后,再次查看数据

1
2
3
4
5
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. 在短时间数据维护时,可以临时使用日志表加载数据,提高数据加载速度。

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/236427.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论