ALTER SYSTEM

说明

完成以下功能:

强制系统做检查点(CHECKPOINT)

强制系统收缩日志(SHRINKLOG)

强制系统做日志归档(ARCHIVELOG)

数据库挂起(SUSPEND)

数据库恢复(RESUME)

清理数据缓冲区(FLUSH BUFFER)

释放多余内存给操作系统(TRIM MEMORY) 仅 Linux 系统支持

清理 ELOG 缓冲区(FLUSH ELOG)

WALLET 钱包相关操作

将数据缓冲区中的页面信息转储到文件

将文件中的页面信息所对应的数据页面加载到数据缓冲区

切换系统 undo 表空间

语法

alter_system ::=

percent_clause ::=

wallet_clause ::=

create_wallet_clause ::=

open_wallet_clause ::=

close_wallet_clause ::=

modify_wallet_clause ::=

backup_wallet_clause ::=

alter_wallet_password_clause ::=

undo_clause ::=

参数

CHECKPOINT [ LOCAL | GLOBAL ]

做检查点。 默认为此选项。 (仅执行 ALTER SYSTEM 与加上 CHECKPOINT 效果相同)。

LOCAL: 本节点做检查点操作。

GLOBAL: 共享存储多主集群所有节点均做检查点操作。默认为此选项。

注解

以下做检查点过程中的表现认为是合理的:

表现:在数据库运行过程中,数据文件 A 丢失,之后在数据文件 B 所属表空间中建一个表 t1,建表后做检查点,做检查点可能成功,也可能失败。

成功或失败的原因:做检查点时脏页回刷线程会检查是否存在需要回刷的脏页,当存在脏页需要回刷时会对数据库的数据文件进行检查,若数据文件丢失则会报错;但是如果没有脏页需要回刷则不会去检查文件是否丢失而是直接返回,因此没有报错,由于产生脏页的线程本身存在自动回刷逻辑,不能保证做检查点操作时一定存在脏页,所以认为当 A 文件丢失时做检查点操作成功和失败的表现都算合理。

SHRINKLOG percent %

手动收缩日志空间。

percent指示收缩后空闲日志空间至少所占总空间的比例,即收缩操作完成后日志空间空闲率不低于percent%。日志文件最多收缩到创建时的大小。

为避免收缩后系统短时间内又自动进行扩展,指定空闲率应不小于60%,如果percent小于60%,系统将自动调整为60%。

注解

系统仅保证收缩后空闲率不低于指定的percent值,在此前提下尽可能收缩更多的空间, 但是由于各种原因(按段收缩、只能收缩尾部连续空闲段等),收缩后空闲率几乎总是高于指定值。

SHRINKLOG TO SIZE size_clause [ FORCE ]

手动收缩日志空间的大小。

size_clause 指示期望将日志文件收缩到目标大小,收缩目标大小必须是正数。后面可以跟单位(K、M、G、T),也可以缺省单位。

缺省单位时,默认单位为M。

如果指定了 FORCE,但是日志文件不能立即被收缩,数据库会内部执行强制检查点以及强制归档,以让更多的redo日志可以被重用,达到收缩到指定大小的目的。

注解

指定 FORCE 时,如果需要执行强制检查点以及强制归档:数据库缓冲区里的待回刷页面越多,强制检查点耗时越长;待归档的redo日志越多,强制归档耗时越长。

且日志文件最多收缩到创建时的初始大小。

ARCHIVELOG [ LOCAL | GLOBAL ]

强制归档日志。系统尽可能地将当前在线日志中所有未归档的日志进行归档。

仅在归档模式下使用,非归档模式下将会报错。

LOCAL: 本节点做强制归档日志操作。

GLOBAL: 共享存储多主集群所有节点均做强制归档日志操作。默认为此选项。

SUSPEND

数据库挂起。挂起数据库中所有的IO操作。

RESUME

数据库恢复。将数据库从挂起状态中恢复。

注解

检查点最大限度地减少数据库完全恢复时所必须执行的日志部分,从而加快恢复的时间。在完全恢复时,必须执行两种操作:

日志可以包含REDO日志,这些修改在系统停止前还没有刷新到磁盘上。必须进行前滚操作,保证这些修改体现到数据文件上。

必须回滚与未完成的事务(没有 COMMIT 或 ROLLBACK 日志记录的事务)相关联的所有修改,这些修改记录在UNDO日志中。

检查点从当前数据库的缓冲区中回刷脏数据和日志页,以尽量减少在恢复时必须前滚的修改量。

神通数据库检查点在当前数据库内执行下列进程:

将标记检查点起点的记录写入日志文件。

将为检查点记录的信息存储在检查点日志记录链内。将这条链起点的 LSN 写入数据库根页。

