返回首页

gbase数据、南大通用产品文档:GBase8s物理日志的大小和位置

更新日期:2024年09月11日

这些主题描述了如何配置物理日志的大小和位置。
指定物理日志的位置
在数据库服务器初始化磁盘空间时,它将逻辑日志文件和物理日志放在根数据库空间中。
您对该放置没有初始控制权。要提高性能(尤其是减少对根数据库空间的写入次数以及将

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 316 -
磁盘争用最小化),可将物理日志从根数据库空间移出至另一数据库空间(最好是不包含
活动表或逻辑日志文件的磁盘)。
建议: 找到容错存储设备上的关键数据库空间。如果物理日志所在的存储器不是容错存
储器,请对包含物理日志的数据库空间使用 GBase 8s 镜像。这将在存储设备发生故障
时保护数据库。
用于估计物理日志的大小的策略
物理日志的大小取决于两个因素:事务生成物理日志活动的速率和是否设置了
RTO_SERVER_RESTART 配置参数
事务生成物理日志活动的速率可影响检查点性能。在检查点处理期间,如果因事务持续生
成物理日志数据而导致物理日志开始变得太满,那么数据库服务器将阻塞事务以使检查点
完成,并避免物理日志溢出。
要避免事务阻塞,数据库服务器必须具有足够的物理日志空间来包含检查点处理期间出现
的所有事务活动。在物理日志填充度达到 75% 时触发检查点。在物理日志填充度达到 75%
时,必须在完成检查点处理之后才能使用剩余的 25% 的物理日志。一旦系统检测到有物理
日志溢出的可能性,就会发生事务阻塞,因为每个活动事务都可能生成一个物理日志活动。

例如,假设您具有 1 千兆字节的物理日志和 1000 个活动事务。如果每个事务同时处于临
界区,那么这 1000 个活动事务具有生成大约 80 兆字节物理日志活动的可能性。当填入
750 兆字节的物理日志时,数据库服务器将触发检查点。如果在使用 920 兆字节物理日志
时检查点仍未完成,那么将出现事务阻塞直到检查点完成。如果发生事务阻塞,那么服务
器将自动触发更频繁的检查点以避免事务阻塞。您可以禁用自动检查点的生成。
如果存在大量脏分区,那么即使物理日志填充度不到 75%,服务器也可能触发检查点,因
为将修改的分区数据清空到磁盘需要物理日志空间。
当服务器检查物理日志填充度是否达
到 75% 时,服务器还会检查以下情况是否为真:
(使用的物理日志页数 + 脏分区数量)>= ((物理日志大小 * 9)/10)
有关检查点处理和自动检查点的更多信息,请参阅检查点。
估计物理日志大小时要考虑的第二个因素取决于是否使用 RTO_SERVER_RESTART 配置参数
指定了快速恢复的目标时间量。如果无需考虑快速恢复时间,那么不需要启用
RTO_SERVER_RESTART 配置参数。如果为 RTO_SERVER_RESTART 配置参数指定值,那么事务
活动将生成附加物理日志活动。
通常,此附加物理日志活动对事务性能影响较小或没有影响。额外的日志记录用于在快速
恢复期间辅助缓冲池,以便以最佳方式执行日志重放。如果物理日志比所有缓冲池的总大
小要大很多,那么快速恢复期间将对页清空并出现缺页故障。页清空和缺页故障大幅减小
了快速恢复性能,而且数据库服务器不能维护 RTO_SERVER_RESTART 策略。
对于缓冲池空间小于 4 千兆字节的系统,物理日志的大小可定在所有缓冲池总大小的
110%。对于较大的缓冲池,以 4 千兆字节的物理日志空间开始,然后监视检查点活动。如
果检查点发生过于频繁,似乎会影响性能,请增加物理日志大小。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 317 -
为数据库服务器配置了较小的物理日志并且该服务器具有大量用户时,可能会出现一种称
为物理日志溢出的罕见情况。遵循上述有关大小的准则可帮助避免物理日志溢出。每当消
息日志检测到未达到最佳标准的配置时,数据库服务器将对其生成性能警告。
如果检测到未达最佳标准的配置,
那么您可以使用 onstat
-g
ckp 命令来显示配置建议。

事务日志记录关闭时物理日志溢出
如以下示例所示,如果您在事务日志记录关闭的数据库中使用简单大对象或智能大对象,
物理日志可能会溢出。
在数据库服务器处理简单大对象时,数据库服务器存储在磁盘上的简单大对象的每个部分
均可分别记录,允许线程退出各部分之间的代码临界区。但如果日志记录关闭,那么数据
库服务器必须对一个临界区中的简单大对象执行所有操作。如果该简单大对象很大,而物
理日志很小,那么该情况可能导致物理日志填满。如果发生这种情况,数据库服务器会将
以下消息发送至消息日志:
Physical log file overflow
然后数据库服务器启动关机操作。有关建议的更正操作,请参阅消息日志。

