YashanDB ALTER DATABASE 语句
通用描述
ALTER DATABASE 用于修改数据库的相关属性。 分布式部署中,仅支持如下语法:
startup_clauses
convert filename [including archivelog]
archivelog/noarchivelog
set standby database to
convert to physical standby
switchover
failover
exit upgrade
add logfile
drop logfile
delete archivelog
推荐使用 yasboot 运维工具管理分布式集群,具体见yasboot命令介绍章节描述。
语句定义
alter database::=










startup_clauses
该语句用于 MOUNT 和 OPEN 数据库,以便用户访问。
MOUNT 是数据库挂载物理文件后的状态,OPEN 是数据库打开后的状态,详细数据库启动介绍请参考实例启停章节。
YashanDB 的 OPEN 方式分为:
READWRITE(READ WRITE):以读写模式打开数据库,单机部署、共享集群部署和分布式部署下默认的主库打开方式,禁止物理备库使用该方式打开数据库。
READONLY(READ ONLY):以只读模式打开数据库,限制数据库只读,不产生任何 redo,物理备库默认使用该方式打开数据库,不适用于分布式, 共享集群部署。
RESETLOGS:打开数据库时重置 redo 时间线,并丢弃在恢复期间未应用的 redo 信息,从而确保永远不会应用这些信息。
UPGRADE:仅当数据库需要升级时才会使用该方式打开数据库。
示例
database_file_clauses
该语句用于对数据库的数据文件进行自动扩展的开关控制、大小指定等。此操作需要数据库处于 OPEN 状态。 在设置数据文件自动扩展或 RESIZE 数据文件时,对于 TEMP 表空间和 SWAP 表空间的数据文件使用 tempfile 选项,其它表空间的数据文件使用 datafile 选项。
autoextend off
关闭某个数据文件的自动扩展,同时该数据文件的 NEXT_SIZE 和 MAX_SIZE 被设置为 0。
示例(单机、共享集群部署)
autoextend on
开启某个数据文件的自动扩展,同时 NEXT 用于指定自动扩展下一空间的大小,以 Bytes 为单位,未指定则取默认值 8K 个 BLOCK 大小;MAXSIZE 用于指定自动扩展的最大空间,UNLIMITED 为无限制,未指定则默认为 64M 个 BLOCK 大小。
示例(单机、共享集群部署)
resize
重新指定某个数据文件的大小。
创建表空间下的数据文件时可以通过设定数据文件自动扩展来满足用户对于更大数据文件的需求,但如果存储空间并不充足,或者数据文件按预期指定过大而实际使用很小,或者数据文件中存在大量被删除的临时数据而空间并没有被回收,这些情况下就需要使用 resize 的方式对数据文件进行缩小,释放磁盘空间。
使用 resize 对数据文件进行扩大,一次设置文件为自己所需大小 ,也可以避免频繁的申请资源。
resize 后的数据文件大小必须在 128 到 64MB 个 BLOCK 之间。
resize 操作不一定会成功,例如在扩大文件时可能会存在磁盘空间不足,或者在缩小文件时,当前数据文件的有效数据大小已超过指定的值。
注意:UNDO 表空间的数据文件只能进行扩大,不能进行缩小。
示例(单机、共享集群部署)
offline [drop]
改变某个数据文件至 offline 状态,可以在数据库处于 MOUNT 或者 OPEN 时执行该操作。 执行此操作后该数据文件所属表空间也会被 offline,表空间内的所有数据文件的状态都是 recover。
执行 offline 的场景:
存在数据文件损坏或丢失导致无法打开数据库,此类场景只能在数据库处于 MOUNT 时执行 offline。
表空间的数据文件在有数据时无法被删除,但不再需要使用该数据文件。
需要数据隔离,临时将某个数据文件 offline。
执行 offline 的说明:
尽量在数据库处于 OPEN 状态时执行此操作,除非存在数据文件损坏或丢失导致无法打开数据库。
该数据文件后续可能会被 online 且仍属于数据库,因此仍需要对其进行备份,但如果该数据文件名称被修改,会由于备份时找不到数据文件而导致备份失败。
发现数据库为 abnormal 状态时,查询 V$DIAG_INCIDENT 排查是否因文件损坏导致 abnormal,如果是则可以将该数据文件 offline。
在数据库处于 MOUNT 状态时执行此操作的额外说明:某些情况下(例如 open 过程中回放了创建该文件所属表空间的 redo 日志),数据库会修复已被此操作 offline 的数据文件和其所属表空间,并将它们置为 online。文件被 offline,然后打开数据库后,查询 V$DATAFILE 将无法正常显示该文件的创建时间,除非其被重新 online。在备库上执行该操作,然后打开数据库后,备库将变成 need repair 状态。尽量在主库上执行该操作,这样可以通过 redo 日志同步使备库 offline 相同的文件。
执行 offline 的限制:
每次只能 offline 一个数据文件。
内置表空间的数据文件不能被 offline。
数据文件被 offline 后不可读写,且不能对该文件进行 resize 或设置自动扩展开关等操作。
主库在 mount 和 open 状态均可执行该操作,备库只能在 mount 状态下执行。
drop
在数据库未开启归档模式时,执行数据文件 offline 必须指定此选项。在开启归档模式的情况下,此选项被忽略,即 OFFLINE DROP = OFFLINE。
示例(单机、共享集群部署)
convert filename [including archivelog]
当数据库整库迁移到其它目录后,该语法可用于将数据库记录在控制文件中的路径进行转换,从而使数据库继续正常启动、运行。该语句仅在实例处于 NOMOUNT 阶段时使用。
该语句的具体使用步骤如下:
更新启动路径:修改配置参数文件中的控制文件路径参数 CONTROL_FILES 为当前数据库启动路径,或删除该参数的已有配置从而使用默认配置启动。
(可选)如需更新归档日志存储路径:修改配置参数文件中的归档日志路径参数 ARCHIVE_LOCAL_DEST 为当前数据库指定归档路径,或删除该参数的已有配置从而使用默认配置存储归档日志。
配置数据文件路径转换参数 DB_FILE_NAME_CONVERT,将旧的文件路径转换为新的文件路径。同时,需确认数据库是否需要开启双写,如需开启双写,请确保数据文件转换路径参数可以对双写文件路径生效。
配置在线日志文件的路径转换参数 REDO_FILE_NAME_CONVERT,将旧的文件路径转换为新的文件路径。
配置 DATABUCKET 的路径转换参数 DB_BUCKET_NAME_CONVERT,将旧的文件路径转换为新的文件路径。
启动数据库至 NOMOUNT 状态,并根据是否需要转换归档日志路径从而决定是否显式指定子句 INCLUDING ARCHIVELOG。
启动数据库至 OPEN 状态。
including archivelog
当需要转换归档日志路径时指定该子句。
示例
logfile_clauses
该语句用于对数据库的 redo 日志进行归档模式设置、备库保护模式设置、增加、删除等操作。
archivelog/noarchivelog
启用或停止数据库的日志归档模式。
单机部署中,此操作需要数据库实例处于 MOUNT 状态。
共享集群部署中,此操作需要当前所在实例处于 MOUNT 状态,且其他实例处于 NOMOUNT 状态。
当数据库处于主备复制模式(单机主备部署或主备共享集群部署)时,无法从归档模式切换为非归档模式。
示例
set standby database to
指定备库的保护模式,缺省值为 MAXIMIZE PERFORMANCE。其中,设置为 MAXIMIZE PROTECTION 的前提主库的日志已经同步到备库,否则会报错。FORCE 表示强制设置,忽略报错。TIMEOUT 表示在设置最大保护模式时,等待备库同步的时间,超过该时间将报错,单位为秒,可省略,默认为 10s。
MAXIMIZE PERFORMANCE:主库事务提交不需要等待备库收到日志,保证了主数据库的可用性及性能,但是主库宕机后,可能丢失数据。
MAXIMIZE PROTECTION:备库的数据保护优先于主库的可用性,主库的日志在同步备库上落盘之后,事务才能提交,在同步备库故障的情况下,主库会在一段时间后变为只读模式。注:如果 COMMIT_WAIT 参数设为 NOWAIT,主库事务提交不会等待备库收到日志
MAXIMIZE AVAILABILITY:同步备库正常时,主库的日志在同步备库上落盘之后,事务才能提交,同步备库故障时,事务提交也不会阻塞,保证数据库可用。注:如果 COMMIT_WAIT 参数设为 NOWAIT,主库事务提交不会等待备库收到日志