记录在检查点记录中的一条信息是第一个日志映像的 LSN,该映像必须存在以保证成功的数据库范围的回滚。这个 LSN 称为最小恢复 LSN (MinLSN),它是下面这些 LSN 中的最小 LSN:

检查点起点的 LSN。

最旧的活动事务起点的 LSN。

记录在检查点记录中的另一条信息是所有未完成的活动事务的列表。

如果数据库使用的是非归档,则删除新的 MinLSN 之前的所有日志记录,这时日志得到回收。

将所有脏日志和数据页写入磁盘。

将标记检查点末端的记录写入日志文件。

检查点在下列情况下发生:

当执行 CHECKPOINT 语句时。对连接所使用的当前数据库执行检查点操作。

当神通数据库实例启动,完成恢复时。

当使用 ALTER DATABASE READ ONLY更改数据库状态时。当数据库选项被更改时,ALTER DATABASE 对数据库执行检查点操作。

神通数据库实例自动设置的减少恢复数据库所需的时间而在每个数据库内定期生成自动检查点时。当神通数据库实例在一定的时间间隔内尚未做过检查点,神通数据库将自动开始一个检查点。该时间间隔由OSCAR.conf配置文件中的配置项TM_CHECKPOINT_INTERVAL控制。

当神通数据库实例正常方式停止运行时(即非SHUTDOWN IMMEDIATE)。

由于使用了异步写回机制,神通数据库的检查点本身代价相当的小,神通数据库默认的检查点时间为1000秒,管理员可以根据数据库负载和数据库恢复性能的要求配置这个参数。

FLUSH BUFFER

清理数据缓冲区。

注解

清除数据缓冲区仅用于测试,数据缓冲区被清除以后,所有数据需要重新从硬盘读取,会影响后续操作的性能!

TRIM MEMORY

释放内存。将多余的内存释放给操作系统。

FLUSH ELOG

清理 ELOG 缓冲区。

create_wallet_clause

创建钱包,包括手动打开钱包和自动打开钱包。

注解

创建钱包不指定钱包类型时默认为手动打开钱包。

open_wallet_clause

打开手动打开钱包。

注解

自动打开钱包无需 SQL 命令打开,当需要使用透明加密功能时会自动打开。

close_wallet_clause

关闭钱包。若不使用密码则关闭自动打开钱包,使用密码则关闭手动打开钱包。

modify_wallet_clause

修改钱包打开方式。

backup_wallet_clause

备份钱包。

alter_wallet_password_clause

修改钱包的密码。

wallet_password

wallet 密码:密码长度在12 - 128之间。若不包含特殊字符则必须包含大写字母、小写字母、和数字;若包含特殊字符,则必须包含大写字母、小写字母、和数字中的一种。

MANUAL

创建钱包语句中表示手动打开钱包,修改钱包打开方式语句中表示手动打开方式。

AUTO

创建钱包语句中表示自动打开钱包,修改钱包打开方式语句中表示自动打开方式。

FORCE KEYSTORE

打开手动打开钱包获取主密钥。

backup_identifier

备份文件的标识。

keystore_location

备份文件的生成路径。若不写默认为 $SZ_OSCAR_HOME/wallet/$DBNAME/ ,相对路径为 $SZ_OSCAR_HOME。

WITH BACKUP

备份旧密码对应的 wallet 文件。

注解

修改密码的前提是必须存在旧密码对应 wallet.pwd 文件的副本,否则需要指定 WITH BACKUP 。

DUMP BUFFER

将数据缓冲区中的页面信息转储到文件。数据库在关闭时,默认会自动将数据缓冲区中的页面信息转储到文件。

LOAD BUFFER

将文件中的页面信息所对应的数据页面加载到数据缓冲区。数据库在启库时,默认会自动将文件中页面信息所对应的数据页面加载到数据缓冲区。

