#ALTER DATABASE

# 通用描述

ALTER DATABASE用于修改数据库的相关属性。

分布式部署中,用户可以执行此语句,但只能对所在节点的数据库实例进行更改,可能对整个分布式集群造成不一致影响,因此不建议使用。对分布式集群的管理操作均应使用OM运维管理工具,具体见yasboot命令介绍章节描述。

# 语句定义

alter database::=

syntax
ALTER DATABASE startup_clauses database_file_clauses logfile_clauses standby_database_clauses upgrade_clauses repair_database_clauses delete_archivelog_clauses double_write_file_clauses

startup_clauses::=

syntax
MOUNT OPEN READWRITE RESETLOGS UPGRADE

database_file_clauses::=

syntax
DATAFILE filename AUTOEXTEND OFF ON NEXT size_clauses MAXSIZE UNLIMITED size_clause RESIZE size_clause OFFLINE DROP
syntax
TEMPFILE filename AUTOEXTEND OFF ON NEXT size_clauses MAXSIZE UNLIMITED size_clause RESIZE size_clause
syntax
CONVERT filename including archivelog

logfile_clauses::=

syntax
ARCHIVELOG NOARCHIVELOG SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE PROTECTION AVAILABILITY FORCE TIMEOUT integer ADD LOGFILE ( filename SIZE size_caluse BLOCKSIZE size_clauses PARALLEL parallel , ) DROP LOGFILE filename

standby_database_clauses::=

syntax
CONVERT TO PHYSICAL STANDBY SWITCHOVER FAILOVER RECOVER MANAGED STANDBY DATABASE UNTIL SCN integer DISCONNECT FROM SESSION CANCEL REGISTER OR REPLACE ARCHIVELOG , filename

upgrade_clauses::=

syntax
EXIT UPGRADE

repair_database_clauses::=

syntax
CONVERT TO NORMAL

delete_archivelog_clauses::=

syntax
DELETE ARCHIVELOG ALL UNTIL SEQUENCE integer TIME date FORCE

double_write_file_clauses::=

syntax
DOUBLE_WRITE RESIZE FILE size_clauses

# startup_clauses

YashanDB的启动可分为三个状态阶段:

  1. 启动数据库到NOMOUNT状态。
  2. 启动数据库到MOUNT状态。
  3. 启动数据库到OPEN状态。
  4. 启动数据库到OPEN UPGRADE状态。

NOMOUNT也就是启动数据库实例(Instance)后的状态,之后即可以使用YashanDB提供的yasql工具连接实例,执行startup_clauses,将数据库启动到MOUNT、OPEN和OPEN UPGRADE状态。

示例

ALTER DATABASE MOUNT;
 
ALTER DATABASE OPEN;

ALTER DATABASE OPEN UPGRADE;

# database_file_clauses

该语句用于对数据库的数据文件进行自动扩展的开关控制、大小指定等。此操作需要数据库处于OPEN状态。 在设置数据文件自动扩展或RESIZE数据文件时,对于TEMP表空间和SWAP表空间的数据文件使用tempfile选项,其它表空间的数据文件使用datafile选项。

# autoextend off

关闭某个数据文件的自动扩展,同时该数据文件的NEXT_SIZE和MAX_SIZE被设置为0。

示例

ALTER DATABASE DATAFILE '/home/yasdb/YASDB_DATA/dbfiles/users' AUTOEXTEND OFF;
ALTER DATABASE TEMPFILE '/home/yasdb/YASDB_DATA/dbfiles/swap' AUTOEXTEND OFF;

# autoextend on

开启某个数据文件的自动扩展,同时NEXT用于指定自动扩展下一空间的大小,以Bytes为单位,未指定则取默认值8K个BLOCK大小;MAXSIZE用于指定自动扩展的最大空间,UNLIMITED为无限制,未指定则默认为64M个BLOCK大小。

示例

ALTER DATABASE DATAFILE '/home/yasdb/YASDB_DATA/dbfiles/users' AUTOEXTEND ON NEXT 8M MAXSIZE 64M;
ALTER DATABASE TEMPFILE '/home/yasdb/YASDB_DATA/dbfiles/swap' AUTOEXTEND ON NEXT 8M MAXSIZE 64M;

# resize

重新指定某个数据文件的大小。

创建表空间下的数据文件时可以通过设定数据文件自动扩展来满足用户对于更大数据文件的需求,但如果存储空间并不充足,或者数据文件按预期指定过大而实际使用很小,或者数据文件中存在大量被删除的临时数据而空间并没有被回收,这些情况下就需要使用resize的方式对数据文件进行缩小,释放磁盘空间。

使用resize对数据文件进行扩大,一次设置文件为自己所需大小 ,也可以避免频繁的申请资源。

resize后的数据文件大小必须在128到64MB个BLOCK之间。

resize操作不一定会成功,例如在扩大文件时可能会存在磁盘空间不足,或者在缩小文件时,当前数据文件的有效数据大小已超过指定的值。

注意:UNDO表空间的数据文件只能进行扩大,不能进行缩小。

示例

