**一、 GBase 8s数据库共有以下 4 种日志模式:**无日志模式、缓冲日志模式、无缓冲日志模式、ANSI 模式。详细介绍如下:
1、无日志模式(Non logging):
采用无日志模式时,所有 DML 操作都不会被记录到日志中,只记录 DDL 操作,且这些操作影响的行并不会被写入日志,只记录操作本身以及返回的代码。该模式的优点是极大地减少了磁盘 I/O,拥有很高的吞吐率,但在该模式下数据库不支持事务控制,当数据库失败时,也无法进行恢复。
创建 无日志模式 数据库的语句,没有with log语句
CREATE DATABASE nologdb;
此种数据库不允许事务相关的使用语句,以下语句无效:
BEGIN WORK; COMMIT WORK; ROLLBACK WORK;
RELEASE SAVEPOINT; ROLLBACK TO SAVEPOINT;
SET IMPLICIT TRANSACTION; SET LOG; SET ISOLATION
部分事务语句实际操作如下:
> BEGIN WORK;
256: Transaction not available.
Error in line 1
Near character position 9
2、缓冲日志模式(buffered logging)
采用缓冲日志模式时,所有操作在发生时被写到缓冲区中,当缓冲区被写满之后或者发生检查点操作才会回写到磁盘。该模式的优点是可以大大减少磁盘的 I/O,从而提高数据库的性能。但是当系统发生问题需要进行恢复时,缓冲区内的数据将丢失。这些数据是无法恢复的。
创建 缓冲日志模式 数据库的语句:
CREATE DATABASE bufferdb WITH BUFFERED LOG;
3、无缓冲日志模式(Unbuffered logging):
当采用无缓冲日志模式时,所有操作在发生时被写到缓冲区中,当事务被提交时立刻回写到磁盘。该模式的优点是当系统发生问题时可以保证数据丢失最少,数据完整性和一致性可以在事务级得到保证。但是增加了磁盘的I/O,使得数据库的性能受到一定的影响。
创建 无缓冲日志模式 数据库的语句:
CREATE DATABASE nobufferdb WITH LOG;
4、ANSI模式:
创建的数据库就是兼容ANSI的数据库,且符合 SQL 语言的 ANSI/ISO 标准。ANSI模式和无缓冲日志模式基本相同,此外还强制要求与 ANSI 模式的事务处理方式一致。
创建 ANSI模式 数据库的语句:
CREATE DATABASE ansidb WITH LOG MODE ANSI
二、 检查数据库日志模式方法
通过sysmaster库下的sysdatabases表检查相关字段,例如检查无日志模式数据库nologdb的日志模式:

相关字段解释:

三、 更改日志模式的影响
数据库服务器在更改日志记录状态时对数据库加上互斥锁定以防止其他用户访问该数据库,而当更改完成时释放该锁定。
如果在日志记录方式更改期间发生故障,那么在复原数据库服务器数据后,请检查 sysmaster 数据库的 sysdatabases 表内标志中的日志记录方式。
在选择了已缓冲或未缓冲日志记录之后,应用程序就可以使用 SQL 语句 SET LOG 从一种日志记录方式更改为另一种日志记录方式。此更改在会话期间会一直持续。
如果向数据库添加日志记录,那么直至数据库的所有存储空间的下一次 0 级备份才完成该更改。
四、GBase 8s数据库改变日志模式的方法共有以下 4 种:
1、ontape命令
2、ondblog命令
3、SET LOG 语句
4、Admin API SQL method:Execute function admin('alter logmode', 'dbname','n/u/b/a');
1、ontape命令:
可以使用 ontape 的--A、--B、--N 和--U 选项来修改数据库日志模式。
$>ontape -s -B:修改为缓冲日志模式。
$>ontape -s -U:修改为无缓冲日志模式。
$>ontape -s -N:修改为无日志模式。
$>ontape -s -A:修改为 ansi logging 模式,从这个模式无法切换到其他模式,因此一般不使用该项。
使用注意事项:
在将数据库从不记录日志切换为记录日志时,-A、-B、-U 选项必须同-s选项一起使用,并需要备份。

如果将日志方式在缓冲日志模式和无缓冲日志模式之间切换,则不需要-s选项

在切换数据库的日志方式时,服务器会对数据库加一个独占锁,因此此时用户不能使用这个数据库,否则将会报告错误。可以通过 onstat -g sql 查询哪些用户正在使用数据库并通过 onmode -z 命令杀死相关线程。

ontape 还可以通过一个命令同时修改多个数据库的日志方式。例如:将bufferdb数据库从缓冲日志模式切换为无日志模式,将nologdb和nologdb2数据库从无日志模式修改为缓冲日志模式。

ANSI日志模式的数据库无法进行切换,会报错。

2、ondblog命令:
可以通过 ondblog 命令来修改一个或多个数据库的日志模式。此外需要注意的是,在向数据库添加日志时,必须在修改生效之前创建一个 level-0 备份。
将数据库设置为无缓冲日志、缓冲日志:
ondblog unbuf
ondblog buf

将数据库设置为不记录日志:
ondblog nolog

将 dbfile 中记录的所有数据库设置为不记录日志:
ondblog nolog -f dbfile

将数据库设置为 ANSI 兼容模式:
onbdlog ansi

3、SET LOG 语句:
使用 SET LOG 语句来将您的数据库日志记录模式从缓冲的事务日志记录更改为未缓冲的事务日志记录,反之亦然。
语法:

SET LOG语句仅定义当前会话的模式。不会更改ondblog设置的缺省模式。

符合 ANSI 的数据库不可使用缓冲的日志记录,下例中ansidb是ANSI数据库。

在Non logging数据库中使用SET LOG语句无效,下例中nologdb是Non logging数据库。

4、Admin API SQL method:
sysadmin 数据库中有一个admin函数,可以更改数据库模式,可使用如下执行语句:
Execute function admin('alter logmode', 'dbname','n/u/b/a');

在向数据库添加日志时,必须在修改生效之前创建一个 level-0 备份,也就是说通过admin将无日志模式修改为其他日志模式后,要使用ontape语句进行备份后才会生效。

其他模式之间的转换:

五、 检查数据库日志模式方法
通过sysmaster库下的sysdatabases表检查相关字段。