#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:以读写模式打开数据库,单机部署、共享集群部署和分布式部署下默认的数据库打开方式,禁止备库使用该方式打开数据库。
- RESETLOGS:打开数据库时重置redo时间线,并丢弃在恢复期间未应用的redo信息,从而确保永远不会应用这些信息。
- 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阶段时使用。
该语句的具体使用步骤如下:
- 更新启动路径:修改配置参数文件中的控制文件路径参数CONTROL_FILES为当前数据库启动路径,或删除该参数的已有配置从而使用默认配置启动。
- (可选)如需更新归档日志存储路径:修改配置参数文件中的归档日志路径参数ARCHIVE_LOCAL_DEST为当前数据库指定归档路径,或删除该参数的已有配置从而使用默认配置存储归档日志。
- 配置数据文件路径转换参数DB_FILE_NAME_CONVERT,将旧的文件路径转换为新的文件路径。同时,需确认数据库是否需要开启双写,如需开启双写,请确保数据文件转换路径参数可以对双写文件路径生效。
- 配置在线日志文件的路径转换参数REDO_FILE_NAME_CONVERT,将旧的文件路径转换为新的文件路径。
- 配置DATABUCKET的路径转换参数DB_BUCKET_NAME_CONVERT,将旧的文件路径转换为新的文件路径。
- 启动数据库至NOMOUNT状态,并根据是否需要转换归档日志路径从而决定是否显式指定子句INCLUDING ARCHIVELOG。
- 启动数据库至OPEN状态。
# including archivelog
当需要转换归档日志路径时指定该子句。
示例
ALTER DATABASE CONVERT FILENAME;
包含归档日志的路径转换使用如下语句
ALTER DATABASE CONVERT FILENAME INCLUDING ARCHIVELOG;
# logfile_clauses
该语句用于对数据库的redo日志进行归档模式设置、备库保护模式设置、增加、删除等操作。
# archivelog/noarchivelog
启用或停止数据库的日志归档模式。
单机部署中,此操作需要数据库实例处于MOUNT状态。
共享集群部署中,此操作需要当前所在实例处于MOUNT状态,且其他实例处于NOMOUNT状态。
当数据库处于主备复制模式(单机主备部署或主备共享集群部署)时,无法从归档模式切换为非归档模式。
示例
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,主库事务提交不会等待备库收到日志
Note:
在共享集群部署下,设置最大保护模式要求所有存活实例处于open状态。
在共享集群部署下,无法使用TIMEOUT字段。
示例
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状态。
共享集群下,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)。
示例
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状态。
共享集群下,redo日志是各个实例独享的,仅支持各个实例删除自己的redo日志。
示例
ALTER DATABASE DROP LOGFILE '/home/yasdb/YASDB_DATA/dbfiles/redo5';
# standby_database_clauses
该语句用于执行主备库之间的切换。主备库详细操作描述请参考高可用手册。
# convert to physical standby
从主数据库切换为备数据库。
示例
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
Note:
- 数据库的角色必须是PRIMARY,且执行实例必须处于MOUNT状态。
- 在共享集群部署下,只有1号实例并且该实例是MASTER_ROLE才可以执行该操作。
# switchover
从备数据库切换回主数据库。
示例
ALTER DATABASE SWITCHOVER;
Note:
- 数据库的角色必须是STANDBY,且执行实例必须处于OPEN状态。
- 主库的所有存活实例的状态必须是OPEN状态。
- 主备之间的redo传输链路连接正常,且备库处于NORMAL状态。(主库查询视图V$ARCHIVE_DEST_STATUS,备库查询视图V$REPLICATION_STATUS)
- 共享集群部署下,主库的1号实例必须存活。
- 共享集群部署下,switchover的性能受checkpoint的影响,需要等待非1号实例完成全量checkpoint再执行该操作。
# failover
当主库出现故障不能恢复时,将备库强制切换为主数据库。
示例
ALTER DATABASE FAILOVER;
Note:
- 数据库的角色必须是STANDBY。
- 执行实例必须处于OPEN状态。
- 数据库与主数据库的连接必须是断开的,可以查看视图V$REPLICATION_STATUS查看主备的连接情况。
- 共享集群部署下,1号实例执行该操作切换成主数据库,其他的实例需要手动OPEN。
- RESET ID仅用于仲裁选主场景yasom自动下发的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 [thread integer]
清理指定序列号之前满足清理条件的归档。若不指定实例,则默认清理实例1的归档。
# until time date
清理指定时间之前生成的并且满足清理条件的归档。
# until scn integer
清理指定SCN之前生成的并且满足清理条件的归档。(同V$ARCHIVED_LOG中的NEXT_CHANGE#作比较)。
# 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;
# supplemental_log_clauses
该语句用于配置数据库级别的附加日志,不适用于分布式部署。
开启附加日志后,数据库将在redo里额外记录一些数据,这些数据包括DDL的原始SQL文本,update,delete时用于定位行位置的索引信息等。 结合附加日志,可以通过redo解析还原出对应的DDL,DML语句,通常用于异构数据库同步。
数据库级别的附加日志对选定类型的所有用户表生效,可以通过动态视图V$DATABASE查看数据库级别的附加日志生效状态。表级附加日志请参考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占用较少,性能影响较小。
示例(单机部署)
--开启最小附加日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
--开启PRIMARY KEY模式的附加日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
--开启ALL模式的附加日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
--关闭ALL模式和PRIMARY KEY模式的附加日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (ALL, PRIMARY KEY) COLUMNS;
--关闭最小附加日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
# supplemental log table type
设置数据库级别的DML附加日志对哪些类型的用户表生效。默认为空,在开启附加日志后,请同时设置需要生效的表类型。
LSC表的热数据转冷数据后,所涉及行的rowid可能会发生改变,不建议对LSC表使用rowid作为行的定位信息。 LSC表在导入或者通过create table as select创建时,不会产生insert的redo,所以不会记录insert的逻辑日志。
示例(单机部署)
--设置数据库级附加日志对HEAP和TAC类型的表生效
ALTER DATABASE ADD SUPPLEMENTAL LOG TABLE TYPE (HEAP, TAC);
--设置数据库级附加日志对LSC表不生效
ALTER DATABASE DROP SUPPLEMENTAL LOG TABLE TYPE (LSC);
Note:
修改数据库级附加日志状态时,不会对正在执行的语句生效。