注解

  • 数据库关闭时默认会自动转储数据缓冲区中的页面信息,如果需要关闭该功能,可修改配置参数 ENABLE_BUFFER_DUMP_AT_SHUTDOWN。
  • 数据库启动时默认会自动加载缓冲区转储文件中记录的页面,如果需要关闭该功能,可修改配置参数 LOADBUFFERLEVEL,数据库启动后无法修改。
  • 数据库默认缓冲区转储文件为 $SZ_OSCAR_HOME/odbs/dbname/dbname.buf(dbname为数据库名称),修改缓冲区转储文件路径配置参数 BUFFER_DUMP_FILE_PATH,文件名称不支持修改。
  • 默认情况数据库每隔24小时进行一次缓冲区页面信息转储,修改时间间隔参数 BUFFER_DUMP_INTERVAL(单位:秒),配置值为0代表关闭转储功能,间隔如果设置则不得小于300s,数据库启动后无法修改。
  • 通过 Ctrl-C 或 SHUTDOWN [NORMAL/TRANSACTIONAL] 方式停库,会自动生成缓冲区转储文件;通过 SHUTDOWN IMMEDIATE 或 SHUTDOWN ABORT 方式停库不会生成缓冲区转储文件。
  • 如果启库加载缓冲区转储页面未完成,就通过 Ctrl-C 或 SHUTDOWN [NORMAL/TRANSACTIONAL] 方式停库,会自动进行转储并覆盖原文件内容,所以建议等待加载完成后停库。
  • 如果加载缓冲区转储页面发生异常而需要停库时,建议使用 SHUTDOWN IMMEDIATE 或 SHUTDOWN ABORT 方式停库,不会自动进行转储而覆盖原转储文件内容。

SET UNDO_TABLESPACE = tablespace_name

将系统 undo 表空间切换到 tablespace_name

创建表空间时,可以给表空间名加上双引号,以指定表空间名大小写区分。如果不加双引号,数据库默认存储的是转成大写后的表空间名。

如果创建表空间时表空间名加了双引号,比如 "UndoTs1",那么在这里切换时需要写成 SET UNDO_TABLESPACE = '"UndoTs1"',否则会找不到该表空间

注解

  • 为了解决 undo 数据文件不断扩大导致磁盘空间无法有效回收和再利用的问题,支持了在线切换 undo 表空间的功能
  • 该功能在使用上有一定的限制,目标表空间必须是一个新创建的,未被使用过的 undo 表空间,才可以切换;若目标表空间是一个已经使用过并被切换掉的 undo 表空间,则会报错
  • 数据库使用过程中不应该频繁的使用此功能,避免回滚段号增长过于频繁而达到数据库的上限
  • 应尽量在空闲时段进行 undo 表空间的切换

示例

示例1: 强制系统做CHECKPOINT

--  强制系统做CHECKPOINT
ALTER SYSTEM CHECKPOINT;

示例2: 强制归档日志

--  准备环境 —— 设置数据库为 归档模式
ALTER DATABASE ARCHIVELOG;

--  强制归档日志
ALTER SYSTEM ARCHIVELOG;


--  设置数据库为 非归档模式
ALTER DATABASE NOARCHIVELOG;

--  强制归档日志
ALTER SYSTEM ARCHIVELOG;
ERROR, 当前数据库为非归档模式,无法执行日志归档

示例3: 收缩日志空间

--  收缩日志空间(按比例收缩)
ALTER SYSTEM SHRINKLOG 80%;

--  收缩日志空间(按大小收缩)
ALTER SYSTEM SHRINKLOG TO SIZE 10M;

--  收缩日志空间(按大小强制收缩)
ALTER SYSTEM SHRINKLOG TO SIZE 10K FORCE;

示例4: 数据库挂起恢复

--  数据库挂起
ALTER SYSTEM SUSPEND;

--  数据库恢复
ALTER SYSTEM RESUME;

示例5: 清理数据缓冲区

--  清理数据缓冲区
ALTER SYSTEM FLUSH BUFFER;

示例6: 清理数据缓冲区

--  将多余的内存释放给操作系统
ALTER SYSTEM TRIM MEMORY;

示例7: 清理数据缓冲区

--  清理 ELOG 缓冲区
ALTER SYSTEM FLUSH ELOG;

示例8: 将数据缓冲区中的页面信息转储到文件

--  将数据缓冲区中的页面信息转储到文件
ALTER SYSTEM DUMP BUFFER;

示例9: 将文件中的页面信息所对应的数据页面加载到数据缓冲区

--  将文件中的页面信息所对应的数据页面加载到数据缓冲区
ALTER SYSTEM LOAD BUFFER;

示例10: 切换 undo 表空间

drop tablespace undots1;
drop tablespace undots2;
drop tablespace "undots3";

create undo tablespace undots1 datafile 'undots1.dbf';

-- 切换到新的undo表空间undots1
alter system set undo_tablespace='UNDOTS1';

create undo tablespace undots2 datafile 'undots2.dbf';

-- 切换到新的undo表空间undots2
alter system set undo_tablespace='UNDOTS2';

create undo tablespace "undots3" datafile 'undots3.dbf';

-- 切换到加了双引号的表空间"undots3"
alter system set undo_tablespace='"undots3"';

-- 尝试切换到旧的 undo 表空间,切换失败
alter system set undo_tablespace='UNDOTS1';
ERROR, UNDOTS1 是一个已经使用过并被切换掉的回滚表空间,需要切换到一个未使用过的回滚表空间


示例: 透明加密功能

见透明加密章节