当您使用由程序逻辑补充的游标时,您可解决普通的 SQL 不可解决的问题。这些问题之
一就是部件爆炸问题,有时称为材料单处理。此问题的核心是对象之间的递归关系;一个
对象包含其他对象,其又包含其他对象。
通常以制造库存为例来说明该问题。例如,公司制造各种部件。有些部件是分立的,但有
些是其他部件的组合。
在可能称为 contains 的单个表中说明这些关系。列 contains.parent 持有系组合的部件的部件
编号。列 contains.child 具有为父部件的组件的部件的部件编号。如果部件编号 123400 是
九个部件的组合,则存在九行,123400 在第一列中,其他部件编号在第二列中。下图展示
描述部件编号 123400 的多行中的一行。
图: 部件爆炸问题


部件爆炸问题在于:给定一个部件编号,产生为那个部件的组件的所有部件的列表。下列
示例是一种解决方案的概要,如以 GBase 8s ESQL/C 实现的那样:
int part_list[200];

boom(top_part)
int top_part;
{
long this_part, child_part;
int next_to_do = 0, next_free = 1;
part_list[next_to_do] = top_part;

EXEC SQL DECLARE part_scan CURSOR FOR
SELECT child INTO child_part FROM contains

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 222 -
WHERE parent = this_part;
while(next_to_do < next_free)
{
this_part = part_list[next_to_do];
EXEC SQL OPEN part_scan;
while(SQLCODE == 0)
{
EXEC SQL FETCH part_scan;
if(SQLCODE == 0)
{
part_list[next_free] = child_part;
next_free += 1;
}
}
EXEC SQL CLOSE part_scan;
next_to_do += 1;
}
return (next_free - 1);
}
从技术上讲,contains 表的每一行都是有向无环图,或树,的头结点。该函数执行对该树的
宽度优先搜索,树根是作为它的参数传递的部件编号。该函数使用名为 part_scan 的游标返
回在 parent 列中带有特定的值的所有行。最内层的 while 循环打开 part_scan 游标,在选择
集中访存每一行,并当已检索了每一组件的部件编号时,关闭该游标。
此函数解决部件爆炸问题的核心,但该函数不是完整的解决方案。例如,它不允许组件在
树中出现多个级别。此外,实际的 contains 表还会有列count,给出在每一 parent 中使用
的 child 部件的计数。返回每一组件部件的总计数的程序要复杂得多。
之前描述的迭代方法不是解决部件爆炸问题的唯一方法。如果代的数目有固定的限制,则
您可使用嵌套的外部自连接,以单个 SELECT 语句解决该问题。
如果在一个最高级别部件内,可包含最多四代部件,则下列 SELECT 语句返回所有部件:

SELECT a.parent, a.child, b.child, c.child, d.child
FROM contains a
OUTER (contains b,
OUTER (contains c, outer contains d) )
WHERE a.parent = top_part_number
AND a.child = b.parent
AND b.child = c.parent

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 223 -
AND c.child = d.parent
此 SELECT 语句为来源于指定为 top_part_number 的祖先的每一行返回一行。对于不存在
的级别,返回 Null 值。
(请使用指示符变量来检测它们。)要将此解决方案扩展到更多级
别,请选择 contains 表的附加的嵌套外部连接。您还可修订此解决方案来返回每一级别上
部件的数目的计数。

函数说明
cume_dist 函数用于统计小于等于当前值的行数/窗口内总行数,比如可以用于统
计小于等于当前薪水的人数所占总人数的比例。
cume_dist 函数不需要参数。
示例

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
869
gbase> SELECT *, cume_dist() over (partition by uname order by dt) as
cume_dist from tt;
+----+------------+-------+-------------+-------------------+
| id | dt
| uname | totalamount | cume_dist
|
+----+------------+-------+-------------+-------------------+
|
2 | 2016-06-05 | A
|
148 |
1 |
|
1 | 2016-06-05 | A
|
135 |
1 |
|
4 | 2016-06-02 | B
|
153 | 0.666666666666667 |
|
3 | 2016-06-02 | B
|
120 | 0.666666666666667 |
|
5 | 2016-06-10 | B
|
198 |
1 |
|
8 | 2016-02-05 | C
|
NULL |