示例
示例(单机、分布式部署)
add logfile
为数据库增加新的 redo 日志,同时增加多个文件以','隔开。此操作需要数据库处于 OPEN 状态。
standby
指定 STANDBY 子句,添加 redo 日志文件到 standby redo log,如果不指定该字段,则添加一个 redo 文件到 online redo log。
共享集群下,redo 日志是各个实例独享的,仅支持各个实例给自己添加 redo 日志。
SIZE 指新增 redo 日志文件大小。BLOCKSIZE 指 redo 日志文件的块大小,默认为 4096,可手动指定为 512 的整数。redo 日志实际创建的文件大小是 BLOCKSIZE 的整数倍,若指定大小不是整数倍,则实际创建大小向上取整。 PARALLEL 可以指定创建 redo 日志文件的并行度,取值范围为 1 到 8。不指定时系统根据文件大小自适应并行度,例如文件不超过 1G 时的并行度为 1,文件超过 128G 时的并行度为 8,文件大小在 1G 到 128G 之间时的并行度为 4。
注:redo 日志文件大小的最小值受 DB_BLOCK_SIZE,MAX_SESSIONS 和 REDO_BUFFER_SIZE 三个参数的影响(最小值参考公式:DB_BLOCK_SIZE * MAX_SESSIONS * 8 + REDO_BUFFER_SIZE / 2)。
示例
drop logfile
删除一个已存在的 redo 日志,对于正在使用中的 redo 日志则不被允许删除。此操作需要数据库处于 OPEN 状态。
standby
指定 STANDBY 子句,删除一个 standby redo log,如果不指定该字段,则删除一个 online redo log。
共享集群下,redo 日志是各个实例独享的,仅支持各个实例删除自己的 redo 日志。
示例
standby_database_clauses
该语句用于执行主备库之间的切换。主备库详细操作描述请参考高可用手册。
convert to physical standby
从主数据库切换为备数据库。
示例
Note:
数据库的角色必须是 PRIMARY,且执行实例必须处于 MOUNT 状态。
在共享集群部署下,只有 1 号实例并且该实例是 MASTER_ROLE 才可以执行该操作。
switchover
从备数据库切换回主数据库。
示例
Note:
数据库的角色必须是 STANDBY,且执行实例必须处于 OPEN 状态。
主库的所有存活实例的状态必须是 OPEN 状态。
主备之间的 redo 传输链路连接正常,且备库处于 NORMAL 状态。(主库查询视图 V$ARCHIVE_DEST_STATUS,备库查询视图 V$REPLICATION_STATUS)
共享集群部署下,主库的 1 号实例必须存活。
共享集群部署下,switchover 的性能受 checkpoint 的影响,需要等待非 1 号实例完成全量 checkpoint 再执行该操作。
failover
当主库出现故障不能恢复时,将备库强制切换为主数据库。
示例
Note:
数据库的角色必须是 STANDBY。
执行实例必须处于 OPEN 状态。
数据库与主数据库的连接必须是断开的,可以查看视图 V$REPLICATION_STATUS 查看主备的连接情况。
共享集群部署下,1 号实例执行该操作切换成主数据库,其他的实例需要手动 OPEN。
RESET ID 仅用于仲裁选主场景 yasom 自动下发的 failover 语句中,不得手动指定该选项。
recover managed standby database cancel
在备库并且为 Open 状态下执行的 SQL 语句,该语句的作用为停止当前回放操作。 如果有前台回放正在进行,则中断该线程使其退出。
示例(单机、共享集群部署)
recover managed standby database
在备库并且为 Open 状态下执行的 SQL 语句,该语句的作用为启动备库回放,如需退出,需要执行取消回放 SQL 语句。
示例(单机、共享集群部署)
until scn integer
在备库并且为 Open 状态下执行的 SQL 语句,该语句的作用为启动备库回放,回放到指定到 SCN 时主动退出。 此时如需退出则需要执行取消回放 SQL 语句进行中断操作。
示例(单机、共享集群部署)
disconnect from session
在备库并且为 Open 状态下执行的 SQL 语句,该语句的作用为在后台执行回放,当前会话可执行其他业务。
示例(单机、共享集群部署)
to logical standby
该语句用于将物理备用数据库转换为逻辑备用数据库。
keep identity
如果您想要使用逻辑备用数据库提供的滚动升级功能,同时恢复到主数据库和物理备用数据库的原始配置,请使用此子句。
register archivelog
该语句用于手动注册归档。该 SQL 的功能约束有:
RESTORE DATABASE 后且数据库未 open,可以用该 SQL 手动注册归档。
数据库恢复或创建完整后,此操作的对象必须是备库,并且配置参数 SANDBOX_STANDBY 为 TRUE。
指定的归档的路径可以为绝对路径,也可以为文件名,使用文件名时默认路径为归档路径(配置参数 ARCHIVE_LOCAL_DEST)。
示例(单机、共享集群部署)
or replace
如果发现归档已经注册,就替换原有注册的归档,该操作比较危险,需要谨慎使用。
示例(单机、共享集群部署)
start logical standby apply
该语句用于开启逻辑备用数据库的逻辑回放功能,该功能默认关闭。
upgrade_clauses
该语句用于数据库的版本升级。
exit upgrade
当数据库升级完成之后,可以直接退出升级模式进入正常 OPEN 模式,无需重启。
示例
repair_database_clauses
该语句用于数据库处于 ABNORMAL 状态时,DBA 介入修复。
convert to normal
当数据库出现故障时,数据库被设为只读,数据库为故障状态,DBA 修复之后,可以通过本语句将数据库手动切换为正常模式。
Note:
当数据库因为资源错误陷入异常状态时,无法使用此语句将数据库状态置为正常。
示例(单机、共享集群部署)
delete_archivelog_clauses
该语句用于对数据库的归档文件进行手动清理,释放磁盘空间。
手动清理归档日志的筛选条件由 ARCH_CLEAN_IGNORE_MODE 参数决定,清理条件的具体描述见归档管理章节。
delete archivelog
all
清理掉满足清理条件的所有归档。
until sequence integer [thread integer]
清理指定序列号之前满足清理条件的归档。若不指定实例,则默认清理实例 1 的归档。
until time date
清理指定时间之前生成的并且满足清理条件的归档。
until scn integer
清理指定 SCN 之前生成的并且满足清理条件的归档。(同 V$ARCHIVED_LOG 中的 NEXT_CHANGE#作比较)。
force
不考虑清理条件,强制清理归档。
示例
double_write_file_clauses
该语句用于重新指定双写文件的大小。
示例(单机、共享集群部署)
supplemental_log_clauses
该语句用于配置数据库级别的附加日志,不适用于分布式部署。
开启附加日志后,数据库将在 redo 里额外记录一些数据,这些数据包括 DDL 的原始 SQL 文本,update,delete 时用于定位行位置的索引信息等。
结合附加日志,可以通过 redo 解析还原出对应的 DDL、DML 语句,通常用于异构数据库同步。
数据库级附加日志对选定类型的所有用户表生效,可以通过动态视图V$DATABASE查看数据库级别的附加日志生效状态。若目标表开启了加密,数据库级附加日志仍会根据选定表类型显示生效状态但实际 redo 里并不会记录该表相关的附加信息。
表级附加日志请参考ALTER TABLE。
supplemental log data
SUPPLEMENTAL LOG DATA 表示最小附加日志,这种模式下 redo 里会额外记录 DDL 文本和 DML 的 rowid,性能影响最小。
当开启 ALL 或 PRIMARY KEY 模式的附加日志时,最小附加日志隐式开启。且在关闭其他模式的附加日志前,不能关闭最小附加日志。
ALL 模式的优先级大于 PRIMARY KEY 模式,当数据库级附加日志模式和表级附加日志模式中有一个为 ALL 时,该表使用 ALL 模式。
数据库级附加日志记录 FUNCTION,PACKAGE,PROCEDURE,SEQUENCE,TRIGGER,SYNONYM,LIBRARY,TABLE,INDEX,TYPE,VIEW,MATERIALIZED VIEW 这些对象的 DDL,并且不修改元数据的 DDL 不会记录。
all
ALL 模式下,redo 里会额外记录 DDL 文本和 DML 的 rowid,还会在 update 和 delete 时记录原行中的所有列(除了 LOB,超过 32K 的 varchar 和 char 等)。
这种模式适用于没有主键的表,由于 redo 里额外记录了整行数据,性能影响较大。
primary key
PRIMARY KEY 模式下,redo 里会额外记录 DDL 文本和 DML 的 rowid,还会在 update 和 delete 时尝试记录主键列。
如果表没有主键,但有非空的唯一索引,则会记录该索引列。
如果表既没有主键,也没有非空的唯一索引,则会记录原行中的所有列(除了 LOB,超过 32K 的 varchar 和 char 等)。
这种模式下,优先记录主键,redo 占用较少,性能影响较小。
示例(单机部署)
supplemental log table type
设置数据库级别的 DML 附加日志对哪些类型的用户表生效。默认为空,在开启附加日志后,请同时设置需要生效的表类型。
LSC 表的热数据转冷数据后,所涉及行的 rowid 可能会发生改变,不建议对 LSC 表使用 rowid 作为行的定位信息。 LSC 表在导入或通过 create table as select 创建时,不会产生 insert 的 redo,所以不会记录 insert 的逻辑日志。
示例(单机部署)
Note:
修改数据库级附加日志状态时,不会对正在执行的语句生效。
评论