ALTER DATABASE DATAFILE '/home/yasdb/YASDB_DATA/dbfiles/users' RESIZE 1048576;
ALTER DATABASE TEMPFILE '/home/yasdb/YASDB_DATA/dbfiles/temp' RESIZE 1048576;

# 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。

示例

ALTER DATABASE DATAFILE '/home/yasdb/YASDB_DATA/dbfiles/file' OFFLINE;

--非归档模式下只能用如下语句offline
ALTER DATABASE DATAFILE '/home/yasdb/YASDB_DATA/dbfiles/file' OFFLINE DROP;

# convert filename [including archivelog]

该语法用于当数据库整库迁移到其它目录后,将数据库记录在控制文件中的路径进行转换后使数据库正常启动、运行,只能在数据库处于NOMOUNT阶段时使用。

数据库整库迁移到其他目录后,使用该语法的具体步骤如下:

  1. 修改配置参数文件中的控制文件路径参数为当前数据库启动路径或删除配置文件中的配置使用默认配置,参数名为CONTROL_FILES。
  2. 如果需要转换归档日志,修改配置参数文件中的归档日志路径参数为当前数据库指定归档路径或删除配置文件中的配置使用默认配置,参数名为ARCHIVE_LOCAL_DEST。
  3. 配置数据文件、在线日志文件、DATABUCKET的路径转换参数,将旧的文件路径转换为新的文件路径,参数名为DB_FILE_NAME_CONVERT、REDO_FILE_NAME_CONVERT、DB_BUCKET_NAME_CONVERT。
  4. 确认数据库是否开启双写,如果开启双写,确保数据文件转换路径参数可以对双写文件路径生效。
  5. 启动数据库到NOMOUNT状态并根据是否需要转换归档日志路径执行ALTER DATABASE CONVERT FILENAME INCLUDING ARCHIVELOG。
  6. 打开数据库。
# including archivelog

当需要转换归档日志路径时指定INCLUDING ARCHIVELOG子句。 示例

ALTER DATABASE CONVERT FILENAME;

包含归档日志的路径转换使用如下语句
ALTER DATABASE CONVERT FILENAME INCLUDING ARCHIVELOG;

# logfile_clauses

该语句用于对数据库的redo日志进行归档模式设置、备库保护模式设置、增加、删除等操作。

# archivelog/noarchivelog

启用或停止数据库的日志归档模式。此操作需要数据库处于MOUNT状态。

示例

ALTER DATABASE ARCHIVELOG;
 
ALTER DATABASE NOARCHIVELOG;

# set standby database to

指定备用库的保护模式,缺省值为MAXIMIZE PERFORMANCE。其中,设置为MAXIMIZE PROTECTION的前提主机的日志已经同步到备机,否则会报错。FORCE表示强制设置,忽略报错。TIMEOUT表示在设置最大保护模式时,等待备机同步的时间,超过该时间将报错,单位为秒,可省略,默认为10s。

  • MAXIMIZE PERFORMANCE:主库事务提交不需要等待备库收到日志,保证了主数据库的可用性及性能,但是主库宕机后,可能丢失数据。
  • MAXIMIZE PROTECTION:备库的数据保护优先于主库的可用性,主库的日志在同步备库上落盘之后,事务才能提交,在同步备库故障的情况下,主库会在一段时间后变为只读模式。注:如果COMMIT_WAIT参数设为NOWAIT,主机事务提交不会等待备机收到日志
  • MAXIMIZE AVAILABILITY:同步备库正常时,主库的日志在同步备库上落盘之后,事务才能提交,同步备库故障时,事务提交也不会阻塞,保证数据库可用。注:如果COMMIT_WAIT参数设为NOWAIT,主机事务提交不会等待备机收到日志

示例

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
 
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
 
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
 
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION FORCE;

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION TIMEOUT 100;

# add logfile

为数据库增加新的redo文件,同时增加多个文件以','隔开。此操作需要数据库处于OPEN状态。

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)。

示例

ALTER DATABASE ADD LOGFILE ('/home/yasdb/YASDB_DATA/dbfiles/redo5' SIZE 72355840,'/home/yasdb/YASDB_DATA/dbfiles/redo6' SIZE 72355840);
ALTER DATABASE ADD LOGFILE '/home/yasdb/YASDB_DATA/dbfiles/redo5' SIZE 72355840 BLOCKSIZE 512;
ALTER DATABASE ADD LOGFILE '/home/yasdb/YASDB_DATA/dbfiles/redo6' SIZE 72355840 PARALLEL 4;

# drop logfile

删除一个已存在的redo日志,对于正在使用中的redo日志则不被允许删除。此操作需要数据库处于OPEN状态。

示例

ALTER DATABASE DROP LOGFILE '/home/yasdb/YASDB_DATA/dbfiles/redo5';

# standby_database_clauses

该语句用于执行主备库之间的切换,此操作需要数据库处于MOUNT状态。主备库详细操作描述请参考高可用手册

# convert to physical standby

从主数据库切换为备用数据库。

ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

# switchover

从备用库切换回主数据库。

示例

