1、unlogged table的定义
若建表时指定了unlogged,则该表为一个不受日志记录的表,被写入到其中的数据不会被写到预写式日志中,因此这种表的速度会比普通表快。
但是,由于不会有日志记录,因此在崩溃时也是不安全的,在崩溃之后或者非干净关闭之后会被自动地截断;表中的内容也不会被复制到后备服务器中;表上创建的任何视图也会自动地不被日志记录。
2、unlogged table在物理备份与还原中的表现
由于unlogged table不会记录日志,在物理备份还原上也会有一定的体现,表现如下:
1、全量备份
初始化一个单机数据库,创建基础数据(创建unlogged表,并插入数据,执行checkpoint):
CREATE UNLOGGED TABLE a (a int);
insert into a values (generate_series(1,20000));
checkpoint;
1)查看unlogged表的数据量
2)执行全量备份
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase --archive-copy --type=full backup
3)停止数据库,备份原data目录,并创建新的data目录
4)还原到数据库停止状态
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase restore
5)恢复后,重启数据库,连接数据库,查看表数据
可见,最终只还原了表,没有还原数据。
2、增量备份
连接数据库,创建基础数据(创建unlogged表,并插入数据,执行checkpoint):
CREATE UNLOGGED TABLE a (a int);
insert into a values (generate_series(1,20000));
checkpoint;
1)查看unlogged表的数据量
2)执行增量备份
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase --archive-copy --type=incr backup
3)停止数据库,备份原data目录,并创建新的data目录
4)还原到数据库停止状态
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase restore
5)恢复后,重启数据库,连接数据库,查看表
可见,最终只还原了表,没有还原数据。
3、差异备份
连接数据库,创建基础数据(创建unlogged表,并插入数据,执行checkpoint):
CREATE UNLOGGED TABLE a (a int);
insert into a values (generate_series(1,20000));
checkpoint;
1)查看unlogged表的数据量
2)执行差异备份
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase --archive-copy --type=diff backup
3)停止数据库,备份原data目录,并创建新的data目录
4)还原到数据库停止状态
./sys_rman --config=/home/zym/0308/kbbr_repo/sys_rman.conf --stanza=kingbase restore
5)恢复后,重启数据库,连接数据库,查看表
可见,最终只还原了表,没有还原数据。
3、unlogged table在集群上表现
由于unlogged table不会记录日志,在集群上也会有一定的体现,表现如下:
1、新建unlogged table
1)主机创建unlogged table,并插入数据
create unlogged table test_unlogged (a int ,b text default now());
insert into test_unlogged values(generate_series(1,100));
2) \d+查看备库(仅有8192bytes),说明备库无数据,仅有表结构。
2)备库unlogged table执行select报错
test=# select * from test_unlogged;
ERROR: cannot access temporary or unlogged relations during recovery
3)创建一个unlogged table的视图,视图创建成功,备库无法查询该视图
主库创建视图:
create view v_test as select * from test_unlogged;
主库可以正常查询该视图,备库查询该视图报错:
test=# select * from v_test;
ERROR: cannot access temporary or unlogged relations during recovery
4)重启集群
重启集群后,同集群重启前表现一致,主机unlogged table中数据未丢失,可正常查询。
5)向主库unlogged table 插入2G左右数据后,停止主机data
备机成功升主,原主机恢复成备机加入集群后,新主机中unlogged table为空,且现在的备机\d+查询表数据也为空,数据丢失。
2、新建普通表,插入数据后将该表修改为unlogged表
1)主机创建普通表,插入数据
create table test1_unlogged (a int ,b text default now());
insert into test1_unlogged values(generate_series(1,1000000));
主机查询表:
备机查询表:
2)主机修改表为unlogged表,主备查询该表,主机查询正常,备机无法查询,且通过\d+ 查询备机表大小,备机表原来大小为66MB,修改为unlogged后,备机表大小为8192bytes
alter table test_unlogged set unlogged;
主机查询表:
备机查询表:
3)创建一个该table的视图,视图创建成功,备库无法查询该视图
4)重启集群,重启后同集群重启前表现一致
5)主备切换,切换后unlogged table中数据为空
新主查看表:
总结:
unlogged表,备份还原只会保护表结构,不会保护表数据
unlogged表,表上创建的任何视图也会自动地不被日志记录
unlogged表,表中的内容也不会被复制到后备服务器中
【更多人大金仓数据库信息, 详见 https://help.kingbase.com.cn 】