ALTER DATABASE SWITCHOVER;

# failover

当备用库出现故障时,强制切换回主数据库。

示例

ALTER DATABASE FAILOVER;

# recover managed standby database cancel

在备机并且为Open状态下执行的SQL语句,该语句的作用为停止当前回放操作。 如果有前台回放正在进行,则中断该线程使其退出。

示例

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

# recover managed standby database

在备机并且为Open状态下执行的SQL语句,该语句的作用为启动备机回放,如需退出,需要执行取消回放SQL语句。

示例

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;
# until scn integer

在备机并且为Open状态下执行的SQL语句,该语句的作用为启动备机回放,回放到指定到SCN时主动退出。 此时如需退出则需要执行取消回放SQL语句进行中断操作。

示例

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE UNTIL SCN 123123123;

# disconnect from session

在备机并且为Open状态下执行的SQL语句,该语句的作用为在后台执行回放,当前会话可执行其他业务。

示例

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE UNTIL SCN 123123123 DISCONNECT FROM SESSION;

# register archivelog

该语句用于手动注册归档。该SQL的功能约束有:

  • RESTORE DATABASE后且数据库未open,可以用该SQL手动注册归档。
  • 数据库恢复或创建完整后,此操作的对象必须是备机,并且配置参数SANDBOX_STANDBY为TRUE。
  • 指定的归档的路径可以为绝对路径,也可以为文件名,使用文件名时默认路径为归档路径(配置参数ARCHIVE_LOCAL_DEST)。

示例

ALTER DATABASE REGISTER ARCHIVELOG '/home/yashan/archive/arch_0_1.ARC';
ALTER DATABASE REGISTER ARCHIVELOG '/home/yashan/archive/arch_0_1.ARC', '/home/yashan/archive/arch_0_2.ARC';
ALTER DATABASE REGISTER ARCHIVELOG 'arch_0_1.ARC';
ALTER DATABASE REGISTER ARCHIVELOG 'arch_0_1.ARC', 'arch_0_2.ARC';

-- 结合RESTORE DATABASE使用
RESTORE DATABASE FROM 'BAK1';
ALTER DATABASE REGISTER ARCHIVELOG 'arch_0_1.ARC', 'arch_0_2.ARC';
RECOVER DATABASE;
ALTER DATABASE OPEN;

# or replace

如果发现归档已经注册,就替换原有注册的归档,该操作比较危险,需要谨慎使用。

示例

ALTER DATABASE REGISTER OR REPLACE ARCHIVELOG '/home/yashan/archive/arch_0_1.ARC';
ALTER DATABASE REGISTER OR REPLACE ARCHIVELOG '/home/yashan/archive/arch_0_1.ARC', '/home/yashan/archive/arch_0_2.ARC';
ALTER DATABASE REGISTER OR REPLACE ARCHIVELOG 'arch_0_1.ARC';
ALTER DATABASE REGISTER OR REPLACE ARCHIVELOG 'arch_0_1.ARC', 'arch_0_2.ARC';

# upgrade_clauses

该语句用于数据库的版本升级。

# exit upgrade

当数据库升级完成之后,可以直接退出升级模式进入正常OPEN模式,无需重启。

示例

ALTER DATABASE EXIT UPGRADE;

# repair_database_clauses

该语句用于数据库处于ABNORMAL状态时,DBA介入修复。

# convert to normal

当数据库出现故障时,数据库被设为只读,数据库为故障状态,DBA修复之后,可以通过本语句将数据库手动切换为正常模式。

Note

当数据库因为资源错误陷入异常状态时,无法使用此语句将数据库状态置为正常。

示例

ALTER DATABASE CONVERT TO NORMAL;

# delete_archivelog_clauses

该语句用于对数据库的归档文件进行手动清理,释放磁盘空间。

手动清理归档日志的筛选条件由ARCH_CLEAN_IGNORE_MODE参数决定,清理条件的具体描述见归档管理章节。

# delete archivelog

# all

清理掉满足清理条件的所有归档。

# until sequence integer

清理指定序列号之前满足清理条件的归档。

# until time date

清理指定时间之前生成的并且满足清理条件的归档。

# force

不考虑清理条件,强制清理归档。

示例

ALTER DATABASE DELETE ARCHIVELOG ALL;

ALTER DATABASE DELETE ARCHIVELOG UNTIL SEQUENCE 5;

ALTER DATABASE DELETE ARCHIVELOG UNTIL TIME TO_DATE('2022-06-01 18:00:00', 'yyyy-mm-dd hh24:mi:ss');

--强制归档清理
ALTER DATABASE DELETE ARCHIVELOG ALL FORCE;

ALTER DATABASE DELETE ARCHIVELOG UNTIL SEQUENCE 5 FORCE;

ALTER DATABASE DELETE ARCHIVELOG UNTIL TIME TO_DATE('2022-06-01 18:00:00', 'yyyy-mm-dd hh24:mi:ss') FORCE;

# double_write_file_clauses

该语句用于重新指定双写文件的大小。

示例

ALTER DATABASE DOUBLE_WRITE RESIZE FILE 32M;